Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

14.09.2013, 15:23. Просмотров 449. Ответов 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;}
            }   
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.09.2013, 15:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проверка на скобки (C++):

Проверка на скобки - C++
С клавиатуры вводится строка, представляющая собой арифметическое выражение, в котором встречается несколько видов скобок - круглые,...

Проверка на скобки в строчном калькуляторе - C++
Добрый день ! Нужна помощь, я в своём калькуляторе прописал многие проверки на ввод, но не могу справиться с таким примером: если человек...

Для каждой открывающей скобки найти позицию ей соответствующей закрывающей скобки - C++
Доброго времени суток. Подскажите пожалуйста алгоритм или путь к решению задачи, используя СТЕК Дана ПСП, ваша задача для каждой...

Фигурные скобки: Мне пишут что ошибка в закрытие скобки после return. - C++
#include &lt;iostream&gt; using namespace std; int main(){ int *ptr_number = new int; int *sum = new int(0); cin &gt;&gt; *ptr_number; ...

Дана строка, содержащая латинские буквы и скобки. Если скобки расставлены правильно - вывести 0. Иначе - номер позиции, где есть ошибочная скобка - C++
Дана строка, содержащая латинские буквы и круглые скобки. Если скобки расставлены правильно (то есть каждой открывающей соответству-ет одна...

Скобки и if else - C++
Задача такова: имеется некая &quot;база данных&quot;: int m= { 0,7,0,4,3,1, 0,3,6,3,1,2, 5,4,3,5,2,5, 1,2,5,0,5,2 }; И мне...

1
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).
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2013, 20:41
Привет! Вот еще темы с ответами:

Скобки - C++
Вывести все правильные скобочные выражения длиной N, состоящие из круглых и квадратных скобок. Входные данные: Входной файл INPUT.TXT...

злые скобки - C++
Здравствуйте!!!Помогите пожалуйста написать код расстановки скобок! Задание такое: 1.Написать программу, которая расставляет...

Скобки в языке C++ - C++
В каком случае используются фигурные скобки {...}, а в каком случае должны быть использованы фигурные скобки? Добавлено через 12 минут...

Строки и скобки в C++ - C++
Здравствуйте. Начали в колледже проходить C++. Нужно решить задачу, но никак с этим не справлюсь. в первом семестре решал точно такую же на...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

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