Структура программы. Скалярные типы данных. Выражения и присваивания цель: Изучить категории типов данных, виды выражений и операций и работу с ними на языке Си. Общие сведения
Вид материала | Лабораторная работа |
СодержаниеЧасть 2 операторы языка с++: операторы цикла |
- Алгоритм и программа поиска минимального и максимального элементов в массиве. Задача, 17.73kb.
- Понятие типа данных. Переменные и константы. Основные типы данных в языке Си: общая, 143.1kb.
- Структура программы. Часть Структуры данных. 24. Классификация структур данных. Операции, 41.26kb.
- Курс за второй семестр. Абстрактные типы данных, 687.76kb.
- Программа дисциплины программирование на языке С++ для направления 080700. 62 «Бизнес-информатика», 131.2kb.
- Основы Pascal. Типы данных. Структура программы на языке Pascal, 3515.8kb.
- Лабораторная работа №4 Тема : Структурный тип данных в языке С++, 112.14kb.
- Практическая работа № «Создание базы данных», 21.96kb.
- Структура программы. Описание типов данных. Любая программа,все равно на каком языке, 611.52kb.
- Лекция Выражения. Операции в выражениях Построение выражений. Операции и их приоритеты., 271.62kb.
ЧАСТЬ 2
ОПЕРАТОРЫ ЯЗЫКА С++: ОПЕРАТОРЫ ЦИКЛА
Цель: Ознакомиться с операторами цикла их видами и правилами их использования.
Общие сведения
Операторы цикла задают многократное исполнение операторов тела цикла. Определены три разных оператора цикла:
1) цикл с предусловием:
while (выражение-условие)
тело цикла;
2) цикл с постусловием:
do
тело цикла
while (выражение-условие);
3) итерационный цикл:
for (инициализация_цикла;
выражение-условие;
список выражений)
тело цикла.
25
Тело_цикла не может быть описанием или определением. Это либо отдельный (в том числе пустой) оператор, который всегда завершается точкой с запятой, либо составной оператор, либо блок (заключается в фигурные скобки ). Выражение-условие – это во всех операторах скалярное выражение (чаще всего отношение или арифметическое выражение), определяющее условие продолжения выполнения итераций (если его значение не равно нулю).
Инициализация_цикла в цикле for всегда завершается точкой с запятой, т. е. отделяется этим разделителем от последующего выражения-условия, которое также завершается точкой с запятой. Даже при отсутствии инициализации_цикла и выражения-условия в цикле for символы "точка с запятой" всегда присутствуют.
Список_выражений (в цикле for) – последовательность скалярных выражений, разделенных запятыми.
Прекращение выполнения цикла возможно в следующих случаях:
- при нулевом значеним проверяемого выражения-условия;
- выполненим в теле цикла оператора передачи управления (break, goto, return) за пределы цикла.
Последнюю из указанных возможностей проиллюстрируем позже, рассматривая особенности операторов передачи управления.
Оператор while (оператор "повторять пока (истинно условие)") называется оператором цикла с предусловием. При входе в цикл вычисляется выражение-условие. Если его значение отлично от нуля, то выполняется тело_цикла. Затем вычисление выражения-условия и выполнение операторов тела_цикла повторяются последовательно, пока значение выражения-условия не станет равным 0.
Оператором while удобно пользоваться для просмотра всевозможных последовательностей, если в конце каждой из них находится заранее известный признак. Например, по определению строка есть последовательность символов типа char, в конце которой находится нулевой символ. Следующая функция подсчитывает длину строки, заданной в качестве параметра:
int length (char *stroka)
{ int len = 0;
while (*stroka++) len++;
return len;
}
67
Здесь выход из цикла – равенство нулю того элемента строки, который адресуется указателем stroka. Обратите внимание на порядок вычисления проверяемого выражения. Вначале будет выбрано значение указателя stroka, затем оно будет использовано для доступа по адресу, выбранное значение будет значением выражения в скобках, и затем значение указателя будет увеличено на 1.
В качестве проверяемого выражения-условия часто используются отношения. Например, следующая последовательность операторов вычисляет сумму квадратов первых К натуральных чисел (членов натурального ряда):
int i = 0; // Счетчик
int s = 0; // Будущая сумма
while (i < К)
s += ++i * i; // Цикл вычисления суммы
Если в выражении-условии нужно сравнивать указатель с нулевым значением (с пустым указателем), то следующие три проверки эквивалентны:
while (point != NULL) ...
while (point) ...
while (point != 0) ...
Используя оператор цикла с предусловием, необходимо следить за тем, чтобы операторы тела_цикла воздействовали на выражение-условие либо оно еще каким-то образом изменялось во время вычислений. Например, за счет побочных эффектов могут изменяться операнды выражения-условия. Часто для этих целей используют унарные операции ++ и --. Только при изменении выражения-условия можно избежать зацикливания. Например, следующий оператор обеспечивает бесконечное выполнение пустого оператора в теле цикла:
while (1); // Бесконечный цикл с пустым
// оператором в качестве тела
Такой цикл может быть прекращен только за счет событий, происходящих вне потока операций, явно предусмотренных в программе. Самый жесткий вариант такого события – отключение питания ЭВМ. Обычно в конкретных реализациях языка возможности выхода из бесконечного цикла обеспечивают средства доступа к механизму прерываний.
Оператор do (оператор "повторять") называется оператором цикла с постусловием. Он имеет следующий вид:
do
тело_цикла
while (выражение-условие);
При входе в цикл do обязательно выполняется тело цикла. Затем вычисляется выражение-условие и, если его выражение не равно 0, вновь выполняется тело_цикла. При обработке некоторых последовательностей применение цикла с постусловием оказывается удобнее, чем применение цикла с предусловием. Это бывает в тех случаях, когда обработку нужно заканчивать не до, а после появления концевого признака. Например, следующая функция переписывает заданную строку (указатель star) в другую, заранее подготовленную строку (nov):
void copy str(char *star, char *nov)
{ do *nov = *star++;
while (*nov++) ;
}
Еще один вариант того же цикла с пустым телом_цикла:
do;
while(*nov ++= *star++);
Даже если строка пустая, в ней (по определению строки) в конце присутствует признак '\0'. Именно его наличие проверяется после записи по адресу nov каждого очередного символа.
65
К выражению-условию требования те же, что и к циклу while с предусловием – оно должно изменяться при итерациях либо за счет операторов тела цикла, либо при вычислениях. Бесконечный цикл:
do; while(1);
Оператор итерационного цикла for имеет формат:
for (инициализация_цикла;
выражение-условие;
список выражений)
тело_цикла
Здесь инициализация_цикла – последовательность определений (описаний) и выражений, разделяемых запятыми. Все выражения, входящие в инициализацию цикла, вычисляются только один раз при входе в цикл. Чаще всего здесь устанавливаются начальные значения счетчиков и параметров цикла. Выражение-условие такое же, как и в циклах while и do: если оно равно 0, то выполнение цикла прекращается. В случае отсутствия выражения-условия следующий за ним разделитель "точка с запятой" сохраняется. При отсутствии выражения-условия предполагается, что его значение всегда истинно. При отсутствии инициализации цикла соответствующая ему точка с запятой сохраняется. Выражения из списка_выражений вычисляются на каждой итерации после выполнения операторов тела цикла и до следующей проверки выражения-условия. Тело_цикла может быть отдельным оператором, составным оператором и пустым оператором.
Следующие операторы for иллюстрируют разные решения уже упомянутой простой задачи суммирования квадратов первых К членов натурального ряда:
for (int i =1, s = 0; i <= К; i++) s += i * i;
for (int i = 0, s = 0; i <= К; s += ++i * i) ;
for (int i = 0, s = 0; i <= К; ) s += ++i * i;
for (int i = 0, s = 0; i <= К; )
{ int j; j = ++i; s += j * j ; }
Во втором операторе тело_цикла – пустой оператор. В третьем отсутствует список_выражений. Во всех операторах в инициализации_циклов определены (и инициализированы) целые переменные.
29
Итак, еще раз проследим последовательность выполнения итерационного цикла for. Определяются объекты и вычисляются выражения, включенные в инициализацию_цикла. Вычисляется выражение-условие. Если оно отлично от нуля, выполняются операторы тела_цикла. Затем вычисляются выражения из списка выражений, вновь вычисляется выражение-условие, и проверяется его значение. Далее цепочка действий повторяется.
При выполнении итерационного цикла for выражение-условие может изменяться либо при вычислении его значений, либо под действием операторов тела цикла, либо под действием выражений из списка заголовка. Если выражение-условие не изменяется либо отсутствует, то цикл бесконечен. Следующие операторы обеспечивают бесконечное выполнение пустых операторов:
for( ; ;); // Бесконечный цикл
for( ; 1; ); // Бесконечный цикл
В проекте стандарта языка Си++ нет специальных соглашений относительно области действия имен, определенных в инициализирующей части оператора цикла. В конкретных реализациях принято, что область действия таких имен – от места размещения цикла for до конца блока, в котором этот цикл используется. Например, следующая последовательность операторов;
for (int i = 0; i < 3; i++) cout « "\t" « i;
for (; i > 0; i--) cout « "\t" « i;
выводит на печать такие значения переменной i:
0 1 2 3 2 1
Если во второй цикл поместить еще одно определение той же переменной i, т. е.
for (int i = 0; i < 3; i++) cout « "\t" « i;
for (int i = 3; i > 0; i—) // Ошибка!!
cout « "\t" « i;
то получим сообщение компилятора об ошибке: "многократное определение переменной i".
Разрешено и широко используется вложение любых циклов в любые циклы. В этом случае в инициализации внутреннего цикла for может быть определена (описана с инициализацией) переменная с таким же именем, что и переменная, определенная во внешнем цикле.
//вложение циклов
#include
void main(void)
{ for (int i = 0; i < 3; i++)
{ cout « "\nДо цикла: i = " « i;
cout « ", вложенный цикл:";
for (int i = 6; i > 3; i--) cout « " i = " « i;
cout « ".\n После: i = " « i « "." ;
Результат выполнения этой программы несколько неожиданный:
До цикла i = 0 вложенный цикл: i = 6 i = 5 i = 4,
После: i = 3;
До цикла i = 1 вложенный цикл: i = 6 i = 5 i = 4,
После: i = 3;
До цикла i = 2 вложенный цикл: i = 6 i = 5 i = 4,
После: i = 3.
До внутреннего цикла действует определение переменной i в инициализации внешнего цикла for. Инициализация внутреннего цикла определяет другую переменную с тем же именем, и это определение остается действительным до конца тела внешнего цикла.
Практические задания:
1. Вычислить сумму квадратов первых К натуральных чисел. Результат вывести на печать.
2. Вычислить квадраты чисел от 0 до 9. Результат вывести на печать.
3. Задать строку из произвольных символов и переписать строку в обратном порядке. Результат вывести на печать.
4. Вычислить квадраты четных чисел от 0 до 9. Результат вывести на печать.
5. Вычислить квадраты первых К натуральных чисел. Результат вывести на печать.
6. Вычислить сумму первых К натуральных чисел. Результат вывести на печать.
7. Ввести слово и отцентровать его
8. y(x)=(a+ln|x-b|)/(e+d), x=1.7(0.3)3.2
31
9. y(x)=(sin(x+c)-d)/(e+a), x=1.5(0.1)2
10. y(x)=(ln|x-a|+d)/(cx+bx), x=1(0.3)2.5
11. y(x)=(cos(d+x)+cx)/(ax+b), x=-1(0.2)1
12. y(x)=(cos(a-x)+sin(d))/(ax+bx), x=1(1)5
13. y(x)=(ln(x)+a)/(bx+c), x=1(2)11
14. y(x)=(ex+a)/(x2), x=1(0.2)3
15. y(x)=(ln(x-a)+b)/(cos(x)), x=2(1)8
16. y(x)=(tg(ln|a-x|))/(a), x=1(0.1)2
17. y(x)=((e+x)3)/(x(0.5)), x=1(0.5)6
18. y(x)=(ex+a)/(bx), x=1.5(0.25)5
19. y(x)=(ln|e+x|-ax)/(bx-a), x=3.9(0.2)4.7
Лабораторная работа № 11