- •1. Краткие теоретические сведения
- •1.1. Переменные с индексами и массивы
- •1.2. Описание массивов в программах
- •1.3. Динамические массивы
- •1.4. Программирование вычислительных процессов, содержащих одномерные массивы (Алгоритмы обработки одномерных массивов)
- •1.4.1. Инициализация массива
- •1.4.2. Формирование и вывод массива
- •1.4.3. Ввод – вывод статического одномерного массива
- •1.4.4. Ввод – вывод динамического одномерного массива
- •1.4.5. Суммирование элементов одномерного массива
- •1.4.6. Табуляция значений функции, аргумент которой – одномерный массив
- •1.4.7. Поиск минимального и максимального значений одномерного массива
- •1.4.8. Сортировка значений одномерного массива по возрастанию (убыванию) методом попарного сравнения
- •1.4.9. Сортировка значений одномерного массива по возрастанию (убыванию) методом нахождения минимума (максимума)
- •Нахождения минимума для примера 10.8
- •1.4.10. Перестановка двух элементов массива
- •1.4.11. Вычисление суммы элементов массива
- •1.4.12. Подсчет количества элементов массива, удовлетворяющих заданному условию
- •1.4.13. Вычисление произведения элементов массива
- •1.4.14. Поиск элементов, обладающих заданным свойством
- •1.4.15. Поиск в упорядоченном массиве
- •1.4.16. Поиск минимального и максимального элемента массива и его порядкового номера (индекса)
- •1.4.17. Копирование массивов
- •1.4.18. Формирование нового массива
- •1.4.19. Примеры решения задач по обработке одномерных массивов
- •2. Задание
- •2.4. Задания для выполнения на занятиях
- •2.4.1. Задание 1. Вычисление сумм, количеств и произведений элементов массива
- •2.4.1.1. Условие задания
- •2.4.1.2. Пример для варианта 30
- •2.4.1.3. Программа
- •2.4.1.4. Тестирование
- •2.4.2. Задание 2. Поиск минимального и максимального элементов массива
- •2.4.2.1. Условие задания
- •2.4.2.2. Пример для варианта 30
- •2.4.2.3. Программа
- •2.4.2.4. Тестирование
- •2.4.3. Задание 3. Формирование новых массивов
- •2.4.3.1. Условие задания
- •2.4.3.2. Пример для варианта 30
- •2.4.3.3. Программа
- •2.4.3.4. Тестирование
- •2.4.4. Задание 4. Обработка упорядоченных массивов
- •2.4.4.1. Условие задания
- •2.4.4.2. Пример для варианта 30
- •2.4.4.3. Программа
- •2.4.4.4. Тестирование
- •2.4.5. Задание 5. Задачи, сводящиеся к обработке одномерных массивов
- •2.4.5.1. Условие задания
- •2.4.5.2. Пример для варианта 30
- •2.4.5.3. Программа
- •2.4.5.4. Тестирование
- •2.4.6. Задание 6. Комбинированные задачи
- •2.4.6.1. Условие задания
- •2.4.6.2. Пример для варианта 30
- •2.4.6.3. Программа
- •2.5.1.2. Пример для варианта 30
- •2.5.1.3. Программа
- •2.5.1.4. Тестирование
- •2.5.2. Задание 8. Комбинированные задания
- •2.5.2.1. Условие задания
- •Варианты заданий
- •5. Пример решения задачи (вариант 30)
- •2.5.2.2. Разработка алгоритма.
- •2.5.2.3. Определение переменных программы
- •2.5.2.4. Разработка текста программы
- •2.5.2.5. Программа
- •2.5.2.6. Отладка программы
- •2.5.2.7. Результаты работы программы
- •2.5.3. Задание 9. Комбинированные задания
- •2.5.3.1. Варианты заданий
- •2.5.3.2. Пример программы обработки динамических массивов
- •2.5.3.3. Программа
- •2.5.3.4. Тестирование
- •2.5.4. Задание 10. Вычисления элементов вектора по формуле
- •2.5.4.2. Пример для варианта 30
- •2.5.4.3. Программа
- •2.5.5.4. Тестирование
- •2.5.5. Задание 11. Вычисления сумм и произведений векторов
- •2.5.5.2. Пример для варианта 30
- •2.4.11.3. Программа
- •2.5.5.4. Тестирование
- •2.5.6. Задание 12. Произвольные задачи
- •2.5.6.2. Пример для варианта 30
- •2.5.6.3. Программа
- •2.5.6.4. Тестирование
- •3. Выводы
- •4. Требование к отчету
- •4. Краткие теоретические сведения.
- •5. Вопросы для самоконтроля
- •Литература
- •1. Краткие теоретические сведения 2
- •1.1. Переменные с индексами и массивы 2
1.2. Описание массивов в программах
Свойства (атрибуты) массивов, используемых в программах, описываются так же, как и атрибуты простых переменных.
При объявлении массива в программе определяется имя массива, тип его элементов, размерность и размер. Размерность или количество измерений массива определяется количеством индексов при обращении к элементам массива. Массивы бывают одномерные, двухмерные, трехмерные и т.д.. Размер массива – это количество его элементов по соответствующим размерностям. Общий вид объявления массива:
<имя_типа> <имя_массива> [k1] [k2] … [kn];
где k1, k2, …, kn – количество элементов массива – константы или константные выражения по 1, 2, …, n измерениям. Причем значения индексов могут изменяться от 0 до ki – 1.
Такое объявление массива называют статическим, поскольку предельное количество его элементов известно заранее, и оно уже не может быть изменено в ходе выполнения программы. При работе с массивами необходимо следовать следующим правилам:
современные трансляторы языка Си не контролируют допустимость значений индексов, это должен делать программист;
количество измерений массива не ограничено;
в памяти элементы массива располагаются так, что при переходе от элемента к элементу наиболее быстро меняется самый правый индекс массива, т.е. матрица, например, располагается в памяти по строкам;
имя массива является указателем – константой на первый элемент массива;
операций над массивами в С++ нет, поэтому пересылка элементов одного массива в другой может быть реализована только поэлементно с помощью цикла;
над элементами массива допускаются те же операции что и над простыми переменными того же типа;
ввод/вывод значений элементов массива можно производить только поэлементно;
начальные значения элементам массива можно присвоить при объявлении массива;
выход индекса за пределы массива не проверяется.
Внимание: нижнее значение индекса при описании массивов в С++ автоматически полагается равным нулю.
Например, при описании массива:
int v[4];
целочисленный массив будет v содержать четыре элемента: нулевой –v[0], первый – v[1], второй – v[2] и третий – v[3].
Примеры объявления массивов:
int A[10]; //одномерный массив из 10 целочисленных величин
float b[5], c[5]; // одномерный массивы b и c из 5 вещественных величин
float X[20]; //одномерный массив из 20 вещественных величин
int ss[10]; // массив из десяти целых чисел.
В языке C++ массивы при объявлении можно инициализировать. Общая форма инициализации массива аналогична инициализации переменной:
тип имя [размер] = {список значений};
Список значений представляет собой список констант, перечисленных в фигурных скобках через запятую. Типы констант должны быть совместимы с типом массива. Первая константа присваивается первому элементу массива, имеющему индекс нуль, вторая – второму и так далее. После закрывающей фигурной скобки точка с запятой обязательна.
Примеры объявления массивов с инициализацией его элементов:
int a[5]={1, 2, 3, 4, 5}; //массив с инициализацией его элементов
static float x[5]={7.5,0,–3.2,0,4};
double b[4] = {1.5, 2.5, 3.75}; // элементы массива получат следующие значения: b[0]=1.5, b[1]=2.5, b[2]=3.75, b[3]=0.
Если в списке инициализации задать количество элементов меньше, чем задано в объявлении массива, то остальные элементы принимаются равными нулю. Если в списке инициализации задать количество элементов больше, чем задано в объявлении массива, это вызовет ошибку при компиляции программы.
Инициализации массива без определения его размера. При инициализации допустима и следующая форма объявления:
тип имя [] = {a0,a1,…,aМ–1};
Компилятор сам создает массив из М элементов, присваивая им значения a0, a1,…, aМ–1.
Например,
int c[]={–1 , 2, 0, –4, 5, –3, –5, –6, 1}; // массив размерность которого 6определяется числом инициализирующих элементов
Обращения к элементам одномерного массива могут иметь вид: A[0], A[1], A[2],…A[9], A[2*3].
В С++ нет массивов с переменными границами. Но, если количество элементов массива известно до выполнения программы, можно определить его как константу с помощью директивы #define, а затем использовать ее в качестве границы массива, например,
#define n 10;
int main ( )
{ int a[n], b[n]; // Объявление 2–х одномерных массивов
Особенностью инициализации массивов является то, что их размер можно задавать только константами, а не переменными. Например, следующая программа приведет к ошибке при компиляции:
int N=100;
float array_f[N]; //ошибка, так нельзя
Поэтому при объявлении массивов обычно используют такой подход:
#include <stdio.h>
#define N 100
int main()
{
float array_f[N];
return 0;
}
Следует отметить, что при инициализации массивов число их элементов должно совпадать с его размерностью. Рассмотрим вариант, когда число элементов при инициализации будет меньше размерности массива.
#define SIZE 4
int data[SIZE]={512, 1024};
for(int i = 0;i < SIZE;i++)
cout << data[i];
Результат работы программы будет следующим:
512, 1024, 0, 0
Из полученного результата видно, что неинициализированные элементы массива принимаются равными нулю. В случаях, когда число элементов при инициализации превышает размерность массива, то при компиляции произойдет ошибка. Поэтому, когда наперед неизвестно число элементов, целесообразно использовать такую конструкцию языка С++:
int data[] = {2, 16, 32, 64, 128, 256};
В результате инициализируется одномерный массив размерностью 6 элементов.
Здесь остается последний вопрос: что будет, если значение индекса при обращении к элементу массива превысит его размерность? В этом случае ни программа, ни компилятор не выдадут значение об ошибке, но при этом в программе могут возникать непредвиденные ошибки. Поэтому программисту следует обращать особое внимание на то, чтобы индексы при обращении к элементам массива не выходили за его пределы. Также следует отметить, что первый элемент массива всегда имеет индекс 0, второй – 1, и т.д.
Пример более сложного описания массива:
const Nmax=10; – задание максимального значения;
typedef double mas1[Nmax*2]; – описание типа одномерного массива;
mas1 a; – декларация массива а типа mas1;
В языке C++ все массивы располагаются в отдельной непрерывной области памяти. Первый элемент массива имеет наименьший адрес, а последний – наибольший.
Объем памяти, необходимый для хранения массива, определяется типом элемента массива и количеством элементов, входящих в массив.
Для одномерного массива требуемый объем памяти вычисляется следующим образом:
Объем памяти в байтах = sizeof(базовый тип элемента)× длина массива.
Внимание: В языке С++ во время выполнения программы: не проверяется выход индекса за пределы границ массива; ни его содержимое. Корректность использования индексов элементов массива должен контролировать программист.
Элементы массивов могут использоваться в выражениях так же, как и обычные переменные, например:
f = 2*a[3] + a[ss[i] + 1]*3;
a[n] = 1 + sqrt(fabs(a[n–1]));
Если количество элементов массива определяется в процессе выполнения программы, используют динамическое выделение оперативной памяти компьютера.