Перезапуск программы на C

#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 выглядит намного понятнее.