Проверить в файле баланс скобок всех видов - 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;
}
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы
- Определяется буферная переменная buf для хранения количества символов в файле
- Создается функция exchange для проверки вида скобки и возврата ее числа
- Создается функция main для чтения файла и проверки его на баланс скобок
- Открывается файл
data.txtдля чтения - Создается массив s для хранения чисел скобок
- Устанавливаются начальные значения переменных cEx, i и found
- Запускается цикл do-while для чтения символов из файла
- В каждой итерации цикла, считывается очередной символ из файла
- Функция exchange вызывается для определения типа скобки
- Если символ является скобкой, его число записывается в массив s
- Если символ является закрывающей скобкой, проверяется, есть ли соответствующая открывающая скобка в массиве s
- Если баланс скобок не соблюден, переменная found устанавливается в 1 и цикл прерывается
- После окончания цикла, проверяется, были ли найдены скобки в файле
- Если скобки не найдены и баланс скобок соблюден, выводится сообщение
Balance perfect - В противном случае выводится сообщение
No balance in this file - Программа ожидает нажатия любой клавиши для завершения работы
- В конце работы программы возвращается 0, что означает успешное завершение работы программы