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

Проверка ввода чисел - C++

Восстановить пароль Регистрация
 
snyppimylt
 Аватар для snyppimylt
7 / 7 / 1
Регистрация: 18.12.2011
Сообщений: 400
18.02.2013, 21:18     Проверка ввода чисел #1
Есть цикл:
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
struct WvsB{
int PLAYER[N];
int PLAYER1[N];
};
    
---
 
while(ch!='\r'){
 
        cout<<"\nКОМАНДА BLACKWOOD\n\n";
 
        for(int i=0,b=1; i<N; ++i,b++)
        {
            while(true){
            cout<<"НОМЕР РАНГА -"<<" ИГРОК "<<b<<" ";
 
            cin>>black.PLAYER[i];
            if(cin.fail() || black.PLAYER[i]>70 || black.PLAYER[i]<1)
            {cout<<"\n...еще раз...\n\n"; cin.clear(); cin.ignore(4,'\n'); continue;}
            
            else
            {cin.ignore(10,'\n'); break;}
 
            }       
        }
 
        cout<<"\nКОМАНДА WARFACE\n\n";
 
        for(int j=0,g=1; j<N; j++, g++)
        {
            cout<<"НОМЕР РАНГА -"<<" ИГРОК "<<g<<" ";
            cin>>warfc.PLAYER1[j];
 
if(cin.fail() || black.PLAYER1[j]>70 || black.PLAYER1[j]<1)
{cout<<"ERROR.. значение = "<< black.PLAYER1[j]; getch(); return 0;}
}
Решил для практики, играя в варфейс написать функцию "Авто баланс команд". Ну вот, первый цикл for работает со всеми проверками нормально а вот второй работает не корректно. Делает подобие пропусков. Может перед тем как инициализировать элементы массивов после ввода надо это сделать до этого? а то я не очень врубаюсь, почему так получается.
Вот пример ошибки:
Миниатюры
Проверка ввода чисел  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.02.2013, 21:18     Проверка ввода чисел
Посмотрите здесь:

Проверка ввода C++
C++ проверка ввода C++
Проверка ввода C++
C++ Проверка корректности ввода чисел
Проверка ввода C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
snyppimylt
 Аватар для snyppimylt
7 / 7 / 1
Регистрация: 18.12.2011
Сообщений: 400
19.02.2013, 00:17  [ТС]     Проверка ввода чисел #2
Буду рад если кто нибудь все таки ответит.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.02.2013, 00:56     Проверка ввода чисел #3
Тут что-то совсем не понятно. Вводите в warfc.PLAYER1, а проверяете black.PLAYER1... А где, вообще, ввод black.PLAYER1?
snyppimylt
 Аватар для snyppimylt
7 / 7 / 1
Регистрация: 18.12.2011
Сообщений: 400
19.02.2013, 03:50  [ТС]     Проверка ввода чисел #4
Цитата Сообщение от alsav22 Посмотреть сообщение
Тут что-то совсем не понятно. Вводите в warfc.PLAYER1, а проверяете black.PLAYER1... А где, вообще, ввод black.PLAYER1?
Видимо я вас запутал, я скопировал верхнюю часть кода проверки и так получилось.

Вот.
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
struct WvsB{
int PLAYER[N];
int PLAYER1[N];
};
    
---
 
while(ch!='\r'){
 
        cout<<"\nКОМАНДА BLACKWOOD\n\n";
 
        for (int i=0,b=1; i<N; ++i,b++)
        {
            while(true){
            cout<<"НОМЕР РАНГА -"<<" ИГРОК "<<b<<" ";
 
            cin>>black.PLAYER[i]; // <<------------- ввод black.PLAYER
 
            if(cin.fail() || black.PLAYER[i]>70 || black.PLAYER[i]<1)
            {cout<<"\n...еще раз...\n\n"; cin.clear(); cin.ignore(4,'\n'); continue;}
            
            else
            {cin.ignore(10,'\n'); break;}
 
            }       
        }
 
        cout<<"\nКОМАНДА WARFACE\n\n";
 
 for (int j=0,g=1; j<N; j++, g++)
 {
            cout<<"НОМЕР РАНГА -"<<" ИГРОК "<<g<<" ";
            cin>>warfc.PLAYER1[j]; // <<------------- ввод warfc.PLAYER1
 
 
          if (cin.fail() || warfc.PLAYER1[j]>70 || warfc.PLAYER1[j]<1)
         {
              cout<<"ERROR.. значение = "<< black.PLAYER1[j]; getch();  
              return 0;
          }
 
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.02.2013, 13:47     Проверка ввода чисел #5
Вопрос остался:
Цитата Сообщение от alsav22 Посмотреть сообщение
А где, вообще, ввод black.PLAYER1?

Цитата Сообщение от snyppimylt Посмотреть сообщение
cin>>black.PLAYER[i]; // <<------------- ввод black.PLAYER
Вы мне показываете ввод black.PLAYER, а я спрашиваю про ввод black.PLAYER1.
Lawlliet
2 / 2 / 0
Регистрация: 25.03.2010
Сообщений: 145
19.02.2013, 13:51     Проверка ввода чисел #6
Цитата Сообщение от snyppimylt Посмотреть сообщение
cin>>warfc.PLAYER1[j]; // <<------------- ввод warfc.PLAYER1
[/CPP]
по моему видно
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.02.2013, 13:55     Проверка ввода чисел #7
Цитата Сообщение от Lawlliet Посмотреть сообщение
по моему видно
Видно black.PLAYER1 или warfc.PLAYER1?
Lawlliet
2 / 2 / 0
Регистрация: 25.03.2010
Сообщений: 145
19.02.2013, 13:56     Проверка ввода чисел #8
извиняюсь, ошибся
snyppimylt
 Аватар для snyppimylt
7 / 7 / 1
Регистрация: 18.12.2011
Сообщений: 400
19.02.2013, 22:09  [ТС]     Проверка ввода чисел #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Вы мне показываете ввод black.PLAYER, а я спрашиваю про ввод black.PLAYER1.
Его нету потому что если бы я и там массив делал в PLAYER, то были бы проблемы с элементами массива. когда записываешь число от 1 до 10 то при следующем вводе первые 2 числа занимают предыдущий ввод первые 2х чисел.

Ну так в чем проблема в коде?

Добавлено через 6 минут
Извините, еще раз:

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
struct WvsB{
int PLAYER[N];
int PLAYER1[N];
};
    
---
 
while(ch!='\r'){
 
        cout<<"\nКОМАНДА BLACKWOOD\n\n";
 
        for (int i=0,b=1; i<N; ++i,b++)
        {
            while(true){
            cout<<"НОМЕР РАНГА -"<<" ИГРОК "<<b<<" ";
 
            cin>>black.PLAYER[i]; // <<------------- ввод black.PLAYER
 
            if(cin.fail() || black.PLAYER[i]>70 || black.PLAYER[i]<1)
            {cout<<"\n...еще раз...\n\n"; cin.clear(); cin.ignore(4,'\n'); continue;}
            
            else
            {cin.ignore(10,'\n'); break;}
 
            }       
        }
 
        cout<<"\nКОМАНДА WARFACE\n\n";
 
 for (int j=0,g=1; j<N; j++, g++)
 {
            cout<<"НОМЕР РАНГА -"<<" ИГРОК "<<g<<" ";
            cin>>warfc.PLAYER1[j]; // <<------------- ввод warfc.PLAYER1
 
 
          if (cin.fail() || warfc.PLAYER1[j]>70 || warfc.PLAYER1[j]<1)
         {
              cout<<"ERROR.. значение = "<< warfc.PLAYER1[j]; getch();  
              return 0;
          }
 
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.02.2013, 22:53     Проверка ввода чисел #10
Цитата Сообщение от snyppimylt Посмотреть сообщение
Его нету
Если его нет, зачем он у вас в коде в 4 посте? Код из 9 поста даёт ошибку?

Добавлено через 9 минут
Не вижу всего кода, но вот такой код ошибок не выдаёт:
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
#include <iostream>
#include <conio.h>
using namespace std;
 
const int N = 7;
 
struct WvsB
{
int PLAYER[N];
int PLAYER1[N];
};
    
 
int main()
{
 setlocale(0, "");
 
 WvsB black;
 WvsB warfc;
 
 char ch = 'y';
 while(ch!='\r')
 {
 
    cout<<"\nКОМАНДА BLACKWOOD\n\n";
 
    for (int i=0,b=1; i<N; ++i,b++)
    {
        while(true)
        {
            cout<<"НОМЕР РАНГА -"<<" ИГРОК "<<b<<" ";
 
            cin>>black.PLAYER[i]; // <<------------- ввод black.PLAYER
 
            if(cin.fail() || black.PLAYER[i]>70 || black.PLAYER[i]<1)
            {cout<<"\n...еще раз...\n\n"; cin.clear(); cin.ignore(4,'\n'); continue;}
            
            else
            {cin.ignore(10,'\n'); break;}
 
        }       
    }
 
    cout<<"\nКОМАНДА WARFACE\n\n";
 
     for (int j=0,g=1; j<N; j++, g++)
     {
                cout<<"НОМЕР РАНГА -"<<" ИГРОК "<<g<<" ";
                cin>>warfc.PLAYER1[j]; // <<------------- ввод warfc.PLAYER1
 
 
              if (cin.fail() || warfc.PLAYER1[j]>70 || warfc.PLAYER1[j]<1)
             {
                  cout<<"ERROR.. значение = "<< warfc.PLAYER1[j]; getch();  
                  return 0;
             }
 
     }
}
 
system("pause");
return 0;
}
Миниатюры
Проверка ввода чисел  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2013, 23:37     Проверка ввода чисел
Еще ссылки по теме:

C++ Проверка ввода
C++ gets() проверка ввода
C++ Проверка правильности ввода. Запретить ввод чисел

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

Или воспользуйтесь поиском по форуму:
snyppimylt
 Аватар для snyppimylt
7 / 7 / 1
Регистрация: 18.12.2011
Сообщений: 400
19.02.2013, 23:37  [ТС]     Проверка ввода чисел #11
Проверил я еще раз свой исходный код и написал так как было в оригинале, т.е. в комманде Варфейс и Блеквуд так же:

C++
1
2
3
4
5
if(cin.fail() || black.PLAYER[i]>70 || black.PLAYER[i]<1)
            {cout<<"\n...еще раз...\n\n"; cin.clear(); cin.ignore(4,'\n'); continue;}
            
            else
            {cin.ignore(10,'\n'); break;}
Вот оригинал, работает стабильно, видимо все дело в невнимательности

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
int main()
{
    setlocale(0,"RUS");
 
char ch;
WvsB black;
WvsB warfc;
 
cout<<"ДЕМОНСТРАЦИЯ РЕЖИМА АВТОБАЛАНСА ИГРЫ WARFACE\n\nВВЕДИТЕ НОМЕР РАНГА У КАЖДОГО ИГРОКА. АВТОБАЛАНС РАСЧИТАН НА ИГРУ 8х8\n\n";
cout<<" ------------------ ДИАПАЗОН РАНГОВ ОТ 1 ДО 70 ----------------------\n";
    while(ch!='\r'){
 
        cout<<"\nКОМАНДА BLACKWOOD\n\n";
 
        for(int i=0,b=1; i<N; ++i,b++)
        {
            while(true){
            cout<<"НОМЕР РАНГА -"<<" ИГРОК "<<b<<" ";
 
            cin>>black.PLAYER[i];
            if(cin.fail() || black.PLAYER[i]>70 || black.PLAYER[i]<1)
            {cout<<"\n...еще раз...\n\n"; cin.clear(); cin.ignore(4,'\n'); continue;}
            
            else
            {cin.ignore(10,'\n'); break;}
 
            }       
        }
 
 
        cout<<"\nКОМАНДА WARFACE\n\n";
 
        for(int j=0,g=1; j<N; j++,g++)
        {
            while(true){
            cout<<"НОМЕР РАНГА -"<<" ИГРОК "<<g<<" ";
 
            cin>>warfc.PLAYER1[j];
            if(cin.fail() || warfc.PLAYER1[j]>70 || warfc.PLAYER1[j]<1)
            {
                cout<<"\n...еще раз...\n\n"; 
                cin.clear(); 
                cin.ignore(4,'\n'); 
                continue;
            }
            
            else
            {
                cin.ignore(10,'\n'); 
                break;
            }
 
        }       
    }
 
    cout<<"\n\n...Enter для выхода...\n";
    ch=getch();
}
 
return 0;
}
Добавлено через 2 минуты
Просто мне казалось странным, почему 2 одинаковой проверки работали не стабильно как в скриншоте который я в теме предоставил.
Yandex
Объявления
19.02.2013, 23:37     Проверка ввода чисел
Ответ Создать тему
Опции темы

Текущее время: 23:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru