- •Основы программирования на языке с
- •1. Элементы языка с
- •1.1. Комментарии
- •1.2. Идентификаторы
- •1.3. Данные
- •1.3.1. Константы
- •4) Строковые константы – это последовательность символов, заключенная в кавычки:
- •1.3.2. Переменные
- •1.4. Арифметические операции
- •1.5. Стандартные математические функции
- •1.6. Арифметические выражения
- •2. Структура с – программы
- •3. Операторы языка с
- •3.1. Оператор присваивания
- •3.2 Составной оператор
- •3.3 Вывод данных на дисплей
- •3.4. Ввод данных с клавиатуры
- •3.5. Оператор перехода goto
- •3.6 Условный оператор if и условная операция
- •3.7. Оператор – переключатель switch
- •3.8. Операторы цикла
- •4. Массивы в языке с
- •В программе на языке с все массивы должны быть описаны.
- •5. Операции с адресами. Указатели.
4. Массивы в языке с
Массив – набор значений одного типа, обозначенных общим именем.
Например: массив 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”);
}
5. Операции с адресами. Указатели.
В языке С есть две адресных операции.
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
-
25
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)
