- •Материалы для подоговки к экзамену по дисциплине «основы программировния»
- •Тема №1 Основные понятия
- •Способы записи алгоритма
- •Тема №2 Переменные
- •Типы переменных
- •Типы с плавающей точкой
- •Переполнение переменных
- •Постфиксное обозначение типа
- •Шестнадцатеричный и восьмеричный формат
- •Экспоненциальная форма представления чисел
- •Объявление переменных
- •Начальное значение переменной
- •Область видимости переменной
- •Тема №3 Оператор присваивания
- •Ввод-вывод Форматированный вывод
- •Форматированный ввод
- •Непечатные символы
- •Тема №4 Ветвления и логические операторы
- •Оператор Switch
- •Логические операторы
- •Логическое отрицание
- •Логическое и
- •Логическое или
- •Пример: закон де-Моргана.
- •Порядок выполнения логических операторов
- •Тема №5 Циклы
- •Цикл с предусловием
- •Циклы с постусловием
- •Цикл for
- •Вложенные циклы
- •Тема №6 Одномерные массивы
- •Начальная инициализация массива.
- •Размер массива
- •Переполнение массива
- •Пример с одномерным массивом
- •Многомерные статические массивы
- •Пример с многомерным массивом
- •Тема №7 Строки в си. Введение
- •Чтение строк
- •Указатели
- •Определение
- •Арифметика указателей
- •Указатель на указатель
- •Указатели и приведение типов
- •Null pointer - нулевой указатель
- •Пример работы с указателями
- •Тема №8 Указатели и массивы
- •Многомерные массивы и указатели на многомерные массивы
- •Определение макросов
- •Тема №9 Тернарный оператор и оператор запятая
- •Оператор запятая.
- •Сегментация приложения на си
- •Тема №10 Динамическое выделение памяти
- •Освобождение памяти с помощью free
- •Работа с двумерными и многомерными массивами
- •Тема №11 Параметры командной строки
- •Функции
- •Параметры и аргументы
- •Передача аргументов По значению
- •По указателю (ссылке)
- •Передача массива в качестве аргумента
- •Тема №12 Битовые операции
- •Операции побитового сдвига
- •Примеры
- •Вопросы к экзамену по дисциплине «Основы программирования»
Оператор Switch
Рассмотрим пример из темы "ветвления". Программа выводит название дня недели по порядковому номера
#include<conio.h>
#include<stdio.h>
int main() {
unsigned day;
printf("Enter day ");
scanf("%d", &day);
if (day > 7) {
day = day % 7;
}
if (day == 0) {
printf("Sunday");
} else if (day == 1) {
printf("Monday");
} else if (day == 2) {
printf("Tuesday");
} else if (day == 3) {
printf("Wednesday");
} else if (day == 4) {
printf("Thursday");
} else if (day == 5) {
printf("Friday");
} else if (day == 6) {
printf("Saturday");
}
getch();
}
Этот код состоит из семи идущих друг за другом операторов if. Его код можно упростить с помощью оператора switch.
#include<conio.h>
#include<stdio.h>
int main() {
unsigned day;
printf("Enter day ");
scanf("%d", &day);
if (day > 7) {
day = day % 7;
}
switch (day) {
case 0:
printf("Sunday");
break;
case 1:
printf("Monday");
break;
case 2:
printf("Tuesday");
break;
case 3:
printf("Wednesday");
break;
case 4:
printf("Thursday");
break;
case 5:
printf("Friday");
break;
default:
printf("Saturday");
}
getch();
}
Оператор switch принимает в качестве аргумента число, и в зависимости от его значения выполняет те или иные команды.
switch (<переменная>) {
case <значение 1>:
<ветвь 1>
[case <значение 2>:
<ветвь 2>]
[default:
<действия по умолчанию>]
}
Если значение переменной не соответствует ни одному case, то выполняется default ветвь. Она может отсутствовать, тогда вообще ничего не выполняется.
В примере выше каждая ветвь оканчивается оператором break. Это важно. Когда компьютер видит оператор break, он выходит из оператора switch. Если бы он отсутствовал, то программа "провалилась" бы дальше, и стала выполнять следующие ветви.
#include<conio.h>
#include<stdio.h>
int main() {
unsigned day;
printf("Enter day ");
scanf("%d", &day);
if (day > 7) {
day = day % 7;
}
switch (day) {
case 0:
printf("Sunday");
case 1:
printf("Monday");
case 2:
printf("Tuesday");
case 3:
printf("Wednesday");
case 4:
printf("Thursday");
case 5:
printf("Friday");
default:
printf("Saturday");
}
getch();
}
Введите значение, например 3, и вы увидите, что программа выведет
WednesdayThursdayFridaySaturday
то есть все ветви, после найденной.
Операторы каждой из ветвей могут быть обрамлены фигурными скобками (и так даже лучше). Тогда каждая из ветвей будет отдельным блоком, в котором можно определять свои переменные. Пример программы, которая запрашивает у пользователя число, оператор и второе число и выполняет действие.
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
float a, b, c;
char op;
scanf("%f %c %f", &a, &op, &b);
switch (op) {
case '+': {
c = a + b;
break;
}
case '-': {
c = a - b;
break;
}
case '/': {
if (b != 0.0) {
c = a / b;
} else {
printf("Error: divide by zero");
getch();
exit(1);
}
break;
}
case '*': {
c = a * b;
break;
}
default:
printf("No operation defined");
getch();
exit(1);
}
printf("%.6f", c);
getch();
}
Если ввести
1 + 2
то будет выведен результат операции 1 + 2 = 3
Хочу обратить внимание, что литеры типа '+' и т.п. воспринимаются в качестве чисел, поэтому их можно использовать в операторе switch. В этой программе использовалась функция exit из библиотеки stdlib. Функция останавливает работу программы и возвращает результат её работы. Если возвращается истина (ненулевое значение), то это значит, что программа была выполнена с ошибкой.
Ветвь default может располагаться в любом месте, не обязательно в конце. Этот код также будет нормально работать.
switch (day) {
case 0:
printf("Sunday");
break;
case 1:
printf("Monday");
break;
case 2:
printf("Tuesday");
break;
case 3:
printf("Wednesday");
break;
case 4:
printf("Thursday");
break;
default:
printf("Saturday");
break;
case 5:
printf("Friday");
break;
}
default здесь также нуждается в операторе break, как и другие ветви, иначе произойдёт сваливание вниз. Несмотря на то, что так можно писать, это плохой стиль программирования. Ветвь default логически располагается в конце, когда других вариантов больше нет.
Возможные значения аргумента оператора switch могут располагаться в любом порядке, но должны быть константными значеними. Это значит, что следующий код не заработает
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
int main() {
//Это, конечно, константа, но не может быть использована как
//значение для оператора switch
const int monday = 0;
unsigned day;
printf("Enter day ");
scanf("%d", &day);
if (day > 7) {
day = day % 7;
}
switch (day) {
case monday:
printf("Sunday");
break;
case 1:
printf("Monday");
break;
case 2:
printf("Tuesday");
break;
case 3:
printf("Wednesday");
break;
case 4:
printf("Thursday");
break;
default:
printf("Saturday");
break;
case 5:
printf("Friday");
break;
}
getch();
}
