Символы кириллицы выводит некорректно. Как сделать чтобы выводился читабельный текст на русском языке? Тип приложения - не 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 ";