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

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

.pdf
Скачиваний:
22
Добавлен:
03.06.2015
Размер:
210.8 Кб
Скачать

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

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

Математическое понятием, которое привело к появлению в языках программирования понятия "массив", являются матрица и ее частные случаи: векторстолбец или вектор-строка.

И так, массив представляет собой совокупность N однотипных элементов, которые индексируются (нумеруются). Нумерация элементов любого массива всегда начинается с 0, т.е. индекс изменяется от 0 до N-1, где N - количество значений индекса или количество элементов массива. Синтаксис определения массива выглядит так: тип имя_ массива [константное_ выражение];

Здесь имя_ массива – идентификатор; константное_ выражение – определяет размер массива, т.е. количество элементов в массиве. Например: float tarif [18] определяет массив тарифных коэффициентов типа float из 18 элементов tarif [0], tarif [1],…, tarif [17].

tarif[i] - i-й элемент масива., i - индекс (номер) элементов массива, изменяющийся от 0 до 17.

Для вызова элемента массива и использования его в вычислениях используется бинарная операция [ ], где в качестве операндов используется имя массива tarif и индекс i: tarif[i]*smin – произведение определяет сумму должностного оклада i-го разряда, где smin –минимальная оплата труда.

Описание массива (статистического) производится после введение константы равной размерности массива: const int n=10; int array[n]; без начальных значений в фигурных скобках , а также может отсутствовать количество его элементов (размер): extern unsigned long E [ ]; - суть описание внешнего массива E беззнаковых длинных целых чисел, который определен в другой части программы, где ему выделена память и возможно присвоены начальные значения его элементов.

Инициализация массивов.

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

float tarif [18] = {1.00, 1.36, 1.59. 1.73, 1.82, 2.00, 2.27, 2.54, 2.9, 3.27, 3.68, 4.18, 4.73, 5.32, 6.00, 6.68, 7.41, 8.23}; - массив из 18 элементов.

Использование инициализации позволяет явно не указывать количество элементов одномерного массива, а только перечислить их начальные значения в списке инициализации: int array[]={-2, 3, 0, -6, 9};. Если количество элементов указано, а инициализирующих значений меньше, чем элементов в массиве, остаток массива обнуляется, если больше – компилятор выдаст ошибочное определение. Особенно такая запись удобна при создании массива символов. Например, определение:

char hello[ ]="Мир"; создает массив из 4 переменных типа char: первые 3 места займут буквы, а четвертое специальный завершающий символ '\0', добавляемый компилятором, чтобы обозначить конец последовательности букв.

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

int RabDniMes[12] ={26, 24, 25, 26, 24, 24, 27, 26, 26, 27, 24, 26}; // Массив из 12 элементов. char CH[ ] = {'A', 'B', 'C', 'D'}; // Массив из 4 элементов.

char STR[ ] = "ABCD" // Массив из 5 элементов. int YES [6] = {10, 20, 30, 40}; // Массив из 6 элементов. float M[ ]; // Ошибка в определении массива – нет размера. double N[4] = {1, 2, 3, 4, 5, 6} // Ошибка, элементов больше чем размерность.

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

В массивы можно собрать переменные и объекты любого типа.

Сумму элементов массива.

Сумму элементов вещественного массива правее последнего отрицательного иллюстрирует следующая программа. (Необходимо напомнить, что для успешной отладки любой программы следует подготовить тестовые примеры.)

Упражнение 1. #include <iostream.h>

#include<clocale> using namespace std;

int main(){setlocale(LC_CTYPE, ""); //Для печати русского текста

float N[10] = {1,3,-7,7,9,-3,9,6,4,2};

// Явная инициализация массива

float sum;

// Описание переменной накапливания суммы элементов массива

int i;

// Описание переменной индекса элементов массива

int ineg=-1;

//Инициал. перемен. для проверки условия отсутствия отрицат. эл.

for (i=0; i<10; i++) if(N[i]<0) ineg=i;//*Цикл нахождения отрицат. элем. массива if(ineg !=-1){ // Проверка условия наличия найденных отрицат. элем. массива

for(sum=0, i=ineg+1; i<10; i++) sum+=N[i]; //с организац. цикла суммиров.

cout<<"nСумма "<<sum<<endl;

//Вывод суммы элементов

}

 

else cout<<"\nОтрицательных элементов нет"<<endl; //Вывод сообщения при return 0; //отсутствии отрицательных элементов в массиве

}

В программу внесена проверка, есть ли в массиве хотя бы один отрицательный элемент. Для этого переменной ineg присваивается начальное значение, не входящее в множество допустимых индексов массива (например -1). После цикла поиска номера отрицательного элемента выполняется проверка, сохранилось ли начальное значение ineg неизменным. Если это так, это означает, что условие N[i]<0 в операторе (*) не выполнилось ни разу, и отрицательных элементов в массиве нет.

Количество элементов массива, расположенных между максимальным и минимальным элементами

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

1. Определить, где в массиве расположены его максимальный и минимальный элементы:

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

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

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

элементами:

Если максимум расположен в массиве раньше, чем минимум, принять левую границу просмотра равной индексу максимума, иначе – индексу минимума.

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

3.Обнулить счетчик положительных элементов. Просмотреть массив в указанном диапазоне. Если очередной элемент больше нуля, увеличить счетчик на единицу.

Массив просматривается, начиная с элемента, следующего за максимальным (минимальным), до элемента, предшествующего минимальному

(максимальному). Индексы границ просмотра хранятся в переменных ibeg и iend.

Упражнение 2.

 

#include <iostream.h>

 

int main(){

 

const int n=10;

 

int a[n] ={1,3,-5,1,-2,1,-1,3,8,4};

 

int i,imax,imin,count;

 

for (i=imax=imin=0;i<n;i++){

 

if(a[i]>a[imax]) imax=i;

 

if (a[i]<a[imin]) imin=i;

 

}

 

cout<<"\n\t max= "<<a[imax]<<" min= "<<a[imin];

//Отладка

int ibeg=imax<imin?imax:imin;

 

int iend=imax<imin?imin:imax;

 

cout<<"\n\t ibeg= "<<ibeg<<" iend= "<<iend;

//Отладка

for (count=0,i=ibeg+1;i<iend;i++) if (a[i]>0) count++;

cout<<" Количество положительных: "<<count<<endl; return 0;

}

В приведенной ниже программе направление просмотра, то есть приращение индекса, хранится в переменной d. Если массив просматривается "слева направо", она равна 1, иначе ─ -1. Ввод массива в этом варианте программы осуществляется с клавиатуры. В этом случае желательно для проверки вывести введенные значения на печать.

Упражнение 3. #include <iostream.h> int main(){

const int n=10; int a[n];

int i,imax,imin,kol;

cout<<" Введите "<<n<<" целых чисел:"<<endl; for (i=0;i<n;i++) cin>> a[i];

for (i=0;i<n;i++) cout<<a[i]<<" "; for (i=imax=imin=0;i<n;i++){

if(a[i]>a[imax]) imax=i; if (a[i]<a[imin]) imin=i;

}

int d=0;

if (imax<imin) d=1;

else if (imax>imin) d=-1;

for (kol=0,i=imax+d;i!=imin;i+=d) if(a[i]>0) kol++;

cout<<" Количество положительных: "<<kol<<endl; return 0;

}

Сжатие элементов массива.

Следующая задача демонстрирует сжатие элементов массива. Элементы массива с нечетными номерами в порядке их расположения в массиве становятся на первые места затем все остальные.

Упражнение 4.

 

#include <iostream>

 

#include<clocale>

 

using namespace std;

 

void main()

 

{ setlocale(LC_CTYPE, "");

 

const int n=5;

//Определение кол-ва элем. массива

int a[n], p, i;

 

for(int i=0; i<n; i++)

//Ввод элементов массива

{cout<<"a["<<i<<"]=";

 

cin>>a[i];}

 

system("cls");

 

cout<<"Введенный массив=";

 

for(i=0; i<n; i++)

//Вывод введенных элементов массива

{cout<<a[i]<<" ";}

 

cout<<endl;

 

for(int k=1, m=0; k<=n/2; k++,m++) //Нечетные элементы в начало, четные в конец массива

{for(i=k; i<n-m; i=i+2)

{p=a[i]; a[i]=a[i+1];

 

a[i+1]=p;}}

 

cout<<"Сжатый массив=";

//Вывод сжатого массива

for(i=0; i<n; i++)

 

{cout<<a[i]<<" ";}

 

cout<<endl;

 

}

 

