Проверить правильность расстановки скобок в строке - 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");
}

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

  1. В начале кода определяются функции и библиотеки, которые будут использоваться: Windows.h, Shlobj.h и Stdio.h.
  2. Затем объявляются переменные: FILE f, long sLen, char chBuf, char sPath[MAX_PATH], LPCITEMIDLIST lpItemDList, BROWSEINFO bi.
  3. Создается объект BROWSEINFO с указанием пути, по которому нужно перейти, заголовка диалогового окна, типа окна и флагов.
  4. Если объект LPCITEMIDLIST получен (то есть пользователь выбрал папку или файл), то вызывается функция SHGetPathFromIDList для получения полного пути к выбранному элементу.
  5. Если получен путь к файлу, то открывается файл с помощью функции fopen.
  6. В цикле с помощью функции fseek перемещается позиция файла в начало, затем с помощью функции ftell определяется текущая длина файла (sLen).
  7. Затем снова вызывается функция fseek для возврата позиции файла в начало.
  8. Выделяется память под строку (char *)malloc(sLen).
  9. С помощью функции fread считывается весь файл в выделенную память.
  10. Закрывается файл с помощью функции fclose.
  11. С помощью функции CharToOem конвертируется текст из кодировки UTF-8 в OEM.
  12. Выводится считанный текст.
  13. Затем идет цикл по всем символам в тексте.
  14. Если встречается скобка '(' без соответствующей скочки ')', то это считается ошибкой.
  15. Если встречается скочка ')', то увеличивается счетчик ncls.
  16. Если количество скобок '(' меньше, чем закрывающих скобок ')', то это также считается ошибкой.
  17. Если количество скобок '(' больше, чем закрывающих скобок ')', то это также считается ошибкой.
  18. Если найдены ошибки, то выводится сообщение об ошибке.
  19. Если ошибок нет, то выводится сообщение о правильности ввода.

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


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

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

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