584_Lebedenko_L.F._Osnovy_programmirovanija_na_S++_
.pdfПри описании массива можно сразу задать начальные значения его элементам:
int dat[4]={5,8,-2,11}; float kom[]={3.5,6,-1.1};
Имя массива фактически является константой-указателем, ссылающимся на начальный адрес данных (адрес первого элемента массива). Начальный адрес массива определяет компилятор в момент описания массива, и такой адрес не может быть переопределен. Первый элемент массива в языке С++ имеет
индекс ноль.
Например:
int Ar[5];
printf ("адрес Ar=%x\n",Ar); printf ("адрес Ar=%x\n",&Ar[0]);
В приведенном фрагменте обе функции printf выводят адрес массива Ar, т.к. выражения Ar и &Ar[0] эквивалентны.
Индексированные переменные
Выбор отдельного элемента из массива осуществляется с помощью индексированной переменной, которая задается следующим образом:
x[i] - индексированная переменная (элемент массива).
Здесь x - имя массива;
i - индекс (номер элемента массива).
В качестве индекса используются:
•целые константы, например х[2] х2;
•целые переменные, например х[к] хk;
•индексные выражения, например х[2*n+1] x2n+1.
Вязыке С++ индексы элементов любого массива начинаются с нуля. Индексные выражения должны иметь значения целого типа.
Переменная с индексом может стоять в левой части оператора присваивания, например:
Ar[3]=2.5; // присвоение числа 2.5 четвертому элементу массива Ar
81
Ввод-вывод одномерных массивов
Ввод-вывод массивов осуществляется поэлементно с помощью операторов scanf и printf соответственно и оператора цикла for..., в котором в качестве параметра используется индекс элемента массива.
Пример 1. Организовать ввод с клавиатуры значения массива:
A = (1.2, 5, -6.8, 14).
Необходимо описать массив и индекс.
int main()
{float A[4] ; int i;
Впрограмме ввод массива рекомендуется организовать в виде диалога, поместив перед оператором ввода оператор вывода (printf), которым выдается на экран поясняющее сообщение, например:
printf("Введите массив А\n"); for( i = 0; i<4; i++) scanf("%f",&A[i]);
В момент исполнения этой группы команд на клавиатуре через один или несколько пробелов набираются элементы массива и нажимается клавиша
[Enter]:
1.2 5 -6.8 14 [Enter]
Замечание. Элементы массива можно вводить в «столбик», если после ввода каждого элемента нажимать клавишу [Enter].
Пример 2. Организовать вывод массива А на экран таким образом, чтобы все элементы располагались на одной строке экрана.
В программе надо записать следующие операторы:
for ( i = 0; i<4; i++)
printf("%5.2f ",A[i]);
printf("\n");
Вид выведенного массива на экране:
1.25.0 -6.8 14.0
Оператор printf("\n"); служит для перевода курсора к началу следующей строки экрана.
82
Обработка одномерных массивов
При решении задач обработки массивов используют, как правило, базовые алгоритмы реализации циклических вычислительных процессов: организация
счетчика, накопление сумм и произведений, поиск минимального и максимального элементов массива.
Задача 1. Организациясчетчика
Дан целочисленный массив: В = {bi};i=1,20. Определить количество элементов массива, которые делятся на 3 без остатка, то есть кратные 3.
Схема алгоритма: |
|
НАЧАЛО |
|
Ввод массива |
|
В |
|
L=0 |
|
I=0, 19 |
|
|
Вывод L |
Да |
|
Bi кратно 3? |
|
L=L+1 |
Конец |
|
Текст программы:
#include "stdafx.h"
int main() |
|
; // описание массива B |
||
{ int |
В[20] |
|||
int |
i, L; |
// описание переменных для индекса и счетчика |
||
printf("Введите массив В\n"); |
||||
for( i=0; |
i<20; i++) |
|||
scanf("%d", &В[i]); |
// ввод данных в массив с клавиатуры |
|||
|
L=0; |
//инициализация счетчика |
||
|
for( i |
=0; i<20; |
i++) |
|
|
|
|
|
83 |
if (В[i] % 3== 0) //проверка элемента на кратность 3 L++; //увеличение счетчика на единицу
printf("Кол-во=%d\n", L); //вывод значения счетчика на экран return 0;
}
В программе можно было для ввода использовать функцию cin, а для вывода функцию cout:
cin>> В[i]; // ввод данных в массив с клавиатуры
cout<<"Кол-во="<<L<<"\n";//вывод значения счетчика на экран
Задача 2. Накопление суммы и произведения
Дано целое число n и массив |
вещественных чисел: |
||
X xi ; |
i |
|
. |
1,n |
Вычислить среднее арифметическое и среднее геометрическое чисел массива, используя формулы:
|
1 |
n |
|
|
n |
|
|
S |
xi ; |
P n xi . |
|||||
n |
|||||||
|
i |
1 |
|
i 1 |
Схема алгоритма:
НАЧАЛО
Ввод
n,X[n]
S=0 P=1
i=1,n
S=S/n P=P1/n
S=S+X[i]
P=P*X[i]
Вывод S,P
Конец
84
Текст программы:
#include "stdafx.h" #include <math.h> #include <iostream> using namespace std;
int main() |
|
|
{ |
X [100]; |
|
float |
//описание массива Х |
|
float |
z; |
|
int |
n; |
|
int i; |
S=0, P=1; //начальные значения суммы и произведения |
|
float |
cout<<"Введите размер массива n= "; cin>>n;
cout<<"Введите массив X\n"; for( i = 0; i<n; i++)
cin>>X[i];
for( i=0; i<n; i++)
{
S = S + X[i]; |
//добавление в сумму элемента массива Х |
P =P*X[i]; |
// добавление в произведение элемента массива Х |
} |
|
S = S/n; |
// вычисление среднего значения Х |
z=1.0/n; |
|
P=pow(P,z); |
// вычисление среднего геометрического Х |
cout<<"S="<<S<<"\n";
cout<<"P="<<P<<"\n"; return 0;
}
Задача 3. Поиск минимального и максимального элементов массива
Дан вещественный массив: T = {ti}; i=1,10 . Поменять местами минимальный и максимальный элементы массива и вывести массив после обмена.
Решение
В этой задаче для осуществления обмена надо знать не только значения минимального и максимального элементов массива, но и их местоположение. Поэтому во время поиска минимального и максимального элементов необходимо фиксировать значения их индексов.
85
Введем обозначения:
min - минимальный элемент;
imin - индекс минимального элемента; max - максимальный элемент;
imax - индекс максимального элемента.
Схема алгоритма:
НАЧАЛО
Ввод массива Т
Min=106 Max=-106
i=1,10
Вывод Min,imin,
Маx, imax
Да
T[i]<Min
Min=T[i] imin=i |
Конец |
Нет
T[i]>Max Да
Max=T[i] imax=i
Нет
Текст программы:
#include "stdafx.h"
#include<math.h>
int main()
{
86
float T[10] ; |
|
// описание массива Т |
|
int |
i, imin, imax; |
|
|
float |
min, max; |
|
|
printf("Введите массив Т\n"); |
|||
for( i = 0;i<10;i++) |
|
||
scanf("%f",&T[i]); |
|
||
min =+1E6; |
//инициализация min очень большим числом |
||
max =-1E6; |
//инициализация max очень маленьким числом |
||
for( i = 0; i<10; i++) //цикл по всем значения индекса |
|||
{ |
|
|
|
if (T[i]<min) |
|
|
|
{ |
min = T[i]; |
|
|
|
|
||
|
imin=i; |
|
// сохранение номера текущего min |
|
} |
|
|
if( T[i]>max) |
|
||
|
{ |
|
|
|
max = T[i]; |
|
|
|
imax = i; |
// сохранение номера текущего max |
|
} |
} |
|
|
|
|
|
|
T[imin]=max; //запись max на место min |
|||
T[imax]= min; |
//запись min на место max |
||
for( i= 0; i<10; |
i++) //вывод массива Т после обмена |
||
|
printf("%6.2f |
",T[i]); |
|
|
printf("\n"); |
return 0;
}
Двухмерныемассивы
Двухмерные массивы в математике представляются матрицей:
|
|
a12 |
... |
a1n |
|
||
a11 |
|
||||||
a |
21 |
a |
22 |
... |
a |
2n |
|
A |
|
|
|
|
|||
... |
... |
... |
... |
|
|||
|
|
am2 |
... |
|
|
|
|
am1 |
amn |
или сокращенно можно записать: А = aij m n , где т – число строк; n -
число столбцов; i,j - индексы (номера) строки и столбца, на пересечении которых находится элемент aij.
87
Описание двухмерного массива
Описание матрицы задается структурным типом вида:
<тип элементов><имя> [m][n];
где m – количество строк;
n –количество столбцов матрицы.
По описанию матрицы во внутренней памяти компьютера выделяется область из т п последовательных ячеек, в которые при работе программы записываются значения элементов матрицы. Например, по описанию:
float A [3][5];
В памяти компьютера для элементов матрицы выделяется область, состоящая из 3 5=15 последовательных ячеек вещественного типа. Из описания видно, что матрица состоит из трех строк и пяти столбцов. Нумерация строк и
столбцов ведется с нуля.
Обращение к отдельным элементам матрицы осуществляется с помощью переменной с двумя индексами. Например:
А[i][j] aij;
А[2][3] a23;
А[2*n][k+1] a2n,k+1.
Ввод-вывод двухмерного массива
Для поэлементного ввода и вывода матрицы используется двойной цикл for.... Если задать индекс i как параметр внешнего цикла, а индекс j как параметр внутреннего цикла, то ввод-вывод матрицы осуществляется построчно.
Пример 1. Организовать ввод целочисленной матрицы М по строкам.
M |
1 |
2 |
3 |
||
|
|
|
|
|
|
|
|
4 |
5 |
6 |
|
|
|
|
Описание матрицы вместе с текущими индексами имеет вид:
int main()
{
int М[2][3] ;
int i, j;
88
Ввод в программе реализуется в форме диалога, т.е. сопровождается выводом поясняющего сообщения:
printf("Введите матрицу М\n"); for( i = 0; i<2; i++)
for( j = 0; j< 3; j++) scanf("%f",&m[i][j]);
Аналогично для ввода матрицы можно использовать функцию cin: cout<<"Введите матрицу М\n";
for( i = 0; i<2; i++) for( j = 0; j< 3; j++)
cin>>m[i][j];
На клавиатуре желательно для наглядности восприятия набирать элементы матрицы по строкам, отделяя числа друг от друга одним или несколькими пробелами:
1 |
2 |
3 |
[Enter] |
4 |
5 |
6 |
[Enter] |
Пример 2. Организовать вывод матрицы М на экран.
Вывод матрицы необходимо реализовать в удобном для чтения виде, т.е. чтобы на одной строке экрана располагалась одна строка матрицы. С этой целью в тело внешнего цикла, помимо внутреннего цикла, включается оператор printf, который переводит курсор к началу следующей строки экрана после вывода текущей строки матрицы.
for ( i = 0; i<2; i++)
{
for ( j = 0; j< 3; j++) printf("%3d ",m[i][j]);
printf("\n");
}
Вид матрицы на экране будет следующим:
1 |
2 |
3 |
4 |
5 |
6 |
Вывод матрицы можно реализовать и с помощью функции cout: for ( i = 0; i<2; i++)
{ for ( j = 0; j< 3; j++) cout<<m[i][j]<<"\t";
cout<<"\n";
}
89
Прежде чем приступись к разбору задач обработки матриц, следует знать следующее.
Квадратная матрица – это двумерный массив, в котором количество строк равно количеству столбцов. Квадратная матрица имеет главную и побочную диагонали. Главной диагональю матрицы называется диагональ, идущая из левого верхнего угла в правый нижний угол матрицы, например,
для матрица M[3][3]:
|
М00 |
|
|
М01 |
|
М02 |
||
|
|
|
|
|
|
|
|
|
|
М10 |
|
М11 |
|
|
М12 |
||
|
|
|
|
|
|
|
||
|
М20 |
|
М21 |
|
М22 |
|
||
|
|
|
|
|
|
|
|
|
элементы М00 М11 М22 – элементы главной диагонали. Обращение к элементу главной диагонали выглядит как М[i][i].
Побочной диагональю матрицы называется диагональ, идущая из левого нижнего угла в правый верхний угол матрицы.
|
М00 |
|
М01 |
|
М02 |
|
||
|
|
|
|
|
|
|
|
|
|
М10 |
|
М11 |
|
|
М12 |
||
|
|
|
|
|
|
|
||
|
М20 |
|
|
М21 |
|
М22 |
||
|
|
|
|
|
|
|
|
|
Обращение к элементу побочной диагонали выглядит как М[i][n-1-i], где n- размерность матрицы.
Для любого элемента М[i][j] квадратной матрицы следует заметить следующее: если учесть, что индексы элементов матрицы изменяются от 0 до n-1, то
1)если i==j , элемент расположен на главной диагонали;
2)если i>j, элемент расположен ниже главной диагонали;
3)если i<j, элемент расположен выше главной диагонали;
4)если i>= j. элемент расположен на главной диагонали и ниже;
5)если i<= j, элемент расположен на главной диагонали и выше;
6)если i+j <=n-1 – элемент расположен над побочной диагональю;
7)если i+j>n-1 – элемент расположен под побочной диагональю;
90