#c
#c
Вопрос:
Я работал над программой, которая будет добавлять, искать, редактировать и удалять записи учащихся. При кодировании основной функции (которая содержит меню) Интересно, есть ли способ перезапустить программу, если пользователь вводит клавишу, которая не включена в меню. Итак, план, который я имею в виду, заключается в том, что когда пользователь вводит недопустимый символ, программа перезапускается вместо запроса перепрофилировать допустимый символ (потому что я работаю над меню, и я лично считаю, что это аккуратно). Это программа, над которой я работал
int main()
{
int choice = 0;
do
{
system("cls");
printf("MAIN MENU");
printf("nnnttt1.Add Student");
printf("nttt2.Search Student");
printf("nttt3.Edit Info of Student");
printf("nttt4.Delete Student");
printf("nttt0.Exit");
printf("nnntttEnter choice => ");
scanf("%d",amp;choice);
switch(choice)
{
case 1:
addInfo();
break;
case 2:
searchInfo();
break;
case 3:
editInfo();
break;
case 4:
deleteInfo();
break;
case 5:
displayAll();
break;
case 6:
printf("nnnttttThank you!!!nnnnn");
exit(1);
break;
} //Switch Ended
}
while(choice==1 amp;amp; choice==2 amp;amp; choice==3 amp;amp; choice==4 amp;amp; choice==5 amp;amp; choice==6);
}
Комментарии:
1. Как может
choice
быть 1, 2, 3, 4, 5, и 6 одновременно? (Если только вы не нацелены на квантовый компьютер.)2. Кстати,
while(choice==1 amp;amp; choice==2 amp;amp; choice==3 amp;amp; choice==4 amp;amp; choice==5 amp;amp; choice==6);
это никогда не будет правдой. Так как будет выполнено только 1 условие.3.
printf("nttt0.Exit");
противcase 6:
выходов. И нет ничего о вводе5
в меню4. Итак, вместо того, чтобы запрашивать новый ввод, пользователь должен перезапустить программу только потому, что вы беспокоитесь о «красоте» структуры меню?
Ответ №1:
Вы, вероятно, захотите этого вместо:
do
{
...
} while(choice>=1 amp;amp; choice<6);
В этом случае вам не нужен вызов exit() внутри коммутатора, вы можете поместить эту часть после цикла do-while .
Обратите внимание, что scanf("%d",amp;choice);
при нажатии пользователем enter символ перевода строки остается позади stdin
. Это будет проблемой, когда вы вернетесь к этой строке, потому что вы будете читать перевод строки вместо следующего целого числа от пользователя. Самый простой способ избежать этого — добавить одну getchar();
строку после scanf .
Комментарии:
1. Обратите внимание на стильный интервал открытия
(choice>=1 amp;amp; choice<6);
. Это работа опытного и опытного программиста.
Ответ №2:
Это обеспечит цикл, который будет работать до тех пор, пока пользователь не введет 0
int main()
{
int choice = 0;
do
{
system("cls");
printf("MAIN MENU");
printf("nnnttt1.Add Student");
printf("nttt2.Search Student");
printf("nttt3.Edit Info of Student");
printf("nttt4.Delete Student");
printf("nttt0.Exit");
printf("nnntttEnter choice => ");
scanf("%d",amp;choice);
switch(choice)
{
case 1:
addInfo();
break;
case 2:
searchInfo();
break;
case 3:
editInfo();
break;
case 4:
deleteInfo();
break;
case 5:
displayAll();
break;
case 6:
printf("nnnttttThank you!!!nnnnn");
exit(1);
break;
} //Switch Ended
}
while(choice!=0);
}
Комментарии:
1.
while(choice!=0);
->while(choice)
хотя, возможно, это личный вкус.2. @Bathsheba Всегда лучше быть понятным в исходном коде. Даже если C интерпретирует любое ненулевое значение как
true
, в этом случае гораздо лучше показать намерениеchoice != 0
. То же самое и с вездесущимany_type *p = ...; if (p) { ... }
, «лучше»p != NULL
выглядит намного понятнее.