Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Практикум по языкам программирования. Учебно-методическое пособие
.pdf
21
{
int *pointer=new int[100];
if (pointer != NULL) cout
<< "
Память успешно выделена";
else cout << "Ошибка выделения памяти" << endl;
}
Как видите, программа сразу проверяет значение, присвоенное оператором
new
переменной-указателю. Если указатель содержит значение
NULL
, значит
new
не смог выделить запрашиваемый объем памяти. Если же указатель содержит
не
NULL,
следовательно, new успешно выделил память и указатель содержит
адрес начала блока памяти.
Пример 2.
Следующая программа использует оператор
new
для распределения памяти
под массив из 500 значений с плавающей точкой:
float *array = new float[100];
if (array != NULL) cout << "Память выделена успешно";
else cout << "new не может выделить память" << endl;
Поскольку эта программа "жестко закодирована" на объем требуемой памяти,
возможно, вам потребуется ее редактировать и перекомпилировать, если
возникнет необходимость, чтобы программа выделила меньше или больше
памяти. Как уже обсуждалось, одна из причин существования динамического
распределения памяти состоит в том, чтобы избавиться от необходимости
редактировать и перекомпилировать программу при изменении требований к
объему памяти. Когда ваша программа использует оператор
new
для
динамического распределения памяти, то вполне вероятно, что она сама
посчитала количество будущих элементов и запросит выделить
соответствующее количество памяти или запросит это значение у пользователя.
Пример 3.
Следующая программа запрашивает у пользователя количество памяти,
которое необходимо выделить для хранения массива символов, и затем
распределяет память, используя оператор
new
:
#include "stdafx.h"
#include <iostream>
using namespace std;
void main()
{
int size;

22
char *pointer;
cout << "Введите размер массива, до 30000: ";
cin >> size;
if (size <= 30000)
{
char *pointer = new char[size];
if (pointer != NULL) cout << "Память выделена успешно";
else cout << "Невозможно выделить память" << endl;
}
}
Альтернативный способ создания динамического массива – использование
функции mallос библиотеки С:
int n = 100;
float *q = (float *) malloc(n * sizeof(float));
Операция преобразования типа, записанная перед обращением к функции
mallос, требуется потому, что функция возвращает значение указателя типа
void*, а инициализируется указатель на float.
Динамические массивы нельзя при создании инициализировать, и они не
обнуляются. Преимущество динамических массивов состоит в том, что
размерность может быть переменной, то есть объем памяти, выделяемой под
массив, определяется на этапе выполнения программы. Доступ к элементам
динамического массива осуществляется точно так же, как к статическим,
например, к элементу номер 5 приведенного выше массива можно обратиться
как р[5] или *(р+5).
Индексированные переменные
Выбор отдельного элемента из массива осуществляется с помощью
индексированной переменной, которая задается следующим образом:
x[i] – индексированная переменная (элемент массива).
Здесь x – имя массива;
i – индекс (номер элемента массива).
В качестве индекса используются:
• целые константы, например х[2] х2;
• целые переменные, например х[к] хk;
• индексные выражения, например х[2*n+1] x
2n+1
.
В языке С++ индексы элементов любого массива начинаются с нуля.
Индексные выражения должны иметь значения целого типа.

