Проверить правильность расстановки скобок в строке - C (СИ)
Формулировка задачи:
прошу помочь доделать задачу:Задан текст, в котором присутствующие скобки. Проанализировать его с целью выявления и локализации ошибок в использовании скобок. Возможны три типа ошибок :
а) несоответствие скобок по количествам;
б) закрывающая скобка расположена к открывающей;
в) отсутствующий текст между скобками.
Результатом работы программы должно быть сообщение о типах допущенных ошибок и их место в тексте (номер строки).задача сама работает, но проблема в том что мы вводим только одну строку.Прошу помочь с:переводом на следующую строку и поиск ошибок в двух строках.Возможна любая комбинация клавиш для перехода на следующую строку.
благодарю за помощь
#include "stdafx.h"
#include <iostream>
#include <math.h>
#include <string.h>
#include <conio.h>
#include <stdio.h>
#pragma warning (disable:4996)
using namespace std;
int finderrors (char *str);
void delspacebeg (char a[20]);
void delspaceend(char a[20]);
char *ptr;
void main()
{
char a[20];
gets(a);
puts(a);
delspacebeg;
delspaceend;
switch (finderrors(a))
{case 1: cout<<"missing text in brakets"<<endl;
break;
case 2:cout<<"error, ) before ("<<endl;
break;
case 3:cout<<"error,invaild quantity of brakets"<<endl;
break;
default :
cout<<"there is no errors"<<endl;
break;
}getch();
}
int finderrors (char *str)
{ int brk=0;
int codeerrors=0;
bool leftrighttreake=false;
for (int i=0;i<strlen(str);i++)
{if (str[i]=='(')
brk++;
if (str[i]==')')
brk--;
if (str[i-1]=='(' && str[i]==')')
codeerrors=1;
if (str[i]=='(' && leftrighttreake==false)
leftrighttreake=true;
if (str[i]==')' && leftrighttreake == true)
leftrighttreake=false;
}
if (brk !=0)
codeerrors =3;
if (leftrighttreake==true)
codeerrors = 2;
return codeerrors;
}
void delspacebeg (char a[20])
{ int k=0;
int i;
while (a[0]==' ')
{k++;
for (i=0;i<strlen(a)-k;i++);
a[i]=a[i+1];
}
printf ("number of spases is: %d \n \n",k);
a[strlen(a)-k]='\0';
puts(a);
}
void delspaceend(char a[20])
{
ptr=strrchr(a,' ');
if (ptr != 0)
while(a[ptr-a]==' ' && a[ptr-a+1]=='\0')
{a[ptr-a]='\0';
ptr=strrchr(a,' ');
}
puts(a);
}Решение задачи: «Проверить правильность расстановки скобок в строке»
textual
Листинг программы
#include <windows.h>
#include <shlobj.h>
#include <stdio.h>
void main()
{
FILE * f;
long sLen;
char * chBuf;
char sPath[MAX_PATH];
LPCITEMIDLIST lpItemDList;
BROWSEINFO bi = {NULL, NULL, sPath,
"Выберите файл с проверяемым текстом",
BIF_DONTGOBELOWDOMAIN|BIF_BROWSEINCLUDEFILES,
NULL,
NULL,
0
};
if((lpItemDList = SHBrowseForFolder(&bi)))
if(SHGetPathFromIDList(lpItemDList, sPath))
{
if((f = fopen(sPath,"rb+")))
{
fseek(f,0,SEEK_END);
sLen = ftell(f);
fseek(f,0,SEEK_SET);
chBuf = (char *)malloc(sLen);
fread(chBuf,1,sLen,f);
fclose(f);
CharToOem((LPCTSTR)chBuf,chBuf);
printf("Ishodni text :\r\n%s\r\n",chBuf);
}
}
int nopn = 0, ncls = 0;
bool bNUM = true;
bool bTXT = true;
bool bPOS = true;
for(int i = 0; i < sLen; i++)
{
if(chBuf[i] == '(')
{
nopn++;
if(i + 1 < sLen)
if(chBuf[i + 1] == ')')
{
bTXT = false;
break;
}
}
if(chBuf[i] == ')')
ncls++;
if(nopn < ncls)
{
bPOS = false;
break;
}
}
if(!bTXT)
printf("Pustie scobki pos : %d\r\n",i);
else
if(!bPOS)
printf("Naryshen poryadok skobok pos : %d\r\n",i);
else
if(nopn != ncls)
bNUM = false;
else
if(!bNUM)
printf("Kolichestvo otkr i zakr skobok razlichno !");
else
printf("Stroka vvedena verno\r\n");
}
Объяснение кода листинга программы
- В начале кода определяются функции и библиотеки, которые будут использоваться: Windows.h, Shlobj.h и Stdio.h.
- Затем объявляются переменные: FILE f, long sLen, char chBuf, char sPath[MAX_PATH], LPCITEMIDLIST lpItemDList, BROWSEINFO bi.
- Создается объект BROWSEINFO с указанием пути, по которому нужно перейти, заголовка диалогового окна, типа окна и флагов.
- Если объект LPCITEMIDLIST получен (то есть пользователь выбрал папку или файл), то вызывается функция SHGetPathFromIDList для получения полного пути к выбранному элементу.
- Если получен путь к файлу, то открывается файл с помощью функции fopen.
- В цикле с помощью функции fseek перемещается позиция файла в начало, затем с помощью функции ftell определяется текущая длина файла (sLen).
- Затем снова вызывается функция fseek для возврата позиции файла в начало.
- Выделяется память под строку (char *)malloc(sLen).
- С помощью функции fread считывается весь файл в выделенную память.
- Закрывается файл с помощью функции fclose.
- С помощью функции CharToOem конвертируется текст из кодировки UTF-8 в OEM.
- Выводится считанный текст.
- Затем идет цикл по всем символам в тексте.
- Если встречается скобка '(' без соответствующей скочки ')', то это считается ошибкой.
- Если встречается скочка ')', то увеличивается счетчик ncls.
- Если количество скобок '(' меньше, чем закрывающих скобок ')', то это также считается ошибкой.
- Если количество скобок '(' больше, чем закрывающих скобок ')', то это также считается ошибкой.
- Если найдены ошибки, то выводится сообщение об ошибке.
- Если ошибок нет, то выводится сообщение о правильности ввода.