Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

584_Lebedenko_L.F._Osnovy_programmirovanija_na_S++_

.pdf
Скачиваний:
4
Добавлен:
12.11.2022
Размер:
1.71 Mб
Скачать

При описании массива можно сразу задать начальные значения его элементам:

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