// - "Talk to me like I'm a 3 year old!" Programming Lessons -
//
// $Author: DigiBen DigiBen@gametutorials.com
//
// $Program: Switch Statements
//
// $Description: Shows the applications for switch statements.
//
// $Date: 5/18/00
//
// Перевод © 2004 Евгений Казеко
// www.gamecoder.kazeko.com
// evgeniy@kazeko.com
#include <stdio.h> // Мы должны включить этот файл, чтобы использовать некоторые функции
void main() // Начало нашей программы
{ // Начало функции main
int number = 0; // Инициализация целочисленной переменной
char ch = 0; // Инициализация символьной переменной
// Сообщение пользователю ввести число от 1 до 3
printf("Input a number between 1 and 3: ");
scanf("%d", &number); // Чтение числа с клавиатуры (%d означает целое число)
/* Код ниже это выражение switch. В основном, оно похоже на набор выражений if.
На обычном языке код ниже означает "Проверить значение переменной number,
если это 1, сообщить об этом, если 2 - сообщить об этом, если 3 - также сообщить,
а если введенное число не является ни одним из них, сказать, что пользователь
не последовал инструкциям."
Мы помещаем переменную, которую хотим проверить, в круглые скобки - ("здесь").
Затем открываем фигурные скобки. Использовать слово "case" это все равно что
сказать "Если значение number равно 1". Или, в виде выражения if() -
"if(number == 1)". Мы ставим двоеточие после case. И теперь, если значение
number равно 1, выполнится все, что идет после case 1 до слова "break".
В данном случае, мы просто печатаем на экран сообщение и затем завершаем
выражение switch с помощью оператора break. Таким образом программа продолжает
выполняться после закрывающей фигурной скобки. Если бы мы не использовали
"break", программа продолжила бы выполнение со следующей строки - "case 2:".
Если хотя бы одно из выражений case истинно, выполняются все операторы.
Странновато, но иногда полезно.
Если ни одно из выражений не является истинным (TRUE), то выполняется "default".
Вам необязательно его использовать, но лучше делать это.
*/
switch (number) // Проверка значения "number"
{
case 1: // Если number равно 1, сообщить
printf("You typed in the number 1!\n");
break; // Остановиться и выйти из выражения switch
case 2: // Если number равно 2, сообщить
printf("You typed in the number 2!\n");
break; // Остановиться и выйти из выражения switch
case 3: // Если number равно 3, сообщить
printf("You typed in the number 3!\n");
break; // Остановиться и выйти из выражения switch
default: // Если number ни 1, ни 2, ни 3
printf("You didn't follow directions!\n");
break; // Обычно это не нужно (мы все равно завершаем switch), но
// можно использовать для единообразия.
}
// Ниже идет пример проверки введенных символов.
rewind(stdin); // Сброс буфера ввода, содержащего все, что вводится с клавиатуры.
// Без этого scanf() будет работать некорректно.
// Полезно делать это после каждого scanf() если предполагается
// использовать scanf() вновь.
printf("\n\nInput a character: "); // Запрос пользователю ввести символ
scanf("%c", &ch); // Чтение символа с клавиатуры (%c для символов)
switch (ch) // Проверка значения "ch"
{
case 'a': // Если ch равно 'a', сообщить
printf("You typed in an A!\n");
break; // Остановиться и выйти из выражения switch
case 'b': // Если ch равно 'b', сообщить
printf("You typed in an B!\n");
break; // Остановиться и выйти из выражения switch
case 'c': // Если ch равно 'b', сообщить
printf("You typed in an C!\n");
break; // Остановиться и выйти из выражения switch
default: // Если ch не 'a', 'b' или 'c', дать нам знать
printf("You did not type an a, b or c!\n");
break; // И снова нам не нужет этот break, но вреда от него не будет.
}
// Вы наверно заметили, что это проверяет только символы нижнего регистра.
// Нам не нужно использовать новые case отдельно для нижнего и верхнего регистра.
// Вот что мы сделаем: мы просто добавим еще один case после первого, разделив их
// двоеточием. Мы можем сделать так столько раз, сколько захотим. Мы также можем
// сделать это на отдельных строках, например так:
// case 'a':
// case 'A':
// printf(etc...) ...
rewind(stdin); // Сброс буфера ввода.
printf("\n\nInput a lowercase or uppercase character: ");
scanf("%c", &ch); // Ввод символа с клавиатуры (%c для символов)
switch (ch) // Проверка значения "ch"
{
case 'a': case 'A': // Если ch равно 'a' или 'A', сообщить
printf("You typed in an A!\n");
break; // Остановиться и выйти из выражения switch
case 'b': case 'B': // Если ch равно 'b' или 'B', сообщить
printf("You typed in an B!\n");
break; // Остановиться и выйти из выражения switch
case 'c': case 'C': // Если ch равно 'c' или 'C', сообщить
printf("You typed in an C!\n");
break; // Остановиться и выйти из выражения switch
default: // Если ch не 'a', 'b' или 'c', дать нам знать
printf("You did not type an a, b or c!\n");
break; // И снова нам не нужет этот break, но вреда от него не будет.
}
} // Конец функции main и программы
///////////////////////////////////////////////////////////////////////////////////////////////
//
// * ПРИМЕЧАНИЕ *
/*
Выражение switch смотрится гораздо лучше, чем несколько выражений if, когда
необходимо проверить больше чем 2 или 3 значения. Однако есть некоторые
ограничения при использовании выражения switch. Одно из них заключается в том,
что нельзя обрабатывать строки. Нельзя написать: switch("Test"). Причина в
том, что строка это массив символов, а выражение switch проверяют постоянные
величины. Также выражение switch не может обрабатывать числа с плавающей запятой,
нельзя записать switch(22.2). И последнее заключается в том, что нельзя использовать
выражения, например: case (number != 2):
В этой обучалке использовалась функция rewind(). По непонятной причине, когда
вызывается scanf(), она заполняет буфер ввода и не очищает его в конце.
Поэтому и необходима функция rewind(), которая его очищает. Если не вызвать
ее, программа не позволит нам ввести что-либо, а посчитает, что мы уже ввели.
Попробуйте закомментировать ее и посмотрите что это значит.
*/
// © 2001 GameTutorials
// Перевод © 2004 Евгений Казеко
// www.gamecoder.kazeko.com
// evgeniy@kazeko.com
|