Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
Debi
0 / 0 / 0
Регистрация: 23.02.2015
Сообщений: 18
1

Цикл While не останавливается

23.02.2015, 11:18. Просмотров 798. Ответов 15
Метки нет (Все метки)

Всем привет! Не судите строго за код, недавно начал учить Си. Объясните почему цикл не останавливается

Задача вот в чем, ввожу любое число например 20, и программа должна начиная от 1 до 20 подсчитать сумму квадрата этих чисел, проблема в том что когда ввожу 20 то цикл становиться бесконечным, по условии должна остановиться достигая 20. Например так:
1 1
2 4
3 9
и т.д до 20

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
int main(void)
{
    setlocale(0,"");
    int num = 0;
    int num2;
    printf("Введите число ___\b\b\b");
    scanf("%d",num2);
    while (num++ < num2 )
    {
        printf("%4d %6d\n", num, num * num);
      
    }
    return 0;
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2015, 11:18
Ответы с готовыми решениями:

Цикл не останавливается, значение функции вычисляется неправильно
Цикл не останавливается и программа не правильно вычисляет значения функции , посмотрите пожалуйста...

При вводе данных цикл по поиску EOF в Getchar не останавливается
Здраствуйте, вот такая проблема: #include &lt;stdio.h&gt; main() { int nc=0; while(getchar()...

Цикл не останавливается
Вот часть программы: var i: longint; b: string; n: byte; begin readln(n); readln(b); ...

C++ Цикл не останавливается на cin >> n;
Имею код: ....... int n; cout &lt;&lt; &quot;Enter the quantity of clients (up to 10)&quot; &lt;&lt; endl; ...

Цикл останавливается, по непонятным причинам
Здравствуйте форумчане. Столкнулся с проблемой, что цикл в цикле, останавливается выполнив...

15
Curry
2852 / 1904 / 239
Регистрация: 01.06.2013
Сообщений: 3,982
Записей в блоге: 7
23.02.2015, 11:31 2
Лучший ответ Сообщение было отмечено Debi как решение

Решение

scanf("%d",&num2);
1
Debi
0 / 0 / 0
Регистрация: 23.02.2015
Сообщений: 18
23.02.2015, 13:36  [ТС] 3
моя не внимательность, спасибо за ответ)
0
System16v
3 / 3 / 1
Регистрация: 19.02.2014
Сообщений: 115
03.04.2015, 18:50 4
А может кто подсказать тоже на счет цикла while? Такая проблема,писал программу,обнаружил косяк.Не могу понять почему. Вот например отрывок кода из программы -
C++
1
2
3
4
5
6
7
 
int a;
while(a!=2&&a!=1)
          {
              cout << "Salonov vsego 2!Viberete salon 1 ili salon 2!: ";
              cin >> a;
          }
Если ввожу числа любые кроме 1 и 2 - все нормально работает,пишет строчку что не верно,и просит заново ввести число.Но если я ввожу символ - начинает бесконечно строчить строку что неверно,и не дает ввести заново повторно.В чем проблема?Я думал,что он должен бы точно так же написать что не верно,и ждать пока я введу заново.Но этого не происходит...Или как сделать чтоб было именно так? Или просто объявить a - символом,и тогда уже в условии вбивать 1 и 2 как символ?
0
Curry
2852 / 1904 / 239
Регистрация: 01.06.2013
Сообщений: 3,982
Записей в блоге: 7
03.04.2015, 19:32 5
Цитата Сообщение от System16v Посмотреть сообщение
Или просто объявить a - символом,
Почему бы и нет? Только условие лучше в конце проверять
C++
1
2
3
4
5
6
7
    char a;
 
    do
    {
        cout << "Salonov vsego 2!Viberete salon 1 ili salon 2!: ";
        cin >> a;
    }while( a!='2' && a!='1');
0
System16v
3 / 3 / 1
Регистрация: 19.02.2014
Сообщений: 115
03.04.2015, 20:07 6
KolodeznyDiver, да я тоже так попробовал,вроде обрадовался,но когда ниже по программе спустился, опечалился...Там потом "a" используется как индекс массива ,короче не получается...
0
ValeryS
Модератор
7483 / 5666 / 725
Регистрация: 14.02.2011
Сообщений: 19,368
Завершенные тесты: 1
03.04.2015, 20:10 7
Цитата Сообщение от System16v Посмотреть сообщение
.Там потом "a" используется как индекс массива
так измени
C++
1
2
3
4
5
6
7
8
    char n;
 
    do
    {
        cout << "Salonov vsego 2!Viberete salon 1 ili salon 2!: ";
        cin >> n;
    }while( n!='2' && n!='1'); 
