Смекни!
smekni.com

Язык прораммирования С++ (стр. 6 из 7)

%6.3g означает, что числу отводится не менее шести знакомест, но от числа сохраняется не более трех значащих цифр. На примере распечатки мы не видим, что числу отведено шесть позиций, потому что столбец последний и число выравнивается не по правому, а по левому краю области печати. Указание выравнивать число по левому краю дано знаком минус в спецификации %-6.3g.

Лекция 4. Работа с массивами

1. Одномерные массивы

Массив, это совокупность однотипных элементов, объединенных общим именем.

Например, десять целых чисел, объединенных именем Mas, объявляются следующим образом:

intMas[10];То же, что на Паскале Mas: array [0..9] ofinteger;.

В объявлении записывают тип элементов, имя массива и, в квадратных скобках, количество элементов.

Элементами массивов могут быть не только числа. Можно например, объявить массив, состоящий из массивов. Нельзя объявлять массивы, элементами которых являются функции или данные типа void.

Массив можно передать функции как параметр, но функция не может возвращать массив в качестве результата своей работы.

Объявление массива можно совместить с его инициализацией, перечислив значения элементов в фигурных скобках:

intA[5] ={2,-3, 0,0,7};

В операторной части программы при обращении к отдельным элементам указывают имя массива и номер элемента в квадратных скобках. Элементы массива нумеруются начиная с нуля, т.е. оператор

printf(“%d”,A[0]);

выведет на экран первый элемент, число 2, а оператор

printf(“%d”,A[4]);

выведет последний элемент, число 7. Элемента A[5] в массиве A нет.

При инициализации массивов язык Си позволяет большую свободу, чем Паскаль. В частности, не обязательно перечислять значения всех элементов. В объявлении

floatM1[10]={4, 2.5, 0.3}; семь последних элементов автоматически заполнятся нулями. Самостоятельно проверьте, можно ли пропускать элементы, если они не последние, например, разделяя отсутствующие элементы запятыми:

floatM2[10]={4, 2.5,0.3,,0,,,,20.3};.

Если при инициализации перечислены все элементы - можно не указывать размер массива: ar[]={2,7,9,3,1};. Заметим, что размер массива можно не указывать также если массив объявлен, как параметр функции или если объявляется ссылка на массив, определенный в другом файле. Пусть, например, наш проект состоит из двух файлов (A.cpp, B.cpp). Если A.cpp мы объявили массив floatM1[10], то в B.cpp для работы с этим массивом можно записать строку

externfloatM1[];,

которая указывает, что массив внешний – объявление массива сделано в другом файле. При необходимости можно указать и размер массива externfloatM1[10], но инициализацию при ссылке на внешний массив (как и на любую внешнюю переменную) повторять нельзя.

Рассмотрим в качестве примера решение следующей задачи:

– объявить массив из пяти целых чисел;

– заполнить элементы массива данными, вводимыми с клавиатуры;

–вывести элементы массива на экран;

найти сумму положительных элементов и вывести ее на экран.

#include <stdio.h>

#include <conio.h>

int ar[5];

void main(void)

{ clrscr();

printf("Enter five numbers");//Этояпословарюпривыкаюканглийскимсловам

for(inti=0;i<5;i++) scanf("%d",&ar[i]); //Объявленная здесь переменная i видна и дальше.

float Sum=ar[0];

for(i=1;i<5;i++) if(ar[i]>0) Sum=Sum+ ar[i];

for(i=0;i<5;i=i+1)printf(“%5d”, ar[I]);

printf("The sum is %f",Sum);

getch ();

}

Решим задачу поиска элементов с максимальным значением в массивах, состоящих из целых чисел. Для этого реализуем функцию поиска максимального элемента в виде отдельного файла

int MaxArr(int Mas[],int R=10) //Файл Max_Arr.cpp

{ int Max=Mas[0];

for(int i=1;i<R;i=i+1) if(Mas[i]>Max)Max=Mas[i];

return Max;

}

Первый параметр функции MaxArr(),– это массив из целых чисел, а второй – количество элементов массива. Размерность массива не указана, поэтому функция может находить максимальный элемент в любом массиве, состоящем из целых чисел. Язык C++ позволяет при описании функции указывать после параметра его значение по умолчанию (параметру R по умолчанию присвоено значение 10). В этом случае при вызове функции можно не указывать один или несколько последних параметров, имеющих заданные по умолчанию значения.

Ниже приведена программа, использующая данную функцию для вывода на экран максимальных элементов двух массивов разного размера.

#include <stdio.h>

#include <conio.h>

int MaxArr(int Mas[],int R=10); Этошаблонзаголовка. В нем можно опускать имена формальных параметров и писать только их типы, например,

int MaxArr(int[],int=10);

void main(void)

{ clrscr();

int M1[5]={-3,5,0,15,6};

int M2[10]={13,25,0,15,-36};

intMax2=MaxArr(M2); МассивM2 состоит из 10 элементов, поэтому можно передавать только первый параметр.

printf("&bsol;n В первом массиве %d &bsol;

Во втором массиве %d", MaxArr(M1,5), Max2); getch();

}

Сравните с языком Паскаль – там при описании формального параметра типа массив, требовалось указывать имя параметра и имя предварительно описанного типа передаваемого массива. Из-за этого на Паскале для работы с массивами разных размеров требовалось иметь отдельные функции. Но зато на Си программист может ошибиться и задать больше или меньше элементов, чем есть в массиве. Заметим, что можно указать в заголовке функции размерность массива:

intMaxArr(intMas[10],intR=10);

Но даже и в этом случае компилятор не производит контроль соответствия размера указанного в заголовке размеру реально передаваемого массива – предоставляя программисту большие возможности, язык С++ возлагает на него большую ответственность за работу программы.

Замечание. Если производится обращение к переменной, объявленной в другом модуле проекта, надо указать, что она внешняя, например, externintM. Имена функций видны везде, нужно указывать лишь прототип функции.

2. Многомерные массивы

Как и в языке Паскаль, в С++и многомерные массивы конструируют, объявляя массив, элементы которого тоже массивы. Так:

– одномерный массив intA[10]; - это набор из 10 целых чисел;

– двумерный массив intA2[10][3]; - это массив из 10 элементов, а каждый элемент A2[i] массив из трех целых чисел;

– intA3[10][3][5]; это массив из 10 элементов, а каждый элемент A3[i] - двумерный массив размером 35;.

Двумерные массивы используются для работы с матрицами и другими прямоугольными таблицами. Для того, чтобы в программе на языке С++ объявить прямоугольную матрицу

t00 t01 t02 t03

T =t10 t11 t13 t12

t20 t21 t22 t23,

надо указать, из элементов какого типа (целых или вещественных) она состоит, дать ей имя, указать сколько в ней строк и столбцов. Если показанная выше таблица содержит вещественные числа, ее объявление будем иметь вид:

doubleT[3][4];

где 3 –количество строк, а 4 – столбцов. В языке Паскаль для каждого индекса указывался интервальный тип данных, задающий начальное и конечное значения, в С++ строки и столбцы всегда нумеруются с нуля, поэтому пишется только их количество.

Чтобы задать конкретный элемент массива, надо указать номер строки, в которой находится этот элемент, и номер столбца. Так, элемент, который находится во второй строке и третьем столбце надо обозначать T[1][2]. Можно рассуждать и иначе:

– выбираем элемент массива, указав его индекс - T[1];

– T[1] это массив из четырех чисел, выбираем элемент массива T[1], указав его индекс - T[1][2].

В Паскале, чтобы увеличить сходство операторов программы с математической записью элементов матриц, разрешалось перечислять индексы массива через запятую. В С++ это недопустимо. Особенно неприятно, что компилятор, встретив обозначение M[1,2] будет считать, что это M[2] и при синтаксическом контроле может не выдать ошибку.

Объявление двумерного массива также можно совмещать с его инициализацией:

intMas[3][4]= {{2, 7, 9,4},

{1,3},

{3,3,3,3}}

Правила инициализации вытекают из соответствующих правил для одномерных массивов.

Двумерный массив – это одномерный массив, элементами которого являются строки матрицы. А при инициализации одномерного массива в фигурных скобках (в примере это внешние скобки) перечисляются через запятую значения элементов массива. Но каждый элемент – это тоже массив. Поэтому его значение – последовательность чисел, взятая в фигурные скобки. Как показано во второй строке, можно перечислять не все элементы строки матрицы – недостающие автоматически заполнятся нулями.

В сделанном выше объявлении массива можно не указывать число строк:

intMas[][4]= {{2,7… и т д.

В памяти элементы массива располагаются по строкам, сначала элементы первой строки, потом второй и т. д. Для многомерных массивов (у которых больше двух индексов) это правило формулируется так:

– при размещении первым записывается в память элемент, у которого все индексы равны нулю;

– далее пробегаем последний (правый) индекс от нуля дот максимального значения;

– потом увеличиваем на единицу предпоследний индекс и заново изменяем последний от нуля до единицы;

– когда предпоследний индекс достигнет максимального значения, увеличиваем третий справа индекс и так далее.

Таким образом, в двумерном массиве целых чисел размером MN элемент с индексами i,j смещен на N*sizeof(int) i+ sizeof(int)*j байтов от начала массива.

Учитывая построчное расположение элементов в памяти, в языке разрешено перечислять при инициализации элементы одной строкой. Тот же массив, что показан выше, можно было объявить так:

intMas[][4]= {2, 7, 9,4, 1,3,0,0, 3,3,3,3};, но оставлять незаполненными элементы второй строки уже нельзя. В этом случае тоже можно не указывать первую размерность. Последняя строка может быть не полной - при объявлении

intMas[][4]={1,2,3,4, 1,3} компилятор будет отсчитывать по четыре числа в строке и создаст матрицу

1 2 3 4

1 3 0 0.