Advertisement
Usow_Maxim

Lab_8.3_module.cpp

Feb 28th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 16.63 KB | None | 0 0
  1. #include "module.h"
  2.  
  3. struct Avto
  4. {
  5.     char* mark;
  6.     int year;
  7.     float value;
  8.     int probeg;
  9. };
  10.  
  11. Avto DefaultAvto() //Возвращает один объект как стандартный, используется при редактировании объекта, когда мы отменяем изменения.
  12. {
  13.     Avto avtos;
  14.     avtos.mark = (char*)"mark";
  15.     avtos.year = 1111;
  16.     avtos.value = 0;
  17.     avtos.probeg = 1;
  18.     return avtos;
  19. }
  20.  
  21. Avto* DefaultAvto(int &Size) //Данная функция просто возращает заранее подготовленный массив, как стандартный
  22. {
  23.     Size = 1;
  24.     Avto* avtos = new Avto[Size];
  25.     avtos[0] = DefaultAvto();
  26.     return avtos;
  27. }
  28.  
  29. void FileWrite(Avto* avtos, int Size) //Функция для записи в файл.
  30. {
  31.     FILE* fout = fopen("Avtos.txt", "w"); //Создаем указатель на потоковый файл и загружаем его в режиме чтения - "w"
  32.     if(Size <= 0 || fout == NULL) //В случае неудачи, пишем пользователь об ошибке с файлам.
  33.     {
  34.         printf("Ошибка записи в файл.");
  35.     }
  36.     else //В случае удачи, просто заполняем файл в цикле необходимой информацией...
  37.     {
  38.         fprintf(fout, "%d\n", Size);
  39.         for(int i = 0; i < Size; i++)
  40.         {
  41.             fprintf(fout, "%s ", avtos[i].mark);
  42.             fprintf(fout, "%d ", avtos[i].year);
  43.             fprintf(fout, "%f ", avtos[i].value);
  44.             fprintf(fout, "%d\n", avtos[i].probeg);
  45.         }
  46.     }
  47.     fclose(fout); //Файл необходимо закрыть, так как могут быть потери данных...
  48. }
  49.  
  50. //Функция конвертирует C++ строки в C строки, ничего особенного
  51. char* cstc(string s)
  52. {
  53.     char *cstr = new char[s.length() + 1];
  54.     strcpy(cstr, s.c_str());
  55.     return cstr;
  56. }
  57.  
  58. Avto* FileRead(int &Size){ //Чтение файла с использованием C++ fstream, так как за 2 часа опытов не удалось написать функцию, которая не использовала бы C++ fstream
  59.     Avto* avtos = NULL; //Создаем массив с объектами и не инициализируем - NULL
  60.     ifstream f;//Создаем указатель на потоковый файл.
  61.     f.open("Avtos.txt"); //Читаем файл, в данном случае тип чтения/записи с файлом определяется в ifstream
  62.     if(f.is_open()) //Надо проверить на успешное открытие файла.
  63.     {
  64.         string str; //Строки языка C++, так как обычные строки нельзя использовать в функции getline
  65.         getline(f, str, '\n'); //Функция языка C++, так как взаимодействует со строками C++
  66.         Size = atoi(cstc(str))? atoi(cstc(str)) : 0; //Линейное условие(ленивый if) - определяется как (Условие)? если правда : если ложь;
  67.         if(Size > 0) //Вдруг мы пытаемся прочитать пустой файл, следует исключить...
  68.         {
  69.             avtos = new Avto[Size]; //Мы теперь знаем, что размер больше 0, так что смело инициализируем массив объектов...
  70.             for(int i = 0; i < Size; i++)
  71.             {
  72.                 getline(f, str, ' '); //Схема чтения из файла в данном случае очень простая, мы просто читаем строку с помощью getline и вносим её в массив объектов.
  73.                 avtos[i].mark = cstc(str);
  74.                 getline(f, str, ' ');
  75.                 avtos[i].year = atoi(cstc(str));
  76.                 getline(f, str, ' ');
  77.                 avtos[i].value = atoi(cstc(str));
  78.                 getline(f, str, '\n');  //Важно, здесь требуется указать не пробел(' '), а переход на следущую строку, так как мы храним данные именно в таком виде.
  79.                 avtos[i].probeg = atoi(cstc(str));
  80.             }
  81.         }
  82.     }
  83.     f.close(); //куда же без закрытия файла.
  84.     return avtos;
  85. }
  86.  
  87. int Write_int(bool zero) //Стандартная функция, без комментариев.
  88. {
  89.     char str[10];
  90.     int value;
  91.     while(true)
  92.     {
  93.         scanf("%s", str);
  94.         value = abs(atoi(str))? abs(atoi(str)) : 0;
  95.         if (zero) break;
  96.         if (!zero && value > 0)
  97.             break;
  98.         else
  99.             printf("Введите значение |n| > 0: ");
  100.     }
  101.     return value;
  102. }
  103.  
  104. Avto* Avto_Add(Avto* avtos, int &Size, Avto newAvto) //Данная функция расширяет массив объектов и в конец добавляет новый...
  105. {
  106.     Size++;
  107.     Avto* copyAvtos = new Avto[Size];
  108.     for (int i = 0; i < Size - 1; i++)
  109.         copyAvtos[i] = avtos[i];
  110.     copyAvtos[Size - 1].mark = newAvto.mark;
  111.     copyAvtos[Size - 1].year = newAvto.year;
  112.     copyAvtos[Size - 1].value = newAvto.value;
  113.     copyAvtos[Size - 1].probeg = newAvto.probeg;
  114.     delete[] avtos;
  115.     return copyAvtos;
  116. }
  117.  
  118. Avto* Avto_Remove(Avto* avtos, int &Size, int Index) //Функция удаляет объект путём обхода его стороной, например мы хотим удалить 6-ой элемент, сделаем это 0..5 7..10
  119. {
  120.     Size--;
  121.     Avto* copyAvtos = new Avto[Size];
  122.     for (int i = 0; i < Index; ++i)
  123.         copyAvtos[i] = avtos[i];
  124.     for (int i = Index; i < Size; ++i)
  125.         copyAvtos[i] = avtos[i + 1];
  126.     delete[] avtos;
  127.     return copyAvtos;
  128. }
  129.  
  130. //Редактор строки
  131. char* strEdit(bool Number = false)
  132. {
  133.     system("cls");
  134.  
  135.     HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); //Получаем объект консоли с которой будем работать.
  136.     COORD pos; //Позиция курсора на экране.
  137.     pos.Y = 1;
  138.     pos.X = 0;
  139.     char* cloneStr = NULL;
  140.     char* str = NULL;
  141.  
  142.     printf("Строка:\n");
  143.  
  144.     while(true)
  145.     {
  146.         int symbol = _getch();
  147.  
  148.         //Расширение
  149.         cloneStr = new char[pos.X + 1]; //В данном случае просто расширяем массив символов на 1
  150.         for (int i = 0; i < pos.X; i++)
  151.             if (str[i] != '\0')
  152.                 cloneStr[i] = str[i];
  153.         str = new char[pos.X + 1];
  154.         for (int i = 0; i < pos.X; i++)
  155.             str[i] = cloneStr[i];
  156.         delete[] cloneStr; //Кстати, данной команды в прошлых редакторах строк небыло, но она здесь очень важна, так как с каждым редактированием строки наша память засерается на пару байт.
  157.  
  158.         if (symbol >= 97 && symbol <= 122 && !Number && pos.X < 50) //Проверяем на нажатие англ клавиш.
  159.         {
  160.             str[pos.X] = symbol;
  161.             printf("%c", str[pos.X]);
  162.             pos.X++;
  163.         }
  164.  
  165.         //Пробел
  166.         if(symbol == 32 && !Number && pos.X < 50)
  167.         {
  168.             str[pos.X] = '_';
  169.             printf("%c", ' ');
  170.             pos.X++;
  171.         }
  172.  
  173.         if((symbol >= 48 && symbol <= 58 || symbol == '.') && pos.X < 50 && Number) //Цифры
  174.         {
  175.             str[pos.X] = symbol;
  176.             printf("%c", str[pos.X]);
  177.             pos.X++;
  178.         }
  179.  
  180.         if (symbol == 8 && pos.X > 0) //Backspace
  181.         {
  182.             str[pos.X] = ' ';
  183.             pos.X--;
  184.             SetConsoleCursorPosition(hConsole, pos); //Функция изменяет позицию курсора в консоли(HANDLE hConsole) на определённую позицию(COORD pos)
  185.             printf("%s", " ");
  186.         }
  187.  
  188.         SetConsoleCursorPosition(hConsole, pos);
  189.         if (symbol == 13)
  190.         {
  191.             str[pos.X] = '\0';
  192.             break;
  193.         }
  194.     }
  195.     delete[] cloneStr; //Удаляем лишнее..
  196.     return str;
  197. }
  198.  
  199. //Редактор
  200. Avto Avto_Edit(Avto avto, bool isCreated = false)
  201. {
  202.     Avto copyAvto; //Создаем объект, который будем редактировать в дальнейшем
  203.     if(isCreated) //Тут мы копируем данные из Avyo avto, если они были переданы.
  204.         copyAvto = avto;
  205.     else
  206.         copyAvto = DefaultAvto(); //загружаем стандартный объект
  207.     bool RUN = true;
  208.     while(RUN)
  209.     {
  210.         system("cls"); //бла.. бла.. бла.. стандартное меню.
  211.         printf("[Редактор машины]\n1.Марка\n2.Год\n3.Объем\n4.Пробег\n5.Сохранить\n6.Не сохранять.\nВыбор: ");
  212.         switch(Write_int())
  213.         {
  214.             case 1:
  215.                 copyAvto.mark = strEdit(); //В случае выбора именно этой строки, мы перейдём в редактор строки, который был описан выше.
  216.                 break;
  217.             case 2:
  218.                 copyAvto.year = atoi(strEdit(true));
  219.                 break;
  220.             case 3:
  221.                 copyAvto.value = atof(strEdit(true)); //atof используем, потому что value - является не строкой, а float
  222.                 break;
  223.             case 4:
  224.                 copyAvto.probeg = atoi(strEdit(true));
  225.                 break;
  226.             case 5:
  227.                 avto = copyAvto; //Сохраняем изменённые данные
  228.                 RUN = false;
  229.                 break;
  230.             case 6:
  231.                 if(!isCreated)
  232.                     avto = DefaultAvto(); //или загружаем стандартные и выходим из редактора объекта.
  233.                 RUN = false;
  234.                 break;
  235.             default:
  236.                 break;
  237.         }
  238.     }
  239.     return avto;
  240. }
  241.  
  242. Avto* InputAvto(Avto* avtos, int &Size) //Функция для работы с объектами...
  243. {
  244.     bool RUN = true;
  245.     while(RUN){
  246.         system("cls");
  247.         printf("[Редактирование списка]\n1.Добавить\n2.Изменить\n3.Удалить\n4.Назад\nВыбор: ");
  248.         switch(Write_int())
  249.         {
  250.             case 1:
  251.             {
  252.                 system("cls");
  253.                 Avto newAvto = DefaultAvto();
  254.                 newAvto = Avto_Edit(newAvto);
  255.                 avtos = Avto_Add(avtos, Size, newAvto);
  256.                 printf("Машина успешно была добавлена в список.\n");
  257.                 printf("Для продолжения нажмите любую клавишу...\n");
  258.                 _getch();
  259.                 break;
  260.             }
  261.             case 2:
  262.             {
  263.                 system("cls");
  264.                 printf("[Изменить]\nИндекс: ");
  265.                 int index = Write_int(true);
  266.                 if(index >= Size)
  267.                 {
  268.                     printf("Вы ввели индекс, который привышает размер списка.\n");
  269.                     printf("Для продолжения нажмите любую клавишу...\n");
  270.                     _getch();
  271.                     break;
  272.                 }
  273.                 avtos[index] = Avto_Edit(avtos[index], true);
  274.                 printf("Машина успешно был изменена в списке.\n");
  275.                 printf("Для продолжения нажмите любую клавишу...\n");
  276.                 _getch();
  277.                 break;
  278.             }
  279.             case 3:
  280.             {
  281.                 printf("[Удаление]\nВведите индекс:\n");
  282.                 int index = Write_int(true);
  283.                 if(index >= Size)
  284.                 {
  285.                     printf("Вы ввели индекс, который привышает размер списка.\n");
  286.                     printf("Для продолжения нажмите любую клавишу...\n");
  287.                     _getch();
  288.                     break;
  289.                 }
  290.                 avtos = Avto_Remove(avtos, Size, index);
  291.                 printf("Машина удалена.\n");
  292.                 printf("Для продолжения нажмите любую клавишу...\n");
  293.                 _getch();
  294.                 break;
  295.             }
  296.             case 4:
  297.                 RUN = false;
  298.                 break;
  299.             default:
  300.                 break;
  301.         }
  302.     }
  303.     return avtos;
  304. }
  305.  
  306. void OutputAvto(Avto* avtos, int Size){ //Функция сортировки и вывода одновременно...
  307.     int* index = new int[Size]; //Мы сортеруем индексы, дабы не создавать разные типы данных для сортировки...
  308.     for(int i = 0; i < Size; i++)
  309.         index[i] = i; //Индексы не могут повторяться, так что заполняем их индивидуальными значениями.
  310.     int temp = 0;
  311.     bool output = false;
  312.     system("cls");
  313.     printf("[Вывод списка]\n1.По индексу\n2.По марке\n3.По году\n4.По объему\n5.По пробегу\nВыбор: ");
  314.     switch(Write_int())
  315.     {
  316.         case 1:
  317.             output = true;
  318.             break;
  319.         case 2: //Сортировка по Марке
  320.             for (int i = 0; i < Size - 1; i++) //Сортировка по пузырьковому алгоритму, расказать нечего...
  321.                 for (int j = 0; j < Size - i - 1; j++)
  322.                     if (strcmp(avtos[index[j]].mark, avtos[index[j + 1]].mark)> 0)
  323.                     {
  324.                         temp = index[j]; //замена индексов местами...
  325.                         index[j] = index[j + 1];
  326.                         index[j + 1] = temp;
  327.                     }
  328.             output = true;
  329.             break;
  330.         case 3: //Сортировка по году
  331.             for (int i = 0; i < Size - 1; i++)
  332.                 for (int j = 0; j < Size - i - 1; j++)
  333.                     if (avtos[index[j]].year > avtos[index[j + 1]].year)
  334.                     {
  335.                         temp = index[j];
  336.                         index[j] = index[j + 1];
  337.                         index[j + 1] = temp;
  338.                     }
  339.             output = true;
  340.             break;
  341.         case 4: //Сортировка по объему
  342.             for (int i = 0; i < Size - 1; i++)
  343.                 for (int j = 0; j < Size - i - 1; j++)
  344.                     if (avtos[index[j]].value > avtos[index[j + 1]].value)
  345.                     {
  346.                         temp = index[j];
  347.                         index[j] = index[j + 1];
  348.                         index[j + 1] = temp;
  349.                     }
  350.             output = true;
  351.             break;
  352.         case 5: //Сортировка по пробегу
  353.             for (int i = 0; i < Size - 1; i++)
  354.                 for (int j = 0; j < Size - i - 1; j++)
  355.                     if (avtos[index[j]].probeg > avtos[index[j + 1]].probeg)
  356.                     {
  357.                         temp = index[j];
  358.                         index[j] = index[j + 1];
  359.                         index[j + 1] = temp;
  360.                     }
  361.             output = true;
  362.             break;
  363.         default:
  364.             break;
  365.     }
  366.     if(output) //если мы выбрали один из типов сортировки, то сортировка уже прошла, остаётся только вывести их по сортированным индексам...
  367.     {
  368.         system("cls");
  369.         printf("[Вывод списка/По индексу]\n");
  370.         char pr[13];
  371.         for (int i = 0; i < Size; i++)
  372.         {
  373.             printf("%d) %s %d %.1f %d", index[i], avtos[index[i]].mark,
  374.                    avtos[index[i]].year, avtos[index[i]].value, avtos[index[i]].probeg);
  375.             printf(" %s\n", avtos[index[i]].probeg >= 100000? "Пройдите ТО!" : " ");
  376.         }
  377.     }
  378.     delete[] index; //Чистим память!
  379.  
  380.     printf("Для продолжения нажмите любую клавишу...\n");
  381.     _getch();
  382. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement