Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
8 / 8 / 1
Регистрация: 18.12.2011
Сообщений: 409
1

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

18.02.2013, 21:18. Показов 900. Ответов 10
Метки нет (Все метки)

Есть цикл:
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 работает со всеми проверками нормально а вот второй работает не корректно. Делает подобие пропусков. Может перед тем как инициализировать элементы массивов после ввода надо это сделать до этого? а то я не очень врубаюсь, почему так получается.
Вот пример ошибки:
0
Миниатюры
Проверка ввода чисел  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.02.2013, 21:18
Ответы с готовыми решениями:

Проверка ввода чисел
Проверка на ввод чисел int n; cout &lt;&lt; &quot;Введите количество строк: &quot;; while (!(cin &gt;&gt; n)) {...

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

Проверка правильности ввода. Запретить ввод чисел
Здравствуйте форумчане! Хочу сделать в коде проверку типа: если вводить, где положено string ...

Visual C++ проверка ввода на число, проверка на кирилицу
Суть ввести с клавиатуры нечто, и повторять ввод до тех пор пока введенное число не будет числом. ...

__________________

Записывайтесь на профессиональные курсы C++ разработчиков
10
8 / 8 / 1
Регистрация: 18.12.2011
Сообщений: 409
19.02.2013, 00:17  [ТС] 2
Буду рад если кто нибудь все таки ответит.
0
5479 / 4874 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.02.2013, 00:56 3
Тут что-то совсем не понятно. Вводите в warfc.PLAYER1, а проверяете black.PLAYER1... А где, вообще, ввод black.PLAYER1?
0
8 / 8 / 1
Регистрация: 18.12.2011
Сообщений: 409
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;
          }
 
}
0
5479 / 4874 / 831
Регистрация: 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.
0
2 / 2 / 0
Регистрация: 25.03.2010
Сообщений: 145
19.02.2013, 13:51 6
Цитата Сообщение от snyppimylt Посмотреть сообщение
cin>>warfc.PLAYER1[j]; // <<------------- ввод warfc.PLAYER1
[/CPP]
по моему видно
0
5479 / 4874 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.02.2013, 13:55 7
Цитата Сообщение от Lawlliet Посмотреть сообщение
по моему видно
Видно black.PLAYER1 или warfc.PLAYER1?
0
2 / 2 / 0
Регистрация: 25.03.2010
Сообщений: 145
19.02.2013, 13:56 8
извиняюсь, ошибся
0
8 / 8 / 1
Регистрация: 18.12.2011
Сообщений: 409
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;
          }
 
}
0
5479 / 4874 / 831
Регистрация: 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;
}
0
Миниатюры
Проверка ввода чисел  
8 / 8 / 1
Регистрация: 18.12.2011
Сообщений: 409
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 одинаковой проверки работали не стабильно как в скриншоте который я в теме предоставил.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.02.2013, 23:37

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Проверка ввода
Как ограничить ввод символов в программе!!!! На каждый символ, который был введен выдавать...

Проверка ввода
Здравствуйте, помогите, пожалуйста, написать функцию для обработки неправильного ввода символов....

Проверка ввода
Доброго вам времени суток. Бывалые, подскажите неопытному, как лучше писать? И если несложно,...

Проверка ввода
Как можно проверить вводимые данные, являются ли они числом. Допустим если ввели &quot;08098рррр9&quot; -...


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

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

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