Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Insanehead
1 / 1 / 0
Регистрация: 17.03.2009
Сообщений: 17
29.03.2009, 23:25     Баланс скобок в файле #1
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;
 }
Данная прога определяет баланс скобок в файле...Она правильно работает но проверка на пустоту файла не хочет состыковываться....и всегда выдает пустой файл...
Помогите чем сможите
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.03.2009, 23:25     Баланс скобок в файле
Посмотрите здесь:

C++ Баланс скобок
Баланс скобок C++
C++ Баланс скобок
C++ Проверить баланс скобок
Баланс круглых скобок C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Alligieri
CEO
Эксперт C++
 Аватар для Alligieri
2246 / 1235 / 24
Регистрация: 16.03.2009
Сообщений: 3,581
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;}
Insanehead
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;
 }


при таком коде как ты мне показал...всё равное если файл пуст прога высвечивает что баланс скобок есть...
Alligieri
CEO
Эксперт C++
 Аватар для Alligieri
2246 / 1235 / 24
Регистрация: 16.03.2009
Сообщений: 3,581
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;
}
Insanehead
1 / 1 / 0
Регистрация: 17.03.2009
Сообщений: 17
30.03.2009, 01:02  [ТС]     Баланс скобок в файле #5
спс чувак...долго я мучался с этой ерундой
Alligieri
CEO
Эксперт C++
 Аватар для Alligieri
2246 / 1235 / 24
Регистрация: 16.03.2009
Сообщений: 3,581
30.03.2009, 01:04     Баланс скобок в файле #6
как гритса -"Тяжело в учении-легко на сесии"
Alexiski
Любитель давать советы
 Аватар для Alexiski
338 / 130 / 2
Регистрация: 12.01.2009
Сообщений: 511
30.03.2009, 08:11     Баланс скобок в файле #7
А алгоритм у Вас неправильный. Например, он найдет правильный баланс для строки ")("
Insanehead
1 / 1 / 0
Регистрация: 17.03.2009
Сообщений: 17
31.03.2009, 10:15  [ТС]     Баланс скобок в файле #8
Alexiski так это и должно быть балансом скобок ..число открывающихся равно числу закрывающихся.....проблема в том что всё работает но если файл тупо набить буквами то он их на экран подаёт ...а надо бы ошибку.
Yevgenijz
11 / 11 / 1
Регистрация: 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, если не удалось открыть файл
Alligieri
CEO
Эксперт C++
 Аватар для Alligieri
2246 / 1235 / 24
Регистрация: 16.03.2009
Сообщений: 3,581
01.04.2009, 11:38     Баланс скобок в файле #10
Цитата Сообщение от Yevgenijz Посмотреть сообщение
Кстати, неправильно!
В строчке 13 пишешь , а потом в строке 16 записываешь в пустую строку!И куда же это всё запишется?Вот из-за этого и бывают вылеты программ и ругают не программиста, который коряво написал, а язык C/C++, который позволяет такие конструкции.
мне кажется, IMHO, нужно вводить символы по одному и проследить ситуацию, когда символ ) встречается раньше, чем был хотя бы один (
и вести подсчет текущей вложенности скобок, как только, она станет отрицательна, значит аварийный выход, дальше скобки можно не считать, потому что появилась ) которая не открывалась.
(Т.е. тут не нужно использовать строки, достаточно одного символа и счетчика вложенности, который то увеличивается, то уменьшается, а чаще остается неизменным)
Если после ввода всего файла баланс опять!=0 то опять ошибка баланса
main() должна возвращать 0 только если баланс =0, напр. 1 если баланс отрицательный, 2 если положительный, 4, если не удалось открыть файл
ну да, у себя я в компиляторе эту ошибочку поправил и условия немного поменял - но думал что автор темки сам поправит где надо(ну надо ж дать человеку подумать). А предложенный вами вариант - пробовал, немного иначе правда, вышло немного громоздко потому и не выкладывал код.
YurA_280784
Заблокирован
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;
}
YurA_280784
Заблокирован
01.04.2009, 13:06     Баланс скобок в файле #12
Чёто код мой в тегах побородился
Кидаю исходник
Вложения
Тип файла: rar test36.cpp.rar (587 байт, 17 просмотров)
Yevgenijz
11 / 11 / 1
Регистрация: 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
Insanehead
1 / 1 / 0
Регистрация: 17.03.2009
Сообщений: 17
02.04.2009, 18:48  [ТС]     Баланс скобок в файле #14
Ребят на самом деле мне надо использовать string (по заданию) так же есть весьма интересная ошибка.....ввожу в файл простой набор букв и они подаются на экран....мне оч стало интересно почему и откуда может это высвечиваться на экран....так же если я ввожу (asdadasda) asd(asdada) то опять всё выводится на экран без вывода существования баланса....что можете посоветовать?

Добавлено через 8 минут 5 секунд
сорри всё попутал юра спс....всё работает.
Alligieri
CEO
Эксперт C++
 Аватар для Alligieri
2246 / 1235 / 24
Регистрация: 16.03.2009
Сообщений: 3,581
02.04.2009, 19:32     Баланс скобок в файле #15
Цитата Сообщение от YurA_280784 Посмотреть сообщение
Alligieri, лови прогу. Честно твоя как-то длинно написана (я её чуток модернизировал)
Чтот мне твоя прога короче не кажется
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.04.2010, 16:13     Баланс скобок в файле
Еще ссылки по теме:

Баланс скобок C++
Баланс скобок C++
Проверять строку на баланс скобок C++

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

Или воспользуйтесь поиском по форуму:
Serik2010
1 / 1 / 1
Регистрация: 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");
}
Yandex
Объявления
05.04.2010, 16:13     Баланс скобок в файле
Ответ Создать тему
Опции темы

Текущее время: 05:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru