Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Болтушкин Л.С., 712-2, отчет

.pdf
Скачиваний:
6
Добавлен:
27.05.2024
Размер:
1 Мб
Скачать
☆

Рисунок 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

Соседние файлы в предмете Основы программирования