- •1. Цель работы
- •2. Базовые понятия языка
- •2.1. Алфавит языка Си
- •2.2. Константы
- •2.3. Идентификатор
- •2.4. Объявление переменных
- •2.5. Стандартные типы данных
- •2.6. Данные вещественных типов
- •2.7. Инициализация переменных
- •3. Операции языка си
- •3.1. Арифметические операции
- •3.2. Поразрядные операции
- •3.3. Операции отношения (сравнения)
- •3.4. Логические операции
- •3.5. Операции присваивания
- •3.6. Операция sizeof
- •3.7. Операция условие
- •3.8. Разделитель точка с запятой
- •3.9. Приоритеты операций и порядок вычислений
- •4. Операторы языка си
- •4.1. Составной оператор
- •4.2. Условный оператор
- •4.3. Оператор switch
- •4.4. Оператор break
- •4.5. Оператор for
- •4.6. Оператор while
- •4.7. Оператор do while
- •4.8. Оператор continue
- •4.9. Оператор goto
- •5. Указатели, массивы, строки
- •5.1. Указатели
- •5.2. Массивы
- •5.3. Строки
- •5.6. Двумерные массивы
- •5.7. Инициализация массивов
- •5.8. Связь указателей и массивов
- •6. Функции
- •6.1. Определение и вызов функций
- •6.2. Передача параметров функции main
- •7. Структуры и объединения
- •7.1. Структуры
- •7.2. Объединения (смеси)
- •7.3. Поля битов
- •8. Ввод-вывод
- •8.1. Консольный ввод-вывод
- •8.2. Потоковый файловый ввод-вывод
- •9. Вопросы для самостоятельного изучения
- •10. Порядок выполнения лабораторных работ и содержание отчета
- •11. Литература
4.7. Оператор do while
Оператор цикла do while называется оператором цикла с постусловием и используется в тех случаях, когда необходимо выполнить тело цикла хотя бы один раз. Формат оператора имеет следующий вид:
do тело while (выражение);
Схема выполнения оператора do while :
1. Выполняется тело цикла (которое может быть составным оператором).
2. Вычисляется выражение.
3. Если выражение ложно, то выполнение оператора do while заканчивается и выполняется следующий по порядку оператор. Если выражение истинно, то выполнение оператора продолжается с пункта 1.
Чтобы прервать выполнение цикла до того, как условие станет ложным, можно использовать оператор break.
Операторы while и do while могут быть вложенными.
Пример:
int i,j,k;
...
i=0; j=0; k=0;
do {i++;
j--;
while (k < i) k++;
}
while (i<30 && j<-30);
4.8. Оператор continue
Оператор continue, как и оператор break, используется только внутри операторов цикла, но в отличие от него выполнение программы продолжается не с оператора, следующего за прерванным оператором, а с начала прерванного оператора.
Пример:
int b;
for (b=0; b<100; b++)
{ if (b%2) continue;
... /*Обработка четных чисел*/
}
Когда переменная b становится нечетной, оператор continue передает управление на очередную итерацию цикла for, не выполняя операторы обработки четных значений.
4.9. Оператор goto
Использование оператора безусловного перехода goto в практике программирования на языке СИ настоятельно не рекомендуется, так как он затрудняет понимание программ и возможность их модификаций.
Формат этого оператора следующий:
goto имя-метки;
...
имя-метки: оператор;
Оператор goto передает управление на оператор, помеченный меткой. Помеченный оператор должен находиться в той же функции, что и оператор goto, а используемая метка должна быть уникальной.
5. Указатели, массивы, строки
5.1. Указатели
Указатель — это адрес памяти, распределяемой для размещения идентификатора (в качестве идентификатора может выступать имя переменной, массива, структуры, строкового литерала). В том случае, если переменная объявлена как указатель, то она содержит адрес памяти, по которому может находится скалярная величина любого типа. При объявлении переменной типа указатель, необходимо определить тип объекта данных, адрес которых будет содержать переменная, и имя указателя с предшествующей звездочкой (или группой звездочек). Формат объявления указателя:
тип *имя_указателя;
Указатель, объявленный как указатель на тип void, может быть использован для ссылки на объект любого типа. Однако для того, чтобы можно было выполнить арифметические и логические операции над указателями или над объектами, на которые они указывают, необходимо при выполнении каждой операции явно определить тип объектов. Такое определение типов может быть выполнено с помощью операции приведения типов.
Примеры:
int *a,*b; /*указатели на тип int*/
double *x; /* указатель на тип double*/
void *t; /*указатель на void*/
Значения указателей одного типа можно присваивать друг другу.
a=b;
Указателю на void можно присвоить значение указателя на любой тип.
t=x;
Чтобы присвоить адрес указателя на void указателю на другой тип необходимо применить явное преобразование типа указателя.
x=(double *)t;
С указателями связаны две операции.
Операция & называется операцией взятия адреса. Если А — это переменная, то &А — это адрес переменной А.
Операция * называется операцией нахождения и обратна предыдущей. Если А — это указатель, то *А — это значение, находящееся по адресу А.
Пример.
int *a,b=6; /*указатели на тип int*/
a=&b; /*указатель а содержит адрес переменной b*/
printf("%d %d\n",b,*a);
В данном примере функция printf дважды выведет на экран содержимое переменной b. Первый раз через имя переменной, а второй раз через указатель.
Над указателями можно выполнять арифметические операции.
int *a,b=10;
char *s,d='t';
a=&b;
s=&d;
a++;
s++;
В данном примере значение указателя s будет увеличено на 1, а значение указателя a — на 2. Значение указателя изменяется на значение равное размеру поля той длины, которая определена типом указателя. Сделано это для того, чтобы, например, указатель на int при изменении его значения ссылался на адрес следующего элемента памяти типа int.
