Лабораторные работы МИРЭА 2014 (1017113), страница 5
Текст из файла (страница 5)
int *arr;
arr=new int[n+2]; //создание массива int
for(int i=0; i<n+2; i++){ //цикл для заполнения массива
arr1[i]=i; //заполнение массива целыми числами
cout<< arr [i];
}
system("pause");
delete arr;
}
Создание двумерного динамического массива
Имя двумерного динамического массива является указателем на указатель. Поэтому сначала выделятся память под указатели, а затем под соответствующие этим указателям строки. Освобождение выделенной памяти происходит в обратном порядке:
double **umas2; //объявление указателя на указатели
umas2 = new double*[n]; //создание массива указателей
for(i=0; i<n; i++)
umas2[i] = new double[m]; // не обязательно m=n
… //код программы
for(i=0; i<n; i++)
delete [ ]umas2[i];
delete [ ]umas2;
umas2=NULL;
Пример выполнения работы
Задача1. Создать двумерный динамический массив типа int и заполнить его числами. Вывести на экран номера отрицательных элементов каждой строки и каждого столбца
#include <iostream.h>
#include <windows.h>
int main(int argc, char* argv[])
{
int n = 0; //Количество строк
int m = 0; //Количество столёцов
SetConsoleOutputCP(1251);
cout << "Введите n: ";
cin >> n;
cout << " Введите m: ";
cin >> m;
//Создаем массив указателей
int** arr=new int*[n];
for (int i=0; i<n; ++i)
arr[i]=new int[m]; //указатели на строки
//Заполняем массив
for (int i=0; i<n; ++i)
{
for (int j=0; j<m; ++j)
{
cout<<"arr["<<i<<"]["<<j<<"]=";
cin>>arr[i][j];
}
}
//Поиск отрицательных чисел в столбце
cout << "В столбце:\n";
//в следующем цикле объявлены 2 переменные !
for (int i=0, index=-1; i<m; ++i)
{
for (int j=0; j<n; ++j)
if(arr[j][i]<0) index=j;
if (index !=- 1) cout<<i<<") "<<index<<endl;
}
cout << "В строке:\n";
for (int i = 0, index=-1; i<m; ++i)
{
for (int j = 0; j<n; ++j)
if (arr[i][j]<0) index=j;
if (index != - 1) cout<<i<<") "<<index<<endl;
}
//Удаляем массив
//сначала удаляются указатели на столбцы
for (int i=0; i<n; ++i) delete [] arr[i];
//потом указатели на строки
delete [] arr;
_flushall(); //очистка всех буферов
char z;
cin>>z;
return 0;
}
Использование указателей в функциях и указатели на функции
Параметрами функций могут быть не только переменные базового типа, но и массивы. Как известно размер массива должен быть определен до его использования. Поэтому, в функциях используются массивы с явным заданием размера, либо с параметрами несущими информацию о размере. Следует запомнить, что если формальными параметрами функции являются массивы, то аргументы передаются в виде указателей, т.е. происходит, так называемая, передача по ссылке..
Рассмотрим задачу умножения двух векторов.
#include <iostream>
#include <windows.h>
using namespace std;
double multVect(int n,double x[],double y[]){
/*скалярное произведение*/
double z=0;
for(int i=0;i<n;i++) z=z+x[i]*y[i];
return z;
}
void main(){
SetConsoleOutputCP(1251);
double u[]={1.0, 2.0, 3.0}, v[]={4.0, 5.0, 6.0};
cout<<"Произведение векторов="<<multVect(3,u,v);
}
Иногда возвращаемое значение функции должно быть указателем. Рассмотрим программу на примере объединения массивов.
#include <iostream>
#include <windows.h>
using namespace std;
//объявляем и описываем фунцию
double *connectVect(int n, double* x, int m, double* y){
int i;
double *z=new double[n+m]; //выделяем память
for(i=0;i<n;i++) z[i]=x[i]; //заносим в память
for(i=n;i<n+m;i++) z[i]=y[i-n];
return z;
}
void main(){
SetConsoleOutputCP(1251);
double u[]={1.0, 2.0, 3.0}, v[]={4.0, 5.0, 6.0, 7.0, 8.0}, *w;
w=connectVect(3,u,5,v);
cout<<"Объединение массивов"<<endl;
for(int i=0;i<8;i++)
cout<<w[i]<<endl;
system("pause");
}
Указатели функций
Любая функция представляет собой код с определенным именем. Для размещения функции компилятор языка С++ находит в памяти подходящий объем свободных ячеек с непрерывными адресами и записывает этот код в память последовательно занимая её свободные ячейки. Указателем на начало кода является имя функции, а его значением служит адрес первой ячейки, занимаемый кодом функции. Тип указателя определяется типом возвращаемого значения. Синтаксис объявления указателя на функцию должен быть таким
тип_функции (*имя_указателя) (список_спецификаций_параметров);
Например, указатель функции предназначенный для умножения двух целых чисел должен иметь вид:
int (*multiplay)(int, int);
Обратите внимание, что имя указателя записывается в круглых скобках, в противном случае компилятор поймет его как прототип функции с именем multiplay, которая возвращает значение указателя типа int.
В качестве примера вновь запишем программу для произведения векторов.
#include <iostream>
#include <windows.h>
using namespace std;
/*объявление функции*/
double multVect(int n,double x[],double y[]){
double z=0;
for(int i=0;i<n;i++) z=z+x[i]*y[i];
return z;
}
//--------------------------------------
void main(){
SetConsoleOutputCP(1251);
double u[]={1.0, 2.0, 3.0}, v[]={4.0, 5.0, 6.0};
double (*ptrFun)(int, double[], double[]); /*объявление указателя с именем ptrFun */
ptrFun=multVect; /*в новый указатель записывается адрес функции */
cout<<"Произведение векторов=" <<ptrFun(3,u,v)<<endl;
cout<<"Произведение векторов=" <<(ptrFun)(3,u,v)<<endl; /* При вызове функции через указатель его имя можно взять в скобки */
}
Задания для самостоятельной работы
Программа должна содержать вывод на экран исходной информации и полученные результаты.
В первой задаче можно использовать как динамические, так и простые массивы. Результаты оформить в виде соответствующих функций.
Вторая задача предполагает создание динамического массива. Код программы может быть записан без применения функций.
Вариант 1
-
В одномерном массиве
-
Найдите количество элементов, находящихся в диапазоне между двумя заданными числами.
-
Упорядочьте элементы массива по убыванию модулей элементов.
-
Найдите сумму элементов массива, расположенных после первого положительного элемента.
-
Из данного массива и другого массива того же типа, но другой размерности сформируйте общий массив и найдите его минимальный элемент.
2. Задана матрица размером NxM. Получить массив B, присвоив его k-му элементу значение 0, если все элементы k-го столбца матрицы нулевые, и значение 1 − в противном случае.
Вариант 2
-
В одномерном массиве
-
Вычислите количество элементов массива, равных 0.
-
Упорядочьте элементы массива по возрастанию их модулей.
-
Найдите сумму элементов массива, расположенных после минимального элемента.
-
Из данного массива и другого массива того же типа, но другой размерности сформируйте общий массив и отсортируйте его по убыванию.
2. Задана матрица размером NxM. Получить массив B, присвоив его k-му элементу значение 1, если элементы k-й строки матрицы упорядочены по убыванию, и значение 0 − в противном случае.
Вариант 3
1. В одномерном массиве
-
Найдите количество элементов, больших заданного числа.
-
Измените порядок следования элементов в массиве так, чтобы сначала располагались все отрицательные элементы, затем положительные, а потом нули.
-
Найдите произведение элементов массива, расположенных после максимального по модулю элемента.
-
Из данного массива и другого массива того же типа, но другой размерности сформируйте общий массив и найдите его максимальный элемент.
2. Задана матрица размером NxM. Получить массив B, присвоив его k-му элементу значение 1, если k-я строка матрицы симметрична, и значение 0 – в противном случае.
Вариант 4
1. В одномерном массиве
-
Найдите минимальный и максимальный элементы массива и поменяйте их местами.
-
Измените порядок следования элементов в массиве на противоположный.
-
Определите среднее арифметическое всех значений элементов массива.
-
Из данного массива и другого массива того же типа, но другой размерности сформируйте общий массив и отсортируйте его по возрастанию.
2. Задана матрица размером NxM. Определить количество «особых» элементов матрицы, считая элемент «особым», если он больше суммы остальных элементов своего столбца.
Вариант 5
1. В одномерном массиве
-
Найдите номер минимального по модулю элемента массива.
-
Преобразуйте массив, переставив все нулевые элементы в конец массива.
-
Найдите сумму модулей элементов массива, расположенных после первого отрицательного числа.
-
Из данного массива и другого массива того же типа, но другой размерности сформируйте общий массив и найдите его минимальный по модулю элемент.
2. Задана матрица размером NxM. Определить количество «особых» элементов матрицы, считая элемент «особым», если в строке слева от него находятся элементы, меньшие его, а справа – большие.
Вариант 6
1. В одномерном массиве
-
Вычислите произведение положительных элементов массива.
-
Упорядочьте по возрастанию отдельно элементы массива, стоящие на четных местах, и элементы массива, стоящие на нечетных местах.
-
Вычислите сумму элементов массива, расположенных до минимального.
-
Из данного массива и другого массива того же типа, но другой размерности сформируйте общий массив и найдите его максимальный по модулю элемент.
2. Задана символьная матрица размером NxM. Определить количество различных элементов матрицы (т.е. повторяющиеся элементы считать один раз).
Вариант 7
1. В одномерном массиве
-
Вычислите произведение отрицательных элементов массива.
-
Замените все отрицательные элементы их квадратами и упорядочьте элементы массива по возрастанию.
-
Вычислите произведение минимального и максимального элементов массива.
-
Из данного массива и другого массива того же типа, но другой размерности сформируйте общий массив и вычислите сумму отрицательных элементов.
2. Дана матрица размером NxM. Упорядочить ее строки по возрастанию их первых элементов.
Вариант 8