Компания ALT Linux
Опубликован: 07.03.2015 | Доступ: свободный | Студентов: 2136 / 487 | Длительность: 24:14:00
Лекция 5:

Массивы

5.3 Отличие статического и динамического массива

В чём же отличие статического и динамического массива?

Предположим, описан статический массив: double x[75];

Это означает, что выделен участок памяти для хранения 75 элементов типа double (массив из 75 элементов типа double). Адрес начала массива хранится в переменной x. Для обращения к i-му элементу можно использовать конструкции x[i] или *(x+i). Если понадобится обрабатывать массив более, чем из 75 элементов, то придётся изменить описание и перекомпилировать программу. При работе с массивами небольшой размерности, большая часть памяти, выделенной под статический массив, будет использоваться вхолостую.

Допустим, задан динамический массив, например

double *x; //Указатель на double
int k;
cin>>k; //Вводим размер массива k.
//Выделение памяти для хранения динамического массива из k чисел.
x=new double [ k ]; //Адрес начала массива хранится в переменной x.
x=(double *) calloc ( k, sizeof ( float ) ); //Память можно будет выделить так
x=(double *) malloc ( k* sizeof ( float ) ); //или так

В этом случае, мы имеем указатель на тип данных double, вводим k — размер динамического массива, выделяем участок памяти для хранения k элементов типа double (массив из k элементов типа double). Адрес начала массива хранится в переменной x. Для обращения к i-му элементу можно использовать конструкции x[i] или *(x+i). В случае динамического массива мы сначала определяем его размер (в простейшем случае просто вводим размер массива с клавиатуры), а потом выделяем память для хранения реального количества элементов. Основное отличие статического и динамического массивов состоит в том, что в динамическом массиве выделяется столько элементов, сколько необходимо.

Имя массива (статического или динамического) это адрес начала выделенного для него участка памяти, значит обращаться к элементам массива можно двумя способами — x[i] или *(x+i).

5.4 Основные алгоритмы обработки массивов

Все манипуляции с массивами в С++ осуществляются поэлементно. Организовывается цикл, в котором происходит последовательное обращение к нулевому, первому, второму и т.д. элементам массива. В общем виде алгоритм обработки массива выглядит так, как показано на рис. 5.1.

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

Алгоритм обработки элементов массива

Рис. 5.1. Алгоритм обработки элементов массива

5.4.1 Ввод-вывод элементов массива

Ввод и вывод массивов также осуществляется поэлементно. Блок-схемы алгоритмов ввода и вывода элементов массива X[N] изображены на рис. 5.2,рис. 5.3.

Рассмотрим несколько вариантов ввода массива:

//Вариант 1. Ввод массива с помощью функции scanf.
//При организации ввода используются специальные символы: табуляция — \t
//и переход на новую строку — \n.
#include <stdio.h>
int main ( )
{
float x [ 10 ]; int i, n;
printf ( " \n N = " ); scanf ( " % d ",&n ); //Ввод размерности массива.
printf ( " \n Введите элементы массива X \n " );
for ( i =0; i<n; i++)
scanf ( " % f ", x+ i ); //Ввод элементов массива в цикле.
//Обратите внимание, x + i — адрес i-го элемента массива.
return 0;
}
Алгоритм ввода массива X[N]

Рис. 5.2. Алгоритм ввода массива X[N]

Результат работы программы:

N=3
Введите элементы массива X
1.2
-3.8
0.49
Алгоритм вывода массива X[N]

Рис. 5.3. Алгоритм вывода массива X[N]
//Вариант 2. Ввод массива с помощью функции scanf и вспомогательной переменной b.
#include <stdio.h>
int main ( )
{
float x [ 10 ], b; int i, n;
printf ( " \n N = " ); scanf ( " % d ",&n ); //Ввод размерности массива.
printf ( " \n Массив X \n " );
for ( i =0; i<n; i++)
{
	printf ( " \n Элемент % d \t ", i ); //Сообщение о вводе элемента.
	scanf ( " % f ",&b ); //Ввод переменной b.
	x [ i ]=b; //Присваивание элементу массива значения переменной b .
}
return 0;
}

Результат работы программы:

N=4
Массив X
Элемент 0 8.7
Элемент 1 0.74
Элемент 2 -9
Элемент 3 78
//Вариант 3. Ввод динамического массива с помощью cin.
#include <iostream>
using namespace std;
int main ( )
{
	int *X,N, i;
	cout<<" \n N = "; cin>>N; //Ввод размерности массива.
	X=new int [N ]; //Выделение памяти для динамического массива из N элементов.
	for ( i =0; i<N; i++)
	{
		cout<<" \n X [ "<<i<<" ]= "; //Сообщение о вводе элемента.
		cin>>X [ i ]; //Ввод элементов массива в цикле.
	}
	delete [ ] X;
	return 0;
}

Результат работы программы:

N=4
X[0]=1
X[1]=2
X[2]=4
X[3]=5

Вывод статического или динамического массива можно осуществить несколькими способами:

//Вариант 1. Вывод массива в виде строки.
for ( i =0; i<n; i++) printf ( " % f \t ",X [ i ] );
//Вариант 2. Вывод массива в виде столбца.
for ( i =0; i<n; i++) printf ( " \n % f ",X [ i ] );
//Вариант 3. Вывод массива в виде строки.
for ( i =0; i<N; i++) cout <<" \t X [ "<<i<<" ]= "<<X [ i ];
//Вариант 4. Вывод массива в виде столбца.
for ( i =0; i<N; i++) cout <<" \n X [ "<<i<<" ]= "<<X [ i ];

5.4.2 Вычисление суммы элементов массива

Дан массив X, состоящий из N элементов. Найти сумму элементов этого массива. Процесс накапливания суммы элементов массива достаточно прост и практически ничем не отличается от суммирования значений некоторой числовой последовательности. Переменной S присваивается значение, равное нулю, затем к переменной S последовательно добавляются элементы массива X. Блок-схема алгоритма расчёта суммы приведена на рис. 5.4.

Алгоритм вычисления суммы элементов массива

Рис. 5.4. Алгоритм вычисления суммы элементов массива

Соответствующий алгоритму фрагмент программы будет иметь вид:

for ( S= i =0; i<N; i++)
	S+=X [ i ];
cout<<" S = "<<S<<" \n ";
Сергей Радыгин
Сергей Радыгин

Символы кириллицы выводит некорректно. Как сделать чтобы выводился читабельный текст на русском языке?

Тип приложения - не Qt,

Qt Creator 4.5.0 основан на Qt 5.10.0. Win7.

 

Юрий Герко
Юрий Герко

Кому удалось собрать пример из раздела 13.2 Компоновка (Layouts)? Если создавать проект по изложенному алгоритму, автоматически не создается  файл mainwindow.cpp. Если создавать этот файл вручную и добавлять в проект, сборка не получается - компилятор сообщает об отсутствии класса MainWindow. Как правильно выполнить пример?