Advertisement
Guest User

Untitled

a guest
Apr 8th, 2020
203
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.12 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <conio.h> // для функции gets
  4.  
  5. #define n 100 // максимальная длина строки
  6.  
  7. int main(){
  8.   int i = 0, max = -1, s[n]; // мах имеет значение -1, и почему так будет позже. последняя переменная для индексов открывающих скобок
  9.   char string[n], open[3][2] = {"(", "{", "["}, close[3][2] = {")", "}", "]"}; // сама строка и массивы со скобками
  10.   printf("Vvedite stroku: ");
  11.   gets(string); // функция для ввода строк с пробелами. по идее не должно быть вопросов у препода
  12.   while(string[i] != '\0'){ // любая строка кончается символом \0, так сказать проверяем строку, пока не встретится конец
  13.     int in_open = 0, in_close = 0, j, oi, ci; // логические переменные, чтобы узнать, принадлежит ли текущий символ одному из массивов
  14.     // по названию думаю понятно. j для цикла. oi и ci - open_index, close_index - индексы скобок в массивах (open/close)
  15.     for(j = 0; j < 3; j++) // проверка на входимость текущего символа строки в массив открывающих скобок
  16.       if(string[i] == open[j][0]){
  17.         in_open = 1; // если соответствует одной из скобок, то логическая переменная = 1
  18.         oi = j; // присвоение индекса скобки
  19.         break; // и выход из цикла проверки
  20.       }
  21.     if(in_open){ // если символ входил в открывающие скобки
  22.       s[++max] = oi; // заполняем первый элемент. для этого нужно было в начале мах = -1 ( если не знаешь, чем отличается ++х от х++ напишешь)
  23.       i++; // переходим к следущему символу
  24.       continue; // и пропускаем то, что будет дальше. ведь если текущий символ - открывающая скобка, то он не может быть закрывающей
  25.     }
  26.  
  27.     for(j = 0; j < 3; j++) // аналогично проверяем символ на закрывающую скобку.
  28.       if(string[i] == close[j][0]){
  29.         in_close = 1;
  30.         ci = j;
  31.         break;
  32.       }
  33.     if(!in_close){ // если текущий символ не скобка - идем дальше.
  34.       i++;
  35.       continue;
  36.     }
  37.  
  38.     if(s[max] != ci){ // теперь самое главное. если индекс последней открывающей скобки не равен индексу текущей закрывающей (поэтому они симметричны)
  39.       printf("Balans ne soblyuden!\n"); // выводим отрицательный результат
  40.       return 0; // и завершаем работу программы, потому что дальше проверять нечего. ведь уже не верно, смысла нет
  41.     }
  42.     else max--; // если все четко, считаем, что последняя открывающая скобка нас больше не интересует
  43.  
  44.     i++; // это на случай, если текущий символ вообще не является никакой скобкой или только что выполнилась эта строка - else max--;
  45.   }
  46.  
  47.   printf("Balans soblyuden!\n"); // если цикл выполнился до конца строки и программа дошла до этой строки - значит баланс соблюден.
  48.  
  49.   return 1; // ну и завершение программы. можешь поставить числа одинаковые. вот тебе наглядное объяснение зачем нужен ретурн.
  50. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement