Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
1 / 1 / 0
Регистрация: 17.03.2009
Сообщений: 17
1

Баланс скобок в файле

29.03.2009, 23:25. Показов 2889. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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
#include<fstream.h>
 
#include<iostream.h>
#include<string.h>
#include<conio.h>
 
#include<stdio.h>
int pkzs(char*,char);
 
 
int main(void)
 {
  clrscr();
  char s[82];
 
  FILE *f;
  f=fopen("in.txt","r");
  fscanf(f,"%s",s);
  int n = 0;
  while (!feof(f))
  {
   n=1;
   break;
   }
   if(n == 0)
 
 { cout << " File Pyct";return 0; }
 
 
 
 
  int n1,n2;
  n1=pkzs(s,'(');
 
  n2=pkzs(s,')');
  if(n1==n2) cout<<"Balans skobok est'";
  else cout<<"Balansa skobok net'";
return 0; }
 
 
int pkzs(char*s,char c)
 {
  int n=0;
   while(1)
   {
    s=strchr(s,c);
    if(s==NULL) break;
    s+=1;
    n+=1;
   }
  return n;
 }
Данная прога определяет баланс скобок в файле...Она правильно работает но проверка на пустоту файла не хочет состыковываться....и всегда выдает пустой файл...
Помогите чем сможите
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.03.2009, 23:25
Ответы с готовыми решениями:

Баланс фигурных скобок в файле
Вообщем нужно прочитать текст (любая программа, в файле name.txt) из файла и проверить баланс...

Проверить баланс скобок в текстовом файле
1. из файла f1 выводится текст (текст со скобками) 2. проверяется соответствие скобок 3. если не...

Баланс скобок
Люди может укажите мне на ошибку в программе по которой не находит баланс..? #include&lt;iostream.h&gt;...

Баланс скобок
проверить правильность расстановки скобок, используя контейнерные типы(стек)

15
CEO
Эксперт С++
2258 / 1248 / 57
Регистрация: 16.03.2009
Сообщений: 3,588
30.03.2009, 00:29 2
Цитата Сообщение от Insanehead Посмотреть сообщение
[CPP]
int main(void)
{
clrscr();
char s[82];

FILE *f;
f=fopen("in.txt","r");
fscanf(f,"%s",s);
int n = 0;
while (!feof(f))
{
n=1;
break;
}
if(n == 0)

{ cout << " File Pyct";return 0; }
1)Чтение данных (строки) в буфер идет вне цикла
2) если так и нужно (текст имеет длину менее 81+\0), то цыкл и проверка
while (!feof(f))
{
n=1;
break;
}
if(n == 0)

{ cout << " File Pyct";return 0; }
не имеют смысла (всегда будет достигатся конец файла, даже если он не пуст).

3) Если все должно так быть (тест менее 82 символов) то проверку на пустоту предлагаю такую.

C++
1
2
3
4
int n;
n=strlen(s);
if (n==0)
{printf ("File empty"); return 0;}
0
1 / 1 / 0
Регистрация: 17.03.2009
Сообщений: 17
30.03.2009, 00:43  [ТС] 3
Код
#include<string.h>
#include<conio.h>
#include<stdio.h>
int pkzs(char*,char);


