Предложите пользователю повторно ввести номер - PullRequest
0 голосов
/ 04 марта 2019

Я занимаюсь практической программой «делай пока», где я хочу, чтобы пользователь ввел три числа, и программа выведет сумму на экран.После получения ответа программа спросит пользователя, хочет ли он ввести еще три числа, чтобы получить другой ответ, и так далее.Я в порядке с этим.

Если пользователь вводит что-либо кроме целого числа («A,!,%») И т. Д., Я хочу, чтобы программа предложила пользователю повторно ввести число.Смотрите комментарии в программе.

#include <stdio.h>

/*
Do - While

This program shall ask the user to enter
three numbers and print out the sum. Entering letters
or special characters will ask the user to re-enter that
number.

example:

Enter Number 1: 2
Enter Number 2: 5
Enter Number 3: 9

Answer is 16

...

Enter Number 1: 2
Enter Number 2: yum   here user incorrectly enters letters
Enter Number 2: 8     re-prompted to enter number to continue
Enter Number 3: 9

Answer is 19

*/

int main(void) {
    int a,b,c,ans,n;
    do{
        do{
            printf("Enter Number 1: ");
            scanf("%d", &a);
            printf("\n");
        }
        while((a>0) || (a<0)|| (a==0));

        do{
            printf("Enter Number 2: ");
            scanf("%d", &b);
            printf("\n");
        }
        while((b>0) || (b<0)|| (b==0));

        do{
            printf("Enter Number 3: ");
            scanf("%d", &c);
            printf("\n");
          }
        while ((c>0) || (c<0)|| (c==0));

        ans = a+b+c;

        printf("Answer is %d\n\n", ans);

        printf("Press 1 to start over, or 0 to quit...");
        scanf("%d",&n);
        printf("\n");

    }while (n!=0);

   return 0;
}

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Ваша программа содержит несколько повторяющихся разделов.Поскольку вы собираете три числа, вы должны использовать цикл for, который запускается три раза.

for (int i = 0; i < 3; i++) {
  /* ... */
}

Внутри цикла for вы собираете i+1 -ое число каждый раз.Если пользователь не вводит правильный номер, вы продолжаете пытаться его набрать.Таким образом, цикл do-while, содержащий printf и scanf, будет идти внутри цикла for.

for (int i = 0; i < 3; i++) {
  do {
    printf("Enter Number %d: ", i+1);
    scanf( /* ... */ );
  } while ( /* ... */ );
}

scanf возвращает количество элементов ввода, успешно прочитанных как int.Таким образом, цикл do-while должен повторяться до тех пор, пока возвращаемое значение scanf равно нулю.Мы можем сохранить возвращаемое значение в переменной и проверить переменную в while (...);, но мы можем просто переместить сам scanf в while (...);.Нам также нужен массив для хранения трех входных чисел.

int n[3];
for (int i = 0; i < 3; i++) {
  do {
    printf("Enter Number %d: ", i+1);
  } while (scanf("%d", n+i) == 0);
}

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

0 голосов
/ 05 марта 2019

Вы можете использовать fgets для получения ввода и использовать strtol () для приведения строки, введенной пользователем, в int.Если strtol возвращает 0, когда пользовательский ввод не начинается с цифры или не содержит числа.Оттуда вы можете проверить, является ли пользовательский ввод 0, и затем перекомпоновывать пользователя, пока а не будет 0.

*instead of scanf()*
char num1[5];
char *end;
fgets(num1, 5, stdin);
a = strtol(num1, &end, 10);
while( a = 0){
    fgets....
}
...