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.
