Проверить правильность расстановки скобок в строке - 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.
- Если количество скобок '(' меньше, чем закрывающих скобок ')', то это также считается ошибкой.
- Если количество скобок '(' больше, чем закрывающих скобок ')', то это также считается ошибкой.
- Если найдены ошибки, то выводится сообщение об ошибке.
- Если ошибок нет, то выводится сообщение о правильности ввода.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д