Как превратить команды Switch-Case & Goto во что-то еще? - PullRequest
0 голосов
/ 07 мая 2020

Я работал над программой, которая позволяет пользователю вводить целые числа, чтобы выбрать вариант из меню. После каждого выбора пользователь должен go вернуться в меню. Я мог бы сделать это отлично с помощью goto, но я должен использовать команду, а не команду goto. Как я могу удалить goto из программы и сохранить ее работоспособность? Я просто хочу, чтобы программа продолжала работать, но нужно удалить goto из проекта, как это сделать? Спасибо.

#include <stdio.h>
#pragma warning(disable:4996)
#include <string.h>

struct student
{
    char name[50];
    char surname[50];
    char major[50];
    int idnum;
} s[100];

void sortstudent(struct student students[], int s);

int main()
{
    int i, total, id, k, mode, flag = 0;
    struct student s[100];
    printf("Enter capacity of the classroom: ");
    scanf("%d", &total);
menu:
    printf("\nType 1 to add student record\nType 2 to search a student\nType 3 to sort students");
    printf("\nType 4 to show the classroom information\nType 5 to exit the program\n");
    scanf("%d", &mode);

    switch (mode)
    {

    case 1:
    //hidden commands
        goto menu;

    case 2:
    //hidden commands
        goto menu;


    case 3:
        //hidden commands
        goto menu;

    case 4:
        //hidden commands
        goto menu;


    case 5:
        printf("Shuttuing down the program.");
        break;

    default:
        printf("Invalid value. Chose an option from the menu again: ");
        goto menu;

    }
}

void sortstudent(struct student students[100], int s)
{
    int i, j;
    struct student temp;
    for (i = 0; i < s - 1; i++)
    {
        for (j = 0; j < (s - 1 - i); j++)
        {
            if (students[j].idnum > students[j + 1].idnum)
            {
                temp = students[j];
                students[j] = students[j + 1];
                students[j + 1] = temp;
            }
        }
    }
}

1 Ответ

1 голос
/ 07 мая 2020

Поместите меню в функцию и используйте некоторое время l oop, чтобы повторить выбор. Выбор 5 вернет функцию в основную и выйдет.
scanf - проблема, если ввод не является целым числом.

#include <stdio.h>
#pragma warning(disable:4996)
#include <string.h>

struct student
{
    char name[50];
    char surname[50];
    char major[50];
    int idnum;
} s[100];

void sortstudent(struct student students[], int s);
void menu(void);

int main()
{
    menu ( );
    return 0;
}

void menu(void)
{
    int i, total, id, k, mode, flag = 0;
    struct student s[100];
    printf("Enter capacity of the classroom: ");
    scanf("%d", &total);
    while ( 1)
    {
        printf("\nType 1 to add student record\nType 2 to search a student\nType 3 to sort students");
        printf("\nType 4 to show the classroom information\nType 5 to exit the program\n");
        scanf("%d", &mode);

        switch (mode)
        {
            case 1:
                //hidden commands
                break;

            case 2:
                //hidden commands
                break;

            case 3:
                //hidden commands
                break;

            case 4:
                //hidden commands
                break;

            case 5:
                printf("Shuttuing down the program.");
                return;

            default:
                printf("Invalid value. Chose an option from the menu again: ");
                break;

        }
    }
}

void sortstudent(struct student students[100], int s)
{
    int i, j;
    struct student temp;
    for (i = 0; i < s - 1; i++)
    {
        for (j = 0; j < (s - 1 - i); j++)
        {
            if (students[j].idnum > students[j + 1].idnum)
            {
                temp = students[j];
                students[j] = students[j + 1];
                students[j + 1] = temp;
            }
        }
    }
}

Используйте fgets и sscanf, чтобы избежать проблем с scanf

#include <stdio.h>
#include <stdlib.h>
#pragma warning(disable:4996)
#include <string.h>

struct student
{
    char name[50];
    char surname[50];
    char major[50];
    int idnum;
};

void sortstudent(struct student students[], int s);
void menu(void);

int main()
{
    menu ( );
    return 0;
}

void menu(void)
{
    char mode[100] = "";
    int i, total, id, k, flag = 0;
    int result = 0;
    struct student s[100];
    do {
        printf("Enter capacity of the classroom: ");
        if ( ! fgets ( mode, sizeof mode, stdin)) {
            fprintf ( stderr, "fgets EOF\n");
            exit ( EXIT_FAILURE);
        }
        result = sscanf(mode,"%d", &total);
    } while ( result != 1);
    while ( 1)
    {
        printf("\nType 1 to add student record\nType 2 to search a student\nType 3 to sort students");
        printf("\nType 4 to show the classroom information\nType 5 to exit the program\n");
        if ( ! fgets ( mode, sizeof mode, stdin)) {
            fprintf ( stderr, "fgets EOF\n");
            exit ( EXIT_FAILURE);
        }

        switch (mode[0])
        {
            case '1':
                //hidden commands
                break;

            case '2':
                //hidden commands
                break;

            case '3':
                //hidden commands
                break;

            case '4':
                //hidden commands
                break;

            case '5':
                printf("Shuttuing down the program.");
                return;

            default:
                printf("Invalid value. Chose an option from the menu again: ");
                break;

        }
    }
}

void sortstudent(struct student students[100], int s)
{
    int i, j;
    struct student temp;
    for (i = 0; i < s - 1; i++)
    {
        for (j = 0; j < (s - 1 - i); j++)
        {
            if (students[j].idnum > students[j + 1].idnum)
            {
                temp = students[j];
                students[j] = students[j + 1];
                students[j + 1] = temp;
            }
        }
    }
}
...