Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование.doc
Скачиваний:
10
Добавлен:
22.09.2019
Размер:
812.03 Кб
Скачать

5.3Оператор while

Оператор цикла while называется циклом с предусловием и имеет следующий формат:

while (выражение) тело ;

В качестве выражения допускается использовать любое выражение языка Си, а в качестве тела любой оператор, в том числе пустой или составной. Схема выполнения оператора while следующая:

1. Вычисляется выражение.

2. Если выражение ложно, то выполнение оператора while заканчивается и выполняется следующий по порядку оператор. Если выражение истинно, то выполняется тело оператора while.

3. Процесс повторяется с пункта 1.

Оператор цикла вида

for (выражение-1; выражение-2; выражение-3) тело ;

может быть заменен оператором while следующим образом:

выражение-1;

while (выражение-2)

{ тело

выражение-3;

}

Так же как и при выполнении оператора for, в операторе while вначале происходит проверка условия. Поэтому оператор while удобно использовать в ситуациях, когда тело оператора не всегда нужно выполнять.

Внутри операторов for и while можно использовать локальные переменные, которые должны быть объявлены с определением соответствующих типов.

5.4Оператор 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 (a[k] < i) k++;

}

while (i<30 && j<-30);

5.5Оператор continue

Оператор continue, как и оператор break, используется только внутри операторов цикла, но в отличие от него выполнение программы продолжается не с оператора, следующего за прерванным оператором, а с начала прерванного оператора. Формат оператора следующий: continue;

Пример:

int main()

{ int a,b;

for (a=1,b=0; a<100; b+=a,a++)

{ if (b%2) continue;

... /* обработка четных сумм */

}

return 0;

}

Когда сумма чисел от 1 до а становится нечетной, оператор continue передает управление на очередную итерацию цикла for, не выполняя операторы обработки четных сумм.

6Регулярные типы данных. Массивы

6.1 Понятие регулярного типа

Массивом называется именованная ограниченная упорядоченная совокупность однотипных величин. Каждая отдельная величина называется компонентой массива. Тип компонент может быть любым, принятым в языке СИ. Тип компонент называется базовым типом. Вся совокупность компонент определяется одним идентификатором, посредством которого к нему осуществляется обращение, указывается тип и количество элементов массива. Для обозначения отдельных компонент используется конструкция, называемая переменной с индексом или с индексами:

A[5] S[k+1] B[3,5].

Пример описания массивов.

float A[20],B[20];

int C[30];

В данном примере описаны одномерные массивы с именами A, B, C, причём массивы A и B имеют элементы типа float, порядковые индексы элементов изменяются от 0 до 19, а массив С – с элементами типа int, и индексами от 0 до 29. В квадратных скобках указывается количество элементов в массиве, нумерация которого всегда с 0 до N-1, где N – количество элементов массива.

Математическим по­нятием, которое привело к появлению в языках программирова­ния понятия "массив", являются матрица и ее частные случаи: вектор-столбец или вектор-строка. Элементы матриц в матема­тике принято обозначать с использованием индексов. Сущест­венно, что все элементы матриц либо вещественные, либо целые и т.п. Такая "однородность" элементов свойственна и массиву, определение которого описывает тип элементов, имя массива и его размерность, т.е. число индексов, необходимое для обозна­чения конкретного элемента. Кроме того, в определении указы­вается количество значений, принимаемых каждым индексом.

Например, int a[10]; определяет массив из 10 элементов а[0], а[1], ..., а[9]. float Z[13][6]; определяет двумерный массив, пер­вый индекс которого принимает 13 значений от 0 до 12, второй индекс принимает 6 значений от 0 до 5. Таким образом, элемен­ты двумерного массива Z можно перечислить так:

Z[0][0], Z[0][l], Z[0][2],...,Z[12][4], Z[12][5]

В соответствии с синтаксисом Си в языке существуют только одномерные массивы, однако элементами одномерного массива, в свою очередь, могут быть массивы. Поэтому двумерный мас­сив определяется как массив массивов. Таким образом, в при­мере определен массив Z из 13 элементов-массивов, каждый из которых, в свою очередь, состоит из 6 элементов типа float.

В качестве индекса может быть использовано выражение. В индексных типах, по одному для каждой размерности массива, указывается число элементов. Допустимыми индексными типами являются все порядковые типы.

Ограничений на размерность массивов, т.е. на число индек­сов у его элементов, в языке Си теоретически нет. Стандарт языка Си требует, чтобы транслятор мог обрабатывать опреде­ления массивов с размерностью до 31. Однако чаще всего ис­пользуются одномерные и двумерные массивы. Продемон­стрируем на простых вычислительных задачах некоторые прие­мы работы с массивами.

Пример:

Вычисление среднего и дисперсии. Введя значение n из диапазона (0<n<=100) и значения n первых элементов массива х[0], х[1],...,х[n-1], вычислить среднее и оценку дисперсии зна­чений введенных элементов массива. Задачу решает следующая программа:

/* Вычисление среднего и дисперсии */

#include <stdio.h>

void main ( )

{ /*n - количество элементов */

int i,j,n; /*b-среднее,d-оценка дисперсии; */

float a,b,d,x[100],e; /*а,е-вспомогательные*/

while (1) {

printf("\n Введите значение n=");

scanf("%d", &n);

if( n > 0 && n <= 100 ) break;

printf("\n Ошибка! Необходимо 0<n<101 "); }

/* Конец цикла ввода Значения n */

printf("\n Введите значения элементов: \n");

for( b=0.0,i=0; i<n; i++) {

printf("x[%d] = ", i);

scanf("%f", &x[i]);

b+=x[i];/* Вычисление суммы элементов */ }

b/=n;/* Вычисление среднего */

for(j=0,d=0.0; j<n; j++) {

a=x[j]-b;

d+=a*a;

} /* Оценка дисперсии*/

d/=n;

printf("\n Среднее =%f, дисперсия=%f",b,d);

}

В программе определен массив х со 100 элемента­ми, хотя в каждом конкретном случае используются только пер­вые n из них. Ввод значения n сопровождается проверкой допустимости вводимого значения. В качестве условия после while записано заведомо истинное выражение 1, поэтому выход из цикла (оператор break) возможен только при вводе правильного значения n, удовлетворяющего неравенству 0<n<101. Следующий цикл обеспечивает ввод n элементов массива и получение их суммы (b). Затем в цикле вычисляется сумма d квадратов отклонений эле­ментов от среднего значения. Возможен следующий результат работы программы:

Введите значение n=5

Введите значение элементов:

х[0]=4

х[1]=5

х[2]=6

х[3]=7

х[4]=8

Среднее=6.000000, дисперсия=2.000000

Найти сумму

Введем следующие обозначения: а - двумерный массив, со­держащий значения элементов матрицы; р - произведение эле­ментов строки матрицы; с - сумма их значений; s - искомая сумма (результат). Опустив определения переменных и опера­торы ввода-вывода, запишем текст на языке Си:

double a[10][5];

for(s=0.0, j=0; j<10; j++)

{

for( p=1.0,c=0.0, i=0; i<5; i++)

{

p*=a[j][i]; c+=a[j][i];

}

s+=c+p; }

При работе с вложенными циклами следует обратить внима­ние на правила выполнения операторов break и continue. Каж­дый из них действует только в том операторе, в теле которого он непосредственно использован. Оператор break прекращает выполнение ближайшего внешнего для него оператора цикла. Оператор continue передает управление на ближайшую внеш­нюю проверку условия продолжения цикла.

Для иллюстрации рассмотрим фрагмент другой программы для вычисления суммы произведений элементов строк той же матрицы:

double a[10][5];

for (j=0,s=0.0; j<10; j++)

{

for (i=0,p=1.0; i<5; i++)

{

if (a[j][i] == 0.0) break;

p*=a[j][i];

}

if (i <5) continue;

s+=p;

}

Внутренний цикл по i прерывается, если обнару­живается нулевой элемент матрицы. В этом случае произведе­ние элементов столбца заведомо равно нулю, и его не нужно вычислять. Во внешнем цикле проверяется значение i. Если i<5, т.е. элемент a[j][i] оказался нулевым, то оператор continue передает управление на ближайший оператор цикла, и, таким образом, не происходит увеличение s на величину "недосчитанного" значения р. Если внутрен­ний цикл завершен естественно, то i равно 5, и оператор continue не может выполняться.