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

Учебное пособие_С++2015

.pdf
Скачиваний:
179
Добавлен:
15.03.2016
Размер:
2.8 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. Организация счетчика

Дан целочисленный массив: В = { b i };i =1,20 . Определить количество элементов массива, которые делятся на 3 без остатка, то есть кратные 3.

Схема алгоритма:

 

НАЧАЛО

 

Ввод массива

 

В

 

L=0

 

I=0, 19

 

 

Вывод L

Да

 

Bi кратно 3?

 

L=L+1

Конец

 

Текст программы:

 

#include "stdafx.h"

 

int main()

 

{ int

В[20] ;

// описание массива B

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 .

Вычислить среднее арифметическое и среднее геометрическое чисел

массива, используя формулы:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

S 1

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

P n xi .

 

 

 

 

 

 

xi ;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

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()

{

 

 

float

X [100];

//описание массива Х

float z;

 

int

n;

 

int i;

 

 

float

S=0, P=1; //начальные значения суммы и произведения

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;

 

 

}

 

 

 

Двухмерные массивы

Двухмерные массивы в математике представляются матрицей:

a

a

...

a

 

11

12

 

1n

a21

a22

...

a2n

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. Организовать ввод целочисленной матрицы М по строкам.

1

2

3

M

 

 

 

 

 

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