Баланс фигурных скобок в файле

Уровень сложности:

В текстовом файле, содержащем текст программы на языке Си, проверить соответствие открывающихся и закрывающихся фигурных скобок { и }. Результат проверки вывести на экран и записать в виде фразы в текстовый файл. Результат работы программы (вывод) поместить в отдельный текстовый файл (например, "out . txt " ), продублировав на экране.

Интересное задание, подумайте как его решить. Оно не сложное, как кажется на первый взгляд. Для написания этой программы вам помогут следующие статьи: файлы в С++, возможно — работа со с символами. Результат работы программы показан ниже:

#include <iostream>

using namespace std;
#include <fstream>
int main()
{
    char file_name[100]; // буфер хранения пути к файлу
    cout << "Введите имя файла: ";
    cin >> file_name;
    ifstream fin(file_name); // открываем файл для чтения

        if (!fin.is_open()) // если файл не открыт
            cout << "Файл не может быть открыт!\n"; // сообщить об этом
        else
        {
            int counterBracketOpen = 0, // количество вхождений фигурных открывающихся скобок
                counterBracketClose = 0; // количество вхождений фигурных закрывающихся скобок

            char symbol; // временная переменная для хранения символов считанных из файла

            fin >> symbol; // предварительное считывание из файла символа

            while (fin)
            {
             if (symbol == '{') counterBracketOpen++; // инкремент количества октрывающихся фигурных скобок

             if (symbol == '}')
             {
                 counterBracketClose++; // инкремент количества закрывающихся фигурных скобок

                 // если нарушен порядок следования скобок
                 if (counterBracketClose > counterBracketOpen)  break; // выход из цикла
             }
            fin >> symbol; // считываем символ из файла
            } // конец while

            fin.close(); // закрываем исходный файл

            ofstream fout("./out"); // создаём файл для записи результата проверки
            // выполнияем проверку баланса скобок
            if (counterBracketOpen == 0 && counterBracketClose == 0)
            {
                cout << "В файле нет фигурных скобок!" << endl;
                fout << "В файле нет фигурных скобок!" << endl;
            }
            else
                if (counterBracketOpen == counterBracketClose)
                {
                    cout << "Баланс скобок не нарушен!" << endl;
                    fout << "Баланс скобок не нарушен!" << endl;
                }
                else
                {
                    cout << "Баланс Скобок нарушен!" << endl;
                    fout << "Баланс Скобок нарушен!" << endl;
                }
            fout.close(); // закрываем файл результата

        }
    return 0;
}

Для корректного отображения русского текста в Windows, прочитайте статью Кириллица в консоли. Пример работы программы:


Баланс фигурных скобок в файле

Следующие статьи помогут вам в решении данной задачи:
Автор: admin
Дата: 12.09.2012
Поделиться:

Комментарии

  1. Alexander Trousevich

    // Language: rust. Details: rust-lang.org
    
    use std::fs::File;
    use std::io::Read;
    
    fn main() {
        let mut f = File::open("src/main.rs").expect("IO Error");
        let mut content = String::new();
        f.read_to_string(&mut content).expect("IO Error");
        let mut balance = 0;
        for s in content.chars() {
            match s {
                '{' => balance += 1,
                '}' => balance -= 1,
                _ => {}
            }
        }
        match balance {
            0 => println!("All OK"),
            _ => println!("All NOT OK")
        }
    }
  2. DanilSava

    //{} proverka;
    #include<iostream>
    #include<fstream>
    #include<conio.h>
    using namespace std;

    char *sim = new char [1]; // массив для считывания символа из файла
    int mun1 = 0, mun2 = 0, n = 0, razmer = 0;
    void rachot(char *sim, int *mun1, int *mun2); //функция расчета mun1={ и mun2=}
    int rezul(int mun1, int num2);

    int main()
    {
    ifstream file(«d:\\12.txt»);
    if (file.is_open())
    cout <<«file open»;
    else cout << «file close»;
    file.seekg(0, ios_base::end);// подчет количесвтва позиций в файле
    razmer=file.tellg();// подчет количесвтва позиций в файле
    do // цикл считывания символов
    {
    file.seekg(n, ios_base::beg); // перемещение по файлу
    file.read (sim, 1);
    rachot(sim, &mun1, &mun2);
    ++n;
    } while (n<razmer); // проверка достижения конца файла
    if (rezul(mun1, mun2)) // проверка равенства { }
    cout << «balans»;
    else cout << «no balans» << endl;
    _getch();
    }

    void rachot(char *sim, int *mun1, int *mun2)
    {
    if (sim[0] == ‘{‘)
    ++(*mun1);
    if (sim[0] == ‘}’)
    ++(*mun2);
    }
    int rezul(int mun1, int num2)
    {
    if (mun1 == mun2)
    return 1;
    else return 0;
    }

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.