1.74M
Категория: ПрограммированиеПрограммирование

Массивы. Тема №6

1.

ТАШКЕНТСКИЙ УНИВЕРСИТЕТ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ
ИМЕНИ МУХАММАДА АЛ-ХОРАЗМИЙ
ПРОГРАММИРОВАНИЕ 1
SWD1316
ТЕМА
06
Массивы
АБДУЛЛАЕВА ЗАМИРА
ШАМШАДДИНОВНА
Доцент кафедры Основы
информатики
1

2.

Содержание
1. Определение массива;
2. Одномерный массив;
3. Двухмерный массив;
4. Массивы и функции;
5. Заключение;
П РО Г РА М М И РО ВА Н И Е 1
2

3.

Понятие массивов
• Массив – это комплекс однотипных элементов, имеет общее
название и памяти.
• Свойства:
• Все элементы относятся одному типу
• Массив имеет одно название
• Все элементы находятся в памяти последовательно
• Примеры:
• Список преподавателей, Квартиры в многоэтажных домах,
Городские университеты, Годовая температура погоды
П РО Г РА М М И РО ВА Н И Е 1
3

4.

Массивы
A
Номер элемента
массива
массив
(index)
0
1
5
10
A[0]
22
15
15
3
4
20
25
A[1] Значение
A[2]элемента
A[3]
A[4]
массива
Значение элемента
массива: 15
!
A[2]
Номер элемента
массива (index) : 2
В С++ элементы массива начинаются с НУЛЯ!
П РО Г РА М М И РО ВА Н И Е 1
4

5.

Объявление массивов
Для чего объявляются массивы?
• Для определения названия массива
• Для определения типа массива
• Для определения количество массива
• Для выделения место в памяти
Размер массива
(количество
Типы
Пример:
элементов)
элементов
Название
int
A [ 5 ];
Ввод размерности с помощью констант:
П РО Г РА М М И РО ВА Н И Е 1
const int N = 5;
int A [ N ];
5

6.

Объявление массивов
Примеры:
int X[10], Y[10];
float zz, A[20];
char s[80];
Задавать начальные значения:
int A[4] = { 8, -3, 4, 6 }; Остальные
нули
float B[2] = { 1. };
char C[3] = { 'A', '1', 'Ю' };
! Если не заданы начальные значения, то элементы
принимают любые значения!
П РО Г РА М М И РО ВА Н И Е 1
6

7.

Найти ошибку
const int
int N = 10;
float A[N];
int A[10];
A[10] = 0;
float X[5];
int n = 1;
X[n-2] = 4.5;
X[n+8] = 12.;
int X[4.5];
Выход из границы
массива
(информация удалена из
памяти)
int X[4];
X[2] = 4.5;
Отбрасывается
дробная часть
(Нет ошибки)
float
int
A[2] = { 1, 3.8 };
float B[2] = { 1., 3.8, 5.5 };
П РО Г РА М М И РО ВА Н И Е 1
7

8.

Объявление
const int N = 5;
Объявление:
int A[N], i;
Ввод с клавиатуры:
cout<<“Введите 5 элементов
массива:\n”;
for( i=0; i < N; i++ ) {
cout<<"A[i] = “ ;
cin>> A[i] ;
Задачи
} с элементами:
П РО Г РА М М И РО ВА Н И Е 1
A[0] = 5
A[1] = 12
A[2] = 34
A[3] = 56
A[4] = 13
8

9.

Объявление
Задачи с элементами:
for( i=0; i < N; i++ ) A[i] = A[i]*2;
Результат:
10 24 68 112 26
Вывод на экран: cout<<“Результат:\n”;
for( i=0; i < N; i++ )
cout<< A[i]<<“ ”;
П РО Г РА М М И РО ВА Н И Е 1
9

10.

Программа
Задача: Ввести 5 элементов через клавиатуру и
умножить все элементы на 2 и вывести результат.
#include <stdio.h>
#include <conio.h>
main()
{const int N = 5;
int A[N], i;
// Ввод элементов массива
// Обработка массивов
// Вывод результатов
getch();
}
П РО Г РА М М И РО ВА Н И Е 1
10

11.

Самый большой элемент
Задача: Найти максимальный элемент массива.
Псевдокод:
// Возьмем A[0] как максимальный
for ( i=1; i < N; i++ )
Почему цикл начинается с i=1?
?
if ( A[i] > максимума)
// A[i] станет максимальным элементом
П РО Г РА М М И РО ВА Н И Е 1
11

12.

