|
Символы кириллицы выводит некорректно. Как сделать чтобы выводился читабельный текст на русском языке? Тип приложения - не Qt, Qt Creator 4.5.0 основан на Qt 5.10.0. Win7.
|
Массивы
5.3 Отличие статического и динамического массива
В чём же отличие статического и динамического массива?
Предположим, описан статический массив: double x[75];
Это означает, что выделен участок памяти для хранения 75 элементов типа double (массив из 75 элементов типа double). Адрес начала массива хранится в переменной x. Для обращения к
-му элементу можно использовать конструкции 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, вводим
— размер динамического массива, выделяем участок памяти для хранения
элементов типа double (массив из
элементов типа double). Адрес начала массива хранится в переменной x. Для обращения к
-му элементу можно использовать конструкции x[i] или *(x+i). В случае динамического массива мы сначала определяем его размер (в простейшем случае просто вводим размер массива с клавиатуры), а потом выделяем память для хранения реального количества элементов. Основное отличие статического и динамического массивов состоит в том, что в динамическом массиве выделяется столько элементов, сколько необходимо.
Имя массива (статического или динамического) это адрес начала выделенного для него участка памяти, значит обращаться к элементам массива можно двумя способами — x[i] или *(x+i).
5.4 Основные алгоритмы обработки массивов
Все манипуляции с массивами в С++ осуществляются поэлементно. Организовывается цикл, в котором происходит последовательное обращение к нулевому, первому, второму и т.д. элементам массива. В общем виде алгоритм обработки массива выглядит так, как показано на рис. 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;
}
Результат работы программы:
N=3 Введите элементы массива X 1.2 -3.8 0.49
//Вариант 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 Вычисление суммы элементов массива
Дан массив
, состоящий из
элементов. Найти сумму элементов этого массива. Процесс накапливания суммы элементов массива достаточно прост и практически ничем не отличается от суммирования значений некоторой числовой последовательности. Переменной
присваивается значение, равное нулю, затем к переменной
последовательно добавляются элементы массива
. Блок-схема алгоритма расчёта суммы приведена на рис. 5.4.
Соответствующий алгоритму фрагмент программы будет иметь вид:
for ( S= i =0; i<N; i++) S+=X [ i ]; cout<<" S = "<<S<<" \n ";

![Алгоритм ввода массива X[N]](/EDI/09_01_19_1/1546985980-8393/tutorial/698/objects/5/files/5.2.png)
![Алгоритм вывода массива X[N]](/EDI/09_01_19_1/1546985980-8393/tutorial/698/objects/5/files/5.3.png)
