Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
mr.man
0 / 0 / 0
Регистрация: 15.05.2009
Сообщений: 14
1

Проверить правильность расстановки скобок в строке

11.06.2009, 16:03. Просмотров 876. Ответов 2
Метки нет (Все метки)

прошу помочь доделать задачу:Задан текст, в котором присутствующие скобки. Проанализировать его с целью выявления и локализации ошибок в использовании скобок. Возможны три типа ошибок :
а) несоответствие скобок по количествам;
б) закрывающая скобка расположена к открывающей;
в) отсутствующий текст между скобками.
Результатом работы программы должно быть сообщение о типах допущенных ошибок и их место в тексте (номер строки).задача сама работает, но проблема в том что мы вводим только одну строку.Прошу помочь с:переводом на следующую строку и поиск ошибок в двух строках.Возможна любая комбинация клавиш для перехода на следующую строку.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#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);
   }
благодарю за помощь
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.06.2009, 16:03
Ответы с готовыми решениями:

Проверить правильность расстановки скобок в строке
Здравствуйте, помогите написать программу на языке СИ Ввести с клавиатуры строку, содержащую...

Проверить правильность расстановки скобок во введенной строке
Проверить правильность расстановки скобок в введенное строке, учитывая круглые, квадратные и...

Проверить правильность расстановки скобок
Не знаю в чем ошибка, программа не работает. Подскажите пожалуйста)) /* Проверить правильность...

Проверить правильность расстановки скобок и выражений
Дано скобочное выражение, оканчивающееся точкой с запятой. Проверить правильность расстановки ...

Дано скобочное выражение, проверить правильность расстановки скобок
дано скобочное выражение заканчивающееся точкой с запятой проверить правильность расстановки скобок...

2
Gravity
570 / 564 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
11.06.2009, 16:25 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <iostream>
#include <math.h>
#include <string.h>
#include <stdio.h>
using namespace std;
 
int finderrors (char *str);
void delspacebeg (char *a);
void delspaceend(char *a);
void readstr(char *, size_t);
char *ptr;
 
int main(void)
{ 
    char a[256];
   
    readstr(a, sizeof(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;
    }
}
 
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)
{
    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)
{ 
    ptr=strrchr(a,' ');
    if (ptr != 0)
        while(a[ptr-a]==' ' && a[ptr-a+1]=='\0') {
            a[ptr-a]='\0';
            ptr=strrchr(a,' ');
        }
    puts(a);
}
 
void readstr(char *s, size_t len)
{
    int i, c;
    
    for(i = 0; i < len-1 && (c = getchar()) != '*'; i++)
        s[i] = c;
    s[i] = '\0';
}
Ввод заканчивается после символа '*'.
1
YurA_280784
Заблокирован
11.06.2009, 17:27 3
Я решил по своему написать, вот что вышло. Решил что исходный текст буд в файле, так и проще для дебага было(не вбивать же мне всякий раз строку), и с вводом мне кацца проще, файлы !bNUM.txt, !bPOS.txt, !bTXT.txt содержат ошибки, которые в самих этих файлах и написаны, ну а файл ОК - понятное дело тот где всё ОК))))
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#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
Миниатюры
Проверить правильность расстановки скобок в строке   Проверить правильность расстановки скобок в строке   Проверить правильность расстановки скобок в строке  

Проверить правильность расстановки скобок в строке  
Вложения
Тип файла: txt !bNUM.txt (79 байт, 13 просмотров)
Тип файла: txt !pTXT.txt (29 байт, 12 просмотров)
Тип файла: txt !bPOS.txt (73 байт, 13 просмотров)
Тип файла: txt OK.txt (33 байт, 12 просмотров)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.06.2009, 17:27

Проверить правильность расстановки круглых и квадратных скобок в выражениях
дана строка символов проверить правильность расстановки круглых и квадратных скобок в выражениях

Пример Дана строка символов. Проверьте правильность расстановки в ней круглых скобок
Если скобок больше справа, то все работает(т.к условие прописано). Но вот не пойму как прописать...

Проверить правильность скобочной структуры, составленной из нескольких типов скобок
Я пока в процессе изучение Си и поэтому уделяю большое время на задачи что бы во много разобратся...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru