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

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

Войти
Регистрация
Восстановить пароль
 
Serg22
103 / 103 / 31
Регистрация: 04.03.2013
Сообщений: 479
Завершенные тесты: 2
#1

как избежать зацикливания - C++

19.05.2013, 18:21. Просмотров 1232. Ответов 11
Метки нет (Все метки)

Подскажите пожалуйста, как избежать зацикливания программы про вводе буквы вот в такой менюшке).
Если я ввожу неправильную цифру (которой нету в списке case, то прога просто еще раз предлагает ввести правильную цифру. А если ввожу букву или другой символ, программа зацикливается(
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
printf("Операции над очередью:\n" // меню з операціями над чергою
          " 1. Добавить элемент\n"
          " 2. Просмотр очереди\n"
          " 3. Удалить элемент\n"
          " 4. Поиск элемента\n"
          " 0. Выход\n");
printf("Комманда> ");
scanf("%d",&s);
switch(s)
{
case 1:
case 2:
case 3:
case 4:
case 0:return 0
}
Буду премного Вам благодарен)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.05.2013, 18:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос как избежать зацикливания (C++):

Как избежать ошибок линковщика? - C++
Я только-только начал изучать С++(Borland). Взял первый попавшийся пример из helpa - printf #include <stdio.h> #include <string.h> ...

Бесконечный цикл (как избежать?) - C++
Программа должна принимать только одно из трёх значений переменной 'destiny'. Если вводят любое другое значение, программа должна повторять...

Как избежать такую конструкцию? - C++
#include <iostream> #include <vector> class Foo { public: Foo() { x = 0; }

Как избежать использование глобальных объектов - C++
Есть два класса. В первом классе должен быть метод, который работает с объектами второго класса. Все получается, если создавать глобальные...

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

Как избежать округления дробных чисел - C++
как сделать что бы не округляло ??? float t; float z,m; using namespace std; void main(void) { m=-pow(5,2)/2;

11
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
19.05.2013, 18:28 #2
не совсем ясно как она у вас там работает. функция возвращает ноль если введено число от 0 до 4 и неизвестно что в противном случае. без всего кода непонятно где что зацикливается.

Про неправильный ввод:
нормальные программы должны обрабатывать неверный ввод пользователя. если он ввел что-то, чего программа не ожидает, то можно например вывести сообщение об этом и предложить сделать ввод еще раз.
0
henecs
17 / 17 / 0
Регистрация: 19.05.2013
Сообщений: 135
19.05.2013, 18:29 #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
switch(s)
{
case 1:
      break;
case 2:
      break;
case 3:
      break;
case 4:
      break;
case 0:return 0 // default: return 0; можно так написать
}
0
Serg22
103 / 103 / 31
Регистрация: 04.03.2013
Сообщений: 479
Завершенные тесты: 2
19.05.2013, 18:40  [ТС] #4
Вот сам код: в 1м основном меню (там где выбор массив или список) при вводе буквы прога завершает свое действие. А вот уже в моих ф-циях MainArray и MainStruct при вводе буквы происходит зацикливание..
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
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <locale.h>
#define N 1000
 
 
// Структура елементу черги
typedef struct node_t
{
   int value; // значення елемента
   struct node_t* next; // покажчик на наступний елемент в черзі.
}  Node;
 
typedef struct queue_t
{
   Node* head; // Покажчик на голову черги
   Node* tail; // Покажчик на хвіст черги
}  Queue;
 
//-----------------------------------------------------------------------------
// Фунция додавання елементу в чергу.
Queue* Push_Queue_List(Queue* queue, int value)// Value - значення, яке потрібно помістити в чергу.
{
   Node* tempNode = (Node*) malloc(sizeof(Node));//Створюється новий елемент черги.
   tempNode->value = value; //Заповнюється інформаційне поле.
   tempNode->next = NULL; //Після tempNode елементів немає.
 
   if (queue->head && queue->tail) // Якщо черга не порожня, то
   {
      queue->tail->next = tempNode; // наступним елементом після хвоста черги стає tempNode
      queue->tail = tempNode;
   }
   else
   {
      queue->head = queue->tail = tempNode; //інакше tempNode стає головою черги.
   }
 
   return queue;
}
//-----------------------------------------------------------------------------
int Del_QueueElement_List(Queue* queue) // Функція видалення елемента з черги. 
{
   int value = 0; 
 
   if (queue->head) // Перевірка, чи не порожня черга.
   {
      value = queue->head->value;
      queue->head = queue->head->next;;// Встановлюємо як голову черги елемент який був наступним після голови.
 
   }
 
   return value; //  повертає елемент черги, що був видалений
}
//-----------------------------------------------------------------------------
int Find_Queue_List(Queue* queue, int value) // Функція пошуку елемента в черзі 
{
   Node* tempNode = queue->head; // починаємо з першого елемента черги
 
   int i = 0; // лічильник циклу (номер позиції елемента)
   for (; tempNode && (tempNode->value != value); tempNode = tempNode->next) // Цикл пошуку елемента в черзі
   {
      i++;
   }
 
   return tempNode ? i : -1; // якщо tempNode != 0 return повертає i,  інакше -1 (тернарний оператор )
}
//-----------------------------------------------------------------------------
void Print_Queue_List(const Queue* queue) // Функція виводу черги на екран
{
   const Node* tempNode = queue->head; //встановлюєму тимчасову змінну на початок черги
            printf("Очередь:"); 
   for (; tempNode; tempNode = tempNode->next)// просуваємося по черзі
   {  
      printf(" %d ", tempNode->value); // виводимо на екран елементи по черзі
   }
   printf("\n");
}
//-----------------------------------------------------------------------------
 
int mainStruct() // головна функція черги на базі списку
{
    Queue queue = {NULL, NULL}; // Ініціалізація порожніми елементами
 for (;;){ // цикл для меню
    printf("Операции над очередью:\n"  // меню з операціями над чергою
          " 1. Добавить элемент\n"
          " 2. Просмотр очереди\n"
          " 3. Удалить элемент\n"
          " 4. Поиск элемента\n"
          " 0. Выход\n");
 
   int S; int value;
 
   {
      printf("Комманда> ");
      scanf("%d",&S);
 
      switch (S) // цикл вибору ф-ції , залежно від вибраного S значення
      {
  case 1:  //додавання елемента в чергу
           printf("элемент> ");
           if (scanf("%d", &value))
           {
               Push_Queue_List(&queue, value);
           }
           break;
 
   case 2: // вивід черги на екран
            Print_Queue_List(&queue);
            break;
 
   case 3: // видалення елемента з черги
            printf("Удален:  %d\n", Del_QueueElement_List(&queue));
            break;
 
   case 4: // пошук елемента в черзі
            printf("Поиск>  ");
            if (scanf("%d", &value))
            {
               int pos = Find_Queue_List(&queue, value);
 
               if (pos != -1)
               {
                  printf("%d-й в очереди\n", pos + 1);
               }
               else
               {
                  printf("Элемент %d не найден\n", value);
               }
            }
            break;
   case 0: return 0; //вихід
            
         
      }
   }
 }
}
 
//кінець черги на базі списку
//------------------------черга на базі масиву------------------------------------------
 
void Push_Queue_Array(int mas[],int *kol,int *end) // Фунция додавання елементу в чергу.
{
if((*kol)==N){ // якщо kol - кількість елементів дорівнює к-ті місць у черзі, то 
    printf("\nОчередь заполнена!\n");} // повідомлення, що черга повна
else{ 
    printf("\nВведите элемент очереди:   ");
    scanf("%d",&mas[(*end)]); // додає введене значення в кінець черги
    (*kol)++; // збільшуємо лічильник кількості елементів на 1
    (*end)++;}
}
void Find_Queue_Array(int mas[],int end, int start)// Функція пошуку елемента в черзі 
{ 
    int f,i,pos=-1;
    printf("Введите искомое число:   ");
    scanf("%d",&f);// вводимо шукане значення
    
    for (i=start;i<end;i++)// цикл пошуку елемента, починаючи з початку черги
        
    if(mas[i]==f)// якщо елемент знайдений, то
        {
        pos = i-start;
        break; // кінець циклу
        
    }
 
    if(pos != -1)
        printf("Элемент  %d-й в очереди\n",pos+1);// повертаємо номер позиції
    else 
        printf("Элемента нет\n"); // якщо елемент не знайдений, то ф-ція повертає -1
}
 
 
 
void Print_Queue_Array(int mas[],int end,int start,int kol)//Функція виводу черги на екран
{
 printf("\nОчередь:   ");
 int i,j;//лічильники циклу
 j=0;
  for(i=start;i<end;i++,j++)//від початку до кінця
  {
   if(j<kol)//друкуємо елементи, доки їх кількість більша за j
   printf("%d ",mas[i]);
   
  }
  printf("\n");
}
 
 
void Del_QueueElement_Array(int mas[],int *kol,int *start)// Функція видалення елемента з черги. 
{
if((*kol)==0)// якщо кількість елементів в черзі = 0,то
{
printf("\n0 элементов в очереди!\n");// вивести повідомлення, що черга порожня
}
else// інакше
{
printf("Удален элемент %d\n",mas[(*start)]);//видаляємо елемент, що стоїть перший в черзі
(*start)++;//наступний елемент у черзі стає першим
(*kol)--;//зменшуємо лічильник кількості елементів у черзі на 1
}
}
 
int mainArray()// головна функція черги на базі масива
{ 
setlocale (LC_ALL, "Russian");//Російська мова
int mas[N];//масив, розмірністю N(1000)
int s,n=0,start=0,end=0;//змінні кінця,початку,циклу
for(;;)//цикл меню
{
 
printf("Операции над очередью:\n" // меню з операціями над чергою
          " 1. Добавить элемент\n"
          " 2. Просмотр очереди\n"
          " 3. Удалить элемент\n"
          " 4. Поиск элемента\n"
          " 0. Выход\n");
printf("Комманда> ");
scanf("%d",&s);
switch(s)
{
case 1:Push_Queue_Array(mas,&n,&end);break;//додавання елемента в чергу
case 2:Print_Queue_Array(mas,end,start,n);break;// вивід черги на екран
case 3:Del_QueueElement_Array(mas,&n,&start);break;// видалення елемента з черги
case 4:Find_Queue_Array(mas,end,start);break;// пошук елемента в черзі
case 0:return 0;//вихід
}
}
 
 
}
 
int main()//головна функція програми
{ setlocale(LC_ALL, "Russian");//Російська мова
    printf("С очередью на какой базе вы желаете работать?\nМассива - нажмите 1\n Списка - нажмите 2\n0 - выход\n Ваш выбор:\t ");
    int P;
    scanf("%d",&P);
    switch(P){
    case 1:mainArray();break;// черга на базі масива
    case 2:mainStruct();break;// черга на базі списка
    case 0:return 0;//вихід
}
}
Добавлено через 52 секунды
henecs, Эмм.. я дописывал
C#
1
default:
не помогает в этом случае...
0
henecs
17 / 17 / 0
Регистрация: 19.05.2013
Сообщений: 135
19.05.2013, 18:48 #5
Serg22, дебагером его !
0
Serg22
103 / 103 / 31
Регистрация: 04.03.2013
Сообщений: 479
Завершенные тесты: 2
19.05.2013, 18:51  [ТС] #6
каким образом это сделать ?) (ай эм нуб)
0
henecs
17 / 17 / 0
Регистрация: 19.05.2013
Сообщений: 135
19.05.2013, 18:56 #7
Serg22, все зависиот от вешего компилятора, погуглите как дебажить в вашем компиляторе
0
Serg22
103 / 103 / 31
Регистрация: 04.03.2013
Сообщений: 479
Завершенные тесты: 2
19.05.2013, 19:01  [ТС] #8
henecs, я в курсе как пользоваться дебагером, но как мне это поможет?...
0
henecs
17 / 17 / 0
Регистрация: 19.05.2013
Сообщений: 135
19.05.2013, 19:05 #9
Serg22, узнаете где где програма заходит в тупик
0
Serg22
103 / 103 / 31
Регистрация: 04.03.2013
Сообщений: 479
Завершенные тесты: 2
19.05.2013, 20:30  [ТС] #10
хм, ну чесно говоря непонятно мне) вместо буквы образуется восьмизначное число, и прога начинает зацикливаться...

