2013-11-27 22 views
0

Я пишу проект, и я должен проверить, введен ли пользователь допустимое значение для определенных вещей. Например, первым случаем является проверка того, вводит ли он целое число, длина которого не превышает 6 и> 0. Я работаю с структурой, так что мой код это:Как проверить, введено ли пользователем допустимое значение?

#include <iostream> 

using namespace std; 

int dolzina_int(int vlez); 

int main() 
{ 
    struct pole{ 
     int sifra;    // sifra na artiklot 
     string opis;   // opis na artiklot 
     float cena;    // edinecna cena 
     int vlez_kol;   // vlezna kolicina 
     int izlez_kol;   // izlezna kolicina 
     float dan_stapka;  // danocna stapka 
     float iznos;   // iznos 
     int datum;    // datum na vlez i izlez (GGMMDD) 
    }artikli[100];    // maksimalen broj na artikli e 100 


    for (int i = 0; i < 5; i++){ 

     cin >> artikli[i].sifra; 

     while(!(cin >> artikli[i].sifra) || 
       (artikli[i].sifra < 0 || (dolzina_int(artikli[i].sifra) > 6))) 
      { 
       cout << "Error" << endl; 
       cin.clear(); 
       std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
      } 
     } 


    return 0; 
} 

// funkcija za dolzina na integer 
int dolzina_int(int vlez){ 
    int dolzina = 1; 
    while(vlez > 0){ 
     dolzina++; 
     vlez /= 10; 
    } 
    return dolzina; 
} 

Итак, мой код, кажется, работает, первая часть, это проверить, если это> 6 или < 0, а второй еще, если это Безразлично 't работать правильно, чтобы проверить, является ли это целым числом или нет. Поэтому мой вопрос заключается в следующем: как я могу убедиться, что это целочисленное значение, которое вводит пользователь, и как я могу убедиться, что длина целого не равна> 6 или значение равно < 0, а между тем, если это так, сделать он снова вводит его, а также проверяет вновь введенное значение, поскольку мой код этого не делает в настоящее время.

for (int i = 0; i < 5; i++){ 

    artikli[i].sifra = 1; 

    do{ 
     cout << "Enter a code: "; 
     while(!(cin >> artikli[i].sifra)){ 
      cin.clear(); 
      cin.ignore(); 
      cout << "Invalid entry. Enter a new value: "; 
     } 
    }while(artikli[i].sifra > 0 && dolzina_int(artikli[i].sifra) > 6); 
} 
+0

Я постараюсь помочь. Можете ли вы показать мне свой класс и всю свою «главную» функцию? – 0x499602D2

+0

Обновлен весь исходный код (текущий) в главном сообщении. – user3002211

+0

Спасибо. Я постараюсь изо всех сил решить вашу проблему. – 0x499602D2

ответ

3

Следует отметить, что извлечение будет выполнено только в том случае, если содержимое, считанное из файла, может использоваться как правильное значение типа объекта (в этом случае целое число sifra). Если он не работает, в состоянии потока будет установлено ios_base::failbit.

Итак, что нужно сделать, так это то, что когда задано неправильное значение, мы отбрасываем неправильный текст, очищаем состояние потока и повторяем его. Например:

#include <iostream> 
#include <string> 
#include <limits> 

int main() 
{ 
    for (int i = 0; i < 5; ++i) 
    { 
     while (!(std::cin >> artikli[i].sifra) || 
       ((artikli[i].sifra < 0) || (artikli[i].sifra > 6))) 
     { 
      std::cout << "Entered an incorrect value, try again.\n"; 
      std::cin.clear(); 
      std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
     } 
     // ... 
    } 
} 
+0

Мне нужно использовать struct, и программа не закончена полностью, поэтому у нее так много переменных, я объявил их для будущего использования. – user3002211

+0

@ user3002211 Несмотря на это, по-прежнему идиоматично использовать вставку для пользовательских классов. – 0x499602D2

+0

Я понимаю, что боль в заднице вставлять множество переменных, однако это то, что требует программа (это упражнение). Что касается части векторов, я не могу их использовать :( – user3002211

0

Сначала вы должны проверить это:

http://www.cplusplus.com/reference/cctype/

Во-вторых, я думаю, что ваш более усложняя его ...

1) Читать в междунар

2) проверки значение int

3) повтор

Так что я хотел бы сделать это

для (я = 0, чтобы я < 5 добавьте к I)

в то время как (введенное значение не цифра)

не получите цифру до значения действительна

Что-то вроде этого:

for(i = 0; i < 5; i++) { 
    cout << "Enter the code" << endl; 
    cin >> artikli[i].sifra; 
    while(!is_digit) { 
     cout << "Invalid, please repeat" << endl; 
     cin >> artikli[i].sifra; 
    } 
} 
+0

Мой код: 'while (! Isdigit (artikli [i] .sifra) && (dolzina_int (artikli [i] .sifra)> 6) && (artikli [i] .sifra) <0) { cin >> artikli [I] .sifra; } ', и когда я запускаю программу, она автоматически заполняет значение и закрывается. – user3002211

+0

Я не понимаю, что делает ваш код ... Вы должны сказать мне, что ваши функции делают или даже имеют в виду, потому что что-то вроде «sifra» не говорит мне, что он делает .. Извините, я думаю, что мы не спекулируя английским здесь. – visc

+0

Извините, sifra означает код на моем языке. В любом случае, давайте сделаем код более простым, 'while (isdigit (artikli [i] .sifra)) {cin >> artikli [i] .sifra; } ', тогда, когда я вхожу в' aaa', он автоматически записывает значение для остальных записей и закрывает программу, не позволяя пользователю исправить ошибку. – user3002211

0

Предполагая, что вы хотите, чтобы ограничить вход для целых чисел и иметь их в определенном [min, max] диапазоне, вы могли бы сделать это следующим образом:

int input = -1; 
do 
{ 
    std::cout << "Enter a value in the range [min, max]: "; 
    while (!(std::cin >> input)) // while the input is invalid 
    { 
     std::cin.clear(); // clear the fail bit 
     std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // ignore the invalid entry 
     std::cout << "Invalid Entry! Please Enter a valid value: "; 
    } 
} while (min > input || max < input); 

Где min и max являются любые значения, которые вы хотите сохранить значение между ними.

+0

Я хочу проверить, если бы пользователь ввел целое число в первую очередь, если бы он это сделал, тогда я бы хотел проверить, больше ли он, чем 0, и если длина меньше или равна 6. Если это так, переходите к следующему, еще раз введите новое целое число. – user3002211

+0

Если тип является 'int' (который здесь' input'), вход будет терпеть неудачу, если вы введете что-то еще. Например, если пользователь вводит 'a', бит отказа будет установлен. Поэтому нет необходимости проверять, является ли ввод целым, если вы не читаете его как строку. –

+0

Я обновил код в первом сообщении, проверьте его, используя свой метод, он, похоже, не работает должным образом. Даже когда я ввожу значение <0, оно не отображает ошибку, или когда значение имеет более 6 цифр внутри. Кроме того, есть некоторая ошибка, которая позволяет мне зацикливаться более чем в 5 раз. – user3002211

Смежные вопросы