Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11766
Последний выпуск: 19.06.2015

Проверить текст на соответствие числа открывающихся и закрывающихся скобок

82K
07 мая
ross_
11 / / 14.03.2017
Дан текстовый файл, содержащий программу на языке Си. Проверить эту программу на соответствие числа открывающихся и закрывающихся скобок (круглых, квадратных, фигурных и угловых).
Как можно прочитать файл, чтобы была возможность проверять является ли текущий символ скобкой или нет? Пишу через построчное чтение, но не уверен, что пишу правильно и подходит ли этот способ вообще, помогите
6
07 мая
@pixo $oft
3.4K / / 20.09.2006
Почему нет? Любой способ подходит, ведь не стоит задачи проверять синтаксис и всё такое. Можно хоть выделить память и весь файл в неё прочитать, удобно будет работать.
82K
07 мая
ross_
11 / / 14.03.2017
Цитата: @pixo $oft
Любой способ подходит.

Ну вот все равно что-то не получается. Написал код, но количество скобок считает неверно. Пишет что их не хватает, когда их хватает.

Код:
#include <stdio.h>
#include <windows.h>

void main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    FILE *f;
    f=fopen("file.txt","r");
    char s;
    int kr=0, kv=0, fg=0, ug=0;
    if(f==NULL)
        printf("Не удалось открыть файл");
    while ((s = fgetc(f))!=EOF)
    {
        if(s=='(')
            kr++;
        if(s==')')
            kr--;
        if(s=='[')
            kv++;
        if(s==']')
            kv--;
        if(s=='{')
            fg++;
        if(s=='}')
            fg--;
        if(s=='<')
            ug++;
        if(s=='>')
            ug--;
    }
    printf("%d,%d,%d,%d",kr,kv,fg,ug);
    if(kr==0)
        printf("Число открывающихся и закрывающихся круглых скобок равноn");
    else
        printf("Число открывающихся и закрывающихся круглых скобок не равноn");
    if(kv==0)
        printf("Число открывающихся и закрывающихся квадратных скобок равноn");
    else
        printf("Число открывающихся и закрывающихся квадратных скобок не равноn");
    if(fg==0)
        printf("Число открывающихся и закрывающихся фигурных скобок равноn");
    else
        printf("Число открывающихся и закрывающихся фигурных скобок не равноn");
    if(ug==0)
        printf("Число открывающихся и закрывающихся угловых скобок равноn");
    else
        printf("Число открывающихся и закрывающихся угловых скобок не равноn");
    fclose(f);
    system("pause");
}
82K
07 мая
ross_
11 / / 14.03.2017
Цитата: ross_
но количество скобок считает неверно.

Еще проблема что не могу применить feof вместо EOF. И немного переделав код количество скобок теперь везде верное, даже если это не так

323
08 мая
UserNet2008
679 / / 03.04.2010
Код:
#include <cstdio>
#include <iostream>
 
int main()
{
  setlocale( LC_ALL,"Russian" );
 
    int int_ReadSymbol, int_ParenthesisOpen = 0, int_ParenthesisClose = 0;
    // загрузка из файла
    FILE * ptr_File = fopen("C:\tempo\test.txt", "rb");
    // проверка загрузки
  if (ptr_File == NULL) perror("Ошибка открытия файла");
  else
  {
    // читать до конца файла
        while ( !feof(ptr_File) )
    {
      // прочитать символ из файла
            int_ReadSymbol = fgetc(ptr_File);
      // подщёт ParenthesisOpen and ParenthesisClose
            if (int_ReadSymbol=='(') int_ParenthesisOpen++;
      if (int_ReadSymbol==')') int_ParenthesisClose++;
      // подщёт остальных скобок
     
    }
    // закрыть файл
        fclose (ptr_File);
    // вывод только круглых скобок
        printf ("Общее количество '(' : %i n", int_ParenthesisOpen);
    printf ("Общее количество ')' : %i n", int_ParenthesisClose);
    std::cout << "Итог  '( )' : " << (int_ParenthesisOpen-int_ParenthesisClose)<<'n';
    // вывод остальных скобок
   
  }
  system("pause");
    return 0;
}
p/s
в пути к файлу надо указать по два\
15K
23 мая
xAtom
64 / / 17.01.2011
Код:
#include <stdio.h>
#define NUM 4
int find_index(const char* s, int c);
int file_test(const char* filename, int brs[], int num,
              const char* fdelim, const char* ldelim);

int main(void){
    int g, i, brs[NUM];
    const char fdelim[] = "([{<";
    const char ldelim[] = ")]}>";

    if(!file_test("file.txt", brs, NUM, fdelim, ldelim))
        return 0;

    for(g = 1, i = 0; i < NUM; ++i){
        if(brs[i] != 0){
            printf("error expression: %c or %c\n", fdelim[i], ldelim[i]);
            g = 0;
        }
    }

    if(g)
        puts("Good!");
    getchar();
    return 0;
}

int file_test(const char* filename, int brs[], int num,
              const char* fdelim, const char* ldelim){
    int   i;
    char  s[256], *p;
    FILE* fp = fopen(filename, "r");
    if(fp == NULL)
        return 0;

    for(i = 0; i < num; ++i)
        brs[i] = 0;

    while(((p = fgets(s, 255, fp)) != NULL) && !ferror(fp)){
        while(*p){
            if((i = find_index(fdelim, *p)) != -1)
                ++brs[i];
            else if((i = find_index(ldelim, *p)) != -1)
                --brs[i];
            ++p;
        }
    }
    fclose(fp);
    return 1;
}

int find_index(const char* s, int c){
    const char* t = s;
    while(*s && (*s != c))
        ++s;
    return (*s) ? (int)(s - t) : -1;
}

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог