- •Министерство образования Республики Беларусь
- •1. Что такое программа на языке программирования
- •2. Общее знакомство с языком с
- •3. Структура простой программы на языке с
- •4. Что такое программа на языке с
- •5. Представление информации и типы данных в языке с
- •6. Константы
- •7. Переменные
- •8. Элементарный вВод и вывод информации
- •9. Выражения и операции
- •9.1. Арифметические операции
- •9.2. Операция изменения знака
- •9.3. Операции инкремента и декремента
- •9.4. Операция присваивания
- •9.6. Поразрядные логические операции
- •9.8. Логические операции и операции отношения
- •9.9. Условная операция «? :»
- •9.10. Операция последовательного вычисления
- •9.11. Операция определения требуемой памяти в байтах sizeof
- •9.12. Операция приведения типа (type)
- •10. Операторы управления вычислительным процессом
- •10.1. Операторы ветвления if и else
- •10.2. Оператор switch
- •10.3. Оператор цикла while
- •10.4. Оператор цикла do…while
- •10.5. Оператор цикла for
- •10.6. Бесконечные циклы
- •10.7. Другие управляющие средства языка с
- •10.8. Стандартные математические функции
- •11. Вычисление выражений и побочные эффекты
- •11.1. Преобразования типов при вычислении выражений
- •11.2. Побочные эффекты при вычислении выражений
- •12. Массивы
- •12.1. Описание массива
- •12.2. Инициализация массива
- •12.3. Ввод-вывод массива
- •12.4. Двумерные массивы (массивы массивов)
- •13. Указатели
- •14. Адресная арифметика
- •15. Массивы и указатели
- •15.1. Указатели и одномерные массивы
- •15.2. Указатели и двумерные массивы
- •16. Строки
- •17. Массивы строк
- •18. Функции
- •18.1. Определение функции в языке с
- •18.2. Возвращение значений из функции
- •18.3. Формальные и фактические параметры функции
- •18.4. Вызов функции
- •18.5. Объявление и определение функции: прототип функции
- •19. Передача параметров в функции
- •19.1. Способы передачи параметров в функции
- •19.2. Передача параметров в функции в языке с
- •19.3. Передача указателей в функции
- •20. Классы хранения и видимость переменных
- •20.1. Общие положения
- •20.2. Спецификаторы класса памяти
- •20.3. Область видимости функций
- •20.4. Глобальные переменные
- •20.5. Глобальные статические переменные
- •20.6. Локальные переменные
- •20.7. Статические локальные переменные
- •20.8. Регистровые переменные
- •20.9. Выводы
- •21. Организация памяти программы
- •22. Многофайловая компиляция (проекты)
- •23. Передача в функции массивОв
- •23.1. Передача одномерных массивов в функции
- •23.2. Передача двумерных массивов в функции
- •23.3. Передача в функции символьных строк
- •23.4. Возвращение указателей из функций
- •24. Функции с переменным количеством аргументов
- •24.1. Соглашения о вызовах: модификаторы функций
- •24.2. Объявление списка параметров переменной длины
- •25. Передача параметров в функцию main()
- •26. Указатели на функцию
- •27. Стандартные функцИи языка с
- •27.1. Функции для работы со строками
- •27.2. Функции для проверки символов и преобразования данных
- •27.3. Функция быстрой сортировки – gsort()
- •27.4. Функция двоичного поиска – bsearch()
- •28. Работа с файлами
- •28.1. Основные понятия
- •28.2. Основные функции для работы с файлами
- •28.3. Открытие и закрытие файлов
- •28.4. Ввод/вывод символов
- •28.5. Ввод/вывод строк
- •28.6. Форматированный ввод/вывод
- •28.7. Ввод/вывод блоков данных
- •28.8. Другие средства для работы с файлами
- •28.9. Ввод/вывод низкого уровня (префиксный доступ к файлам)
- •29. Типы, определяемые пользователем: Перечисления, структуры и объединения
- •29.1. Переименование типов – оператор typedef
- •29.2. Перечисления (enum)
- •29.3. Основные сведения о структурах
- •29.4. Структурные переменные в памяти компьютера
- •29.5. Доступ к полям структуры
- •29.6. Массивы структур
- •29.7. Структуры и функции
- •29.8. Объединения (union)
- •30. Динамическая память
- •30.1. Понятие динамического объекта
- •30.2 Создание и уничтожение динамических объектов
- •30.3 Динамическое размещение одномерных массивов и строк
- •30.4 Динамическое размещение двумерных массивов
- •30.5. Функции для работы с блоками памяти
- •31. Динамические структуры данных
- •31.1. Понятие структуры данных
- •31.2. Структуры, ссылающиеся на себя
- •31.3. Связанные списки
- •31.5. Очереди
- •Ниже приводятся примеры функций для очереди (структура элемента очереди совпадает со структурой элемента стека в примере выше):
- •32. Препроцессор языка с
- •32.1 Директива включения файлов
- •32.2. Директива определения макрокоманд (макросов)
- •32.3 Директива условной компиляции
- •32.4 Дополнительные директивы препроцессора
10.2. Оператор switch
В некоторой точке вашей программы может оказаться несколько (более двух) возможных путей ветвления. Если необходимо выбрать один вариант из многих, то это можно сделать с помощью вложенных операторов if…else. Но это не очень удобно. В качестве альтернативы, для сложного условного ветвления язык С предоставляет конструкцию switch. Синтаксис ее следующий:
switch (выражение) {
case константа_1:
оператор_1;
[break;]
case константа_2:
оператор_2;
[break;]
...
case константа_N:
оператор_N;
[break;]
[default:
оператор_N+1;]
}
где константа_i – константа или константное выражение, оператор_i – одни оператор или группа операторов. Скобки [] означают, что данная часть оператора может отсутствовать.
Результат вычисления выражения сравнивается с каждой из констант_i. Если находится совпадение, то управление передается оператору или операторам, связанным с данным case, т.е. идущим сразу после него. Исполнение оператора switch продолжается до конца оператора switch или пока не встретится оператор break, который передает управление из тела switch вовне.
Операторы, связанные с ключевым словом default, выполняются, если выражение не соответствует ни одному из константных выражений в case. Ключевое слово default необязательно должно располагаться в конце оператора switch.
Задача. Сколько дней в месяце (високосным будем считать только год, который делится на 4)?
void main() {
int y, m, d;
printf(“Введите год и номер месяца\n”);
scanf(“%d %d”, &y, &m);
switch(m) {
case 2:
d= 28 + !(y%4);
break;
case 4:
case 6:
case 9:
case 11:
d= 30;
break;
default:
d= 31;
}
printf(“Количество дней %d\n”, d);
bioskey(0);
}
10.3. Оператор цикла while
В языке С существуют три вида циклов: while, for, do...while.
Ключевое слово while позволяет выполнять тело цикла до тех пор, пока условие цикла не перестанет быть истинным. Синтаксис его следующий:
while (выражение)
тело цикла;
Если тело цикла состоит более чем из одного оператора (из составного оператора), то эти операторы надо заключать в фигурные скобки {}.
Тело цикла while, не будет выполняться, если выражение изначально ложно.
Обычно инициализирующее выражение расположено за пределами цикла (до цикла). Выражение, которое влияет на условие цикла, обычно находится в конце тела цикла.
int i = 0; // инициализация счётчика
while (i < 10) {
// тело цикла
i++; // операция инкремента
}
Задача. Подсчитать количество отрицательных и сумму положительных чисел, введенных с клавиатуры. Окончание ввода – число 0.
void main() {
int a, k = 0, s = 0;
printf(“Введите последовательность чисел\n”);
scanf(“%d”, &a);
while (a != 0) {
if (a < 0) k++;
else s += a;
scanf(“%d”, &a);
}
printf(“Количество отрицательных чисел = %d\n”, k);
printf(“Сумма положительных чисел = %d\n”, s);
bioskey(0);
}
Задача. Подсчитать количество чисел, введенных с клавиатуры. Окончание ввода – превышение суммы положительных чисел числа 100.
void main() {
int a, k = 0, s = 0;
printf("Введите последовательность чисел\n");
scanf("%d", &a);
if (a > 0) s += a;
while (s <= 100) {
k++;
scanf("%d", &a);
if (a > 0) s += a;
}
printf("Количество чисел = %d\n", k);
}
Задача. Подсчитать количество совпадающих пар чисел, введенных с клавиатуры. Окончание ввода – число, кратное 5.
void main() {
int a, k = 0, b = 5;
printf("Введите последовательность чисел\n");
scanf("%d", &a);
while (a%5 != 0) {
if (a == b) k++;
b = a; // сохраняем предыдущее введенное число
scanf("%d", &a);
}
printf("Количество пар совпадающих чисел = %d\n", k);
}
Задача. Ввести число и вывести все его цифры по одной в строке.
void main(){
unsigned long x, y;
scanf("%lu", &x);
while(x){ // while(x!=0)
y = x % 10; // очередная цифра числа
printf("y = %lu\n", y);
x /= 10; // убираем последнюю цифру числа
}
}
Задача. Сформировать число по его цифрам. Окончание ввода – цифра 9.
void main(){
unsigned long x, y = 0;
scanf("%lu", &x);
while(x != 9){
y *= 10; // y = y*10 + x;
y += x; //
scanf("%lu", &x);
}
printf("y = %lu\n", y);
}
Задача. Записать число в обратном порядке цифр (125 => 521).
void main(){
unsigned long x, y = 0, c;
scanf("%lu", &x);
while(x){
c = x % 10;
y = y*10 + c;
x /= 10;
}
printf("y = %lu\n", y);
}
Задача. Удалить старший разряд числа (725 => 25).
void main(){
unsigned long x, y = 0, p = 1;
scanf("%lu", &x);
while(x > 9){
y += (x%10 * p);
x /= 10;
p *= 10;
}
printf("y = %lu\n", y);
}
Второй вариант:
void main(){
unsigned long x, y, xx, k = 1;
scanf("%lu", &x);
xx = x;
while(x > 9){
k *= 10;
x /= 10;
}
y = xx % k;
printf("y = %lu\n", y);
}