23
Переменная с индексом может стоять в левой части оператора
присваивания, например:
Ar[3]=2.5; // присвоение числа 2.5 четвертому элементу массива Ar
Ввод-вывод одномерных массивов
Ввод-вывод массивов осуществляется поэлементно с помощью операторов
scanf и printf или cin и cout соответственно и оператора цикла
for..., в котором в качестве параметра используется индекс элемента массива.
Пример 1. Организовать ввод с клавиатуры значения массива:
A = (1.2, 5, -6.8, 14).
Необходимо описать массив и индекс.
int main()
{ float A[4] ;
int i;
В программе ввод массива рекомендуется организовать в виде диалога,
поместив перед оператором ввода оператор вывода (printf), которым
выдается на экран поясняющее сообщение, например:
printf("Введите массив А\n");
for( i = 0; i<4; i++)
scanf("%f",&A[i]);
В момент исполнения этой группы команд на клавиатуре через один или
несколько пробелов набираются элементы массива и нажимается клавиша
[Enter]:
1.2 5 -6.8 14 [Enter]
Замечание. Элементы массива можно вводить в «столбик», если после
ввода каждого элемента нажимать клавишу [Enter].
Пример 2. Организовать вывод массива А на экран таким образом, чтобы
все элементы располагались на одной строке экрана.
В программе надо записать следующие операторы:
for ( i = 0; i<4; i++)
printf("%5.2f ",A[i]);
printf("\n");
Вид выведенного массива на экране:
1.2 5.0 -6.8 14.0
Оператор printf("\n"); служит для перевода курсора к началу
следующей строки экрана.

24
Освобождение памяти
Функции new и malloc позволяют вашей программе выделять память
динамически во время выполнения. Если вашей программе больше не нужна
выделенная память, она должна ее освободить.
Память, выделенная функцией mallос – освобождается посредством
функции free, напимер free (q):
Память, зарезервированная под динамический массив с помощью new [],
должна освобождаться оператором delete [].
Для освобождения памяти с использованием оператора delete вы просто
указываете этому оператору указатель на данную область памяти, как показано
в следующем примере:
Пример 4.
Следующая программа использует оператор
delete
для освобождения
выделенной с помощью оператора
new
памяти:
#include "stdafx.h"
#include <string.h>
#include <iostream>
using namespace std;
void main()
{
char *pointer = new char[100];
strcpy(pointer, "Учимся программировать на языке C++");
cout << pointer << endl;
delete pointer;
}
По умолчанию, если ваша программа не освобождает выделенную ей
память до своего завершения, операционная система автоматически
освобождает эту память после завершения программы. Однако если ваша
программа использует оператор
delete
для освобождения памяти по мере
того, как она (память) становится ненужной, то эта память вновь становится
доступной для других целей (возможно, для вашей программы, которая опять
будет использовать оператор
new
, или для операционной системы).
Пример 5.
Следующая программа выделяет память для хранения массива из 1000
целочисленных значений. Затем она заносит в массив значения от 1 до 1000,
выводя их на экран. Потом программа освобождает эту память и распределяет
память для массива из 2000 значений с плавающей точкой, занося в массив
значения от 1.0 до 2000.0:

25
#include "stdafx.h"
#include <iostream>
using namespace std;
const int n=1000;
int main()
{
float *array2;
int *array1 = new int[n];/*создание динамического массива
*/
int i;
if (array1!=NULL)
{
for (i = 0; i < n; i++) //заполнение массива
array1[i]=i+1;
for (i = 0; i < n; i++) //вывод элементов массива
cout<<array1[i]<<' ';
delete array1; //освобождение памяти
}
cout <<endl;
array2=new float[2*n];/*создание динамического массива
*/
if (array2 != NULL)
{
for (i = 0; i < 2*n; i++)//заполнение массива
array2[i]=(i+1)*1.0; //числами
for (i = 0; i < 2*n; i++)//вывод элементов
cout << array2[i] << ' ' ;// массива
delete array2;//освобождение памяти
}
cout <<endl;
return 0;
}
Выводы:
1.
Способность выделять память динамически во время выполнения
снимает с ваших программ зависимость от фиксированных размеров
массивов.

26
2.
Если оператор
new
успешно выделяет требуемую вашей
программой память, он возвращает указатель на начало области
этой памяти.
3.
Если оператор
new
не может выделить требуемую вашей
программой память, он возвращает
NULL
-указатель, который
содержит значение 0.
4. Каждый раз, когда ваша программа распределяет память
динамически с использованием оператора
new
, она должна
проверять значение возвращаемого оператором
new
указателя,
чтобы определить, не равен ли он
NULL
, что указывает на
невозможность выделения памяти.
5.
Используя указатель на массив, ваша программа может обращаться
к памяти, выделенной с помощью оператора
new
.
6.
Оператор
new
выделяет память из блока неиспользуемой памяти,
называемой свободной памятью.
7.
В зависимости от вашей операционной системы и модели памяти
компилятора размер свободной памяти может быть различным. В
среде MS-DOS свободная память может быть ограничена 64 Кбайт.
8.
Если вашей программе больше не нужна выделенная память, она
должна освободить ее (вернуть в свободную память), используя
оператор
delete.
9. память, выделенная функцией mallос — освобождается посредством
функции free, напимер free (q);
10. При несоответствии способов выделения и освобождения памяти
результат не определен.
Задание. Составить алгоритм решения задачи согласно своему варианту и
написать программу на языке С+, используя динамические массивы. В
отчете предоставить блок-схемы всех функций, текст программы.
Варианты заданий
1. Из целочисленного массива Х(N) все четные элементы записать в массив
Y(k). Удалить в массивах максимальные элементы. В программе написать
функции: формирования массива Y, поиска номера максимального
элемента, удаления элемента.
2. В целочисленном массиве Х(N) после каждого четного числа вставить
максимальный элемент массива. Найти среднее арифметическое элементов
массива до и после вставки. В программе написать функции: вставки

27
элемента, поиска максимального элемента, определения среднего
арифметического элементов массива.
3. Заданы два целочисленных массива Y(k) и Z(m). Определить в каждом
массиве среднее арифметическое простых двузначных чисел. Если таких
чисел в массиве больше двух, то удалить их из соответствующего массива.
В программе написать функции: вычисления среднего арифметического
простых двузначных чисел в массиве и их количества, удаления элемента.
4. Из массива Х(N) все положительные элементы записать в массив Y(k).
Найти в каждом массиве среднее арифметическое простых элементов. В
программе написать функции: формирования массива Y, определения
среднего арифметического простых элементов.
5. Из массива Х(N) все положительные элементы записать в массив Y(k), а все
отрицательные элементы – в массив Z(m). Найти в каждом массиве
максимальный по модулю элемент. Удалить в каждом массиве первый
элемент. В программе написать функции: формирования массивов Y и Z,
определения максимального по модулю элемента, удаления элемента.
6. Из целочисленного массива Х(N) записать в массив Y(k) все элементы,
превышающие среднее арифметическое значение всех элементов массива Х.
Удалить в массивах все элементы, не являющиеся простыми числами. В
программе написать функции: формирования массива Y, определения
среднего арифметического элементов, удаления элемента.
7. В целочисленном массиве Х(N) после каждого положительного числа
вставить ноль. Найти среднее арифметическое элементов массива. В
программе написать функции: вставки элемента, определения среднего
арифметического элементов массива.
8. Из целочисленного массива Х(N) все четные числа записать в массив Y(k), а
все элементы нечетные, – в массив Z(m). Найти в каждом массиве
минимальный элемент и удалить его. В программе написать функции:
формирования массивов Y и Z, определения минимального по модулю
элемента, удаления элемента.
9. В целочисленном массиве Х(N) удалить все элементы, расположенные
между максимальным и минимальным элементами. Найти среднее
арифметическое элементов массива до и после удаления. В программе

28
написать функции: удаления элемента, поиска номеров минимального и
максимального элементов, определения среднего арифметического
элементов массива.
10. В целочисленном массиве Х(N) удалить все нечетные простые числа.
Проверить, как поменялось положение максимального элемента массива.
Найти среднее арифметическое элементов массива до и после удаления. В
программе написать функции: удаления элемента, поиска номера
максимального элемента, вычисления среднего арифметического элементов
массива.
11. Записать каждый второй элемент целочисленного массива Х(N) подряд в Y.
В программе написать функции: формирования массива Y, определения
количества простых чисел, вычисления среднего арифметического
элементов массива.
12. В целочисленном массиве Х(N) определить максимальный элемент среди
положительных нечетных элементов и минимальный среди положительных
четных элементов и удалить их. В программе написать функции: удаления
элемента, определения максимального и минимального элементов согласно
заданию.
13. Сформировать массив В(k), записав в него каждый второй элемент массива
А(N). Вычислить среднее арифметическое отрицательных элементов
массивов А и B. В программе написать функции: формирования массива В,
определения среднего арифметического отрицательных элементов.
14. Задан массив Z(m) целых чисел. Удалить из массива все двузначные числа.
В программе написать функции: формирование массива Z, удаления
элемента.
15. В массиве целых чисел Х(k) удалить элементы, стоящие после
максимального элемента. Найти среднее арифметическое элементов
массива до и после удаления. В программе написать функции: удаления
элемента, определения номера максимального элемента, вычисления
среднего арифметического элементов массива.
16. Из целочисленного массива Х(N) все нечетные элементы записать в массив
Y(k). Удалить из каждого массива все двузначные числа. Найти, как
изменилось количество чисел в каждом массиве после удаления. В

29
программе написать функции: формирования массива Y, удаления
элемента, определения количества чисел в массиве.
17. Из целочисленного массива Х(N) удалить два первых числа.
Проверить, изменилось ли положение максимального элемента. Найти
среднее арифметическое положительных элементов до и после удаления. В
программе написать функции: удаления элемента, определения номера
максимального элемента, вычисления среднего арифметического
положительных элементов массива.
18. Задан упорядоченный по убыванию целочисленный массив Х(N). Вставить
в массив Х некоторое число Н, сохранив упорядоченность массива. Найти
среднее арифметическое простых чисел в массиве до и после вставки числа.
В программе написать функции: вставки элемента, вычисления среднего
арифметического простых элементов массива.
19. Дан массив X(N). Удалить из массива все простые элементы. В программе
написать функции: проверки, является ли число простым, удаления
элемента.
20. Из целочисленного массива Х(N) записать в массив Y(k) каждый второй
элемент. Удалить в каждом массиве наибольший и наименьший элементы.
В программе написать функции: формирования массива Y, поиска номеров
максимального и минимального элементов, удаления элемента.
21. Задан массив Х(N) целых чисел. Поменять местами в массиве последнее
положительное число и первое положительное. Удалить из массива все
четные числа. В программе написать функции: поиска номеров последнего
и первого положительного элементов, удаления элемента.
22. Переписать элементы массива целых чисел X(N) в обратном порядке в
массив Y(N). Определить положение максимального элемента в каждом
массиве. Удалить в каждом массиве первый и последний элементы. В
программе написать функции: формирования массива Y, поиска номера
максимального элементов, удаления элемента.
23. Заданы два целочисленных массива X(n) и Z(k). В каждом массиве найти
максимальный элемент массива и его индекс, Определить среднее
арифметическое положительных элементов массива. В программе написать
функции: поиска максимального элемента, вычисления среднего
арифметического положительных элементов массива.

30
24. Заданы два массива X(n) и Y(k). Удалить из массивов все элементы, равные
максимальному значению. Определить, поменялось ли после удаления
положение минимального элемента в каждом массиве. В программе
написать функции: поиска максимального элемента, поиска номера
минимального элемента, удаления элемента.
25. Из целочисленного массива Z(K) удалить все положительные четные
элементы и отрицательные нечетные элементы. Найти среднее
геометрическое и среднее арифметическое элементов массива до и после
удаления. В программе написать функции: удаления элемента, вычисления
среднего арифметического, определения среднего геометрического
элементов массива.
Порядок выполнения работы
1. Получить допуск к работе у преподавателя (показать домашние
заготовки).
2. Загрузить среду Visual Studio.
3. Ввести текст программы.
4. Провести отладку программы.
5. Выполнить программу, провести анализ результатов и, убедившись в
правильности решения, предъявить их преподавателю для проверки.
6. Занести результаты расчета в отчет.
7. Выйти из среды.
Содержание отчета
1. Номер и тема лабораторной работы.
2. Задание к лабораторной работе.
3. Схему алгоритма решения задачи.
4. Программу на языке Си.
5. Результаты выполнения программы.
Показать отчет преподавателю.
Контрольные вопросы
1. Функции для создания динамических массивов.
2. Передача массива в качестве параметра функции.
3. Передача указателя в функцию.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
