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

Работа с динамическими стеками - ошибка - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Класс POINT (ТОЧКА), который может вводить и выводить точки с заданными координатами http://www.cyberforum.ru/cpp-beginners/thread1221412.html
Создайте класс POINT (ТОЧКА), который может вводить и выводить точки с заданными координатами. Создайте 5 объектов класса POINT ПОМОГИТЕ С++
C++ Что лучше использовать? Шаг переменной dx Есть описание функции. вот как я её сделал: if (abs(x) >= 10){ printf("Y(x)=%1.2f\n\n", y = x*x); } else { printf("Y(x)=%1.2f\n\n", y = abs(x)); } Нужно добавить к ней такие условия: задаваемый диапазон (a,b), шаг функции dx, т.е. что бы на каждом шаге проверял условие. что лучше для этого использовать и как организовать код? http://www.cyberforum.ru/cpp-beginners/thread1221407.html
Написать программу вывода сетки таблицы размером 3*2 C++
Написать программу вывода сетки таблицы размером 3*2 Помогите кто сможет
C++ Сбой при преобразовании в coff
при построении выдает ошибку "Сбой при преобразовании в coff: файл недопустим или поврежден" Microsoft Visual Studia 2010 Professional Вот код программы: #include <iostream> #include <fstream> #include <conio.h> #include <string.h> using namespace std;
C++ Обработка телефонного номера в форме (XXX)XXX-XX-XX http://www.cyberforum.ru/cpp-beginners/thread1221402.html
Напишите программу, которая вводит телефонный номер в форме (XXX)XXX-XX-XX. Программа должна извлекать в виде лексем код места (указывается в скобках), первые трёх и последние четыре цифры телефонного номера. Семь цифр номера должны соединяться в одну строку С++
C++ Класс SQUARE (квадрат) Создайте класс SQUARE (квадрат). Класс имеет атрибут length. Он имеет функции, которые вычисляют площадь и периметр квадрата. Он также имеет функции записи и чтения length кому не трудно помогите С++ подробнее

Показать сообщение отдельно
Nekit0939
0 / 0 / 0
Регистрация: 02.07.2014
Сообщений: 2

Работа с динамическими стеками - ошибка - C++

02.07.2014, 17:43. Просмотров 277. Ответов 0
Метки (Все метки)

Имеется задача:
Задание: смоделировать стек на основе односвязного списка и решить на этой структуре задачу по варианту из списка ниже. Создать интерактивное приложение с возможностью выбора команды: а) ввод данных в стек(и) из стандартного или нестандартного текстового файла(ов); б) вывод данных из всех стеков на экран (стандартный текстовый файл); в) решение задачи; г) освобождение стеков; д) выход.
Сама задача: Из элементов двух стеков, хранящих слова, собрать новый стек со словами, у которых первая и последняя буква совпадают (могут быть в разном регистре), изменив связи между элементами стеков (не выделяя новую память). Подходящие слова искать по-очереди в каждом из стеков. В исходных стеках должны остаться неиспользованные слова.


Написал такой код. После нескольких компиляций - заметил закономерность, что программа вылетает с ошибкой в том случае, если первые или последние элементы стеков удовлетворяют условию. Как я понял, происходит переполнение. Помогите найти ошибку.

Код:
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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <windows.h>
 
struct TElem {
    char Info[31] ;
    TElem *Next;
};
 
//==============================================================================
char *ANSIUpperCase(char *s, char *S);
TElem* PushStack(TElem *St, char* Info); // добавить элемент в стек
char* PopStack(TElem **PSt);  //извлечь элемент из стека
// дополнительная процедура перекладывания элемента из одного стека (StTop) в другой(Dop)
void TopToTop (TElem **PSt1, TElem **PSt2); // без изменения адресов элементов, только связи
//----------первая часть: создание стека из текстового файла
TElem* CreateStack(TElem *St);
//----------вторая часть: вывод стека на экран ------
void OutputStack(TElem *St);
//----------третья часть: решение задачи -------------
void Decide(TElem **PSt1, TElem *St2, TElem **PSt3);
//----------четвертая часть: освобождение памяти -----
TElem* FreeStack(TElem *St);
 
//==============================================================================
 
char *ANSIUpperCase(char *s, char *S){
S = strcpy(S, s);
char *ch=S;
   while (*ch) {
        if (*ch>='a' && *ch<='z' || *ch>='а' && *ch<='я') *ch= *ch-32;
        if (*ch =='ё') *ch='Ё';
        ch++;
   }
   return S;
}
 
//==============================================================================
TElem* PushStack(TElem *St, char* Info){ // добавить элемент в стек
    TElem *Elem= new TElem;
    strcpy(Elem->Info, Info);
    Elem->Next = St;
    return Elem; // Адрес новой вершины
}
 
//==============================================================================
char* PopStack(TElem **PSt){ //извлечь элемент из стека
    TElem *Elem = *PSt;
    char* Info = Elem->Info;
    *PSt = Elem->Next;
    delete Elem;
    return Info;
}
// дополнительная процедура перекладывания элемента из одного стека (StTop) в другой(Dop)
void TopToTop (TElem **PSt1, TElem **PSt2){
    TElem *Elem, *StTop=*PSt1, *Dop=*PSt2;
    Elem = StTop;
    StTop = StTop->Next;  // или StTop=(*StTop).Next;
    Elem->Next = Dop;
    Dop = Elem;
    *PSt1 = StTop; *PSt2 = Dop;  // сохранить новые адреса вершин по адресам PSt1 и PSt2
    return;
}
 
//==============================================================================
TElem* CreateStack(TElem *St){
    int kol=0;
    char *n,*r;
    char Info[31];
 
    while(1){
        printf("Slovo (или **)=?");
        fgets(Info,30,stdin);  fflush(stdin);
        n = strchr(Info, '\n'); if (n) Info[n-Info]='\0';
        r = strchr(Info, '\r'); if (r) Info[r-Info]='\0';
        if (strncmp(Info, "**",2)==0) break;
        St = PushStack(St, Info);
        kol++;
    }
    printf("Создан стек из %d элементов\n", kol);
    printf("Press any key to continue\n");
    getch();
    return St;
}
 
//==============================================================================
void OutputStack(TElem *St){
    TElem *Dop=NULL;
    while (St){
        printf("%30s\n", St->Info);
        TopToTop(&St, &Dop);
    }
    while(Dop) TopToTop(&Dop, &St);
 
    printf("Press any key to continue");
    getch();
    return;
}
 
//==============================================================================
//==============================================================================
 
 
//----------четвертая часть: освобождение памяти -----
TElem* FreeStack(TElem *St){
    char* Info;
    while (St){
        Info = PopStack(&St);
    }
    return St;
}
 
//----------- РЕШЕНИЕ ----------------------------------------------------------
void Decide(TElem **PSt1, TElem **PSt2, TElem **PSt3){//(TElem **PSt1, TElem **PSt2, TElem **PSt3){
     TElem *St1=*PSt1, *St2=*PSt2, *St3=*PSt3, *Dop1=NULL, *Dop2=NULL;
     St3=FreeStack(St3);
char *c,*s;
int flag=1;
int flag2=1;
 
if ((St1==NULL) && (St2==NULL)){ 
printf ("\nСтеки пусты\n");
return ;}
 
 
while ( (flag==1) || (flag2==1) ){
      //для первого стека
      if (St1){
        c=ANSIUpperCase(St1->Info,c);
         int i=strlen(c);
          if(c[0]==c[i-1]) TopToTop(&St1,&St3);
          else TopToTop(&St1,&Dop1);
          }
      else flag=0;
      //------------------
      
      //для второго стека
      if (St2){
        c=ANSIUpperCase(St2->Info,c);
         int i=strlen(c);
          if(c[0]==c[i-1]) TopToTop(&St2,&St3);
          else TopToTop(&St2,&Dop2);
          }
      else flag2=0;
      //------------------
}
 
  while(Dop1){TopToTop(&Dop1,&St1);}
  while(Dop2){TopToTop(&Dop2,&St2);} 
 
 *PSt1=St1;
 *PSt2=St2; 
 *PSt3=St3; 
 
 printf("Было произведено решение\n");
    return ;  // новый адрес через результат функции вернется
}
 
//==============================================================================
 
int main(){
TElem *StackTop1=NULL, *StackTop2=NULL, *StackTop3=NULL;
SetConsoleOutputCP(1251);SetConsoleCP(1251);  char ch;
do{
printf(" Выберите номер нужного действия:\n1. Создать стеки\n2. Ввести стеки на экран\n\
3. Решить задачу\n4. Освободить память\n5. Выход\n");
 
ch=getchar();
fflush(stdin);
switch (ch){
case '1': if (StackTop1) {
                    printf("Error: сначала надо освободить память!"); break;
                }
                StackTop1 = CreateStack(StackTop1);
                if (StackTop2) {
                    printf("Error: сначала надо освободить память!"); break;
                }
                StackTop2 = CreateStack(StackTop2);
                break;
case '2': printf("Первый стек:\n"); OutputStack(StackTop1);
                printf("\nВторой стек :\n"); OutputStack(StackTop2);
                printf("\nТретий стек (результат):\n"); OutputStack(StackTop3);
                break;
case '3': Decide(&StackTop1, &StackTop2, &StackTop3);
                break;
case '4':StackTop1=FreeStack(StackTop1);
                StackTop2=FreeStack(StackTop2);
                StackTop3=FreeStack(StackTop3);
                printf("Вся память под стеки особождена\n");
                break;
case '5':return 0;
default: printf("Нет такой команды\nPress any key");
getch();}
} while (ch!='5');
 
 
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru