
- •2. Общие рекомендации к выполнению и требования к оформлению контрольной работы
- •3. Темы заданий для выполнения контрольной работы
- •4. 1. Базовые средства языка
- •Алфавит языка
- •Ключевые слова языка
- •Идентификаторы
- •Комментарии
- •4.1.5. Типы данных Си
- •Логический тип
- •4.1.8. Операции и выражения
- •Операции присваивания
- •Арифметические операции
- •Логические операции
- •Операции отношения
- •Условная операция
- •Операция преобразования типа
- •Операция определения размера
- •4.1.9. Стандартные функции
- •4.1.10. Структура программы
- •4.1.11. Ввод и вывод данных
- •Функции ввода- вывода
- •Объектно-ориентированные средства ввода-вывода.
- •4.2. Операторы управления
- •4.2.1. Понятие алгоритма
- •4.2.2. Изображение алгоритма в виде блок-схемы
- •2.3. Составной оператор
- •2.4. Операторы ветвления
- •If (выражение) оператор;
- •4.2.5. Примеры программ
- •4.2.6. Оператор варианта
- •4.2.7. Алгоритмы циклической структуры
- •Оператор цикла с предусловием
- •Оператор цикла с постусловием
- •Оператор цикла с параметром
- •Операторы передачи управления
- •4.2.8. Решение задач с использованием циклов
- •4.3. Обработка массивов
- •4.3.1. Описание массивов
- •4.3.2. Основные операции над массивами
- •4.3.3. Ввод-вывод элементов массива
- •4.3.4. Вычисление суммы элементов массива
- •4.3.5. Вычисление произведения элементов массива
- •4.3.6. Поиск максимального элемента и его номера
- •4.3.7. Сортировка элементов в массиве
- •4.3.8. Удаление элемента из массива
- •4.3.9. Решение задач с использованием массивов
- •4.4. Обработка матриц
- •4.4.1. Ввод-вывод матрицы
- •4.4.2. Примеры алгоритмов обработки матрицами
- •4.5.1. Передача параметров в функцию
- •4.5.2. Возврат результата с помощью оператора return
- •4.6. Указатели и динамические массивы
- •4.6.2. Операции * и & при работе с указателями
- •4.6.3. Операция присваивания указателей
- •4.6.4. Арифметические операции над адресами
- •4.6.5. Динамические массивы
- •4.6.6. Использование указателей в качестве аргументов функций
- •Литература
4.6.5. Динамические массивы
Обычно объем памяти необходимой для той или иной переменной задается еще до процесса компиляции посредством объявления этой переменной.
Если возникает необходимость в создании переменной, размер которой неизвестен заранее, то используют динамическую память.
Резервирование и освобождение памяти в программах на С++ может происходить в любой момент времени.
Оператор new выделяет память.
Его единственный аргумент это выражение, определяющее количество байтов, которые будут зарезервированы.
Возвращает оператор указатель на начало выделенного блока памяти.
Оператор delete освобождает память, его аргумент – адрес первой ячейки блока, который необходимо освободить.
Динамический массив – массив переменной длины, память под который выделяется в процессе выполнения программы. Выделение памяти осуществляется оператором new. Адрес первого элемента выделенного участка памяти хранится в переменной объявленной как указатель. Оператор
int *mas=new int[10];
означает, что описан указатель mas и ему присвоен адрес начала непрерывной области динамической памяти, выделенной с помощью оператора new8. Фактически в переменной mas хранится адрес нулевого элемента динамического массива. Адрес следующего, первого элемента, в выделенном участке памяти – mas+1, а mas+i является адресом i-го элемента. Обращение к i-му элементу динамического массива можно выполнить как обычно mas[i]. Важно следить за тем, чтобы не выйти за границы выделенного участка памяти.
Когда динамический массив, в любой момент работы программы, перестает быть нужным, то память можно освободить с помощью оператора delete.
4.6.6. Использование указателей в качестве аргументов функций
Указатели можно использовать в качестве аргументов функций. Если в роли параметра функции выступает массив, то в функцию передается указатель на его первый элемент. С++ автоматически передает массив в функцию, используя его адрес.
В результате вызываемые функции могут изменять значения элементов в исходных массивах и возвращать их в главную функцию. Информация о количестве элементов массива должна передаваться через отдельный параметр.
ЗАДАЧА 16. Из массива целых чисел удалить все числа, значение которых меньше среднего арифметического. Полученный массив упорядочить по возрастанию.
Разобьем задачу на подзадачи:
вычисление среднего арифметического элементов массива;
удаление элемента из массива;
упорядочивание массив.
Функция, которая вычисляет среднее арифметическое массива x из n элементов (рис. 27):
float sr_arifm(int *x, int n)
Рис. 27. Алгоритм вычисления среднего
арифметического элементов массива
Функция удаления элемента с номером m в массиве x из n элементов (рис. 28):
void udal(int *x, int m, int *n)
Рис. 28. Алгоритм удаления элемента из масисав
Функция сортировки по убыванию массив x из n элементов (рис. 29):
void upor(int *x,int N)
Рис. 29. Сортировка элементов массива по убыванию
Далее приведен текст программы.
#include<iostream.h>
#include<math.h>
float sr_arifm(int *x, int n)
{
int i; float s=0;
for(i=0;i<n;s+=x[i],i++);
if (n>0) return(s/n);
else return 0;
}
void udal(int *x, int m, int *n)
{int i;
for(i=m;i<*n-1;x[i]=x[i+1],i++);
--*n;
}
void upor(int *x, int n)
{
int i,j,b;
for(j=1;j<=n-1;j++)
for(i=0;i<=n-1-j;i++)
if (x[i]<x[i+1])
{
b=x[i];
x[i]=x[i+1];
x[i+1]=b;
}
}
int main()
{
int n,i; float sr;
cout<<"n="; cin>>n;
int *a=new int[n];
cout << "Vvedite massiv A\n";
for(i=0;i<n;cin>>a[i],i++);
sr=sr_arifm(a,n);
cout<<"sr="<<sr<<"\n";
for(i=0;i<n;)
{
if(a[i]<sr) udal(a,i,&n);
else i++;
}
cout << "Massiv A\n";
for(i=0;i<n;cout<<a[i]<<"\t",i++);
cout<<"\n";
upor(a, n);
cout << "Upor Massiv A\n";
for(i=0;i<n;cout<<a[i]<<"\t",i++);
cout<<"\n";
delete [] a;
}