Определение правильного цикла для использования
Я пытаюсь научить себя C. Для забавы и для собственного развития я создал код, который запрашивает у пользователя буквенную оценку, а затем выводит диапазон этой буквенной оценки. Вот что у меня так далеко:
//Ted C. Lim
#include "stdio.h"
int main()
{
char grade;
printf("Enter a single character grade: ");
scanf("%c", &grade);
printf("You entered %c as the grade. ", grade);
switch(grade)
{
case 'A':
printf("The grade range for A and A- is 100%% - 90%%.");
break;
case 'B':
printf("The grade range for B and B- is 80%% - 89%%.");
break;
case 'C':
printf("The grade range for C and C- is 70%% - 79%%.");
break;
case 'D':
printf("The grade range for D and D- is 60%% - 69%%.");
case 'F':
printf("The grade range for F is 0%% - 59%%.");
default:
printf("That grade does not exist.");
break;
}
}
Если вы запустите программу, вы увидите, что она запрашивает пользователя только один раз, возвращает правильный вывод и останавливается. То, что я хотел бы сделать, это повторять приглашение до бесконечности, пока пользователь не введет что-то вроде 'Q', чтобы выйти. Я знаю, что должен использовать какой-то цикл здесь, но я не совсем уверен, как его применить.
4 ответа
Здесь вы можете выбрать пару различных опций, и цикл while, и цикл do будут работать. Лично я бы сказал, что цикл do while лучше подходит для этого случая, в основном потому, что вы точно знаете, что хотите, чтобы программа запрашивала пользователя хотя бы один раз. Чтобы использовать его, вам нужно поместить do перед операторами printf, а затем выполнить, пока в конце вводится некоторая строка scanf!= "Q"
Включите ваш регистр переключателя в цикл while, который имеет значение true, и он будет работать бесконечно. Вы также можете использовать scanf, чтобы проверить, какой конкретный ключ нужно ввести, чтобы остановить его.
Вы можете использовать while
цикл, наряду с другим регистром символов, чтобы выйти из цикла.
char grade;
while (1)
{
printf("Enter a single character grade (or 'X' to exit): ");
scanf(" %c", &grade);
printf("You entered %c as the grade. ", grade);
if (grade == 'X') // Or another letter, make it clear what you're using
{
break;
}
// Output code here...
}
Я также рекомендовал бы вам проверять как строчные, так и прописные буквы. в switch
заявление:
case 'A':
case 'a':
printf("The grade range for A and A- is 100%% - 90%%.");
break;
в if
заявление:
if (grade == 'X' || grade == 'x')
{
break;
}
Чтобы повторить действие бесконечно, вы можете обернуть его внутри while
цикл с условием, которое всегда верно (например, while (1) { ... }
) следующее:
#include <stdio.h>
#include <ctype.h>
int main()
{
char grade;
while (1)
{
printf("Enter a single character grade (or Q to quit):\n");
scanf(" %c", &grade);
grade = toupper(grade);
if (grade == 'Q') break;
printf("You entered %c as the grade.\n", grade);
switch(grade)
{
case 'A':
printf("The grade range for A and A- is 100%% - 90%%.\n");
break;
case 'B':
printf("The grade range for B and B- is 80%% - 89%%.\n");
break;
case 'C':
printf("The grade range for C and C- is 70%% - 79%%.\n");
break;
case 'D':
printf("The grade range for D and D- is 60%% - 69%%.\n");
break;
case 'F':
printf("The grade range for F is 0%% - 59%%.\n");
break;
default:
printf("That grade does not exist.\n");
break;
}
}
return 0;
}
Вы заметите, что я сделал несколько других модификаций, которые я рассмотрю здесь:
include "stdio.h"
должно быть#include <stdio.h>
, Угловые скобки указывают компилятору искать в стандартном каталоге файлы заголовков системы.Я также добавил
#include <ctype.h>
потому что я используюtoupper()
функция для преобразования входного символа в верхний регистр. Это облегчает использование вашего кода, потому что теперь он будет принимать как прописные, так и строчные буквы.scanf()
строка формата содержит пробел перед%c
, Это пропустит любые пробелы, включая символы новой строки. Без этого программа будет обрабатывать эти символы как фактические входные данные и сообщать вам, что\n
Оценка не существует.break
оператор может быть использован для выхода из цикла, когда пользователь вводит Q. Также было несколькоbreak
отсутствует в вашемswitch
блок.main()
функция объявлена какint main() { ... }
, поэтому он должен возвращать целочисленное значение. Если ошибок не было, это значение должно быть равно нулю.