1. Оператор break; прекращает работу цикла. Например:
while (x<=2)
{....
if (y>5) break;
....
}
2. Оператор continue; пропускает следующую за ним часть тела цикла и переходит к новому шагу цикла. Например: программа выводит на экран только положительные y и считает их количество k.
while (x<=2)
{ y = sqrt (fabs (x)) – x*x;
if (y<0)
{ x+=0.1;
continue;
}
printf (“x=....”, x, y);
k++;
x+=0.1;
}
Сложные (вложенные) циклы
Сложный цикл образуется, когда один цикл входит в другой цикл и т.д.
Уровень сложности цикла – количество вложенных друг в друга циклов.
Пример сложного цикла:
Вычислить
f = 2,7*sin(x) + 1,3*cos(y), где величины x и y изменяются следующим образом:
-3 ≤ x ≤ 3 Δx = 0,1 -4 ≤ y ≤ 4 Δy = 0,2
Рассмотрим 2 варианта реализации: 1. С использованием цикла while; 2. С использованием цикла for.
1. float x = -3, y;
while (x<=3)
{ y = -4;
while (y <=4)
{ f = 2.7*sin(x) + 1.3*cos(x);
printf(“x=%.1 y=%.1f f=%.3f\n”, x, y, f);
y+ = 0.2;
}
x+=0.1;
}
2. float x, y;
for (x=-3; x<=3; x+=0.1)
for (y=-4; y<=4; y+=0.2)
{
f=2.7*sin(x)+1.3*cos(y);
printf(“x=%.1 y=%.1f f=%.3f\n”, x, y, f);
}
Массивы в языке С
Массив – набор значений одного типа, обозначенных общим именем.
Например: массив X = {x1, x2, …, x50} = {xi}, i = 1…50
Размерность массива – количество индексов у элемента массива.
X = {xi} – одномерный массив (Вектор)
Y = {yij} – двухмерный массив (Матрица)
Z = {zijk} – трёхмерный массив (Куб чисел)
Y, Z – многомерные массивы.
В программе на языке С все массивы должны быть описаны.
Одномерные массивы
Форма описания одномерного массива:
тип имя [к];
где к – количество элементов в массиве, целое число.
int p[10];
float x[50];
Начальный индекс элемента массива всегда равен 0.
p[0] p[1] … p[9]
x[0] x[1] … x[49]
Инициализация массива (задание его элементам начальных значений):
тип имя [k] = { конст1, конст2, …, констК};
|
int d[5] = {-1, 2, 7, -4, 10};
d[0]= = -1 d[1]= = 2 d[2]= = 7 … d[4]= =10
Для работы с одномерными массивами чаще всего используются простые циклы типа for, параметром которых является индекс элемента массива. Например: необходимо вычислить и вывести на экран элементы одномерного массива y[30].
float y[30];
int i;
for (i=0; i<30; i++)
{ y[i] = 1.5*sin(2.1*i);
printf(“y[%d]=%.3f\n”, i, y[i]);
}
Многомерные массивы
Виды многомерных массивов:
а) двухмерные массивы {aij} – матрицы
б) трёхмерные массивы {bijk} – куб чисел
в) четырёхмерные массивы {cijkl} и т.д.
Форма описания многомерного массива:
тип имя [k1] [k2] … [kn];
где ki – количество элементов по i-му индексу.
Общее число элементов многомерного массива равно
kобщ = k1*k2*…*kn
int d[5][10]; kd = 50 эл-тов.
float x[7][10][5]; kx = 350 эл-тов.
Начальные индексы у элементов многомерных массивов равны 0.
Индексы для элементов массива d[5][10]:
d [0][0] d[0][1] d[0][2] … d[0][9] d[1][0] … d[4][9]
Индексы для элементов массива x[7][10][5]:
x[0][0][0] x[0][0][1] ……………x[6][9][4]
В памяти многомерные массивы располагаются линейно так, что в первую очередь изменяется крайний правый индекс, потом индекс слева и т.д.
Инициализация многомерных массивов:
int t[3][4] = { {2, 7, -1, 10},
{5, 12, 18, -3},
{11, -8, 25, 4} };
Для работы с многомерными массивами чаще всего используются сложные циклы for. Количество операторов цикла for равно размерности массива. Параметрами этих циклов являются индексы элементов массива. Например: необходимо вычислить и вывести на экран элементы двухмерного массива z[5][7].
int i, j;
float z[5][7];
printf(“Массив Z\n”);
for (i=0; i<5; i++)
{
for (j=0; j<7; j++)
{
z[i][j]=-1.9*i + 2.5*j;
printf(“%.1f “, z[i][j]);
}
printf(“\n”);
}
Операции с адресами. Указатели.
|
В языке С есть две адресных операции.
1. Получение адреса переменной V - &V
Результат операции – физический адрес переменной V в памяти компьютера.
Пример: вывести на экран значения и адреса в памяти переменных p, y, z, m.
int p=25;
float y=371.9;
double z=18.469E-12;
char m=’+’;
printf (“Переменная Значение Адрес \n”);
printf (“ P %10d %u\n”, p, &p);
printf (“ Y %10.1f %u\n”, y, &y);
printf (“ Z %10.3e %u\n”, z, &z);
printf (” M %10c %u\n”, m, &m);
Распределение памяти:
p y z m
371.9 | 18.469E-12 | + |
Адреса: 6921 → 6921+2 → 6923+4 → 6927+8
На экран будет выведена следующая информация:
Переменная Значение Адрес
P 25 6921
Y 371.9 6923
Z 18.469е-12 6927
M + 6935
2. Получение значения по адресу, заданному Р - *Р
где Р – указатель или адресное выражение.
Результат операции – из памяти считывается значение, хранящееся по адресу Р.
Указатель – это специальный вид переменной, которая может хранить адрес.
Форма описания указателя:
тип *имя;
где имя – любой идентификатор, рекомендуется обозначать указатели следующим
образом: ptr pt_a pt_x ptr_k (ptr сокращение от английского pointer).
int m=125, *ptr_m;
float b=221.9, *ptr_b, c;
ptr_m=&m;
ptr_b=&b;
c=*ptr_b;
Адресные операции используются при работе с функциями для передачи адресов параметров, например:
scanf(“%f%d”, &z, &k);
Указатели и массивы
1. В языке С имя массива – это указатель-константа на начало массива
int p[10]; p= =&p[0]
float a[5][7]; a= =&a[0][0]
Для двухмерного массива запись его имени с одним индексом задает адрес начала соответствующей строки:
a[i] = =&a[i][0] – адрес i-й строки
2. С элементами массивов можно работать через указатели. Для этого указателю необходимо присвоить адрес начала массива, а затем можно получить доступ к любому его элементу путем прибавления к указателю индекс этого элемента.
|
В одномерном массиве x[25] расположение элементов следующее:
x x[0] x[1] …. x[24]
float x[25], *ptx;
ptx = x;
i-й элемент массива: x[i] → *(ptx+i)
В адресном выражении (ptx+i) - +1 – это увеличение адреса на длину float
x[5] → *(ptx+5)
В двухмерном массиве m[5][6] расположение элементов следующее:
m00 m01 m02 …. m05 m10 m11 m12 … m45
int m[5][6], *ptm;
ptm=m;
i-й j-й элемент массива: m[i][j]→ *(ptm+i*6+j)
В адресном выражении (ptm+i*6+j) к адресу начала массива ptm прибавляется смещение на количество предыдущих строк i*6 и смещение по текущей строке j.
m[1][2] = = *(ptm+1*6+2)