я уже публиковал это раньше. но я хочу сделать это более кратким. и теперь он не работает. Я хочу ввести оценки учеников, а также хочу получить оценку через некоторое время. но это не совсем работает. значение, которое я когда-либо вводил здесь, отображается только буквой «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");
}
}
Переменная 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];
}