Динамическое выделение памяти
ОБЩЕЕ ЗАДАНИЕ
Разработать 2 консольных приложения для работы с одномерными массивами (выделять память двумя способами: с помощью функций malloc и операции new). В каждом приложении создать 3 динамических одномерных массива (размерность задаем с клавиатуры) со случайными числами (заполнение организовать в отдельной процедуре). Суммировать соответствующие значения двух массивов в третий. Очистить память.
// Комментарий:
Способы работы с динамической памятью:
а) Первый использует семейство функций malloc (free для очистки памяти) (язык C);
идентификатор = (тип_идентификатора*) malloc (sizeof(тип_идентификатора))
б) Второй использует операции new и delete
тип_данных *имя_указателя = new тип_данных;
#include <iostream>
#include <ctime>
using namespace std;
void vvod_matr(int n, int *m)
{
int i;
for (i=0; i<n; i++)
{
m[i]=rand()/10;
cout << m[i] << ' ';
}
cout << endl;
}
int main()
{
srand (time(0));
int N; cout << "Vvedite razmer: "; cin >> N;
int *A = new int[N]; // или отдельно int *A; A = new int[N];
int *B; B = new int[N];
int *C = new int[N];
vvod_matr(N,A);
vvod_matr(N,B);
for (int i = 0; i < N; i++) {
C[i]=A[i]+B[i];
}
for (int i = 0; i < N; i++) cout << " znachenie " << i << " elementa massiva A = " << A[i] << endl;
for (int i = 0; i < N; i++) cout << " znachenie " << i << " elementa massiva B = " << B[i] << endl;
cout <<endl;
for (int i = 0; i < N; i++) cout << " znachenie " << i << " elementa massiva C (SYMMA) = " << C[i] << endl;
system("pause");
delete [] A,B,C; // очистка памяти
return 0;
}
-------------------------------------------------------------------
#include <iostream>
#include <ctime>
using namespace std;
void vvod_matr(int n, int *m)
{
int i;
for (i=0; i<n; i++)
{
m[i]=rand()/10;
cout << m[i] << ' ';
}
cout << endl;
}
int main()
{
srand (time(0));
int N; cout << "Vvedite razmer: "; cin >> N;
int *p1, *p2;
p1 = (int*) malloc (sizeof(int));
int *A = (int*) malloc (sizeof(int*)*N);
int *B; B = (int*) malloc (sizeof(int*)*N);
int *C = (int*) malloc (sizeof(int*)*N);
vvod_matr(N,A);
vvod_matr(N,B);
for (int i = 0; i < N; i++) {
C[i]=A[i]+B[i];
}
for (int i = 0; i < N; i++) cout << " znachenie " << i << " elementa massiva A = " << A[i] << endl;
for (int i = 0; i < N; i++) cout << " znachenie " << i << " elementa massiva B = " << B[i] << endl;
cout <<endl;
for (int i = 0; i < N; i++) cout << " znachenie " << i << " elementa massiva C (SYMMA) = " << C[i] << endl;
system("pause");
free(A); // очистка памяти
free(B);
free(C);
return 0;
}
ИНДИВИДУАЛЬНЫЕ ЗАДАНИЯ
Форма защиты лабораторных работ
После того, как программа будет успешно откомпилирована, необходимо провести несколько запусков программы с различными начальными параметрами, проанализировать полученные результаты работы написанной программы. В случае правильной работы программы можно защищать ее преподавателю, иначе исправить ошибки и провести повторные запуски программ с теми же и другими начальными параметрами. При защите написанной программы студент должен правильно отвечать на поставленные вопросы преподавателя, ориентироваться в написанной программе, уметь изменять функциональные особенности программы, предвидеть результаты работы программы при различных начальных параметрах.
В соответствии со своим вариантом:
// Е_С2_21) Дан целочисленный массив из 30 элементов. Элементы массива могут принимать значения от //0 до 1000. Опишите алгоритм, который находит и выводит среднее арифметическое всех элементов массива, //имеющих нечётное значение. Гарантируется, что хотя бы один такое элемент в массиве есть. | |
// Е_С2_22) Опишите алгоритм подсчета максимального количества //подряд идущих отрицательных элементов в целочисленном массиве длины 30. | |
// Е_С2_23) Дан целочисленный массив из 30 элемента, //Элементы массива могут принимать значения от (–20) до 20 - сведения о температуре за каждый день ноября. //Опишите алгоритм, который подсчитывает и выводит максимальную температуру среди дней, //когда были заморозки (температура опускалась ниже нуля). //Гарантируется, что хотя бы один день в ноябре была отрицательная температура. | |
// Е_С2_36) Дан целочисленный массив из 70 элемента. //Опишите алгоритм, позволяющий найти и вывести //наименьшую нечётную сумму двух соседних элементов массива. //Гарантируется, что в массиве есть соседние элементы с нечётной суммой. | |
// Е_С2_25) Дан целочисленный массив из 30 элемента, //все элементы которого – неотрицательные числа, не превосходящие 10000. //Опишите алгоритм, который находит и выводит минимальное трехзначное число, //записанное в этом массиве. если таких чисел нет, нужно вывести сообщение «Таких чисел нет». | |
// Е_С2_26) Дан целочисленный массив из 30 элементов, //все элементы которого – положительные числа, не превосходящие 100. //Опишите алгоритм,, который находит и выводит номер элемента, //имеющего максимальное количество целочисленных делителей //(если таких элементов несколько, то номер любого из них). | |
// Е_С2_27) Дан целочисленный массив из 40 элемента, //все элементы которого – целые числа в интервале от -500 до 500. //Опишите алгоритм, который находит и выводит находит среднее арифметическое //всех положительных элементов массива, которые кратны первому элементу (делятся нацело на первый элемент). //Гарантируется, что первый элемент массива положительный. | |
// Е_С2_28) Дан целочисленный массив из 20 элемента, //все элементы которого – целые числа в интервале от -1000 до 1000. //Опишите алгоритм, который находит находит минимальное значение //из всех нечетных элементов массива, которые делятся на 5. //Гарантируется, что хотя бы один такой элемент существует. | |
// Е_С2_29) Дан целочисленный массив из 30 элемента, //все элементы которого – целые числа в интервале от 0 до 1000. //Опишите алгоритм, позволяющий найти и вывести сумму элементов массива, кратных тринадцати. //Гарантируется, что в исходном массиве есть хотя бы один элемент, значение которого делится на тринадцать. | |
// Е_С2_30) Дан целочисленный массив из 30 элемента, //все элементы которого – целые числа в интервале от 0 до 1000. //Опишите алгоритм, позволяющий найти среднее арифметическое нечётных трехзначных чисел, //записанных в этом массива. //Если ни одного такого числа нет, нужно вывести сообщение об этом. | |
// Е_С2_31) Дан целочисленный массив из 30 элемента, //все элементы которого – целые числа в интервале от 0 до 100. //Опишите алгоритм, позволяющий найти произведение элементов массива, //которые имеют чётное значение и не оканчиваются на 0. //Гарантируется, что в исходном массиве есть хотя бы один элемент, //значение которого чётно и не оканчиваются на 0. |
--------------------------------------------------
// двумерный
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
void vvod_matr(int n, int **a)
{
int i,j;
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
a[i][j]=rand()%5;
cout << a[i][j] << ' ';
}
cout << endl;
}
}
int main()
{
srand (time(0));
int i,j,n,k,e,**A,**B,**C,**D;
cout << "Vvedite n: ";
cin >> n;
A=(int**) malloc(sizeof(int*)*n);
for (j=0; j<n; j++) A[j]=(int*) malloc (sizeof(int*)*n);
B=(int**) malloc (sizeof(int*)*n);
for (j=0; j<n; j++) B[j]=(int*) malloc(sizeof(int*)*n);
C=(int**) malloc(sizeof(int*)*n);
for (j=0; j<n; j++) C[j]=(int*) malloc(sizeof(int*)*n);
D=(int**) malloc(sizeof(int*)*n);
for (j=0; j<n; j++) D[j]=(int*) malloc(sizeof(int*)*n);
vvod_matr(n,A);
vvod_matr(n,B);
vvod_matr(n,C);
vvod_matr(n,D);
e=0;
for (i=0; i<n; i++)
for (j=0; j<n; j++)
{
for (k=0; k<n; k++)
{
e=e+B[k][j]*C[i][k];
}
B[i][j]=e;
e=0;
}
e=0;
for (i=0; i<n; i++)
for (j=0; j<n; j++)
{
for (k=0; k<n; k++)
{
e=e+B[k][j]*D[i][k];
}
D[i][j]=e;
e=0;
}
for (i=0; i>j; i++)
for (j=0; j<i; j++)
{
A[i][j]=A[j][i];
{
cout << A[j][i] << ' ';
}
cout << endl;
}
for (i=0; i<n; i++)
for (j=0; j<n; j++)
{
D[i][j]=D[i][j]-A[i][j];
}
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
cout << D[i][j] << ' ';
}
cout << endl;
}
system("PAUSE");
return EXIT_SUCCESS;
}