Болтушкин Л.С., 712-2, отчет
.pdf
Рисунок 2.1 – Блок схема задания 2.1
Листинг кода задания 2.1:
using System;
class Program
{
static void Main(string[] args)
{
double[] arr = { 1, 4.31, -7, -21.47, 31.123, 2.89, -143.191, 7.77, 8.04 };
// Нахождение макс. элемента
double max_elem = arr[0]; // мб, что первый эл. окажется макс. for (int i = 1; i < arr.Length; i++)
{
if (arr[i] > max_elem)
{
max_elem = arr[i];
}
}
Console.WriteLine("Максимальный элемент в массиве: " + max_elem);
// Нахождение суммы элементов массива, расположенных до последнего "+"
элемента
double sum_before_last_positive = 0;
int last_positive_index = -1; // индекс последнего положительного элемента (-
11
1), если такого элемента нет)
for (int i = 0; i < arr.Length; i++)
{
if (arr[i] > 0)
{
last_positive_index = i;
}
if (last_positive_index == -1)
{
continue; // если положительный элемент еще не встретился - пропускаем
}
if (i < last_positive_index)
{
sum_before_last_positive += arr[i]; // берем в сумму все числа до последнего положительного
}
}
Console.WriteLine("Сумма элементов до последнего положительного элемента: " + sum_before_last_positive);
// Удаление элементов в интервале [a, b], освобождение конечных ячеек и заполнение их нулями
double a = -7.0; // задаем левую границу интервала double b = 3.0; // задаем правую границу интервала
int shift = 0; // переменная для подсчета удаленных элементов
for (int i = 0; i < arr.Length; i++)
{
if (Math.Abs(arr[i]) >= a && Math.Abs(arr[i]) <= b) { // если элемент попадает в интервал, SKIP
shift++; //побитовый сдвиг
}
else
{ // если элемент не попал в интервал if (shift > 0)
{
arr[i - shift] = arr[i]; // сдвигаем элементы на количество
удаленных элементов
}
}
}
// ставим нули свободных ячеек
for (int i = arr.Length - shift; i < arr.Length; i++)
{
arr[i] = 0;
}
Console.WriteLine("Измененный массив:"); for (int i = 0; i < arr.Length; i++)
{
Console.Write(arr[i] + " ");
}
}
}
Результат работы программы представлен ниже на рисунке 2.2.
12
Рисунок 2.2 – Результат работы программы задания 2.1
Задание 2.2. Дана матрица 5Х5. Построить одномерный массив В(5),
состоящий из средних арифметических элементов строк.
Словесное описание алгоритма:
А1: Инициализировать двумерный массив matrix размером 5x5.
А2: Создать объект класса Random для генерации случайных чисел.
А3: Запустить внешний цикл счетчика i от 0 до 4 (включительно).
А4: На каждой итерации внешнего цикла:
А4.1: Инициализировать вложенный массив matrix[i] размером 5.
А4.2: Запустить внутренний цикл счетчика j от 0 до 4 (включительно).
А4.3: На каждой итерации внутреннего цикла:
А5: Присвоить элементу matrix[i][j] случайное целое число в диапазоне от 1 до
100 с помощью метода random.Next(1, 101).
А6: Инициализировать одномерный массив B размером 5.
А7: Запустить цикл счетчика i от 0 до 4 (включительно).
А8: На каждой итерации цикла:
А8.1: Инициализировать переменную sum со значением 0.
А8.2: Вычислить среднее значение элементов массива matrix[i] с помощью метода matrix[i].Average() и привести его к типу int.
А8.3: Присвоить полученное значение B[i].
А9: Вывести сообщение "Исходная матрица:".
А10: Запустить цикл счетчика i от 0 до 4 (включительно).
А11: Запустить вложенный цикл счетчика j от 0 до 4 (включительно).
А12: На каждой итерации вложенного цикла:
13
А13: Вывести значение matrix[i][j].
А14: Вывести символ новой строки.
А15: Вывести сообщение "Массив B:".
А16: Запустить цикл счетчика i от 0 до 4 (включительно).
А17: Вывести значение B[i].
А18: Вывести пробел.
А19: Завершить программу.
Блок-схема алгоритма представлена на рисунке 2.3.
Рисунок 2.3 – Блок схема задания 2.2
Листинг кода задания 2.2:
int[][] matrix = new int[5][]; Random random = new Random();
for (int i = 0; i < 5; i++)
{
matrix[i] = new int[5]; for (int j = 0; j < 5; j++)
{
matrix[i][j] = random.Next(1, 101);
}
}
int[] B = new int[5];
for (int i = 0; i < 5; i++)
{
int sum = 0;
B[i] = (int)matrix[i].Average();
}
14
Console.WriteLine("Исходная матрица:"); for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
Console.Write(matrix[i][j] + " ");
}
Console.WriteLine();
}
Console.WriteLine("\nМассив В:"); for (int i = 0; i < 5; i++)
{
Console.Write(B[i] + " ");
}
Результат работы программы представлен ниже на рисунке 2.4.
Рисунок 2.4 – Результат работы программы задания 2.2
15
Лабораторная работа №3
Вариант 5
Задание 3.1. Даны координаты вершин двух треугольников. Определить,
какой из них имеет больший периметр. Обязательно использовать функции.
Словесное описание алгоритма:
А1: Создать класс Triangle.
А2: Внутри класса Triangle определить статическую функцию Perimeter, которая принимает координаты трех точек вершин треугольника и вычисляет его периметр.
А3: Вычислить длину стороны a с помощью формулы расстояния между двумя точками, используя методы Math.Sqrt и Math.Pow.
А4: Вычислить длину стороны b и стороны c аналогичным образом.
А5: Вернуть сумму длин всех трех сторон в качестве результата.
А6: Внутри класса Triangle определить функцию Main.
А7: Вывести сообщение "Введите координаты вершин первого треугольника
(через пробел 5 чисел): ".
А8: Считать строку ввода с помощью метода Console.ReadLine и разделить ее на подстроки с помощью метода Split.
А9: Преобразовать каждую подстроку в координату типа double с помощью метода double.Parse и присвоить соответствующей переменной.
А10: Вычислить периметр первого треугольника, вызвав функцию Perimeter и
передав соответствующие координаты.
А11: Вывести сообщение "Введите координаты вершин второго треугольника
(через пробел 5 чисел): ".
А12: Считать строку ввода, разделить ее на подстроки и преобразовать каждую подстроку в координату для второго треугольника.
А13: Вычислить периметр второго треугольника, вызвав функцию Perimeter с
16
соответствующими координатами.
А14: Сравнить периметры двух треугольников с помощью условных операторов.
А14.1: Если p1 > p2, вывести сообщение "Первый треугольник больше по периметру, чем второй".
А14.2: Если p2 > p1, вывести сообщение "Второй треугольник больше по периметру, чем первый".
А14.3: Если p1 равно p2, вывести сообщение "Периметры треугольников равны".
А15: Завершить программу.
Блок-схема алгоритма представлена на рисунке 3.1.
Рисунок 3.1 – Блок схема задания 3.1
17
Листинг кода задания 3.1:
using System;
class Triangle
{
// Функция, которая вычисляет расстояние между точками вершин
public static double Perimeter(double x1, double y1, double x2, double y2, double x3, double y3)
{
double a = Math.Sqrt(Math.Pow(x2 - x1, 2) + Math.Pow(y2 - y1, 2)); double b = Math.Sqrt(Math.Pow(x3 - x2, 2) + Math.Pow(y3 - y2, 2)); double c = Math.Sqrt(Math.Pow(x1 - x3, 2) + Math.Pow(y1 - y3, 2)); return a + b + c; // Функция возврата
}
static void Main()
{
// Ввод координат первого треугольника
Console.Write("Введите координаты вершин первого треугольника (через пробел 6 чисел): ");
string[] input = Console.ReadLine().Split(); double x1 = double.Parse(input[0]);
double y1 = double.Parse(input[1]); double x2 = double.Parse(input[2]); double y2 = double.Parse(input[3]); double x3 = double.Parse(input[4]); double y3 = double.Parse(input[5]);
//Вычисление периметра первого треугольника double p1 = Perimeter(x1, y1, x2, y2, x3, y3);
//Ввод координат второго треугольника
Console.Write("Введите координаты вершин второго треугольника (через пробел 6 чисел): ");
input = Console.ReadLine().Split(); // split - разбивает строку на подстроки на основе указанного символа-разделителя
x1 = double.Parse(input[0]);
y1 = double.Parse(input[1]);
x2 = double.Parse(input[2]);
y2 = double.Parse(input[3]);
x3 = double.Parse(input[4]);
y3 = double.Parse(input[5]);
//Вычисление периметра второго треугольника double p2 = Perimeter(x1, y1, x2, y2, x3, y3);
//Сравнение периметров
if (p1 > p2)
Console.WriteLine("Первый треугольник больше по периметру, чем второй"); else if (p2 > p1)
Console.WriteLine("Второй треугольник больше по периметру, чем первый"); else
Console.WriteLine("Периметры треугольников равны.");
}
}
Результат работы программы представлен ниже на рисунке 3.2.
18
Рисунок 3.2 – Результат работы программы задания 3.1
Задание 3.2. Найти наибольший общий делитель двух чисел. Обязательно использовать рекурсивный подход решения задачи.
Словесное описание алгоритма:
А1: Вывести сообщение "Введите значение x: ".
А2: Считать введенное пользователем значение x с помощью метода
Console.ReadLine и преобразовать его в целое число с помощью метода int.Parse.
А3: Присвоить полученное значение переменной x.
А4: Вывести сообщение "Введите значение y: ".
А5: Считать введенное пользователем значение y аналогично шагу 2. Присвоить полученное значение переменной y.
А6: Вызвать функцию NOD, передав значения x и y в качестве аргументов.
А6.1: Если x равно 0, вернуть значение y.
А6.2: Если y равно 0, вернуть значение x.
А6.3: Если x равно y, вернуть значение x.
А6.4: Если x больше y, вызвать функцию NOD с аргументами (x - y, y) и вернуть ее результат.
А6.5: Если x меньше y, вызвать функцию NOD с аргументами (y - x, x) и вернуть ее результат.
А7: Сохранить результат функции NOD в переменной nod.
А8: Вывести сообщение, используя строковый интерполятор $"", вида
"Наибольший общий делитель для {x} и {y} = {nod}".
А9: Завершить программу.
19
Блок-схема алгоритма представлена на рисунке 3.3
Рисунок 3.3 – Блок схема задания 3.2
Листинг кода задания 3.2:
using System;
class Program
20