Самый большой элемент
Дополнение: как найти максимальный элемент?
max = A[0]; // пока A[0]– максимальный
iMax = 0;
for ( i=1; i < N; i++ )//проверка остальных
if ( A[i] > max ) { // нахождение нового
max = A[i];
//A[i] сохраняется
iMax = i; }
// i сохраняется
?
Как можно оптимизировать код?
Можно взять вместо элемента iMax значение
A[iMax]. Поэтому все max заменяем на A[iMax] и
уберем перемменную max.
П РО Г РА М М И РО ВА Н И Е 1
12

13.

Заполнение массивов
for (int i = 0; i < size of values; i++)
{
values[i] = 0;
}
Заполним массив квадратов числами 0, 1, 4, 9, 16
и т.д. Обратите внимание, что 0 индексный элемент
принимает 0, 1 индексный элемент 1 и так далее.
for (int i = 0; i < size of squares; i++)
{
squares[i] = i * i;
}
П РО Г РА М М И РО ВА Н И Е 1
13

14.

Копирование элементов
Рассмотрим два массива:
int squares[5] = { 0, 1, 4, 9, 16 };
int lucky_numbers[5];
Допустим, что вы хотите переписать все элементы первого
массива на второй. Следующее выражение будет ошибочной:
lucky_numbers = squares; // Error На C++ нельзя копировать
элементы одного массива на другой. Для этого мы будем
использовать цикл:
for (int i = 0; i < 5; i++)
{
lucky_numbers[i] = squares[i];
}
П РО Г РА М М И РО ВА Н И Е 1
14

15.

Удаление элементов
Рассмотрим массив с известным размеров и известными
значениями. Допустим, что вы хотите удалить элемент массива под
индексом pos. Если элементы не упорядочены, то это действие будет
легко. Потому что, последний элемент заменим на удаляемый. После,
уменьшаем размерность массива.
values[pos] = values[current_size - 1];
current_size--;
Если порядок элементов будет зависеть от удаления, то задача
усложнится. Для этого мы все элементы должны заменить на один
нижние элементы массива. После этого уменьшаем размерность
массива.
П РО Г РА М М И РО ВА Н И Е 1
15

16.

Заполнение случайными числами
#include <stdlib.h>
RAND_MAX – максимальное случайное число
(обычно RAND_MAX = 32767)
[0,RAND_MAX] целые числа в интервале
x = rand(); // первое число
x = rand(); // теперь другое
Ввод начального значения последовательности:
srand ( 345 ); // начинается с 345
П РО Г РА М М И РО ВА Н И Е 1
16

17.

Целые числа в заданном интервале
Целые числа в интервале [0,N-1]:
int random(int N) {
return rand()% N;}
Примеры:
x = random ( 100 ); // [0,99] interval
x = random ( z ); // [0,z-1] interval
числа в интервале [a,b] :
x = random ( z ) + a; // [a,z-1+a] interval
x = random (b – a + 1) + a; // [a,b] interval
П РО Г РА М М И РО ВА Н И Е 1
17

18.