int a=n-'0';
Добавлено через 54 секунды
хотя странный индекс отсчет в СИ в массивах идет с 0
1
Curry
2852 / 1904 / 239
Регистрация: 01.06.2013
Сообщений: 3,982
Записей в блоге: 7
03.04.2015, 20:20 8
Цитата Сообщение от ValeryS Посмотреть сообщение
хотя странный индекс отсчет в СИ в массивах идет с 0
Если с нуля, кто ж мешает
C++
1
int a=n-'1';
1
ValeryS
Модератор
7483 / 5666 / 725
Регистрация: 14.02.2011
Сообщений: 19,368
Завершенные тесты: 1
03.04.2015, 20:30 9
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Если с нуля, кто ж мешает
да никто не мешает
но видишь вводится 1 или 2 а используется как индекс, вот у меня и непонятки
0
Curry
2852 / 1904 / 239
Регистрация: 01.06.2013
Сообщений: 3,982
Записей в блоге: 7
03.04.2015, 21:03 10
Вообще то способы разные есть
C++
1
2
3
4
5
6
7
8
9
10
11
    int a; 
    do
    {
        cout << "Salonov vsego 2! Viberete salon 1 ili salon 2!: ";
        if (!(cin >> a)) {
            cout << "parse error";
            cin.clear();
            cin.ignore();
            continue;
        } 
    }while( a!=2 && a!=1);
или считывать целую строку в cin.getline и atol только, в данном случае, они избыточны.
1
System16v
3 / 3 / 1
Регистрация: 19.02.2014
Сообщений: 115
03.04.2015, 21:10 11
Ну вроде бы понял , спасибо.Буду пробовать.
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
!(cin >> a)
Только можешь объяснить условие.А то я не совсем понял,что оно означает
0
Curry
2852 / 1904 / 239
Регистрация: 01.06.2013
Сообщений: 3,982
Записей в блоге: 7
03.04.2015, 21:14 12
Цитата Сообщение от System16v Посмотреть сообщение
Только можешь объяснить условие
Если операция чтения из потока в заданном формате не удалась, возвращается 0, т.е. !(cin >> a) == 1,
тогда выполняем сброс ошибок во входном потоке - он оживает и не зацикливается.
1
System16v
3 / 3 / 1
Регистрация: 19.02.2014
Сообщений: 115
03.04.2015, 23:49 13
Вот вроде переделал свой код,все вроде бы адекватно работает .Но...Че за ерунда подскажите пожалуйста.В самом коде думаю вам сразу трудно будет разбираться,да и смысл то ,но прикол в том,что 1 цикл while работает как-то странно .Т.е. там спрашивается выберете 0 - для выхода и 1 - для продолжения.Сделал так как выше ты описывал,чтоб на другие символы не реагировал и не зацикливался. Так вот,если вводишь не 0 и не 1,а любую другую цифру,то работает адекватно - пишет ошибку,просит повторит ввод.А если вводишь символ другой - то 1й раз реагираует адекватно и так же просит ввести повторно,а если вводишь второй раз символ - то цикл завершается сам по себе,как буд-то я ввел 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
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
//---------------------------------------------------------------------------
#include <vcl.h>
#include <iostream>
#include <cstdlib>
#include <math>
#include <iomanip>
 
using namespace std;
 
 
 