Сортировка массива.

Наиболее распространённая задача с массивами их сортировка и упорядочивание. Ниже приведена программа упорядочивание (сортировка) элементов массива методом выбора максимального элемента. Алгоритм заключается в следующем:

1)определяем внешний цикл для последовательной установки в исходный массив найденных максимальных элементов в подмассивах, т.е.

a)первый найденный максимальный элемент исходного массива, переставляем местами с первым элементом через промежуточную переменную,

b) второй найденный максимальный элемент в подмассиве (преобразованный исходный массив согласно пункта a без первого элемента) переставляем местами с первым элементом подмассива через промежуточную переменную и т.д. пока не заполнится весь массив; 2) определяем внутренний цикл нахождения максимальных элементов в подмассивах.

Упражнение 5.

//Сортировка массива по убыванию путем выбора максимального элемента

#include <iostream> #include<clocale> using namespace std;

void main()

{ setlocale(LC_CTYPE, ""); const int n=10;

int max=0;

int i, j, p, tmp=0, a[n];

cout<<"Введите элементы массива через нажатие клавиши Enter"<<endl; for(i=0; i<n; i++)

{cout<<"a["<<i<<"]="; cin>>a[i];} system("cls");

cout<<"Введенный массив="; for(i=0; i<n; i++) {cout<<a[i]<<" ";} cout<<endl;

for(i=0; i<n; i++) //Внешний цикл последовательной установки найденных максимальных элементов в подмассивах в исходный массив

{max=a[i]; p=1; tmp=a[i];

for(j=i; j<n; j++) //Внутренний цикл нахождения максимальных элементов в подмассивах

{

if(a[j]>=max) {max=a[j]; p=j;} else continue;}

if(i!=p) {a[i]=a[p]; a[p]=tmp;}

}

cout<<"Отсортированный массив="; for(i=0; i<n; i++)

{cout<<a[i]<<" ";} cout<<endl;

}

Упражнение 6.

Сортировка массива по убыванию путем выбора максимального элемента (Отсортированный исходный массив записывается в новый)

#include <iostream> #include <clocale>

#include <limits.h>//Предельные значения для целочисленных типов

//#include <float.h> //Предельные значения для вещественных типов

//Mikrosoft Visual Studio-Help-Index-Data Type Constants

- таблица констант в Mikrosoft Visual Studio

using namespace std;

 

void main()

 

{ setlocale(LC_CTYPE, "");

 

const int n=5;

 

int a[n],b[n],i,k,p=0, max=LONG_MIN; // LONG_MIN=-2147483647; a[n] –исходный массив: b[n] –упорядоченный массив for(int i=0; i<n; i++)

{cout<<"a["<<i<<"]=";

cin>>a[i];}

system("cls"); cout<<"Введенный массив=";

for(i=0; i<n; i++)

 

{cout<<a[i]<<" ";}

 

cout<<endl;

 

for(k=0; k<n; k++)

// Внешний цикл просмотра элементов массива

{for(i=0; i<n; i++)

{if(a[i]>max) {max=a[i]; p=i;}} // Внутренний цикл просмотра элементов массива и выбор из них максимального с фиксацией его номера p=i; a[p]=LONG_MIN; //Присвоение предельного минимального значения очередному макисмальному элементу массива

b[k]=max; //Заполнение массива найденными максимальными элементами max=LONG_MIN;}

cout<<"Отсортированный массив="; for(i=0; i<n; i++)

{cout<<b[i]<<" ";} cout<<endl;

}

Задание 1. В одномерном массиве, состоящем из n вещественных элементов, вычислить:

1)сумму отрицательных элементов массива;

2)произведение элементов массива с четными номерами.

3)упорядочить массив по убыванию

Задание 2..

В одномерном массиве, состоящем из n вещественных элементов, вычислить минимальное, максимальное и среднее значение элементов массива. Результат должен разместится по адресам min, max, avg.