Лабораторная работа: 8.
Тема: Указатели и ссылки. Имя массива как указатель. Динамические массивы.
Файл: Lab08_YaP_2019_1S.pdf
Обратите внимание:
В файлах Source.cpp, Source.cs и *.pas помимо прочего, так же имеются примечания к программам с различными комментариями и пояснениями.
При оформлении программ в сети Интернет я их удаляю, чтобы не нагромождать эти программы и тем самым не затруднять их восприятие.
Язык: C++.
Среда: Microsoft Visual Studio 2019 v16.3.0.
Платформа: x64.
Задание:
Дан одномерный массив, состоящий из N целочисленных элементов.
1. Ввести массив с клавиатуры.
2. Найти максимальный отрицательный элемент.
3. Вычислить произведение отрицательных элементов массива.
4. Вывести ненулевые элементы на экран в обратном порядке.
Написать программу с использованием динамических массивов, вводя размер массива с клавиатуры и используя имя массива как указатель, применить адресную арифметику для работы с элементами массива (каждое задание оформить отдельной функцией).
ЛР № 8, задание № 5.1
1/7. Source.cpp:
C++ | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
| /*
*Лабораторная работа: 8.
*Тема: Указатели и ссылки. Имя массива как указатель. Динамические массивы.
*Пункт: 5.1. Динамические массивы. Имя массива как указатель.
*Файл: Lab08_YaP_2019_1S.pdf
*
*Язык: C++.
*Среда: Microsoft Visual Studio 2019 v16.3.0.
*Платформа: x64.
*Изменение: 03.01.2020.
*
*Вариант: 13.
*Защита: 29.11.2019.
*Задание: БН. Дан одномерный массив, состоящий из N целочисленных элементов.
*1. Ввести массив с клавиатуры.
*2. Найти максимальный отрицательный элемент.
*3. Вычислить произведение отрицательных элементов массива.
*4. Вывести ненулевые элементы на экран в обратном порядке.
*Написать программу с использованием динамических массивов, вводя размер массива с клавиатуры и используя имя массива как указатель,
* применить адресную арифметику для работы с элементами массива (каждое задание оформить отдельной функцией).
*/
#include <iostream> // Требуется для SETLOCATE, PRINTF, CIN. //
#include "Header.h"
void main () {
setlocale (LC_ALL, "Russian");
int Dimension = 0;
void (*PointerOnFunction []) (int*, int) = {InicializastionArrayFunction, MaxNegativesFunction, MultiplicationFunction,
WriteArrayFunction};
printf ("1. Введите размерность массива: ");
cin >> Dimension;
int *SourceArray = new int [Dimension]; // Объявление SOURCEARRAY. //
printf ("\n2. Элементы массива:\n");
(*PointerOnFunction [0]) (SourceArray, Dimension);
(*PointerOnFunction [1]) (SourceArray, Dimension);
(*PointerOnFunction [2]) (SourceArray, Dimension);
printf ("\n5. Ненулевые элементы в обратном порядке:\n");
(*PointerOnFunction [3]) (SourceArray, Dimension);
delete [] SourceArray; // Деструктор SOURCEARRAY. //
cout << endl << endl;
ExitProgramFunction ();
} |
|
2/7. Header.h:
C++ | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| /*
*Лабораторная работа: 8.
*Тема: Указатели и ссылки. Имя массива как указатель. Динамические массивы.
*Пункт: 5.1. Динамические массивы. Имя массива как указатель.
*Файл: Lab08_YaP_2019_1S.pdf
*
*Язык: C++.
*Среда: Microsoft Visual Studio 2019 v16.3.0.
*Платформа: x64.
*Изменение: 03.01.2020.
*
*Вариант: 13.
*Защита: 29.11.2019.
*Задание: БН. (...)
*/
using namespace std;
void ExitProgramFunction (); // Объявление EXITPROGRAMFUNCTION. //
void WriteArrayFunction (int *SourceArray, int Dimension); // Объявление WRITEARRAYFUNCTION. //
void MultiplicationFunction (int *SourceArray, int Dimension); // Объявление MULTIPLICATIONFUNCTION. //
void MaxNegativesFunction (int *SourceArray, int Dimension); // Объявление MAXNEGATIVESFUNCTION. //
void InicializastionArrayFunction (int *SourceArray, int Dimension); // Объявление INICIALIZATIONARRAYFUNCTION. // |
|
3/7. InicializastionArrayFunction.cpp:
C++ | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| /*
*Лабораторная работа: 8.
*Тема: Указатели и ссылки. Имя массива как указатель. Динамические массивы.
*Пункт: 5.1. Динамические массивы. Имя массива как указатель.
*Файл: Lab08_YaP_2019_1S.pdf
*
*Язык: C++.
*Среда: Microsoft Visual Studio 2019 v16.3.0.
*Платформа: x64.
*Изменение: 03.01.2020.
*
*Вариант: 13.
*Защита: 29.11.2019.
*Задание: БН. (...)
*/
#include <iostream> // Требуется для PRINTF, CIN. //
#include <ctime> // Требуется для TIME. //
#include "Header.h"
void InicializastionArrayFunction (int *SourceArray, int Dimension) { // Определение INICIALIZATIONARRAYFUNCTION. //
srand (time (0)); // TIME (0) - инициализация локального времени системы. //
for (int i = 0; i < Dimension; i++) {
*(SourceArray + i) = rand () % 199 - 99; // SOURCEARRAY E [-99..99]. //
printf ("\n%d) А (%d) = %3d.", i + 1, i, *(SourceArray + i));
}
} |
|
4/7. MaxNegativesFunction.cpp:
C++ | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
| /*
*Лабораторная работа: 8.
*Тема: Указатели и ссылки. Имя массива как указатель. Динамические массивы.
*Пункт: 5.1. Динамические массивы. Имя массива как указатель.
*Файл: Lab08_YaP_2019_1S.pdf
*
*Язык: C++.
*Среда: Microsoft Visual Studio 2019 v16.3.0.
*Платформа: x64.
*Изменение: 03.01.2020.
*
*Вариант: 13.
*Защита: 29.11.2019.
*Задание: БН. (...)
*/
#include <iostream> // Требуется для PRINTF. //
#include "Header.h"
void MaxNegativesFunction (int *SourceArray, int Dimension) { // Определение MAXNEGATIVESFUNCTION. //
int MinElement = *(SourceArray);
for (int i = 1; i < Dimension; i++) {
if ((*(SourceArray + i) < 0) && (*(SourceArray + i) < MinElement)) {
MinElement = *(SourceArray + i);
}
}
if (MinElement == *(SourceArray)) {
printf ("\n\n3. Отрицательные элементы в массиве отсутствуют.\n"); // Выводится на экран, если в SOURCEARRAY отрицательных
} // элементов нет. //
else {
printf ("\n\n3. Наибольший отрицательный элемент массива: %d.\n", MinElement);
}
} |
|
5/7. MultiplicationFunction.cpp:
C++ | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
| /*
*Лабораторная работа: 8.
*Тема: Указатели и ссылки. Имя массива как указатель. Динамические массивы.
*Пункт: 5.1. Динамические массивы. Имя массива как указатель.
*Файл: Lab08_YaP_2019_1S.pdf
*
*Язык: C++.
*Среда: Microsoft Visual Studio 2019 v16.3.0.
*Платформа: x64.
*Изменение: 03.01.2020.
*
*Вариант: 13.
*Защита: 29.11.2019.
*Задание: БН. (...)
*/
#include <iostream> // Требуется для PRINTF. //
#include "Header.h"
void MultiplicationFunction (int *SourceArray, int Dimension) { // Определение MULTIPLICATIONFUNCTION. //
int Multiplication = 1;
for (int i = 0; i < Dimension; i++) {
if (*(SourceArray + i) < 0) {
Multiplication *= *(SourceArray + i); // MULTIPLICATION = MULTIPLICATION * SOURCEARRAY [I]. //
}
}
if (Multiplication == 1) {
printf ("\n4. Отрицательные элементы в массиве отсутствуют.\n"); // Выводится на экран, если в SOURCEARRAY отрицательных
} // элементов нет. //
else {
printf ("\n4. Произведение отрицательных элементов массива равно: %d.\n", Multiplication);
}
} |
|
6/7. WriteArrayFunction.cpp:
C++ | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| /*
*Лабораторная работа: 8.
*Тема: Указатели и ссылки. Имя массива как указатель. Динамические массивы.
*Пункт: 5.1. Динамические массивы. Имя массива как указатель.
*Файл: Lab08_YaP_2019_1S.pdf
*
*Язык: C++.
*Среда: Microsoft Visual Studio 2019 v16.3.0.
*Платформа: x64.
*Изменение: 03.01.2020.
*
*Вариант: 13.
*Защита: 29.11.2019.
*Задание: БН. (...)
*/
#include <iostream> // Требуется для PRINTF. //
#include "Header.h"
void WriteArrayFunction (int *SourceArray, int Dimension) { // Определение WRITEARRAYFUNCTION. //
int Counter = 1;
bool NullElementsBoolean = true;
for (int i = (Dimension - 1); i >= 0; i--) {
if (*(SourceArray + i) != 0) {
printf ("\n%d) А (%d) = %3d.", Counter++, i, *(SourceArray + i));
NullElementsBoolean = false;
}
}
if (NullElementsBoolean == true) {
printf ("\nНенулевые элементы в массиве отсутствуют.\n"); // Выводится на экран, если все элементы SOURCEARRAY равны
} // нулю. //
} |
|
7/7. ExitProgramFunction.cpp:
C++ | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| /*
*Лабораторная работа: 8.
*Тема: Указатели и ссылки. Имя массива как указатель. Динамические массивы.
*Пункт: 5.1. Динамические массивы. Имя массива как указатель.
*Файл: Lab08_YaP_2019_1S.pdf
*
*Язык: C++.
*Среда: Microsoft Visual Studio 2019 v16.3.0.
*Платформа: x64.
*Изменение: 03.01.2020.
*
*Вариант: 13.
*Защита: 29.11.2019.
*Задание: БН. (...)
*/
#include <iostream> // Требуется для SYSTEM, EXIT. //
#include "Header.h"
void ExitProgramFunction () { // Определение EXITPROGRAMFUNCTION. //
system ("pause");
exit (true);
} |
|
Язык: C++.
Среда: Microsoft Visual Studio 2019 v16.3.0.
Платформа: x64.
Задание:
Используя указатели на функцию вычислить значение функции в точке X в соответствии с выбором функции пользователем. При невозможности вычисления функции в точке X выдать соответствующее сообщение:
1. (1 + X) / (1 - X).
2. SIN (X)^(1 / 2).
3. ARCTG (1 / X).
4. LN^2 (X - 1 / X).
ЛР № 8, задание № 5.2
1/7. Source.cpp:
C++ | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
| /*
*Лабораторная работа: 8.
*Тема: Указатели и ссылки. Имя массива как указатель. Динамические массивы.
*Пункт: 5.2. Указатели на функцию.
*Файл: Lab08_YaP_2019_1S.pdf
*
*Язык: C++.
*Среда: Microsoft Visual Studio 2019 v16.3.0.
*Платформа: x64.
*Изменение: 03.01.2020.
*
*Вариант: 13.
*Защита: 29.11.2019.
*Задание: БН. Используя указатели на функцию вычислить значение функции в точке X в соответствии с выбором функции пользователем. При
* невозможности вычисления функции в точке X выдать соответствующее сообщение:
*1. (1 + X) / (1 - X).
*2. SIN (X)^(1 / 2).
*3. ARCTG (1 / X).
*4. LN^2 (X - 1 / X).
*/
#include <iostream> // Требуется для SETLOCATE, PRINTF, CIN. //
#include "Header.h"
void main () {
setlocale (LC_ALL, "Russian");
int Choice = 0;
void (*PointerOnFunction []) () = {ExitProgramFunction, FirstFunction, SecondFunction, ThirdFunction, FourthFunction};
printf ("1. С помощью какой функции вы хотите вычислить значение?\n\n 1 + x _ 1 2 1\n1) "
"-----. 2) Sin Vx. 3) Arctg -. 4) Ln (x - -).\n 1 - x x x\n\nВаш в"
"ыбор: ");
cin >> Choice;
if ((Choice < 1) || (Choice > 4)) {
printf ("\nОшибка ввода. Программа завершает свою работу.\n\n");
(*PointerOnFunction [0]) ();
}
(*PointerOnFunction [Choice]) ();
(*PointerOnFunction [0]) ();
} |
|
2/7. Header.h:
C++ | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| /*
*Лабораторная работа: 8.
*Тема: Указатели и ссылки. Имя массива как указатель. Динамические массивы.
*Пункт: 5.2. Указатели на функцию.
*Файл: Lab08_YaP_2019_1S.pdf
*
*Язык: C++.
*Среда: Microsoft Visual Studio 2019 v16.3.0.
*Платформа: x64.
*Изменение: 03.01.2020.
*
*Вариант: 13.
*Защита: 29.11.2019.
*Задание: БН. (...)
*/
using namespace std;
void ExitProgramFunction (); // Объявление EXITPROGRAMFUNCTION. //
void FourthFunction (); // Объявление FOURTHFUNCTION. //
void ThirdFunction (); // Объявление THIRDFUNCTION. //
void SecondFunction (); // Объявление SECONDFUNCTION. //
void FirstFunction (); // Объявление FIRSTFUNCTION. // |
|
3/7. FirstFunction.cpp:
C++ | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| /*
*Лабораторная работа: 8.
*Тема: Указатели и ссылки. Имя массива как указатель. Динамические массивы.
*Пункт: 5.2. Указатели на функцию.
*Файл: Lab08_YaP_2019_1S.pdf
*
*Язык: C++.
*Среда: Microsoft Visual Studio 2019 v16.3.0.
*Платформа: x64.
*Изменение: 03.01.2020.
*
*Вариант: 13.
*Защита: 29.11.2019.
*Задание: БН. (...)
*/
#include <iostream> // Требуется для PRINTF, CIN. //
#include "Header.h"
void FirstFunction () { // Определение FIRSTFUNCTION. //
float X = 0;
printf ("\n2. Область определения функции: X E (-oo, 1) U (1, +oo).\n\n3. Введите значение переменной X: ");
cin >> X;
if (X == 1) {
printf ("\n4. При X = 1 функция не определена.\n\n");
ExitProgramFunction ();
}
printf ("\n 1 + %.2f\n4. Y = -------- = %.3f.\n 1 - %.2f\n\n", X, (1 + X) / (1 - X), X);
} |
|
4/7. SecondFunction.cpp:
C++ | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| /*
*Лабораторная работа: 8.
*Тема: Указатели и ссылки. Имя массива как указатель. Динамические массивы.
*Пункт: 5.2. Указатели на функцию.
*Файл: Lab08_YaP_2019_1S.pdf
*
*Язык: C++.
*Среда: Microsoft Visual Studio 2019 v16.3.0.
*Платформа: x64.
*Изменение: 03.01.2020.
*
*Вариант: 13.
*Защита: 29.11.2019.
*Задание: БН. (...)
*/
#include <iostream> // Требуется для PRINTF, CIN, SIN, SQRT. //
#include "Header.h"
void SecondFunction () { // Определение SECONDFUNCTION. //
float X = 0;
printf ("\n2. Область определения функции: X E [0, +oo).\n\n3. Введите значение переменной X: ");
cin >> X;
if (X < 0) {
printf ("\n4. При X E (-oo, 0) функция не определена.\n\n");
ExitProgramFunction ();
}
printf (" ____\n4. Y = Sin V%.2f = %.3f.\n\n", X, sin (sqrt (X)));
} |
|
5/7. ThirdFunction.cpp:
C++ | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| /*
*Лабораторная работа: 8.
*Тема: Указатели и ссылки. Имя массива как указатель. Динамические массивы.
*Пункт: 5.2. Указатели на функцию.
*Файл: Lab08_YaP_2019_1S.pdf
*
*Язык: C++.
*Среда: Microsoft Visual Studio 2019 v16.3.0.
*Платформа: x64.
*Изменение: 03.01.2020.
*
*Вариант: 13.
*Защита: 29.11.2019.
*Задание: БН. (...)
*/
#include <iostream> // Требуется для PRINTF, CIN, ATAN. //
#include "Header.h"
void ThirdFunction () { // Определение THIRDFUNCTION. //
float X = 0;
printf ("\n2. Область определения функции: X E (-oo, 0) U (0, +oo).\n\n3. Введите значение переменной X: ");
cin >> X;
if (X == 0) {
printf ("\n4. При X = 0 функция не определена.\n\n");
ExitProgramFunction ();
}
printf ("\n 1\n4. Y = Arctg ---- = %.3f.\n %.2f\n\n", atan (1 / X), X);
} |
|
6/7. FourthFunction.cpp:
C++ | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| /*
*Лабораторная работа: 8.
*Тема: Указатели и ссылки. Имя массива как указатель. Динамические массивы.
*Пункт: 5.2. Указатели на функцию.
*Файл: Lab08_YaP_2019_1S.pdf
*
*Язык: C++.
*Среда: Microsoft Visual Studio 2019 v16.3.0.
*Платформа: x64.
*Изменение: 03.01.2020.
*
*Вариант: 13.
*Защита: 29.11.2019.
*Задание: БН. (...)
*/
#include <iostream> // Требуется для PRINTF, CIN, POW, LOG. //
#include "Header.h"
void FourthFunction () { // Определение FOURTHFUNCTION. //
float X = 0;
printf ("\n2. Область определения функции: X E (-1, 0) U (1, +oo).\n\n3. Введите значение переменной X: ");
cin >> X;
if ((X <= -1) || ((X >=0) && (X <= 1))) {
printf ("\n4. При X E (-oo, -1] U [0, 1] функция не определена.\n\n");
ExitProgramFunction ();
}
printf ("\n 2 1\n4. Y = Ln (%.2f - ----) = %.3f.\n %.2f\n\n", X, pow (log (X - (1 / X)), 2), X);
} |
|
7/7. ExitProgramFunction.cpp:
C++ | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| /*
*Лабораторная работа: 8.
*Тема: Указатели и ссылки. Имя массива как указатель. Динамические массивы.
*Пункт: 5.1. Динамические массивы. Имя массива как указатель.
*Файл: Lab08_YaP_2019_1S.pdf
*
*Язык: C++.
*Среда: Microsoft Visual Studio 2019 v16.3.0.
*Платформа: x64.
*Изменение: 03.01.2020.
*
*Вариант: 13.
*Защита: 29.11.2019.
*Задание: БН. (...)
*/
#include <iostream> // Требуется для SYSTEM, EXIT. //
#include "Header.h"
void ExitProgramFunction () { // Определение EXITPROGRAMFUNCTION. //
system ("pause");
exit (true);
} |
|
|