Заполнение случайными числами
#include <stdio.h>
#include <stdlib.h>
int random(int N)
{ return rand() % N; }
main()
{const int N = 10;
int A[N], i;
printf(“Massiv:\n");
for (i = 0; i < N; i++ ) {
A[i] = random(100) + 50;
cout<<A[i]; }...}
П РО Г РА М М И РО ВА Н И Е 1
Функция выводит
случайные числа от 0
до N-1
? Какой интервал?
18

19.

Запись элементов массива в обратном порядке
Задача: Вывести элементы массива в обратном порядке
(используя инверсию).
0
1

0
N-2 N-1
N-2 N-1
N-1 сумма индексов
A[0] и A[N-1], A[1] и A[N-2], …
/ 2 ; i++ )
for ( i = 0; i < N N
// Замена A[i] и A[N-1-i]
П РО Г РА М М И РО ВА Н И Е 1

7 9 … 5 3
3 5 … 9 7
Алгоритм:
Заменяем
Псевдокод:
1
? Что неправильно?
19

20.

Как можно заменять?
Задача: Поменять
местами содержание
двух пиялушек.
2
Задача: Заменить две ячейки памяти.
y
x
x = y;
y = x;
c = x;
x = y;
y = c;
П РО Г РА М М И РО ВА Н И Е 1
4
6
2
6
4
4
?
20

21.

Программа
main()
{ const int N = 10;
int A[N], i, c;
// Заполнение массива
// Ввод элементов массива
for ( i = 0; i < N/2; i++ ) {
c = A[i];
A[i] = A[N-1-i];
A[N-1-i] = c;
}
// Вывести полученный массив }
П РО Г РА М М И РО ВА Н И Е 1
21

22.

Циклический сдвиг
Задача: Сдвиньте элементы массива на одну ячейку в
лево, первый элемент должен стать последним.
0
1
2
3

N-2 N-1
3 5 8 1 … 9 7
5 8 1 … 9 7 3
Алгоритм:
A[0]=A[1]; A[1]=A[2];… A[N-2]=A[N-1];
Цикл:
Почему не N?
for ( i = 0; i < N-1; i ++)
Что
неправильно?
?
A[i] = A[i+1];
П РО Г РА М М И РО ВА Н И Е 1
22

23.

Программа
main()
{ const int N = 10;
int A[N], i, c;
// Введите массив
// Вывод текущего массива
c = A[0];
for ( i = 0; i < N-1; i ++)
A[i] = A[i+1];
A[N-1] = c;
// Вывод измененного массива
}
П РО Г РА М М И РО ВА Н И Е 1
23

24.

Многомерные статические массивы
На языке C++ нет ограничения для типов элементов
массива, но эти типы должны быть ограниченным размерностью
объектов. Потому что компилятор должен вычислять место
занимаемой в памяти для массивов. В общем, компонентом
массива может быть сам массив («вектор-векторов»), в
результате появится двухмерный массив называемым
матрицей.
Если элемент матрицы будет вектором, то получиться куб
называемым трехмерным массивом. Этим способом можно
создавать массивы любых размерностей.
Синтаксис двухмерного массива выглядит следующим
образом:
П РО Г РА М М И РО ВА Н И Е 1
24

25.

Определение двухмерного массива
Тип элемента Строки Столбцы
Список начальных
значений
Название
П РО Г РА М М И РО ВА Н И Е 1
25

26.

Многомерные статические массивы
<тип> <название> [<кол. строк >] [<кол. столбцов>]
Например, объявление массива вещественных чисел:
float a[10][20];
Объявление матрицы A выглядит следующим образом.
1
П РО Г РА М М И РО ВА Н И Е 1
26

27.

Ввод и вывод элементов
Ввод двухмерного массива похож на ввод
одномерного массива, но отличие в том, что в
двухмерном массиве вводятся данные по нескольким
строкам:
int value = counts[3][1];
Двухмерный массив состоит из двух циклов, один
цикл для строк и другой для столбцов. Например,
следующий цикл выводит все элементы матрицы.
П РО Г РА М М И РО ВА Н И Е 1
27

28.

Ввод и вывод элементов
Индекс строк
Индекс
столбцов
П РО Г РА М М И РО ВА Н И Е 1
28

29.

Функции и массивы
Используется фиксированная размерность при случаи, когда в качестве
параметра функции не используется строка. Если мы будем
использовать функцию с параметром, в котором размерность массива
любое. Пример:
П РО Г РА М М И РО ВА Н И Е 1
29

30.

Функции и массивы
Название массива является указателем поэтому элементы массива
можно изменять и эти изменения сохраняться и после выхода из
функции.
П РО Г РА М М И РО ВА Н И Е 1
30

31.

Функция и массивы
Работа с многомерными массивами несколько
сложна, потому что хранение элементов массива в
памяти может быть различна. Например, нельзя
записать матрицу действительного типа x[n][n] так,как
float sum(float x[n][n]).
Решение проблемы – это в том, что размерность
массива нужно задавать в качестве параметра функции
и сама функция будет такой:
float sum(int n,float x[][]);
П РО Г РА М М И РО ВА Н И Е 1
31

32.

Функции и массивы
Можно использовать несколько методов для использования
многомерного массива в качестве параметра:
1-метод. Можно указать вторую размерность массива
неизменяемым выражением (числом) :
П РО Г РА М М И РО ВА Н И Е 1
32

33.

Функции и массивы
2-метод. При задания двухмерного массива как массив
указателей:
П РО Г РА М М И РО ВА Н И Е 1
33

34.

Функции и массивы
3-метод. При использовании
указанных как двойной указатель:
П РО Г РА М М И РО ВА Н И Е 1
динамических
массивов
34

35.

Заключение
• Массивы предназначены для хранения последовательности
однозначных значений. Например: массивы предназначенные для
результатов тестов показывают исчерпывающие результаты:
int scores[NUMBER_OF_SCORES количество баллов];
• Но выражение double personal_data[3]; не удовлетворительный
сохраняющей массив с парными личными информациями [3] в
позициях 0, 1 и 2, то есть по возрасту человека, банковскому
счету и росту. Для программиста сложно запомнить их где
хранится массив, такие значения информации. В таком случаи
лучшее использовать 3 разные переменные.
П РО Г РА М М И РО ВА Н И Е 1
35

36.

ТАШКЕНТСКИЙ УНИВЕРСИТЕТ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ
ИМЕНИ МУХАММАДА АЛ-ХОРАЗМИЙ
СПАСИБО ЗА ВНИМАНИЕ!
АБДУЛЛАЕВА ЗАМИРА
ШАМШАДДИНОВНА
Доцент кафедры Основы
информатики
36
English     Русский Правила