Advertisement
Anton0093

7_4

Nov 5th, 2019
312
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.33 KB | None | 0 0
  1. #include <iostream>
  2. #include <math.h>
  3. int read_number(double* value, const char* prompt, int size_buf, const char* mode);
  4. using namespace std;
  5. class List {
  6. private:
  7.     struct Node {
  8.         int a;
  9.         int b;
  10.         Node* next;
  11.     };
  12.     Node* start; //указатель на первый элемент списка
  13.     Node* p;
  14.     //указатель на текущий элемент списка
  15. public:
  16.     List(int a = 0, int b = 0);// конструктор класса
  17.     ~List();// деструктор класса
  18.     void add(int a, int b);//добавить элемент
  19.     void remove();// удалить элемент
  20.     void show();// показать значение полей
  21.     void change(int a, int b);//поменять значения полей
  22.     void begin();// переместить в начало списка
  23.     void step();//переместить указатель на один элемент вправо
  24.     void showall();//показать весь список
  25.     int find();//поиск элемента
  26. };
  27.  
  28. void List::add(int a, int b) {
  29.     Node* B = new Node;
  30.     B->a = a;
  31.     B->b = b;
  32.     B->next = p->next;
  33.     p->next = B;
  34. };
  35.  
  36. void List::remove() {
  37.     Node* p0 = start;
  38.     if (p0 == p) {
  39.        
  40.         p0 = p0->next;
  41.         delete p;
  42.         p = p0;
  43.         start = p;
  44.     }
  45.     else {
  46.         while (p0->next != p) p0 = p0->next;
  47.        
  48.         p0->next = p->next;
  49.         delete p;
  50.         p = p0;
  51.     }
  52. };
  53.  
  54. void List::show() {
  55.     cout << endl << "(" << p->a << ", " << p->b << "); ";
  56. };
  57.  
  58. void List::change(int a, int b) {
  59.     p->a = a;
  60.     p->b = b;
  61. };
  62.  
  63. void List::step() {
  64.     if (p->next != NULL)
  65.         p = p->next;
  66. };
  67.  
  68. void List::showall() {
  69.     Node* p0 = start;
  70.    
  71.     cout << endl << "Все элементы: ";
  72.     while (p0 != NULL) {
  73.         if (p0 == p) {
  74.             cout << "[" << p0->a << ", " << p0->b << "] ";
  75.         }
  76.         else
  77.             cout << "(" << p0->a << ", " << p0->b << ") ";
  78.         p0 = p0->next;
  79.     }
  80.     cout << endl;
  81. };
  82.  
  83. int List::find(){
  84.     bool isExist = false;
  85.     int a, b;
  86.     Node* p0 = start;
  87.     Node* last = new Node;
  88.    
  89.     do {
  90.         a = p0->a;
  91.         b = p0->b;
  92.         if ((a=0) & (b!=0)) {
  93.             last = p0;
  94.             isExist = true;
  95.         }
  96.         p0 = p0->next;
  97.     } while (p0 != NULL);
  98.    
  99.     if (isExist) {
  100.         p = last;
  101.         return 0;
  102.     }
  103.     else return 1;
  104. };
  105.  
  106. List::List(int a, int b) {
  107.     Node* B = new Node;
  108.     B->a = a;
  109.     B->b = b;
  110.     B->next = NULL;
  111.     start = B;
  112.     p = B;
  113. };
  114.  
  115. List::~List() {
  116.     p = start;
  117.     while (p->next != NULL)
  118.         p = p->next;
  119.     while (p != start)
  120.         List::remove();
  121.     delete start;
  122. }
  123.  
  124. void main_add(List* list) {
  125.     double a, b;
  126.     int status = 0;
  127.    
  128.     cout << endl;
  129.     do {
  130.         status = read_number(&a, "Введите параметр 'а'", 8, "int");
  131.         if (status != 0) cout << "Попробуйте ещё раз." << endl;
  132.     } while (status != 0);
  133.    
  134.     do {
  135.         status = read_number(&b, "Введите параметр 'b'", 8, "int");
  136.         if (status != 0) cout << "Попробуйте ещё раз." << endl;
  137.     } while (status != 0);
  138.    
  139.     list->add(a, b);
  140. }
  141.  
  142. void main_change(List* list) {
  143.     double a, b;
  144.     int status = 0;
  145.    
  146.     cout << endl;
  147.     do {
  148.         status = read_number(&a, "Введите параметр 'а' первого элемента", 8, "int");
  149.         if (status != 0) cout << "Попробуйте ещё раз." << endl;
  150.     } while (status != 0);
  151.    
  152.     do {
  153.         status = read_number(&b, "Введите параметр 'b' первого элемента", 8, "int");
  154.         if (status != 0) cout << "Попробуйте ещё раз." << endl;
  155.     } while (status != 0);
  156.    
  157.     list->change(a, b);
  158. }
  159.  
  160. void List::begin() {
  161.     p = start;
  162. };
  163.  
  164. void main_find(List* list) {
  165.     if (list->find() == 0) {
  166.         cout << endl << "Найденный элемент:" << endl;
  167.         list->show();
  168.         cout << endl;
  169.     }
  170.     else {
  171.         cout << endl << "Элементов, для которых a=0 & b!=0, в списке нет." << endl;
  172.     }
  173. }
  174.  
  175. int read_number(double* value, const char* prompt, int size_buf, const char* mode) {
  176.     using namespace std;
  177.    
  178.     size_t length = 0;
  179.     char* end = NULL;
  180.     char* buf = (char*)malloc(size_buf * sizeof(char));
  181.    
  182.     cout << prompt << ": ";
  183.    
  184.     cin.getline(buf, size_buf + 1);
  185.     if (!cin) {
  186.         cin.clear();
  187.         while (cin.get() != '\n');
  188.         cout << endl << "Ошибка: не вводите больше чем " << size_buf << " символа(ов)." << endl;
  189.         return 1;
  190.     }
  191.    
  192.     int tt = (strchr(buf, '\n') - buf) + 1;
  193.    
  194.     if (tt <= size_buf + 1) {
  195.         double i, f = 0, tmp_d;
  196.         errno = 0;
  197.        
  198.         if (mode == "int") {
  199.             tmp_d = strtod(buf, &end);
  200.             f = modf(tmp_d, &i);
  201.             *value = i;
  202.         }
  203.         if (mode == "double") {
  204.             *value = strtod(buf, &end);
  205.         }
  206.        
  207.         if (strlen(buf) == 0) {
  208.             cout << endl << "Ошибка: введена пустая строка." << endl;
  209.             return 1;
  210.         }
  211.         if (errno != 0 || *end != '\0') {
  212.             cout << endl << "Ошибка: некорректный символ." << endl;
  213.             cout << "\t" << buf << endl;
  214.             printf("\t%*c\n",(int)(end - buf) + 1,  '^');
  215.             return 1;
  216.         }
  217.         if (f > 0) {
  218.             cout << endl << "Ошибка: введите целое число." << endl;
  219.             return 1;
  220.         }
  221.     }
  222.     return 0;
  223. }
  224.  
  225.  
  226. int main(){
  227.     int status=0;
  228.     double a, b;
  229.     double key = 0;
  230.     do {
  231.         status = read_number(&a, "Введите параметр 'а' первого элемента", 8, "int");
  232.         if (status != 0) cout << "Попробуйте ещё раз." << endl;
  233.     } while (status != 0);
  234.    
  235.     do {
  236.         status = read_number(&b, "Введите параметр 'b' первого элемента", 8, "int");
  237.         if (status != 0) cout << "Попробуйте ещё раз." << endl;
  238.     } while (status != 0);
  239.    
  240.     List list(a, b);
  241.     while (key != 9) {
  242.         cout << endl;
  243.         cout << "1.Добавить элемент." << endl;
  244.         cout << "2.Удалить элемент." << endl;
  245.         cout << "3.Показать значения полей текущего элемента." << endl;
  246.         cout << "4.Поменять значения полей текущего элемента." << endl;
  247.         cout << "5.Перейти к первому элементу списка." << endl;
  248.         cout << "6.Перейти к следующему элементу списка." << endl;
  249.         cout << "7.Вывести все элементы списка." << endl;
  250.         cout << "8.Найти последний элемент для которого выполняется a=0 и b!=0." << endl;
  251.         cout << "9.Выход из программы." << endl;
  252.         do {
  253.             status = read_number(&key, "Выберите операцию", 1, "int");
  254.            
  255.             if(status != 0) cout << "Попробуйте ещё раз." << endl;
  256.         }
  257.         while (status != 0);
  258.        
  259.         switch ((int)key) {
  260.             case 1:
  261.                 cout <<endl;
  262.                 cout << "Добавляем элемент..." << endl;
  263.                 main_add(&list);
  264.                 break;
  265.             case 2:
  266.                 cout <<endl;
  267.                 cout << "Удаляем элемент..." << endl;
  268.                 list.remove();
  269.                 break;
  270.             case 3:
  271.                 cout <<endl;
  272.                 cout << "Показываем значение полей..." << endl;
  273.                 list.show();
  274.                 break;
  275.             case 4:
  276.                 cout <<endl;
  277.                 cout << "Меняем значения полей..." << endl;
  278.                 main_change(&list);
  279.                 break;
  280.             case 5:
  281.                 cout <<endl;
  282.                 cout << "Перемещаем в начало списка..." << endl;
  283.                 list.begin();
  284.                 break;
  285.             case 6:
  286.                 cout <<endl;
  287.                 cout << "Перемещаем указатель на один элемент вправо..." << endl;
  288.                 list.step();
  289.                 break;
  290.             case 7:
  291.                 cout <<endl;
  292.                 cout << "Показываем весь список..." << endl;
  293.                 list.showall();
  294.                 break;
  295.             case 8:
  296.                 cout <<endl;
  297.                 cout<<"Находим элемент для котрого выполняется a=0 и b!=0..."<<endl;
  298.                 main_find(&list);
  299.                 break;
  300.             case 9:
  301.                 cout <<endl;
  302.                 cout << "Выход из программы..." << endl;
  303.                 exit(EXIT_SUCCESS);
  304.                 break;
  305.             default:
  306.                 cerr << "Вы выбрали неверный вариант" << endl;
  307.                 exit(EXIT_FAILURE);
  308.         }
  309.     }
  310.     return 0;
  311. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement