![](/user_photo/2706_HbeT2.jpg)
- •Алфавит языка Си
- •Идентификаторы (имена) языка Си
- •Ключевые слова
- •Константы (литералы)
- •Комментарии
- •Пример программы на Си
- •Последовательность обработки программы на Си
- •Термины
- •2.1. Концепция типа данных
- •2.2. Базовые типы данных
- •2.2. Атрибуты объектов
- •2.2.1. Класс памяти
- •2.2.2. Область (сфера) действия, связанного с объектом идентификатора
- •2.2.3. Область видимости объекта
- •2.2.4. Продолжительность существования объекта (время жизни)
- •2.2.5. Тип компоновки (связывания)
- •2.3. Объявления, определения и описания в языке Си
- •2.4. Объявления переменных стандартных типов
- •2.5. Преобразования типов
- •Термины
- •3.1. Определение и общая классификация операторов
- •3.2. Последовательно выполняемые операторы
- •3.3. Операции языка Си
- •3.4. Приоритеты и порядок выполнения операций, тип результата выражения
- •Тип результата выражения арифметической бинарной операции
- •Даны X, y (значения вводятся с клавиатуры). Вычислить a, если
- •Термины
- •4.1. Условный оператор
- •4.2. Переключатель
- •4.3. Операторы циклов
- •4.4. Оператор безусловной передачи управления
- •4.5. Оператор возврата из функции
- •4.6. Оператор выхода из цикла или переключателя
- •4.7. Оператор перехода к следующей итерации цикла
- •Термины
- •5.1. Указатели
- •5.2. Ссылки
- •5.3. Массивы
- •5.3.1. Одномерные массивы
- •Int a[100]; // Объявление массива из 100 элементов типа int
- •Инициализация массива
- •Массивы и указатели
- •Динамические массивы
- •5.3.2. Многомерные массивы
- •Инициализация многомерных массивов
- •Динамические многомерные массивы
- •Указатель на массив указателей и указатель на массив
- •Int ** p1; // Указатель на массив указателей
- •Int (*p2)[10]; // Указатель на массив из 10 элементов типа int
- •Термины
- •6.1. Структуры
- •Int X; // Поле структуры
- •Int X; // Поле структуры
- •Int X; // Поле структуры
- •Инициализация структуры
- •Int year, page; // Год издания и число страниц
- •6.2. Объединения
- •6.3. Битовые поля структур и объединений
- •Int a1: 10; // Битовое поле из 10 бит
- •Int a2: 14; // Битовое поле из 14 бит
- •Int :6; // Пропускаем 6 бит
- •6.4. Директива определения типа typedef
- •Термины
- •7.1. Определение, описание и вызов функции
- •7.2. Использование значений параметров по умолчанию
- •7.3. Изменение значений скалярных параметров в функциях
- •7.3.1. Передача параметров в функции по значению
- •7.3.1. Передача параметров в функции по указателю (по ссылке)
- •7.4. Передача в функцию массивов
- •7.4.1. Передача в функцию массивов, не являющихся строками
- •7.4.2. Передача в функцию строк
- •7.5. Функции с переменным количеством параметров
- •7.6. Рекурсивные функции
- •7.7. Подставляемые (inline) функции
- •7.8. Указатели на функции
- •7.10. Шаблоны функций
- •7.11. Возможные параметры функции main
- •Термины
- •8.1. Общие сведения о вводе-выводе
- •8.2. Стандартные потоки ввода-вывода
- •8.3. Функции для вывода в поток stdout
- •8.4. Функции для считывания из потока stdin
- •8.5. Ввод- вывод в файлы Открытие файла
- •Закрытие файла
- •Определение конца файла
- •Функции записи в файл
- •Функции чтения из файла
- •Функции позицирования в файлах
- •Функции для сброса буферов
- •Термины
- •9.1. Стадии и основные команды препроцессорной обработки
- •9.2. Замены в тексте
- •9.3. Макроподстановки
- •9.4. Включение текстов из файлов
- •9.5. Условная компиляция
- •9.6. Директива нумерации строк
- •9.7. Директива обработки ошибок
- •9.8. Директивы # и ##
- •9.9. Заранее определенные препроцессорные идентификаторы
- •9.10. Указания компилятору
- •Термины
4.2. Переключатель
В отличие от условного оператора переключатель может использоваться для мультиветвления фрагмента исходного кода программы, т.е. фрагмент исходного кода делится на несколько фрагментов и в зависимости от условий выполняется один фрагмент из нескольких (или несколько из нескольких).
Формат переключателя:
switch(<переключающее_выражение>)
{
case <константное_выражение1>: <операторы>
case <константное_выражение2>: <операторы>
……..
case <константное_выражениеN>: <операторы>
[ default: <операторы> ]
}
<переключающее_выражение> - значение целочисленное или приводящееся к целому, например, тип char.
<константное_выражениеX> - целочисленное или приводящееся к целому.
При выполнении переключателя управление передается на подходящую метку вида case <конст_выр>: , значение которой совпадает со значением переключающего выражения или на метку default (она не обязательна), если ни одна из меток не сработала. После передачи управления выполняются все операторы до конца переключателя, вне зависимости от наличия меток. Для выхода из переключателя необходимо использовать оператор break;
Рассмотрим примеры:
int a;
printf("a="); scanf("%d", &a);
switch(a)
{
case 1: printf("\n1");
case 2: printf("\n2");
case 3: printf("\n3");
default:
printf("\n>3");
}
В данном фрагменте при вводе с клавиатуры значения 2 на печать будет выводится:
2
3
>3
Т.е. управление передается на метку case 2: и далее выполняются все последующие операторы, не смотря на наличие меток, т.е. работает принцип выбора несколько из нескольких. Чаще всего требуется реализовать принцип выбора – один из нескольких. Для этого в переключателе необходимо использовать оператор break; - оператор выхода из цикла или переключателя. Если приведенный выше пример переписать:
int a;
printf("a="); scanf("%d", &a);
switch(a)
{
case 1: printf("\n1"); break;
case 2: printf("\n2"); break;
case 3: printf("\n3"); break;
default:
printf("\n>3");
}
то при вводе с клавиатуры значения 2 будет выводиться значение 2, затем осуществляется выход из переключателя оператором break;
4.3. Операторы циклов
Операторы цикла используются для организации многократно повторяющихся вычислений. Тело цикла – оператор или составной оператор (блок) может выполняться несколько раз, однократное выполнение тела цикла называется итерацией. При переходе от итерации к итерации некоторые переменные могут менять свои значения.
В языке Си существует три разновидности операторов цикла.
-
Цикл с предусловием имеет формат:
while(<выражение_условие>) <оператор>
<выражение_условие> - значение этого выражения может быть любого типа языка Си, заменяющиго логический (целый, вещественный, указатель), значение условия считается истинным, если оно отлично от нуля, при этом выполняется тело цикла, телом цикла может быть составной оператор или блок.
Блок схема фрагмента алгоритма с циклом с предусловием
-
Цикл с постусловием имеет формат:
do <оператор> while(<выражение_условие>);
Цикл работает аналогично предыдущему, но только в начале выполняется оператор – тело цикла, затем проверяется выражение – условие.
Блок схема фрагмента алгоритма с циклом с постусловием.
-
Цикл for имеет формат:
for([<инициализаторы>];[<выражение_условие>]; [<модификации>]) <оператор>
<инициализаторы> используется для объявления и присвоения начальных значений переменным, используемым в цикле, можно записать несколько выражений, разделенных запятой.
<выражение_условие> - определяет условия продолжения цикла, задается аналогично, как в предыдущих видах циклов.
<модификации> выполняются после каждой итерации цикла и служат обычно для изменения параметров цикла, здесь можно записать несколько выражений через запятую.
Телом цикла может быть простой оператор, составной оператор или блок;
Блок схема фрагмента алгоритма с циклом for
Ложно
Все три элемента в заголовке цикла могут отсутствовать (или некоторые из них), но наличие «;» обязательно. Если выражение условие отсутствует, то считается, что оно всегда истинно.
Пример циклов for:
for( ; ; ) { …} // Бесконечный цикл
for(int i=0; i<100; i++) { … }
for(int i=0, j=20; i<j; i++, j--) { … }
for(int i=0; i<20; i+=2) { … }
Рассмотрим следующий пример. Решить задачу, организовав цикл с точностью .
Вычислить сумму ряда
S= (-1)k-1/k c точностью =10-2, 10-4. Точное значение - ln 2.
K=1
Определить, как изменяется число итераций при изменении точности.
Цикл в данном примере должен завершиться, когда модуль очередного слагаемого будет меньше, чем заданная точность. Ниже представлен пример программы для решения задачи, в примере использован цикл с постусловием.
#include <stdio.h>
#include <math.h>
void main()
{
double e=1e-4;
double Sum=0; // Рассчитываемая сумма
double si; // Очередное слагаемое в сумме
int k=0; // Индекс
int sign=1; // Знак слагаемого значение или 1 или -1 (или -1 в степени)
do
{
k++; // Номер слагаемого итерации
si=1./k; // Модуль слагаемого
Sum+=sign*si; // Считаем сумму
sign*=-1; // Знак слагаемого изменяется
}
while(si>=e); // Пока модуль слагаемого >= точности цикл продолжается
printf("Sum=%f k=%d ln(2)=%f", Sum, k, log(2.));
}
В результате выполнения программы в консольное окно будет выведено: Sum=0.693197 k=10001 ln(2)=0.693147