Система оценок с использованием оператора switch

я уже публиковал это раньше. но я хочу сделать это более кратким. и теперь он не работает. Я хочу ввести оценки учеников, а также хочу получить оценку через некоторое время. но это не совсем работает. значение, которое я когда-либо вводил здесь, отображается только буквой «F». это так раздражает. Не могли бы вы помочь мне с моими недостатками в этом коде, чтобы сделать его более приемлемым для других?

#include<stdio.h>
int main()

{
    int num;
    printf("Enter any number : ");
    scanf("%d",&num);

    switch(num)
    {
    case 1:
    {
       if (num>100 || num<0)
       {
         printf("Invalid number");
       }
         break;
       }

    case 2:
    {
        if (num>=80 && num<=100)
        {
         printf("A+");
        }

        break;
    }
    case 3:
    {
        if (num>=70 && num<=79)
      {
        printf("A");
      }
        break;
    }

    case 4:
    {
      if (num>=60 && num<=69)
      {
        printf("A-");
      }

        break;
    }

    case 5:
    {
        if (num>=50 && num<=59)
        {
         printf("B");
        }

        break;
    }


    case 6:
    {
        if (num>=40 && num<=49)
        {
         printf("C");
        }

        break;
    }

    case 7:
    {
        if (num>=32 && num<=39)
        {
          printf("D");
        }

        break;
    }

    default:

           printf("F");
    }
}
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Переменная num используется для включения диапазона от 0 до 7 и значения по умолчанию, а также оценки от 0 до 100 и выхода за пределы диапазона. Это не может быть и то, и другое одновременно. Если вы хотите сопоставить num с оценкой, я предлагаю вам убрать этот переключатель.

Поскольку num проверяется от наибольшего к наименьшему в непрерывном диапазоне, нет необходимости проверять нижнюю границу. Обратите внимание, что num > 100 — это то же самое, что num >= 101. Это делает все тесты одинаковыми, за исключением особого случая отрицательных оценок. Это пригодится ниже.

Всегда проверяйте возвращаемое значение scanf(), иначе вы можете работать с неинициализированной переменной.

#include <stdio.h>

int main() {
    printf("Enter any number : ");
    int num;
    if (scanf("%d",&num) != 1) {
        printf("scanf failed\n");
        return 1;
    }
    if (num < 0 || num>=101)
        printf("Invalid number\n");
    else if (num>=80)
        printf("A+\n");
    else if (num>=70)
        printf("A\n");
    else if (num>=60)
        printf("A-\n");
    else if (num>=50)
        printf("B\n");
    else if (num>=40)
        printf("C\n");
    else if (num>=32)
        printf("D\n");
    else if (num >= 0)
        printf("F\n");
}

и пример запуска:

Enter any number : 40
C

«Не повторяйте себя» (DRY) — это следующий шаг, например, путем поиска баллов в таблице шкал. Такая конструкция позволяет легко обновлять шкалу или даже считывать ее из файла данных во время выполнения, поэтому вам не придется перекомпилировать программу, если шкала изменится:

#include <stdio.h>

struct scale {
    size_t n;
    int *score;
    char **grade;
};

const char *grade(struct scale *scale, int score) {
    for(size_t i = 0; i < scale->n; i++)
        if (score >= scale->score[i])
            return scale->grade[i];
    return scale->grade[0]; // score < 0
}

int main() {
    printf("Enter any number : ");
    int num;
    if (scanf("%d",&num) != 1) {
        printf("scanf failed\n");
        return 1;
    };
    struct scale scale = {
        8,
        (int []) {101, 80, 70, 60, 50, 40, 32, 0},
        (char *[]) {"Invalid number", "A+", "A", "A-", "B", "C", "D", "F"}
    };
    printf("%s\n", grade(&scale, num));
}

grade() можно реализовать с помощью lfind(), но здесь нет особого смысла:

#include <search.h>

int ge(const void *a, const void *b) {
    return *(int *) a >= *(int *) b ? 0 : 1;
}

const char *grade(struct scale *scale, int score) {
    int *offset = lfind(&score, scale->score, &scale->n, sizeof *scale->score, ge);
    return scale->grade[offset ? offset - scale->score : 0];
}

Другие вопросы по теме

Построение «системы оценок» школы с использованием управляющего оператора «switch»
Переключатели С++ Возврат внутри/вне скобок? перерыв?
Я пытаюсь создать систему управления библиотекой и не понимаю, почему в случае переключения также есть цикл с оператором прерывания
Использование выражения переключения C# с вводом массива
Как воспроизвести поведение сопоставления шаблонов в операторе переключения C# 4? Функция «сопоставление шаблонов» недоступна в C# 4
Напишите метод, который принимает 3 целых числа в качестве параметров, возвращает true, если они равны, в противном случае возвращает false, не используя оператор if
Как я могу использовать измененную строку в операторе C# switch → case?
Существует ли прагматичное решение для удаления переключателей перечисления?
Что лучше в этом сценарии — цикл if else или случай в сценариях оболочки?
Немедленный перерыв после ввода с помощью переключателя или если