Проанализировать правильность расставленных скобок - C (СИ)
Формулировка задачи:
не компилирует
#include <stdio.h>
#include <string.h>
int main()
{
char instr[80], outstr[80];
int i, j, posLastOpenBracket = -1, posFirstCloseBracket = -1, sizeinstr;
puts("Input string:");
gets(instr);
for(i = 0; i < strlen(instr); i++)
if(instr[i] == '{')
posLastOpenBracket = i;
if(posLastOpenBracket == -1)
{
puts("Error.");
return;
}
for(i = posLastOpenBracket + 1; i < strlen(instr); i++)
if(instr[i] =='}')
{
posFirstCloseBracket = i;
break;
}
if(posFirstCloseBracket < posLastOpenBracket)
{
puts("Error");
return;
}
for(i = posLastOpenBracket + 1, j=0; i < posFirstCloseBracket; i++, j++)
outstr[j]=instr[i];
outstr[j] = '\0';
for(i = posFirstCloseBracket; i <= strlen(instr); i++)
{
instr[i - (posFirstCloseBracket - posLastOpenBracket) + 1] = instr[i];
}
puts(instr);
puts(outstr);
}Решение задачи: «Проанализировать правильность расставленных скобок»
textual
Листинг программы
#include <stdio.h>
#include <string.h>
int main()
{
char instr[80], outstr[80];
int i, j, posLastOpenBracket = -1, posFirstCloseBracket = -1, sizeinstr;
puts("Input string:");
gets(instr);
for(i = 0; i < strlen(instr); i++)
if(instr[i] == '{')
posLastOpenBracket = i;
if(posLastOpenBracket == -1)
{
puts("Error.");
return;
}
for(i = posLastOpenBracket + 1; i < strlen(instr); i++)
if(instr[i] =='}')
{
posFirstCloseBracket = i;
break;
}
if(posFirstCloseBracket < posLastOpenBracket)
{
puts("Error");
return;
}
for(i = posLastOpenBracket + 1, j=0; i < posFirstCloseBracket; i++, j++)
outstr[j]=instr[i];
outstr[j] = '\0';
for(i = posFirstCloseBracket; i <= strlen(instr); i++)
{
instr[i - (posFirstCloseBracket - posLastOpenBracket) + 1] = instr[i];
}
puts(instr);
puts(outstr);
getch();
}
Объяснение кода листинга программы
- В начале программы объявляются две строки:
instrиoutstr, каждая из которых может содержать до 80 символов. - Затем определяются переменные
i,j,posLastOpenBracket,posFirstCloseBracketиsizeinstr. - Далее программа просит ввести строку и сохраняет ее в переменной
instr. - Затем происходит поиск позиции последнего открывающего скобка в цикле, который итерируется по каждому символу строки
instr. - Если открывающая скобка не найдена, программа выводит сообщение об ошибке и завершает работу.
- В противном случае, в цикле ищутся закрывающие скобки. Если они найдены, то фиксируется позиция первой закрывающей скобки. Если закрывающие скобки не найдены, программа продолжает поиск.
- Если первая закрывающая скобка находится перед последней открывающей скобкой, программа выводит сообщение об ошибке и завершает работу.
- В противном случае, в цикле копируются символы из исходной строки в выходную строку, начиная с позиции последней открывающей скобки и до, но не включая первую закрывающую скобку.
- Затем символы исходной строки, начиная с позиции первой закрывающей скобки и до последней открывающей скобки, перемещаются в начало строки.
- Выводятся исходная и выходная строки.
- Программа завершается.