Добавлено через 1 час 4 минуты
ну как это исправить?... очень горит)
0
DeZRo
3 / 3 / 0
Регистрация: 05.11.2012
Сообщений: 49
19.05.2013, 20:43 #11
Цитата Сообщение от Serg22 Посмотреть сообщение
хм, ну чесно говоря непонятно мне) вместо буквы образуется восьмизначное число, и прога начинает зацикливаться...

Добавлено через 1 час 4 минуты
ну как это исправить?... очень горит)
попробуйте поставить условие....правда я сам слабо это представляю =D ну, допустим если ввести цифру - все как надо, а если что-нибудь другое - выдать что-нибудь типо :"ЦИФРУ МНЕ! ЦИФРУУУУ!" =D
0
Serg22
103 / 103 / 31
Регистрация: 04.03.2013
Сообщений: 479
Завершенные тесты: 2
20.05.2013, 22:37  [ТС] #12
Решил проблему. может пригодиться кому: перед
C#
1
scanf
пишем
C#
1
fflush(stdin);
И все супер )
0
20.05.2013, 22:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2013, 22:37
Привет! Вот еще темы с ответами:

Как избежать зацикливание ввода не числа? - C++
Как избежать зацикливание ввода не числа? чтобы при вводе символа не уходил в бесконечный цикл. Пример: #include &lt;iostream.h&gt; ...

Как избежать округления дробных чисел - C++
не виводит дробь а только целие числа. где проблема ? #include &lt;iostream.h&gt; #include &lt;math.h&gt; int mat(double x,double y){ ...

Как избежать switch case и преобразования типов? - C++
Подскажите пожалуйста, есть класс , допустим ,Automobile , есть наследники этого класса, допустим Automobile_Model_1, Automobile_Model_2, и...

Ошибка #IND00. Как избежать деления на ноль? - C++
Есть такая программа #include &lt;clocale&gt; #include &lt;cstdio&gt; #include &lt;math.h&gt; double fact(int n) { double p=1; for (int...


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

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

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