int main()
{
       const int size=10;
       int samolet[size]={0};
       int a,b,c=0,d=0;
       int e;
 
       for(int i=0;i<1000;i++)
       {
          cout << "\nVvedite 1, dlya kyryashih\nVvedite 2, dlya ne kyryashih: ";
          do
           {
            if (!(cin >> a))
            {
            cout << "Salonov vsego 2! Viberete salon 1 ili salon 2!: ";
            cin.clear();
            cin.ignore();
            continue;
            }
            if(a!=1&&a!=2)
              cout << "Salonov vsego 2! Viberete salon 1 ili salon 2!: ";
            }while( a!=2 && a!=1);
          if(a==1)
          {
            if(c!=5)
            {
             cout << "\nSvobodnie mesta est v kyryashem salone: ";
             for(int j=0;j<5;j++) // вывод пустых мест
               {
                  if(samolet[j]!=1)
                     cout << j+1 << ", ";
               }
             cout << "\nViberete mesto soglasno svobodnim: " ;
             do
               {
               if (!(cin >> b))
                {
                 cout << "Takogo mesta ne syshestvyet!Vvedite ot 1 do 5!: ";
                 cin.clear();
                 cin.ignore();
                 continue;
                }
                 if(b>5||b<1)
                   cout << "Takogo mesta ne syshestvyet!Vvedite ot 1 do 5!: ";
               }while(b>5||b<1);
 
             if(samolet[b-1]==1)   // проверка введенного места
             {
                cout << "Eto mesto zanyato!Viberi svobodnoe!: ";
                 do
               {
               if (!(cin >> b))
                {
                 cout << "Takogo mesta ne syshestvyet!: ";
                 cin.clear();
                 cin.ignore();
                 continue;
                }
                 if(samolet[b-1]==1)
                   cout << "Eto mesto zanyato!Viberi svobodnoe!: ";
                 if(b>5||b<1)
                 cout << "Takogo mesta ne syshestvyet!: ";
                }while(b>5||b<1||samolet[b-1]==1);
 
             }
                samolet[b-1]=1;
                c++;
                cout << "\nVashe mesto [" << b << "] v kyrayshem salone\n\n";
 
             }
              else if(c!=5)
                {
                 samolet[b-1]=1;
                 c++;
                 cout << "\nVashe mesto [" << b << "] v kyrayshem salone\n\n";
                 if(d>5)
                   d=5;
                }
              if(a==0)
               break;
              if(c==5&&d!=5)
               {
                   cout << "Mesta v kyryashem salone zakonchilis! ";
                   cout << " Ostalis tolko v ne kyryashem salone! ";
                   cout << endl;
               }
             }
//---------------------------------------------------------------- конец if a==1
     if(a==2)
           {
            if(d!=5)
            {
             cout << "Svobodnie mesta est v ne kyryashem salone: ";
             for(int j=5;j<size;j++)
               {
                  if(samolet[j]!=1)
                    cout << j+1 << ", ";
               }
               cout << "\nViberete mesto soglasno svobodnim: " ;
             do
               {
               if (!(cin >> b))
                {
                 cout << "Takogo mesta ne syshestvyet!Vvedite ot 6 do 10!: ";
                 cin.clear();
                 cin.ignore();
                 continue;
                }
                 if(b<6||b>10)
                   cout << "Takogo mesta ne syshestvyet!Vvedite ot 6 do 10!: ";
               }while(b<6||b>10);
 
             if(samolet[b-1]==1)
             {
                cout << "Eto mesto zanyato!Viberi svobodnoe!: ";
                 do
               {
               if (!(cin >> b))
                 {
                 cout << "Takogo mesta ne syshestvyet!: ";
                 cin.clear();
                 cin.ignore();
                 continue;
                 }
                  if(samolet[b-1]==1)
                    cout << "Eto mesto zanyato!Viberi svobodnoe!: ";
                  if(b<6||b>10)
                  cout << "Takogo mesta ne syshestvyet!: ";
                 }while(b<6||b>10||samolet[b-1]==1);
               }
               samolet[b-1]=1;
               d++;
               cout << "\nVashe mesto [" << b << "] v ne kyrayshem salone\n\n";
               if(c>5)
               c=5;
               if(d==5&&c!=5)
               {
                cout << "Mesta v ne kyryashem salone zakonchilis! ";
                cout << " Ostalis tolko v kyryashem salone! ";
                cout << endl;
               }
             }
              else if(d!=5)
                {
                 samolet[b-1]=1;
                 d++;
                 cout << "\nVashe mesto [" << b << "] v ne kyrayshem salone\n\n";
                 if(c>5)
                 c=5;
                 if(d>5)
                 d=5;
                  if(d==5&&c!=5)
                  {
                   cout << "Mesta v ne kyryashem salone zakonchilis! ";
                   cout << " Ostalis tolko v kyryashem salone! ";
                   cout << endl;
                  }
                }
                else if(d==5)
                  {
                   cout << "Mesta v ne kyryashem salone zakonchilis! ";
                   cout << " Ostalis tolko v kyryashem salone! ";
                   cout << endl;
                  }
          }
//---------------------------------------------------------------конец if a==2
       if(c==5&&d==5)
          break;
 
           cout << "\nEsli vvod zakonchen,vvedite - 0 "
                << ",ili 1 dlya prodolgeniya: ";
           do
           {
            if (!(cin >> e))
            {
            cout << "Nevernii vvod!Vvedite 0 - dlya vihoda,1 - dlya vibora mest: ";
            cin.clear();
            cin.ignore();
            continue;
            }
             if(e!=0&&e!=1)
              cout << "Neverni vvod!Vvedite 0 - dlya vihoda,1 - dlya vibora mest: ";
            }while(e!=0&&e!=1);
       if(e==0)
          break;
             }
//------------------------------------------------------------- конец цикла for
       if(c==5&&d==5)
       {
          cout << "\nVse mesta zanyati!"
               << "\nVsego mest zanyato v salone kyryashih: " << c
               << "\nVsego mest zanyato v salone ne kyryashih: " << d
               << "\nPriyatnogo poleta!Poleteli!";
       }
       if(c!=5||d!=5)
       {
        cout << "\nVsego mest zanyato v salone kyryashih: " << c
             << "\nVsego mest zanyato v salone ne kyryashih: " << d
             << "\nPriyatnogo poleta!Poleteli!";
       }
       cout << endl << endl;
       system("pause");
       return 0;
}
Строки 183-194
0
Curry
2852 / 1904 / 239
Регистрация: 01.06.2013
Сообщений: 3,982
Записей в блоге: 7
04.04.2015, 10:45 14
Да, код у Вас запутанный. Вначале спрашиваете про "курячий салон" , но не запрашиваете ответ.
Во первых, выделите каждый запрос-ответ в отдельную функцию, чтобы основная уменьшилась и стала понятнее.
Во вторых, попробуйте способ, который, вообще то, используется чаще всего:
C++
1
2
3
4
5
6
7
8
    int a; 
    char buf[88];
    do
    {
        cout << "Salonov vsego 2! Viberete salon 1 ili salon 2!: ";
        cin.getline(buf,sizeof(buf));
        a=atoi(buf); 
    }while( a!=2 && a!=1);
0
System16v
3 / 3 / 1
Регистрация: 19.02.2014
Сообщений: 115
04.04.2015, 11:18 15
Цитата Сообщение от KolodeznyDiver Посмотреть сообщение
Вначале спрашиваете про "курячий салон" , но не запрашиваете ответ.
всмысле?Там изначально спрашивается на выбор либо 1 либо 2,если выбрал 1, то работает if==1,если 2,то if==2 . Так все таки почему while работает некорректно в строках 183-194?Остальные работают нормально.Где там может быть ошибка? Я уже когда практически все сделал,понял что проще было через 2 функции отдельных сделать,но переделывать лень
0
Curry
2852 / 1904 / 239
Регистрация: 01.06.2013
Сообщений: 3,982
Записей в блоге: 7
04.04.2015, 12:41 16
Попробуйте все вопросы задавать через, например, такую вспомогательную функцию:
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
typedef bool IntPredicate(int v);
 
int ask(const char* prompt, const char* errmsg, IntPredicate fp)
{
    int a; 
    char buf[88];
    cout << prompt;
    if(!cin.getline(buf,sizeof(buf))){
        cout << errmsg;
        return ask(prompt,errmsg,fp);
    }
    a=atoi(buf);
    if(fp(a))
        return a;
    cout << errmsg;
    return ask(prompt,errmsg,fp);
}
 
 
bool pred1_2(int a)
{
    return a==1 || a==2;
}
 
int main()
{
    int a=ask("Viberete salon 1 ili salon 2!: ","Salonov vsego 2! ",pred1_2);
- тогда размер основной ф-ии уменьшится, и в тумане чтото станет видно.
p.s. Я не знаю CPPBuilder, на котором Вы пишите, тем более его версию. Если он поддерживает лямбда функции или бы Вы умели пользоваться библиотекой boost, можн было бы не записывать отдельные ф-ии - предикаты на каждый случай. Но и так можно.
0
04.04.2015, 12:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.04.2015, 12:41

Почему не останавливается цикл по требованию?
Здравствуйте! Интересует вопрос по теме. for (int i = 2; !flag; ++i) { if...

Цикл не останавливается на терминальном нуле
#include&lt;iostream&gt; #include&lt;string.h&gt; using namespace std; void strlen(char *s) { int i;...

Не останавливается цикл по нажатию кнопки на форме
у меня есть цикл в программе который запускается с кнопки на форме, и я хочу прервать этот цикл с...


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

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

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