Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1296129.rtf
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
10 Мб
Скачать
☆

1. Математическая постановка задачи

Условие:

Результаты эксперимента хранятся в двумерном массиве m x n (n>=3, m=2*n). Найти пересечение двух множеств и сформировать одномерный массив (заштрихованная часть).

Найти среднее арифметическое значение элементов одномерного массива.

В одномерном массиве подсчитать, сколько элементов отличаются от ср. арифм. значения на 50%. Вспомогательные массивы не создавать.

Входные данные:

1. Количество столбцов двумерного массива n;

2. Результаты эксперимента, которые хранятся в двумерном массиве

Выходные данные:

1. Размер полученного одномерного массива

2. Среднее арифметическое значение элементов одномерного массива

3. Количество элементов массива, которые отличаются от ср. арифм. значения на 50%.

Требования к программе:

Программа написана на языке Delphi (консольный режим)

Оформить в подпрограммы:

1. Ввод данных эксперимента.

2. Формирование одномерного массива

3. Подсчет количества элементов массива, которые отличаются от ср. арифм. значения на 50%.

2. Решение примера заданным методом

Находим ср. арифм. и, сравнивая, сколько элементов массива, отличаются от ср. арифм. На 50 %.

Блок-схема

Рис 1. Блок-схема основной подпрограммы.

Рис 2. Блок-схема подпрограммы формирования двумерного массива и ввода данных эксперимента vvodmas.

Рис 3. Блок-схема подпрограммы нахождения пересечения двух множеств и формирования одномерного массива peresech.

Рис 4. Блок-схема подпрограммы расчета среднего арифметического значения элементов одномерного массива srednee.

Рис 5. Блок-схема подпрограммы формирования откорректированного одномерного массива correct.

Рис 6. Блок-схема подпрограммы вывода одномерного массива vyvodmas.

3. Листинг программы

unit kurs_gui;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, Grids, StdCtrls;

type // раздел описания типов данных

// описание типа - динамический одномерный массив

t1dArray = array of Real;

// описание типа - динамический двумерный массив

t2dArray = array of array of Real;

TForm1 = class (TForm)

lbl_n: TLabel;

edt_n: TEdit;

btn_n: TButton;

// ввод значений массива

strgrd_mn: TStringGrid;

// кнопка запуска основной подпрограммы

btnRaschet: TButton;

lblx_len: TLabel;

// вывод размера полученного одномерного массива

edt_xlen: TEdit;

// вывод среднего арифметическое значение элементов массива X

edt_xsr: TEdit;

lbl_xsr: TLabel;

lbl_del: TLabel;

// вывод количества удаленных элементов массива X

edt_del: TEdit;

lbl_ylen: TLabel;

// вывод размер откорректированного массива Y

edt_ylen: TEdit;

lbl_ysr: TLabel;

// вывод cреднее арифметическое значение элементов откорректированного массива Y

edt_ysr: TEdit;

lbl_y: TLabel;

// вывод значений массива

strgrd_y: TStringGrid;

procedure btn_nClick (Sender: TObject);

procedure btnRaschetClick (Sender: TObject);

procedure FormCreate (Sender: TObject);

private

{ Private declarations }

// массив с результатами эксперимента

A: t2dArray;

// одномерный массив полученный в результате пересечения двух множеств

X: t1dArray;

// откорректированный одномерный массив

Y: t1dArray;

xlen: Integer; // размер массива X

ylen: Integer; // размер массива Y

xsr: Real; // среднее арифметическое значение элементов массива X

ysr: Real; // среднее арифметическое значение элементов откорректированного массива Y

m: Integer; // количество строк массива A

n: Integer; // количество столбцов массива A

// инициализация strgrd_mn

// col - введенное количество столбцов

procedure vvod_n (col: Integer);

// подпрограмма формирования двумерного массива и ввода данных эксперимента

// row - количество строк массива m2d

// col - количество столбцов массива m2d

// возвращает введенный массив m2d [0. row-1] [0. col-1]

// true - если массив успешно сформирован

function vvodmas (Var m2d: t2dArray; row: Integer; col: Integer): Boolean;

// функция нахождения пересечения двух множеств и формирования одномерного массива

// m2d - двумерный массив с результатами эксперимента [0. row-1] [0. col-1]

// row - количество строк массива m2d

// col - количество столбцов массива m2d

// возвращает полученный одномерный массив m1d и его длину

function peresech (m2d: t2dArray; row: Integer; col: Integer;

var m1d: t1dArray): Integer;

// функция расчета среднего арифметического значения элементов одномерного массива

// m1d - одномерный массив [0. len-1]

// len - длина массива m1d

// возвращает среднее арифметическое значение элементов массива m1d

function srednee (m1d: t1dArray; len: Integer): Real;

// функция формирования откорректированного одномерного массива

// m1d - одномерный массив [0. len-1]

// len - длина массива m1d

// sr - среднее арифметическое значение элементов массива m1d;

// возвращает откорректированный одномерный массив m1d1 и его длину

function correct (m1d: t1dArray; len: Integer; sr: Real;

var m1d1: t1dArray): Integer;

// процедура вывода одномерного массива

// m1d - одномерный массив [0. len-1]

// len - длина массива m1d

procedure vyvodmas (m1d: t1dArray; len: Integer);

public

{ Public declarations }

end;

var // раздел объявления переменных

Form1: TForm1;

implementation

{$R *. dfm}

// инициализация strgrd_mn

// col - введенное количество столбцов

procedure TForm1. vvod_n (col: Integer);

var

i,j: Integer; // индексы

begin

if (col<3) then

begin

// выводим сообщение

ShowMessage ('Значение n должно быть не менее 3');

// завершаем подпрограмму

Exit;

end;

n: =col; // количество столбцов

m: = 2 * n; // находим количество строк

// количество строк m + 1 фиксированный столбец

strgrd_mn. RowCount: =m+1;

// количество столбцов n + 1 фиксированная строка

strgrd_mn. ColCount: =n+1;

// подпишем строки и столбцы

strgrd_mn. Cells [0,0]: ='m\n';

// строки

for i: =1 to m do strgrd_mn. Cells [0, i]: =IntToStr (i);

// столбцы

for j: =1 to n do strgrd_mn. Cells [j,0]: =IntToStr (j);

// очистим ячейки

// строки

for i: =1 to m do

begin

// столбцы

for j: =1 to n do

begin

// очистим ячейку

strgrd_mn. Cells [j, i]: ='';

end;

end;

end;

// подпрограмма формирования двумерного массива и ввода данных эксперимента

// row - количество строк массива m2d

// col - количество столбцов массива m2d

// возвращает введенный массив m2d [0. row-1] [0. col-1]

// true - если массив успешно сформирован

function TForm1. vvodmas (Var m2d: t2dArray; row: Integer; col: Integer): Boolean;

var

i, j: Integer; // индексы массива

r: Real;

begin

result: =False;

SetLength (m2d, row); // задаем количествл строк массива

// задаем количество столбцов для каждой строки

for i: = 0 to row - 1 do

SetLength (m2d [i], col);

for i: = 0 to row - 1 do

begin

for j: = 0 to col - 1 do

begin

try

// преобразуем строку в вещественное значение

r: =StrToFloat (strgrd_mn. Cells [j+1, i+1]);

except

// если значение строки нельзя преобразовать в вещественное значение

on E: Exception do

begin

