Advertisement
Guest User

Untitled

a guest
Apr 20th, 2019
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.87 KB | None | 0 0
  1. #include <iostream>
  2. #include "Formular.h"
  3. #include "EL1.h"
  4. #include "Line_with_marker.h"
  5. #include "FormularProcessing.h"
  6. #include "CommonProcess.h"
  7. using namespace std;
  8.  
  9. int main() {
  10.     int lineCountFromInput = 0, FirstNodeNumber = 0, ShouldBeDeletedNode = 0;
  11.     Formular form;
  12.     InitialiseFormular(form);
  13.     if(CheckFile()) {
  14.         return 666;
  15.     }
  16.     lineCountFromInput = LineCount();
  17.     getting_info_from_file(form, lineCountFromInput);
  18.     cout << "Введите номер элемента, с которого вы хотите начать удаление,"
  19.             " и количество элементво, которое вы хотите удалить" << endl;
  20.     cin >> FirstNodeNumber >> ShouldBeDeletedNode;
  21.     DeleteNode(form, FirstNodeNumber, ShouldBeDeletedNode);
  22.  
  23.     PrintFormular(form);
  24.  
  25.     DeleteList(form);
  26.     return 0;
  27. }
  28.  
  29. #include <iostream>
  30. #include <fstream>
  31. #include "CommonProcess.h"
  32. #include "FormularProcessing.h"
  33. #include "EL1Processing.h"
  34. #include "Formular.h"
  35. using namespace std;
  36.  
  37. void DeleteList(Formular &form) {
  38.     GoBegin(form);
  39.     while(form.Head != nullptr) {
  40.         form.Current = form.Head->next;
  41.         delete[] form.Head->Inf.symbols;
  42.         delete form.Head;
  43.         form.Head = form.Current;
  44.     }
  45.     delete form.Head;
  46.     delete form.Current;
  47.     delete form.Previous;
  48.     form.Last = nullptr;
  49. }
  50.  
  51. void DeleteEnd(Formular &form) {
  52.     // Работает корректно
  53.     GoBegin(form);
  54.     GoEnd(form);
  55.  
  56.     delete[] GetCurrent(form)->Inf.symbols;
  57.     delete GetCurrent(form);
  58.     GoBegin(form);
  59.     GoEnd(form);
  60.     SetLast(form, GetPrevious(form));
  61.     GetPrevious(form)->next = nullptr;
  62. }
  63.  
  64. int DeleteNode(Formular &form, int FirstNodeNumber, int ShouldBeDeletedNode) {
  65.     // Работате корректно
  66.     GoBegin(form);
  67.     SetCurrent(form, form.Head);
  68.     for(int i = 1; i < FirstNodeNumber; i++) {
  69.         GoNext(form);
  70.     }
  71.     if(FirstNodeNumber == LineCount()) {
  72.         DeleteEnd(form);
  73.         return 0;
  74.     }
  75.     if(FirstNodeNumber != 1) {
  76.         if(LineCount() - FirstNodeNumber < ShouldBeDeletedNode) {
  77.             ShouldBeDeletedNode = LineCount() - FirstNodeNumber;
  78.             ShouldBeDeletedNode++;
  79.         }
  80.         for (int j = 0; j < ShouldBeDeletedNode; j++) {
  81.             EL1 *trash;
  82.             trash = GetCurrent(form);
  83.             SetCurrent(form, form.Current->next);
  84.             GetPrevious(form)->next = GetCurrent(form);
  85.             delete[] trash->Inf.symbols;
  86.             delete trash;
  87.         }
  88.     } else {
  89.         for(int i = 0; i < ShouldBeDeletedNode; i++) {
  90.             DeleteBegin(form);
  91.         }
  92.     }
  93.     return 0;
  94. }
  95.  
  96. void DeleteBegin(Formular &form) {
  97.     // Работает корректно
  98.     GoBegin(form);
  99.     SetHead(form, GetNext(GetCurrent(form)));
  100.     delete GetCurrent(form);
  101.     GoBegin(form);
  102. }
  103.  
  104. int LineCount() {
  105.     //--------------------------------------------------------Находит количество строк. Строка с маркером не учитывается
  106.     // Работает корректно
  107.     fstream input_file;
  108.     char trash = 0;
  109.     int line_count = 0;
  110.     input_file.open("../cmake-build-debug/input_file.txt", ios::in);
  111.     input_file.unsetf(ios::skipws);
  112.  
  113.     while(!input_file.eof()) {
  114.         input_file >> trash;
  115.         if(trash == '\n')
  116.             line_count++;
  117.     }
  118.     input_file.setf(ios::skipws);
  119.  
  120.     input_file.close();
  121.     return line_count;
  122. }
  123.  
  124. int SymbolsCount(fstream &input_file, char trash) {
  125.     // Работает корректно
  126.     char symbols_count = 0;
  127.     do
  128.     {
  129.         input_file >> trash;
  130.         if(input_file.eof() || (trash == '\n'))
  131.             break;
  132.         symbols_count++;
  133.     } while (true);
  134.  
  135.     return symbols_count;
  136. }
  137.  
  138. void InputOneLine(Formular &form, int symbols_count, const char* transit_line, char Marker) {
  139.     // Работает корректно
  140.     auto *trash = new EL1;
  141.     trash->next = nullptr;
  142.     trash->Inf.symbols = new char[symbols_count + 1];
  143.     for(int i = 0; i < symbols_count; i++) {
  144.         trash->Inf.symbols[i] = transit_line[i];
  145.     }
  146.     trash->Inf.symbols[symbols_count] = Marker;
  147.     trash->Inf.Marker = Marker;
  148.     if(form.Head != nullptr) {
  149.         form.Last->next = trash;
  150.         SetLast(form, form.Last->next);
  151.     } else {
  152.         SetHead(form, trash);
  153.         SetLast(form, form.Head);
  154.     }
  155. }
  156.  
  157. void getting_info_from_file(Formular &form, int lineCountFromInput) {
  158.     //--------------------------------------------------------------------------------------------Чтение данных из файла
  159.     // Работает корректно
  160.     fstream input_file;
  161.     char trash = 0, Marker = 0;
  162.     int symbols_count = 0;
  163.     input_file.open("../cmake-build-debug/input_file.txt", ios::in);
  164.     input_file.unsetf(ios::skipws);
  165.     input_file >> Marker;
  166.     do
  167.     {
  168.         input_file >> trash;
  169.     } while (trash != '\n');
  170.  
  171.     int position = 0;
  172.     for(int i = 0; i < lineCountFromInput; i++) {
  173.         position = input_file.tellg();
  174.         symbols_count = SymbolsCount(input_file, trash);
  175.         auto transit_line = new char[symbols_count + 1];
  176.         input_file.clear();
  177.         input_file.seekg(position);
  178.         for (int j = 0; j < symbols_count; j++)
  179.             input_file >> transit_line[j];
  180.         input_file >> trash;
  181.         InputOneLine(form, symbols_count, transit_line, Marker);
  182.         form.Last->LineNumber = i;
  183.         delete[] transit_line;
  184.     }
  185.  
  186.     input_file.setf(ios::skipws);
  187.     input_file.close();
  188. }
  189.  
  190. bool CheckFile() {
  191.     //----------------------------------------------------------------------------------------------------Проверка файла
  192.     // Работает корректно
  193.     fstream f;
  194.     char Marker = 0;
  195.     f.open("../cmake-build-debug/input_file.txt", ios::in);
  196.     if(f.bad() != 0) {
  197.         cout << "Произошла ошибка открытия файла" << endl;
  198.         return true;
  199.     } else {
  200.         f.unsetf(ios::skipws);
  201.         f >> Marker;
  202.         if(Marker == '\n') {
  203.             cout << "Маркер не может быть пуст" << endl;
  204.             f.setf(ios::skipws);
  205.             Marker = 0;
  206.             return true;
  207.         }
  208.         long file_size;
  209.         f.seekg(0, ios::end);
  210.         file_size = f.tellg();
  211.         if (file_size == 0) {
  212.             cout << "А файл то пуст :D" << endl;
  213.             return true;
  214.         }
  215.     }
  216.     f.close();
  217.     return false;
  218. }
  219.  
  220. #ifndef PROGA_3_COMMONPROCESS_H
  221. #define PROGA_3_COMMONPROCESS_H
  222.  
  223. #include "Formular.h"
  224. using namespace std;
  225.  
  226. void DeleteList(Formular &form);
  227. void DeleteEnd(Formular &form);
  228. void DeleteBegin(Formular &form);
  229. int LineCount();
  230. void InputOneLine(Formular &form, int symbols_count, const char* transit_line, char Marker);
  231. void getting_info_from_file(Formular &form, int lineCountFromInput);
  232. int DeleteNode(Formular &form, int FirstNodeNumber, int ShouldBeDeletedNode);
  233. bool CheckFile();
  234.  
  235. #endif //PROGA_3_COMMONPROCESS_H
  236.  
  237. #ifndef PROGA_3_EL1_H
  238. #define PROGA_3_EL1_H
  239.  
  240. #include "Line_with_marker.h"
  241.  
  242. struct EL1 {
  243.     Line_with_marker Inf;
  244.     int LineNumber;
  245.     EL1* next;
  246. };
  247.  
  248.  
  249. #endif //PROGA_3_EL1_H
  250.  
  251. #ifndef PROGA_3_LINE_WITH_MARKER_H
  252. #define PROGA_3_LINE_WITH_MARKER_H
  253.  
  254.  
  255. struct Line_with_marker {
  256.     char* symbols;
  257.     char Marker;
  258. };
  259.  
  260.  
  261. #endif //PROGA_3_LINE_WITH_MARKER_H
  262.  
  263. #ifndef PROGA_3_FORMULAR_H
  264. #define PROGA_3_FORMULAR_H
  265.  
  266. #include "EL1.h"
  267.  
  268. struct Formular {
  269.     EL1 *Head, *Current, *Previous, *Last;
  270. };
  271.  
  272.  
  273. #endif //PROGA_3_FORMULAR_H
  274.  
  275. #include <fstream>
  276. #include "FormularProcessing.h"
  277. #include "EL1Processing.h"
  278. #include "Formular.h"
  279. #include "EL1.h"
  280.  
  281. void InitialiseFormular(Formular &formular) {
  282.     formular.Head = nullptr;
  283.     formular.Previous = nullptr;
  284.     formular.Current = nullptr;
  285.     formular.Last = nullptr;
  286. }
  287.  
  288. void SetHead(Formular &formular, EL1 *NewHead) {
  289.     formular.Head = NewHead;
  290. }
  291.  
  292. void SetPrevious(Formular &formular, EL1 *NewPrevious) {
  293.     formular.Previous = NewPrevious;
  294. }
  295.  
  296. void SetCurrent(Formular &formular, EL1 *NewCurrent) {
  297.     formular.Current = NewCurrent;
  298. }
  299.  
  300. void SetLast(Formular &formular, EL1 *NewLast) {
  301.     formular.Last = NewLast;
  302. }
  303.  
  304. EL1 *GetHead(Formular &formular) {
  305.     return formular.Head;
  306. }
  307.  
  308. EL1 *GetPrevious(Formular &formular) {
  309.     return formular.Previous;
  310. }
  311.  
  312. EL1 *GetCurrent(Formular &formular) {
  313.     return formular.Current;
  314. }
  315.  
  316. EL1 *GetLast(Formular &formular) {
  317.     return formular.Last;
  318. }
  319.  
  320. void GoBegin(Formular &formular) { // Устанавливает Previous как nullptr, а current элемент переносит на головной
  321.     SetPrevious(formular, nullptr);
  322.     SetCurrent(formular, GetHead(formular));
  323. }
  324.  
  325. void GoNext(Formular &formular) {
  326.     SetPrevious(formular, GetCurrent(formular));
  327.     SetCurrent(formular, GetNext(GetCurrent(formular)));
  328. }
  329.  
  330. void GoEnd(Formular &formular) {
  331.     GoBegin(formular);
  332.     do {
  333.         GoNext(formular);
  334.     } while (GetCurrent(formular)->next != nullptr);
  335. }
  336.  
  337. void PrintFormular(Formular &formular) { // Надо дописать
  338.     std::fstream output_file;
  339.     output_file.open("output_file.txt", std::ios::out);
  340.  
  341.     auto temp = formular.Head;
  342.     while(temp != nullptr) {
  343.         for(int i = 0; temp->Inf.symbols[i] != temp->Inf.Marker; i++) {
  344.             output_file << temp->Inf.symbols[i];
  345.         }
  346.         temp = temp->next;
  347.         if(temp != nullptr)
  348.             output_file << "  --->" << std::endl;
  349.         else
  350.             output_file << "  --->nullptr";
  351.     }
  352.     output_file.close();
  353. }
  354.  
  355. #ifndef PROGA_3_EL1PROCESSING_H
  356. #define PROGA_3_EL1PROCESSING_H
  357.  
  358. #include "EL1.h"
  359.  
  360. EL1* GetNext(EL1 *lText);
  361.  
  362. #endif //PROGA_3_EL1PROCESSING_H
  363.  
  364. #include "EL1Processing.h"
  365. #include "EL1.h"
  366.  
  367. EL1* GetNext(EL1 *lText) {
  368.     return lText->next;
  369. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement