Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Материалы для подготовки к экзамену по ОП.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
297.52 Кб
Скачать

Вложенные циклы

Рассмотрим пример, где циклы вложены друг в друга. Выведем таблицу умножения.

#include<conio.h>

#include<math.h>

#include<stdio.h>

int main() {

int i, j;

// Для каждого i

for (i = 1; i < 11; i++) {

// Выводим строку из произведения i на j

for (j = 1; j < 11; j++) {

printf("%4d", i*j);

}

// После чего переходим на новую строку

printf("\n");

}

getch();

}

В этом примере в первый цикл по переменной i вложен второй цикл по переменной j. Последовательность действий такая: сначала мы входим в цикл по i, после этого для текущего i 10 раз подряд осуществляется вывод чисел. После этого необходимо перейти на новую строку. Теперь давайте выведем только элементы под главной диагональю.

for (i = 1; i < 11; i++) {

for (j = 1; j < 11; j++) {

if (j > i) {

break;

}

printf("%4d", i*j);

}

printf("\n");

}

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

for (i = 1; i < 11; i++) {

for (j = 1; j <= i; j++) {

printf("%4d", i*j);

}

printf("\n");

}

В данном случае мы используем во вложенном цикле счётчик первого цикла.

Тема №6 Одномерные массивы

Пусть нам необходимо работать с большим количеством однотипных данных. Например, у нас есть тысяча измерений координаты маятника с каким-то шагом по времени. Создавать 1000 переменных для хранения всех значений очень обременительно. Вместо этого множество однотипных данных можно объединить под одним именем и обращаться к каждому конкретному элементу по его порядковому номеру.

Массив в си определяется следующим образом

<тип> <имя массива>[<размер>];

Например,

int a[100];

Мы получим массив с именем a, который содержит сто элементов типа int. Как и в случае с переменными, массив содержит мусор.

Для получения доступа до первого элемента, в квадратных скобках пишем его номер (индекс). Например.

#include <conio.h>

#include <stdio.h>

void main() {

int a[100];

a[0] = 10;

a[10] = 333;

a[12] = 234;

printf("%d %d %d", a[0], a[10], a[12]);

getch();

}

Первый элемент имеет порядковый номер 0. Важно понимать, почему. В дальнейшем будем представлять память компьютера в виде ленты. Имя массива - это указатель на адрес памяти, где располагаются элементы массива.

Массив хранит адрес первого элемента. Индекс i элемента - это сдвиг на i*sizeof(тип) байт от начала.

Индекс массива указывает, на сколько байт необходимо сместиться относительно начала массива, чтобы получить доступ до нужно элемента. Например, если массив A имеет тип int, то A[10] означает, что мы сместились на 10*sizeof(int) байт относительно начала. Первый элемент находится в самом начале и у него смещение 0*sizeof(int).

В си массив не хранит своего размера и не проверяет индекс массива на корректность. Это значит, что можно выйти за пределы массива и обратиться к памяти, находящейся дальше последнего элемента массива (или ближе).