int main(void)
 {
  clrscr();
  char s[82];

  FILE *f;
  f=fopen("in.txt","r");
  fscanf(f,"%s",s);
  int n;
  n=strlen(s);
  if(n==0)
   { printf ("File Pyct "; return 0;)
  int n1,n2;
  n1=pkzs(s,'(');
  n2=pkzs(s,')');
  if(n1==n2) cout<<"Balans skobok est'";
  else cout<<"Balansa skobok net'";
return 0; }


int pkzs(char*s,char c)
 {
  int n=0;
   while(1)
   {
    s=strchr(s,c);
    if(s==NULL) break;
    s+=1;
    n+=1;
   }
  return n;
 }


при таком коде как ты мне показал...всё равное если файл пуст прога высвечивает что баланс скобок есть...
0
CEO
Эксперт С++
2258 / 1248 / 57
Регистрация: 16.03.2009
Сообщений: 3,588
30.03.2009, 00:56 4
эх, все за вас делать должен Рабочий код:

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
#include<string.h>
#include<conio.h>
#include<stdio.h>
#include<fstream.h>
 
int pkzs(char*,char);
 
 
int main()
{
clrscr();
char *s;
s="";
FILE *f;
f=fopen("in.txt","r");
fscanf(f,"%s",s);
int n;
n=strlen(s);
if(n==0)
{ printf ("File Pyct ");getch(); return 0;} ;
int n1,n2;
n1=pkzs(s,'(');
n2=pkzs(s,')');
if(n1==n2&&n1!=0) cout<<"Balans skobok est'";
else {if (n1!=0) cout<<"Balansa skobok net'";
else cout<<"Skobok net!";
};
 
getch();
return 0; }
 
 
int pkzs(char*s,char c)
{
int n=0;
while(1)
{
s=strchr(s,c);
if(s==NULL) break;
s+=1;
n+=1;
}
return n;
}
0
1 / 1 / 0
Регистрация: 17.03.2009
Сообщений: 17
30.03.2009, 01:02  [ТС] 5
спс чувак...долго я мучался с этой ерундой
0
CEO
Эксперт С++
2258 / 1248 / 57
Регистрация: 16.03.2009
Сообщений: 3,588
30.03.2009, 01:04 6
как гритса -"Тяжело в учении-легко на сесии"
0
Любитель давать советы
342 / 135 / 14
Регистрация: 12.01.2009
Сообщений: 511
30.03.2009, 08:11 7
А алгоритм у Вас неправильный. Например, он найдет правильный баланс для строки ")("
0
1 / 1 / 0
Регистрация: 17.03.2009
Сообщений: 17
31.03.2009, 10:15  [ТС] 8
Alexiski так это и должно быть балансом скобок ..число открывающихся равно числу закрывающихся.....проблема в том что всё работает но если файл тупо набить буквами то он их на экран подаёт ...а надо бы ошибку.
0
11 / 11 / 0
Регистрация: 31.03.2009
Сообщений: 69
01.04.2009, 11:27 9
Цитата Сообщение от Alligieri Посмотреть сообщение
эх, все за вас делать должен Рабочий код:

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
#include<string.h>
#include<conio.h>
#include<stdio.h>
#include<fstream.h>
 
int pkzs(char*,char);
 
 
int main()
{
clrscr();
char *s;
s="";
FILE *f;
f=fopen("in.txt","r");
fscanf(f,"%s",s);
int n;
n=strlen(s);
if(n==0)
{ printf ("File Pyct ");getch(); return 0;} ;
int n1,n2;
n1=pkzs(s,'(');
n2=pkzs(s,')');
if(n1==n2&&n1!=0) cout<<"Balans skobok est'";
else {if (n1!=0) cout<<"Balansa skobok net'";
else cout<<"Skobok net!";
};
 
getch();
return 0; }
 
 
int pkzs(char*s,char c)
{
int n=0;
while(1)
{
s=strchr(s,c);
if(s==NULL) break;
s+=1;
n+=1;
}
return n;
}
Кстати, неправильно!
В строчке 13 пишешь
s="";
, а потом в строке 16 записываешь в пустую строку!И куда же это всё запишется?Вот из-за этого и бывают вылеты программ и ругают не программиста, который коряво написал, а язык C/C++, который позволяет такие конструкции.
мне кажется, IMHO, нужно вводить символы по одному и проследить ситуацию, когда символ ) встречается раньше, чем был хотя бы один (
и вести подсчет текущей вложенности скобок, как только, она станет отрицательна, значит аварийный выход, дальше скобки можно не считать, потому что появилась ) которая не открывалась.
(Т.е. тут не нужно использовать строки, достаточно одного символа и счетчика вложенности, который то увеличивается, то уменьшается, а чаще остается неизменным)
Если после ввода всего файла баланс опять!=0 то опять ошибка баланса
main() должна возвращать 0 только если баланс =0, напр. 1 если баланс отрицательный, 2 если положительный, 4, если не удалось открыть файл
0
CEO
Эксперт С++
2258 / 1248 / 57
Регистрация: 16.03.2009
Сообщений: 3,588
01.04.2009, 11:38 10
Цитата Сообщение от Yevgenijz Посмотреть сообщение
Кстати, неправильно!
В строчке 13 пишешь , а потом в строке 16 записываешь в пустую строку!И куда же это всё запишется?Вот из-за этого и бывают вылеты программ и ругают не программиста, который коряво написал, а язык C/C++, который позволяет такие конструкции.
мне кажется, IMHO, нужно вводить символы по одному и проследить ситуацию, когда символ ) встречается раньше, чем был хотя бы один (
и вести подсчет текущей вложенности скобок, как только, она станет отрицательна, значит аварийный выход, дальше скобки можно не считать, потому что появилась ) которая не открывалась.
(Т.е. тут не нужно использовать строки, достаточно одного символа и счетчика вложенности, который то увеличивается, то уменьшается, а чаще остается неизменным)
Если после ввода всего файла баланс опять!=0 то опять ошибка баланса
main() должна возвращать 0 только если баланс =0, напр. 1 если баланс отрицательный, 2 если положительный, 4, если не удалось открыть файл
ну да, у себя я в компиляторе эту ошибочку поправил и условия немного поменял - но думал что автор темки сам поправит где надо(ну надо ж дать человеку подумать). А предложенный вами вариант - пробовал, немного иначе правда, вышло немного громоздко потому и не выкладывал код.
0
Заблокирован
01.04.2009, 13:02 11
Alligieri, лови прогу. Честно твоя как-то длинно написана (я её чуток модернизировал)
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
#include <iostream.h>
#include <malloc.h>
#include <string.h>
#include <conio.h>
#include <stdio.h>
 
 
int pkzs(char *,char); 
 
int main()
{
    char *s;
    FILE *f;
    long fLen;
    if((f=fopen("in.txt","rb+")))
    {
        fseek(f,0,SEEK_END);
        fLen = ftell(f);
        fseek(f,0,SEEK_SET);
        if(0 < fLen)
        {
            s = (char *)malloc(fLen);
            fscanf(f,"%s",s);
        }
        else
            cout<<"File pyst\r\n";
        fclose(f);
    }
    int n1 = 0,n2 = 0;
    if(s)//Если мы что-то прочли из файлика
    {
        n1 = pkzs(s,'(');
        n2 = pkzs(s,')');
        if(n1 == 0 && n2 == 0)
            cout<<"File ne soderzhit skobok\r\n";
        else
            if(n1 == n2)
                cout<<"Balans skobok vipolnyaetsya\r\n";
            else
                cout<<"File imeet nepravil'ni balans skobok !\r\n";
//#ifndef _DEBUG//Сделал потому что для Debug-a free - глючит
//      free((void *)s);
//#endif
    }
    cin>>n1;
    return 0; 
} 
 
int pkzs(char*s,char c)
{
    int n = 0;
    char *chBuf = strchr(s,c);
    while(chBuf)
    {
        n++;
        chBuf = strchr(chBuf + 1,c);
    }
    return n;
}
0
Заблокирован
01.04.2009, 13:06 12
Чёто код мой в тегах побородился
Кидаю исходник
Вложения
Тип файла: rar test36.cpp.rar (587 байт, 18 просмотров)
0
11 / 11 / 0
Регистрация: 31.03.2009
Сообщений: 69
01.04.2009, 13:41 13
примерно так
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
#define OK 0
// код успешного завершения
#include <stdio.h>
void analize(int *BALANCE,char c);
int main()
{
 const errstr[]="Баланс скобок не соблюден\n";
 const zakstr[]="Закрывающих скобок больше\n";
 int c,balans=0;
 while((c=getchar)!=EOF){ //воспользуюсь тем, что в качестве 
                                     // стандартного ввода можно использовать файл,
                                     // а не обязательно клавиатуру
   analize(&balans,(char)c);
   if(balans<0){ // ) больше
    printf(errstr);
    printf(zakstr);
    printf("Ошибка обнаружена до конца файла");
    return 3; // если не доходя до конца файла обнаружили
                //что закр. скобке не соответствует откр.
   }
 } // endwhile
 printf("файл проанализирован полностью\n");
 if(balans<0){ // ) больше
  printf(zakstr);
  printf(errstr);
  return 1; // если дойдя до конца файла обнаружили
                //что закр. скобке не соответствует откр.
 }
 if(balans==0){
  printf("Скобки сбалансированы\n);
  return OK;}
// теперь остался случай, когда откр скобок больше
 printf(errstr);
 printf("Открывающих скобок больше");
 return 2;
}
void analize(int *BALANCE,char c)
{
#define balans (*BALANCE)
// это, чтобы было понятнее, что это баланс
// и обращаемся к нему по адресу, чтобы при изменении
// он изменился бы и в вызывающей функции
 if(c==')') {
  --balans; // если закр. скобка, уменьшаем баланс
  return;
 }
 if(c=='(') 
  ++balans; // если откр. скобка, увеличиваем баланс
// в противном случае ничего не делаем  
}
запускать, указав в команде запуска program.exe <file.txt
0
1 / 1 / 0
Регистрация: 17.03.2009
Сообщений: 17
02.04.2009, 18:48  [ТС] 14
Ребят на самом деле мне надо использовать string (по заданию) так же есть весьма интересная ошибка.....ввожу в файл простой набор букв и они подаются на экран....мне оч стало интересно почему и откуда может это высвечиваться на экран....так же если я ввожу (asdadasda) asd(asdada) то опять всё выводится на экран без вывода существования баланса....что можете посоветовать?

Добавлено через 8 минут 5 секунд
сорри всё попутал юра спс....всё работает.
0
CEO
Эксперт С++
2258 / 1248 / 57
Регистрация: 16.03.2009
Сообщений: 3,588
02.04.2009, 19:32 15
Цитата Сообщение от YurA_280784 Посмотреть сообщение
Alligieri, лови прогу. Честно твоя как-то длинно написана (я её чуток модернизировал)
Чтот мне твоя прога короче не кажется
0
1 / 1 / 2
Регистрация: 01.04.2010
Сообщений: 46
05.04.2010, 16:13 16
Вот мой вариант:
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
#include "stdafx.h"
#include <iostream>
#include <malloc.h>
#include <string.h>
#include <conio.h>
#include <stdio.h>
 using namespace std;
 
 
int pkzs(char *,char); 
 
void main()
{
        setlocale (LC_ALL, "Russian_Russia.1251");
        char *s;
        FILE *f;
        long fLen;
        if((f=fopen("C:\\file.txt","rb+")))
        {
                fseek(f,0,SEEK_END);
                fLen = ftell(f);
                fseek(f,0,SEEK_SET);
                if(0 < fLen)
                {
                        s = (char *)malloc(fLen);
                        fscanf(f,"%s",s);
                }
                else
                        cout<<"Файл пуст!\r\n";
                fclose(f);
        }
        int n1 = 0,n2 = 0;
        if(s)//Если мы что-то прочли из файлика
        {
                n1 = pkzs(s,'(');
                n2 = pkzs(s,')');
                if(n1 == 0 && n2 == 0)
                        cout<<"Файл не содержит скобок!\r\n";
                else
                        if(n1 == n2)
                                cout<<"Баланс скобок в файле (C:\\file.txt) выполняется!\r\n";
                        else
                                cout<<"Файл (C:\\file.txt) не имеет баланса скобок!\r\n";
//#ifndef _DEBUG//Сделал потому что для Debug-a free - глючит
//              free((void *)s);
//#endif
        }
        cin>>n1; 
        system ("pause");
} 
 
int pkzs(char*s,char c)
{
        int n = 0;
        char *chBuf = strchr(s,c);
        while(chBuf)
        {
                n++;
                chBuf = strchr(chBuf + 1,c);
        }
        return n;
        system ("pause");
}
0
05.04.2010, 16:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.04.2010, 16:13
Помогаю со студенческими работами здесь

Баланс скобок
Помогите пожалуйста!!! Собственно задание: Текст в файле содержит многократно вложенные круглые...

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

Баланс скобок
Добавьте плиз условие чтоб )(-говорило что не баланс..я прост незнаю #include &lt;stdio.h&gt;...

Баланс круглых скобок
Проверить, соблюдается ли в тексте баланс круглых скобок. Для каждой открывающей скобки ‘(‘ должна...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru