Вызов функций несколько раз с разными значениями в одной и той же функции - PullRequest
0 голосов
/ 06 февраля 2019

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

int studentId, var, i;
float first;
int course, course1, course2;
float second, amount;
float credit1, credit2, credit3, credit4, credit5, credit6, credit7, credit8;
float paymentA, paymentB, paymentC, paymentD, total;
float creditA, creditB;
char *a;


void courseInfo(int myCourse){
    switch(myCourse)
    {
             case 4587:
                credit1 = 4;
                a = "MAT 236";
                break;
            case 4599:
                credit1 = 3;
                a = "COP 220";
                break;
            case 8997:
                credit1 = 1;
                a = "GOL 124";
                break;
            case 9696:
                credit1 = 3;
                a = "COP 100";
                break;
            case 4580:
                credit1 = 3;
                a = "MAT 230";
                break;
            case 4581:
                credit1 = 4;
                a = "MAT 231";
                break;
            case 4582:
                credit1 = 2;
                a = "MAT 232";
                break;
            case 4583:
                credit1 = 2;
                a = "MAT 233";
                break;
            case 3587:
                credit1 = 4;
                a = "MAT 256";
                break;
            case 4519:
                credit1 = 3;
                a = "COP 420";
                break;
            case 6997:
                credit1 = 1;
                a = "GOL 127";
                break;
            case 9494:
                credit1 = 3;
                a = "COP 101";
                break;
            default:
                printf("Sorry invalid entry!\n\n");
                }
        printf("%.2d\t%.2c\t%.2f\t\t$ %.2f\n", course, a, credit1 , credit1*120.25);
}

int main()
{


/*taking in the variables amounts*/





printf("Please enter Student ID:\n");
scanf("%i", &studentId);
printf("Enter how may courses-up to 3:\n");
scanf("%f", &amount);

for(i = 1; i = amount; i++){
    printf("Enter the %.2f course number(s)\n", amount);
    scanf("%i %i %i", &course, &course1, &course2);
    courseInfo(course);
    courseInfo(course1);
    courseInfo(course2);
    }

Я просто хотел, чтобы на входе было сказано, например, 3 курса, вы бы ввели 3 курса CRN, которые вы хотели бы пройти, они встретились бызатем распечатайте цены и то, что вы брали, затем повторите цикл для следующих 3. Я подумал, что если ничего не было введено, как если бы кто-то выбрал 1 курс, переменным course1 и course2 не было бы присвоено значение, таким образом пропускаяпереключатель

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

изменение для цикла

for(i = 1; i = amount; i++){

до

for(i = 1; i <= amount; i++){
0 голосов
/ 06 февраля 2019

Избегайте глобальных переменных.Объявите / определите переменные как можно ближе к месту их использования.В CourseInfo() вы используете a неинициализированным, если myCourse, переданный функции, не соответствует case.Разыменование неверного значения указателя - неопределенное поведение в C и C ++.Кроме того, второй спецификатор преобразования "% c" строки формата в вызове printf() внутри CourseInfo() не соответствует переданному параметру (a), который является указателем на char - формат "%s".

Также

scanf("%i %i %i", &course, &course1, &course2);

- неопределенное поведение, так как три параметра float с, а не int с.Типы параметров должны соответствовать спецификаторам преобразования строки формата.

for(i = 1; i = amount; i++){
    printf("Enter the %.2f course number(s)\n", amount);
    scanf("%i %i %i", &course, &course1, &course2);
    courseInfo(course);
    courseInfo(course1);
    courseInfo(course2);
}

Чтобы попросить пользователя ввести до трех курсов:

int amount;

// ...

printf("Enter the %i course number(s):\n", amount);

for (int i = 0; i < amount; ++i) {
    int course;
    if (scanf(" %i", &course) == 1)
        courseInfo(course);    
}

Если вы хотите сохранить номера курсов для дальнейшего использования, используйте массив int, убедитесь, что вы не пишете больше элементов, чем размер этого массива, и используйте его в for -loop:

int courses[amount] = { 0 };  // initialize with all zeros to be able to tell
                              // later if a input operation failed.

for (int i = 0; i < amount; ++i) {
    int course;
    if (scanf(" %i", &courses[i]) == 1)
        courseInfo(course);    
}

С вашим текущим дизайном невозможно узнать за пределами courseInfo(), является ли данный курс действительным.Возможно, courseInfo() должен вернуть bool (<stdbool.h>) в зависимости от того, допустимо ли переданное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...