-
-
Save yvasiyarov/130874b80789a8c3910917b293699a29 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "pch.h" | |
#include <iostream> | |
#include <stdio.h> | |
#include <Windows.h> | |
#include <ctime> | |
#include <cstdlib> | |
using namespace std; | |
//Почему ты назвал структуру Branch ?? | |
//Может ты прекратишь копипастить из интеренета и начнешь сам писать ?? | |
struct Branch | |
{ | |
int value; | |
Branch *left, *right; | |
}; | |
int result; | |
// Первое: Объясни мне пожалуйста зачем ты используешь *& в строке ниже. Объясни что эти символы означают и зачем ты их используешь ? | |
// Второе: Запомни, каждая функция должна выполнять только одну роль. И больше ничего. | |
// Если роль этой функции show - то есть показать, значит она должна только показывать - и ничего больше. | |
// никакого подсчета. | |
// Для подсчета ты должен написать другую функцию - "count" которая и будет выполнять подсчет. | |
int show(Branch *&Tree,int a) | |
{ | |
if (Tree != NULL) | |
{ | |
// я тебя много раз просил - используй понятные названия для переменной. | |
// что значит переменная "a" в этом случае ? | |
if (a < Tree->value) | |
{ | |
result++; | |
} | |
show(Tree->left,a); | |
printf("%d ",Tree->value); | |
show(Tree->right,a); | |
} | |
//Объясни мне почему result у тебя объявлена вне функции ? | |
// Объясни мне разницу между объявлением переменной внутри функции и вне функции | |
return result; | |
} | |
void add_node(int value, Branch *&MyTree) | |
{ | |
// Объясни мне почему ты выполняешь сравнение таким образом (сначала пишешь NULL а потом MyTree) | |
if (NULL == MyTree) | |
{ | |
MyTree = new Branch; | |
MyTree->value = value; | |
//Объясни что значит строка ниже | |
MyTree->left = MyTree->right = NULL; | |
} | |
if (value < MyTree->value) | |
{ | |
// Объясни мне что делает строка ниже: | |
if (MyTree->left != NULL) add_node(value, MyTree->left); | |
else | |
{ | |
MyTree->left = new Branch; | |
MyTree->left->left = MyTree->left->right = NULL; | |
MyTree->left->value = value; | |
} | |
} | |
if (value > MyTree->value) | |
{ | |
// Тоже самое. Объясни мне что тут написано | |
if (MyTree->right != NULL) add_node(value, MyTree->right); | |
else | |
{ | |
MyTree->right = new Branch; | |
MyTree->right->left = MyTree->right->right = NULL; | |
MyTree->right->value = value; | |
} | |
} | |
} | |
int* InputArray(int n) | |
{ | |
FILE *f; | |
//input а не intut!!! | |
//объясни мне что значит "wt" в строке ниже | |
fopen_s(&f, "C:\\temp\\intut.txt", "wt"); | |
int *collection = (int*)malloc(n * sizeof(int)); | |
for (int i = 0; i < n; i++) | |
{ | |
//перед тем как использовать генератор случайных чисел нужно инициализировать | |
// объясни почему ты используешь %100 +1 | |
collection[i] = rand() % 100 + 1; | |
fprintf(f, "%d", collection[i]); | |
} | |
return collection; | |
//ты не закрываешь файл!!! у тебя сначала стоит return, а только потом fclose()!! | |
fclose(f); | |
} | |
//сколько раз говорил - используй понятные имена!! Не значешь - придумывай их на русском и используй google translate!! | |
// что означают пермененные a и n в этой функции ??? почему я должен читая твой код напрягаться и думать об этом ??? | |
// Если бы ты их по нормальному назвал - мне бы не пришлось напрягаться читая твой код | |
int CalculateArray(int* collection, int a,int n) | |
{ | |
int result=0; | |
for (int i = 0; i < n; i++) | |
{ | |
if (collection[i] > a) | |
{ | |
result++; | |
} | |
} | |
return result; | |
} | |
//Почему ты используешь разные стили кодирования ??? | |
// в функциях работы с деревьями у тебя открывающая скобка на новой строке находится, а тут на той же строке где названия | |
// из разных источников копипастил и было лень поправить ??? | |
struct Node { | |
int value; | |
struct Node *next; | |
struct Node *prev; | |
}; | |
struct List { | |
struct Node* first; | |
struct Node* last; | |
}; | |
struct List* create() { | |
struct List* list = (struct List*)malloc(sizeof(struct List)); | |
list->first = NULL; | |
list->last = NULL; | |
return list; | |
} | |
void insert( struct List* list) | |
{ | |
if (list->first == NULL && list->last == NULL) | |
{ | |
//ты заметил что у тебя вот эти две строчки повторяются ? | |
// их нужно вынести в начало - вне зависимости от того куда ты прицепишь элемент - | |
// тебе нужно выделить под него память и заполнить его случайным числом | |
struct Node* node = (struct Node*)malloc(sizeof(struct Node)); | |
node->value = rand() % 100 + 1; | |
node->next = NULL; | |
node->prev = NULL; | |
list->first = node; | |
list->last = node; | |
} | |
else { | |
struct Node* node = (struct Node*)malloc(sizeof(struct Node)); | |
node->value = rand() % 100 + 1; | |
node->prev = list->last; | |
node->next = NULL; | |
list->last = node; | |
} | |
} | |
// опять же: у функции должно быть одно назначение. | |
// либо считать либо печатать. | |
// сделай две разные функции для подсчета и для печати | |
int ScrollList(int limit, struct List* list) | |
{ | |
if (list == NULL || list->first == NULL) | |
{ | |
return 0; | |
} | |
Node* curentNode = list->last; | |
int result = 0; | |
printf("коллекция"); | |
do { | |
if (curentNode->value > limit) | |
{ | |
result++; | |
} | |
printf("%d ", curentNode->value); | |
curentNode = curentNode->prev; | |
} while (curentNode != list->last && curentNode != NULL); | |
printf("\n"); | |
return result; | |
} | |
int main() | |
{ | |
setlocale(LC_ALL, "Russian"); | |
int StartTime = clock(); | |
printf("Выбирете тип коллекции\nМассив(1)\nДвусвязный список(2)\nДвоичное дерево(3)\nДля выбора нужного типа коллекции введите номер соответствующего типа\n"); | |
int Type; | |
int n; | |
int Result; | |
scanf_s("%d", &Type); | |
printf("Введите размер коллекции"); | |
printf("\n"); | |
scanf_s("%d", &n); | |
Branch *Tree = NULL; | |
//я тебя просил протестировать свою программу с разными входными данными. | |
// а что если я вообще не число введу а слово - "жопа"? | |
// или введу Type == 10 ? или размер введу минус 1 ?? ты это все должен проверить!!! | |
if (Type == 1) | |
{ | |
int* collection=InputArray(n); | |
printf("Введите число с кототорым хотите сравнить элементы коллекции!"); | |
printf("\n"); | |
int a; | |
scanf_s("%d", &a); | |
Result=CalculateArray(collection, a, n); | |
} | |
else if(Type == 2) | |
{ | |
printf("Введите число с кототорым хотите сравнить элементы коллекции!"); | |
printf("\n"); | |
int a; | |
scanf_s("%d", &a); | |
struct List* list = create(); | |
for (int i = 0; i < n; i++) | |
{ | |
insert(list); | |
} | |
Result = ScrollList(a, list); | |
} | |
else if(Type == 3) | |
{ | |
int val; | |
printf("Введите число с кототорым хотите сравнить элементы коллекции!"); | |
printf("\n"); | |
int a; | |
scanf_s("%d", &a); | |
printf("коллекция\n"); | |
for (int i = 0; i < n; i++) | |
{ | |
val = rand() % 100 + 1; | |
add_node(val, Tree); | |
} | |
Result=show(Tree,a); | |
} | |
int Member; | |
if (Type == 1) | |
{ | |
// объясни мне откуда взялось число 8 строке ниже и что оно обозначает | |
Member = sizeof(int) * 8 + sizeof(int)*n; | |
} | |
else if(Type == 2) | |
{ | |
Member = sizeof(int) * 8 + sizeof(List); | |
} | |
else if (Type == 3) | |
{ | |
// объясни что означает число 9 | |
Member = sizeof(int) * 9 + sizeof(Branch); | |
} | |
int EndTime = clock(); | |
int Time = EndTime - StartTime; | |
printf("Количество чисел больше введённого: %d\nКоличество памяти требоемое для хранения данных: %d\nВремя выполнения операции: %d", Result,Member,Time); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment