Проверить в файле баланс скобок всех видов - C (СИ)

Узнай цену своей работы

Формулировка задачи:

посмотрите плз в чем ошибка
#include <stdio.h>
 
using namespace std;
 
char s[500], str[500];
int r;
bool bad;
 
int main()
{
    gets(str);
    for (int i = 0; str[i] != 0; i++)
    {
        if (str[i] == '(' || str[i] == '[' || str[i] == '{')
            s[r++] = str[i];
        else
            if (str[i] == ')' || str[i] == ']' || str[i] == '}')
            {
                if (r == 0 || (str[i] == ')' && s[r - 1] != '(') || (str[i] == ']' && s[r - 1] != '[') || (str[i] == ']' && s[r - 1] != '['))
                {
                    bad = true;
                    break;
                }
                r--;
            }
            else
                if (r > 0)
                {
                    bad = true;
                    break;
                }
    }
    if (r > 0)
        bad = true;
    printf("%d", bad);
 
}

Решение задачи: «Проверить в файле баланс скобок всех видов»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#define buf 5000
 
int exchange(char bracket)
{   switch (bracket) 
    {   case    '(' : return 1;
        case    '[' : return 2;
        case    '{' : return 3;
        case    ')' : return -1;
        case    ']' : return -2;
        case    '}' : return -3;
        default     : return 0;
    }
}
 
int main()
{   FILE *f = fopen("data.txt","r");
    if (f==NULL) 
    {   perror ("Error opening file");
        getchar();
        exit(1);
    }
    
    int *s = new int[buf];
    char c;
    int cEx, i = 0, found = 0;
 
    do 
    {   c = getc (f);
        cEx = exchange(c);
        if(cEx>0)
        {   s[i] = cEx;
            i++;
        }
        else 
            if(cEx<0)
            {   if(i>0 && (s[i-1]+cEx)==0)
                    i--;
                else
                {   found = 1;
                    break;
                }
            }
    } while (c!= EOF);
 
    if(!i && !found)
        printf("Balance perfect");
    else
        printf("No balance in this file");
 
    getchar();
    return 0;
}

Объяснение кода листинга программы

  1. Включаются необходимые заголовочные файлы
  2. Определяется буферная переменная buf для хранения количества символов в файле
  3. Создается функция exchange для проверки вида скобки и возврата ее числа
  4. Создается функция main для чтения файла и проверки его на баланс скобок
  5. Открывается файл data.txt для чтения
  6. Создается массив s для хранения чисел скобок
  7. Устанавливаются начальные значения переменных cEx, i и found
  8. Запускается цикл do-while для чтения символов из файла
  9. В каждой итерации цикла, считывается очередной символ из файла
  10. Функция exchange вызывается для определения типа скобки
  11. Если символ является скобкой, его число записывается в массив s
  12. Если символ является закрывающей скобкой, проверяется, есть ли соответствующая открывающая скобка в массиве s
  13. Если баланс скобок не соблюден, переменная found устанавливается в 1 и цикл прерывается
  14. После окончания цикла, проверяется, были ли найдены скобки в файле
  15. Если скобки не найдены и баланс скобок соблюден, выводится сообщение Balance perfect
  16. В противном случае выводится сообщение No balance in this file
  17. Программа ожидает нажатия любой клавиши для завершения работы
  18. В конце работы программы возвращается 0, что означает успешное завершение работы программы

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.714 из 5
Похожие ответы