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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
saserlend
10 / 10 / 1
Регистрация: 25.11.2011
Сообщений: 139
#1

Проверка на скобки - C++

14.09.2013, 15:23. Просмотров 403. Ответов 1
Метки нет (Все метки)

Просьба помочь разобраться в мной написанной программе. Задание и код прилагаются. У меня пока 2 проблемы.
1. void Spisok(). При записи в файл, во всех строках после первой теряется первый элемент.
2. void Task(). Не получается организовать второй цикл for для прохода по элементам строки.

В командной строке программе передается имя файла для проверки (.txt) и имя файла результатов (.txt).
Программа (консольная) проверяет каждую строку файла для проверки на расстановку скобок 4 типов ("(" и ")", "[" и "]", "{" и "}", "<" и ">"), проверка должна учесть парность и вложенность расстановки скобок (как в математических выражениях), другие символы - пропускать без обработки.
По результатам проверки формируется файл результатов, каждая строка которого соответствует строке файла для проверки, результат в строке может быть описан как - "нет ошибок", "ошибка в символе N" (N - порядковый номер символа в строке).
Программа должна выдавать отладочную информацию на экран - какой файл открыт (ошибка открытия), номер обработанной строки и результат обработки.
Работа с файлом через FILE*.
Тестирование программы - файл для проверки создается с учетом разных вариантов расстановки скобок (не менее 20 строк).

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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#include <iostream>
#include <conio.h>
#include <sstream>
 
using namespace std;
 
 
FILE *file;
FILE *result;
typedef struct {char sList[50];} Parker;
Parker St[30];
int nStruct=1;
char FileName[40];
char FileNameR[40];
int menu();
void NewFile();
void OpenFile();
void Spisok();
void Task();
void Result();
int main()
{
while (true)
    {
        switch(menu())
        {
            case 1: NewFile();  break;
            case 2: OpenFile(); break;
            case 3: Task();     break;
            case 4: Result();   break;
            case 5: return 0;
            default: "Select the correct";
        }
    puts("Press any key to continue");  
    getch();                                                                                                //Проверить библиотеку с getch!!!!!!!!!!!!!!
    system("cls");
    }
}
 
int menu()
{
    cout << "Select\n\n";
    cout << "1. Create new file\n";
    cout << "2. Open file\n";
    cout << "3. Task\n";
    cout << "4. Result\n";
    cout << "5. Exit\n\n\n";
    int p1;
    cin >> p1;
    if(p1<1 || p1>5)
    {cout << "Select the correct\n";}
    return p1;                          //Значение возвращаемое в оператор switch для выбора пункта меню.
}
 
void NewFile() //Создание нового файла.
{
    cout << "Enter new file name\t\t\t";
    cin.ignore();
    cin.getline (FileName,sizeof(FileName),'\n');   //Ввод с клавиатуры учитывая пробелы пока не '\n'.
    file = fopen(FileName,"wb");    //Создание файла с режимом w-записи, t-текстовый файл.
    
    Spisok(); //Переход в функцию заполнения файла.
}
 
void OpenFile() //Открытие ранее созданного файла.
{
    char sLetter;
    cout << "Enter open file name\t\t\t";
    cin.ignore();
    cin.getline(FileName,sizeof(FileName), '\n');   //Ввод имени файла для открытия пока не '\n'.
    { 
    if ((file = fopen(FileName,"rt"))==NULL)    //Открытие файла в режиме r-чтения.
    { 
        cout << "\n\n" << "File exist\n";
        cout << " Create new file? Y/N\n";
        do
        {
            sLetter=cin.get();
            sLetter=toupper(sLetter);               //Преобразование к верхнему регистру (toupper)
        }
        while((sLetter != 'Y') && (sLetter != 'N'));    //Ожидание нажатия 'Y','y' или 'N','n'.
        {
            if(sLetter == 'Y')
            {
                file = fopen(FileName,"wt");    //Если нажато 'Y','y' создать новый файл с введенным ранее именем.
                Spisok();                       //Переход в функцию заполнения файла.
            }
            if(sLetter == 'N')  
            {
                OpenFile();                     //Если нажато 'N','n' вернуться в функцию открытия файла.
            }
        }
    } 
 
int n=0; Parker t;
cout << "File open\n"; 
    while(true)             //Цикл вывода ранее созданного файла на экран.
        { 
            int nDate = fread(&t, sizeof(Parker), 1, file); 
            if (nDate!=1) break; 
            St[n]=t; 
            cout << St[n].sList << "\n"; 
            nStruct++; 
        } 
fclose(file); 
    }
}
 
