Similar presentations:
Массивы. Одномерные массивы
1.
ТАШКЕНТСКИЙ УНИВЕРСИТЕТ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙИМЕНИ МУХАММАДА АЛ-ХОРАЗМИЙ
ПРОГРАММИРОВАНИЕ 1
SWD1316
ТЕМА
05
Массивы. Одномерные
массивы
1
2. План лекции
1Понятие о массиве. Определение.
2
Объявления и инициализация массивов.
3
4
Алгоритмы обработки массивов
Поиск в массиве
5
П РО Г РА М М И РО ВА Н И Е 1
2
3. Что такое массив?
? Как ввести 10000 переменных?Массив – это группа переменных одного типа, расположенных в памяти
рядом (в соседних ячейках) и имеющих общее имя. Каждая ячейка в
массиве имеет уникальный номер (индекс).
Примеры:
Список преподавателей, Квартиры в многоэтажных домах, Городские
университеты, Годовая температура погоды
Надо:
• выделять память
• записывать данные в нужную ячейку
• читать данные из ячейки
П РО Г РА М М И РО ВА Н И Е 1
3
4. Обращение к элементу массива
AНОМЕР
элемента массива
(ИНДЕКС)
массив
0
1
5
10
A[0]
A[1]
22
15
15
3
4
20
25
ЗНАЧЕНИЕA[3]
A[4]
элемента массива
ЗНАЧЕНИЕ
НОМЕР (ИНДЕКС)
элемента массива: 15
элемента массива: 2
A[2]
!
В С++ элементы массива начинаются с НУЛЯ!
П РО Г РА М М И РО ВА Н И Е 1
4
5. Выделение памяти (объявление)
! Массив = таблица!число
элементов
int A[5];
double V[8];
bool L[10];
char S[80];
! Элементы нумеруются
с нуля!
A[0], A[1], A[2], A[3], A[4]
размер через
константу
const int N = 10;
int A[N];
П РО Г РА М М И РО ВА Н И Е 1
? Зачем?
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 intint 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];
Обработка:
// обработать A[0]
// обработать A[1]
// обработать A[2]
// обработать A[3]
// обработать A[4]
? 1) если N велико (1000, 1000000)?
2) при изменении N программа не должна меняться!
П РО Г РА М М И РО ВА Н И Е 1
8
9. Как обработать все элементы массива?
Обработка с переменной:i = 0;
// обработать A[i]
i ++;
// обработать A[i]
i ++;
// обработать A[i]
i ++;
// обработать A[i]
i ++;
// обработать A[i]
i ++;
П РО Г РА М М И РО ВА Н И Е 1
i = 0;
while ( i < N )
{
// обработать A[i]
i ++;
}
Цикл с переменной:
for( i = 0; i < N; i++ )
{
// обработать A[i]
}
9
10. Заполнение массива
int main(){
const int N = 10;
int A[N];
int i;
for ( i = 0; i < N; i++ )
A[i] = i*i;
}
? Чему равен A[9]?
П РО Г РА М М И РО ВА Н И Е 1
10
11. Ввод с клавиатуры и вывод на экран
Объявление:const int N = 10;
int A[N];
Ввод с клавиатуры:
for ( i = 0; i < N; i++ )
{
cout << "A[" << i << "]=";
cin >> A[i];
}
Вывод на экран:
cout >> "Массив A:\n";
for ( i = 0; i < N; i++ )
cout << A[i] << " ";
П РО Г РА М М И РО ВА Н И Е 1
A[0] = 5
A[1] = 12
A[2] = 34
A[3] = 56
A[4] = 13
? Зачем пробел?
11
12. Генератор случайных чисел
или#include <сstdlib>
#include <stdlib.h>
Генератор на отрезке [0,RAND_MAX]:
int X, Y;
X = rand(); // псевдослучайное число
Y = rand() // это уже другое число!
41
18467
англ. random – случайный
Целые числа на отрезке [a,b]:
rand() % (b - a + 1);
? Почему так?
[0,b-a]
П РО Г РА М М И РО ВА Н И Е 1
12
13. Заполнение случайными числами
Задача. Заполнить массив (псевдо)случайными целымичислами в диапазоне от 20 до 100.
int irand ( int a, int b )
{
return a + rand()% (b - a + 1);
}
for ( i = 0; i < N; i++ )
{
A[i] = irand ( 20, 100 );
cout << A[i] << " ";
}
П РО Г РА М М И РО ВА Н И Е 1
13
14. Перебор элементов
Общая схема:for ( i = 0; i < N; i++ )
{
... // сделать что-то с A[i]
}
Подсчёт нужных элементов:
Задача. В массиве записаны данные о росте
баскетболистов. Сколько из них имеет рост больше
180 см, но меньше 190 см?
count = 0;
for ( i = 0; i < N; i++ )
if ( 180 < A[i] && A[i] < 190 )
count ++;
П РО Г РА М М И РО ВА Н И Е 1
14
15. Перебор элементов
Среднее арифметическое:int count, sum;
count = 0;
sum = 0;
for ( i = 0; i < N; i++ )
if ( 180 < A[i] && A[i] < 190 ) {
count ++;
sum += A[i];
}
cout << (float)sum / count;
? Зачем float?
П РО Г РА М М И РО ВА Н И Е 1
среднее
арифметическое
15
16. ЗАДАЧИ
«А»: Заполните массив случайными числами в интервале [0,100] и подсчитайтеотдельно среднее значение всех элементов, которые <50, и среднее
значение всех элементов, которые ≥50.
Пример:
Массив:
3 2 52 4 60
Ср. арифм. элементов [0,50): 3.000
Ср. арифм. элементов [50,100]: 56.000
«В»: Заполните массив из N элементов случайными числами в интервале [1,N]
так, чтобы в массив обязательно вошли все числа от 1 до N (постройте
случайную перестановку).
Пример:
Массив:
3 2 1 4 5
П РО Г РА М М И РО ВА Н И Е 1
16
17. Алгоритмы обработки массивов
Алгоритмы обработкимассивов
П РО Г РА М М И РО ВА Н И Е 1
17
18. Поиск в массиве
Найти элемент, равный X:i = 0;
while ( A[i] != X )
i ++;
cout << "A[" << i << "]=" << X;
? Что плохо?
i = 0;
while ( i < N && A[i] != X )
i ++;
Что если такого нет?
if ( i < N )
cout << "A[" << i << "]=" << X;
else
cout << "Не нашли!";
?
П РО Г РА М М И РО ВА Н И Е 1
18
19. Поиск в массиве
Вариант с досрочным выходом:nX = -1;
for ( i = 0; i < N; i++ )
if ( A[i] == X )
{
nX = i;
досрочный
break;
выход из
}
цикла
if ( nX >= 0 )
cout << "A[" << nX << "]=" << X;
else
cout << "Не нашли!";
П РО Г РА М М И РО ВА Н И Е 1
19
20. Максимальный элемент
Задача: Найти максимальный элемент массива.Псевдокод:
// Возьмем A[0] как максимальный
for ( i=1; i < N; i++ )
Почему цикл начинается с i=1?
?
if ( A[i] > максимума)
// A[i] станет максимальным элементом
П РО Г РА М М И РО ВА Н И Е 1
20
21. Максимальный элемент
M = A[0];for ( i = 1; i < N; i++ )
if ( A[i]> M )
M = A[i];
cout << M;
? Как найти его номер?
M = A[0]; nMax = 0;
for ( i = 1; i < N; i++ )
if ( A[i] > M ) {
Что можно улучшить?
M = A[i];
nMax = i;
}
cout << "A[" << nMax << "]=" << M;
?
П РО Г РА М М И РО ВА Н И Е 1
21
22. Максимальный элемент и его номер
! По номеру элемента можно найти значение!nMax = 0;
for ( i = 1; i < N; i++ )
if ( A[i] > A[nMax] )
nMax = i;
cout << "A[" << nMax << "]=" << A[nMax] ;
П РО Г РА М М И РО ВА Н И Е 1
22
23. Реверс массива
«Простое» решение:остановиться на середине!
for( i = 0; i < N/2
N ; i++ )
{
// поменять местами A[i] и A[N-1-i]
}
? Что плохо?
П РО Г РА М М И РО ВА Н И Е 1
23
24. Как можно заменять?
Задача: Поменятьместами содержание
двух пиялушек.
2
Задача: Заменить две ячейки памяти.
y
x
x = y;
y = x;
c = x;
x = y;
y = c;
П РО Г РА М М И РО ВА Н И Е 1
4
6
2
6
4
4
?
24
25. Реверс массива
for ( i = 0; i < (N/2); i++ ){
c = A[i];
A[i] = A[N-1-i];
A[N-1-i] = c;
}
? *Как обойтись без переменной c?
П РО Г РА М М И РО ВА Н И Е 1
25
26. Циклический сдвиг элементов
«Простое» решение:?
Почему не до N-1?
c = A[0];
for ( i = 0; i < N-1; i++ )
Что плохо?
A[i] = A[i+1];
A[N-1] = c;
?
П РО Г РА М М И РО ВА Н И Е 1
26
27. ЗАДАЧИ
«A»: Введите массив с клавиатуры и найдите (за один проход) количествоэлементов, имеющих максимальное значение.
Пример:
Массив:
3 4 5 5 3 4 5
Максимальное значение 5
Количество элементов 3
«B»: Массив имеет четное число элементов. Заполнить массив случайными
числами и выполнить реверс отдельно в первой половине и второй
половине.
Пример:
Массив:
1 2 3 4 5 6
Результат:
3 2 1 6 5 4
П РО Г РА М М И РО ВА Н И Е 1
27
28. Отбор нужных элементов
Задача. Отобрать элементы массива A,удовлетворяющие некоторому условию, в массив B.
«Простое» решение:
сделать для i от 0 до N-1
если условие выполняется для A[i] то
B[i]= A[i]
Что плохо?
?
0
1
2
3
4
5
12
3
34
11
23
46
12
?
34
?
?
46
П РО Г РА М М И РО ВА Н И Е 1
выбрать чётные
элементы
28
29. Отбор нужных элементов
01
2
3
4
5
12
3
34
11
23
46
12
34
46
?
?
?
выбрать чётные
элементы
?
Если A и B – один и
count = 0;
тот же массив?
for ( i = 0; i < N; i++ )
if ( A[i] % 2 == 0 )
{
Как вывести на экран?
B[count] = A[i];
count ++;
}
for ( i = 0; i < count ; i++ )
printf ( "%d ", B[i] );
?
П РО Г РА М М И РО ВА Н И Е 1
29
programming