ShowMessage ('Ошибка в ячейке m='+IntToStr (i+1) +', n='+IntToStr (j+1) +#$0d+#$0a+E. Message);

// завершаем работу подпрограммы

Exit;

end;

end;

// присваиваем элементу массива значение

m2d [i, j]: =r;

end;

end;

result: =True;

end;

procedure TForm1. btn_nClick (Sender: TObject);

begin

vvod_n (StrToInt (edt_n. Text));

end;

// функция нахождения пересечения двух множеств и формирования одномерного массива

// m2d - двумерный массив с результатами эксперимента [0. row-1] [0. col-1]

// row - количество строк массива m2d

// col - количество столбцов массива m2d

// возвращает полученный одномерный массив m1d и его длину

function TForm1. peresech (m2d: t2dArray; row: Integer; col: Integer;

var m1d: t1dArray): Integer;

var

i, j, k, p: Integer; // индексы массива

len: Integer; // количество элементов массива m1d

next: Boolean; // переход к следующему элементу

begin

len: = 0;

// первая половина строк матрицы - первое множество

for i: = 0 to (row div 2) - 1 do

begin

for j: = 0 to col - 1 do

begin

next: = False;

// вторая половина строк матрицы - второе множество

for k: = (row div 2) to row - 1 do

begin

for p: = 0 to col - 1 do

begin

// каждый элемент первого множества проверяем на равенство

// с каждым из элементов второго множества

if m2d [i, j] = m2d [k, p] then

begin

SetLength (m1d, len + 1); // увеличиваем длину массива m1d на 1

m1d [len]: = m2d [i, j]; // сохраним элемент массива m2d в массиве m1d

len: = len + 1; // увеличим на 1 количество элементов массива m1d

next: = True; // переходим к следующему элементу

Break; // выходим из цикла for p: =0 to col-1 do

end;

end;

if next then

Break; // выходим из цикла for k: = (row div 2) to row-1 do

end;

end;

end;

result: = len; // возвращаем длину полученного одномерного массива

end;

// функция расчета среднего арифметического значения элементов одномерного массива

// m1d - одномерный массив [0. len-1]

// len - длина массива m1d

// возвращает среднее арифметическое значение элементов массива m1d

function TForm1. srednee (m1d: t1dArray; len: Integer): Real;

var

sum: Real; // сумма элементов массива

i: Integer; // индекс массива

begin

sum: = 0;

// находим сумму элементов массива

for i: = 0 to len - 1 do

sum: = sum + m1d [i];

// находим и возвращаем среднее арифметическое значене элементов массива m1d

result: = sum / len;

end;

// функция формирования откорректированного одномерного массива

// m1d - одномерный массив [0. len-1]

// len - длина массива m1d

// sr - среднее арифметическое значение элементов массива m1d;

// возвращает откорректированный одномерный массив m1d1 и его длину

function TForm1. correct (m1d: t1dArray; len: Integer; sr: Real;

var m1d1: t1dArray): Integer;

var

i: Integer; // индекс массива

len1: Integer; // количество элементов откорректированного массива

begin

len1: = 0;

for i: = 0 to len - 1 do

begin

// если элемент отличается от среднего арифметического значения

// более чем на 50%, то не включаем его в откорректированный

// одномерный массив

if not ( ( (m1d [i] / sr) > 1.5)) then

if not ( (m1d [i] / sr) < 0.5) then begin

SetLength (m1d1, len1 + 1); // увеличиваем длину массива m1d1 на 1

m1d1 [len1]: = m1d [i]; // сохраним элемент массива m1d в массиве m1d1

len1: = len1 + 1; // увеличим на 1 количество элементов массива m1d1

end;

end;

result: = len1; // возвращаем количество элементов массива m1d1

end;

// процедура вывода одномерного массива

// m1d - одномерный массив [0. len-1]

// len - длина массива m1d

procedure TForm1. vyvodmas (m1d: t1dArray; len: Integer);

var

i: Integer; // индекс массива

begin

// зададим количество столбцов

strgrd_y. ColCount: =len;

// подпишем столбцы

for i: = 0 to len - 1 do strgrd_y. Cells [i,0]: =IntToStr (i+1);

// заполним таблицу значениями одномерного массива

for i: = 0 to len - 1 do strgrd_y. Cells [i,1]: =FloatToStr (m1d [i]);

end;

procedure TForm1. btnRaschetClick (Sender: TObject);

begin

// формируем двумерный массив c данными эксперимента

if (vvodmas (A, m, n)) then

begin

// нахождения пересечения двух множеств и формирования одномерного массива

xlen: = peresech (A, m, n, X);

// находим среднее арифметическое значене элементов массива X

xsr: = srednee (X, xlen);

// формируем откорректированный одномерный массив

ylen: = correct (X, xlen, xsr, Y);

// находим среднее арифметическое значене элементов массива Y

ysr: = srednee (Y, ylen);

// вывод результатов

// Размер полученного одномерного массива

edt_xlen. Text: =IntToStr (xlen);

// Среднее арифметическое значение элементов массива

edt_xsr. Text: =FloatToStr (xsr);

// Количество удаленных элементов массива

edt_del. Text: =IntToStr (xlen-ylen);

// Размер откорректированного массива

edt_ylen. Text: =IntToStr (ylen);

// Среднее арифметическое значение элементов откорректированного массива

edt_ysr. Text: =FloatToStr (ysr);

// Элементы откорректированного массива

vyvodmas (Y, ylen);

end;

end;

procedure TForm1. FormCreate (Sender: TObject);

begin

vvod_n (3);

end;

end.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]