void Spisok() //Заполнение ранее созданного файла .
{ 
    int k;
    cout << "Enter the number of rows\t"; 
    cin >> k;                               //Ввод количества строк файла(структуры).
    for (int i=1; i<=k; i++)                //Цикл построчного ввода строк структуры.
    { 
        cout << i <<":"<<" ";
        cin.ignore();
        cin.getline(St[i].sList, 20); 
        cout << "\n";
        fwrite (&St[i], sizeof(Parker), 1, file); //Запись строк структуры в ранее созданный файл.
    }
fclose(file); 
}
 
void Result()       //Вывод результатов на экран.
{
    cout << "Enter result file name\t\t\t";
    cin >> FileNameR;
    file = fopen(FileNameR,"rb"); //Открыте файла результата в режиме r-чтения.
}
 
void Task()             //Код выполняющий задание.
{
    int c=0, i=1, n=1, k=0;
    int mass3[20];
    char mass1[]={'(','{','<','['}, mass2[]={')','}','>',']'}, mass4[20]; 
    for(St[i]; i<nStruct; i++)
        cout << "String " << i << ":\n";
        for(k=0;strlen(St[i].sList);k++)
            if(St[k].sList==&mass1[0] || St[k].sList==&mass1[1] || St[k].sList==&mass1[2] || St[k].sList==&mass1[3])
            {
                mass3[c]=k;
                strcpy(&mass4[c],St[k].sList);
                c++;
            }
            if(St[k].sList==&mass2[0] || St[k].sList==&mass2[1] || St[k].sList==&mass2[2] || St[k].sList==&mass2[3] && mass3[0]==NULL)
            {
                cout << "Error:" << k << " ";
            }
            else
            {
                if(St[k].sList==&mass2[0])
                    if(mass4[c]!=mass1[0]) {cout << "Error:" << k << endl;} else {c=c-2;}
                if(St[k].sList==&mass2[1])
                    if(mass4[c]!=mass1[1]) {cout << "Error:" << k << endl;} else {c=c-2;}
                if(St[k].sList==&mass2[2])
                    if(mass4[c]!=mass1[2]) {cout << "Error:" << k << endl;} else {c=c-2;}
                if(St[k].sList==&mass2[3])
                    if(mass4[c]!=mass1[3]) {cout << "Error:" << k << endl;} else {c=c-2;}
            }   
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.09.2013, 15:23     Проверка на скобки
Посмотрите здесь:

Строки и скобки в C++ C++
Скобки C++
Задача про скобки C++
Скобки у конструктора C++
C++ Скобки в языке C++
Конструктор и скобки C++
C++ злые скобки
Квадратные скобки [] C++
Проверка на скобки C++
Проверка на скобки в строчном калькуляторе C++
Поиск непарной скобки C++
C++ Скобки и if else

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dendrit
1 / 1 / 0
Регистрация: 07.09.2013
Сообщений: 6
15.09.2013, 20:41     Проверка на скобки #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
    for(;;) //главный цикл
    {
        stack<char> st;
        char in=0,tmp=0;
        while(in!='\n')
        {
            in=getchar(); //тут ввод по одному символу
            if (in=='\n') break;
            if (in!='('&&in!=')'&&in!='{'&&in!='}'&&in!='['&&in!=']'&&in!='<'&&in!='>')
                continue;
            if (st.empty()) 
            {
                st.push(in);
                continue;
            }       
            tmp=st.top();
            if ((in==')' && tmp=='(') || (in=='}' && tmp=='{') ||
                (in==']' && tmp=='[') || (in=='>' && tmp=='<'))
                st.pop();
            else st.push(in);
        }
        cout<<boolalpha<<st.empty()<<endl; // тут поток вывода
    }
Вам надо только поменять потоки на ввод и вывод, изменить условие главного цикла(у вас это конец файла) и подключить stack (#include stak).
Yandex
Объявления
15.09.2013, 20:41     Проверка на скобки
Ответ Создать тему
Опции темы

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