Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Новая методичка.rtf
Скачиваний:
6
Добавлен:
22.07.2019
Размер:
7.64 Mб
Скачать

Лабораторная работа №8

Одномерные динамические массивы.

Цель работы:

  • изучение типа данных “динамический массив”;

  • получение навыков программирования обработки динамических массивов средствами Object Pascal.

Пример 8.1 Основные операции со структурой данных – динамический массив

Дано: динамический массив из “n” элементов целого типа. Разработать приложение, выполняющие следующие действия:

  1. Формирование массива вводом элементов значений с клавиатуры.

  2. Вычисление суммы положительных элементов массива.

  3. Определение, сколько раз максимальный элемент встречается в массиве.

  4. Формирование нового массива из элементов заданного, кратных числу “k”.

  5. Упорядочение заданного массива по возрастанию.

  6. Показ полученных результатов на форме Form2:

  • суммы и максимального элемента в полях редактирования Edit;

  • заданного массива, массива из кратных элементов, упорядоченного массива по возрастанию в списках строк ListBox;

Вид формы Form1 с компонентами:

Вид формы Form2 с компонентами:

Модуль формы Form1:

unit Unit1;

Interface

uses Windows, Messages, SysUtils, Classes, Graphics,

Controls, Forms, Dialogs, StdCtrls,MAS_PP;

type

TForm1 = class(TForm)

Label1: TLabel;

Edit1: TEdit;

Label2: TLabel;

Edit2: TEdit;

Button1: TButton;// ввод массива

Button2: TButton;// вывод массива

Button3: TButton;// показ результатов в Form2

Button4: TButton;// суммирование

Button5: TButton;// максимальный элемент

Label3: TLabel;

Edit3: TEdit;

Button6: TButton;// массив из элементов, кратных "к"

Button7:TButton;//сортировка массива по возрастанию

Button8: TButton;// освобождение памяти и выход

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

procedure Button5Click(Sender: TObject);

procedure Button6Click(Sender: TObject);

procedure Button7Click(Sender: TObject);

procedure Button8Click(Sender: TObject);

private { Private declarations }

public { Public declarations }

end;

var

Form1: TForm1;

A:arr;

n:integer;

implementation

uses Unit2;

{$R *.DFM}

Function GetSubstr(st:string;k:integer):string;

Var i,p:integer;

Begin for i:=1 to k-1 do

begin

p:=Pos(' ',st);

st:=copy(st,p+1,length(st)-p);

end;

p:=Pos(' ',st);

if p <> 0 then result:=copy(st,1,p-1)

else result:=st

end;

procedure TForm1.Button1Click(Sender: TObject);

// ввод массива

Var i:integer;

begin

n:=StrToInt(Edit1.Text);

SetLength(A,n); // Выделение памяти

for i:=0 to n-1 do

A[i]:=StrToInt(GetSubstr(Edit2.text,i+1));

{В динамическом массиве индекс 1-го элемента

равен нулю, а из редактора Edit берется 1-й,2-й ит.д.

элементы}

end;

procedure TForm1.Button2Click(Sender: TObject);

// вывод массива

var i:integer;

begin

for i:= 0 to n-1 do

Form2.listBox1.items.Add(IntToStr(A[i]))

end;

procedure TForm1.Button3Click(Sender: TObject);

// показ результатов в Form2

begin Form2.show end;

procedure TForm1.Button4Click(Sender: TObject);

// суммирование

Var k,i,S:integer;

B:arr;

begin k:=0;

SetLength(B,k+1); // Выделение памяти

for i:=0 to n-1 do

if A[i]>0 then

begin

SetLength(B,k+1); // Выделение памяти

B[k]:=A[i]; k:=k+1 end;

S:=Sum(k,B);

Form2.Edit1.Text:=IntToStr(S) ;end;

procedure TForm1.Button5Click(Sender: TObject);

// максимальный элемент

Var amax,i,kmax:integer;

begin

amax:=Max(n,A);

kmax:=0;

for i:= 0 to n-1 do

if A[i]=amax then kmax:=kmax+1;

Form2.Edit2 .text:=inttostr(amax);

Form2.Edit3.text:=inttostr(kmax);

end;

procedure TForm1.Button6Click(Sender: TObject);

// массив из элементов, кратных "к"

var B:arr; k,kk,i:integer;

begin

k:=StrToInt(Edit3.text); Kratn(n,A,k,B,kk);

if kk=0 then Form2.listBox2.items.Add('нет кратных')

else for i:= 0 to kk-1 do

Form2.listBox2.items.Add(IntToStr(B[i]));

B:=nil; end;

procedure TForm1.Button7Click(Sender: TObject);

// сортировка массива по возрастанию

var i:integer;

begin

Sort(n,A);

for i:= 0 to n-1 do

Form2.listBox3.items.Add(IntToStr(A[i])) end;

procedure TForm1.Button8Click(Sender: TObject);

// освобождение памяти и выход

begin A:=nil; close end;

end.

Модуль формы Form2:

unit Unit2;

interface

uses Windows, Messages, SysUtils, Classes, Graphics,

Controls, Forms, Dialogs, StdCtrls;

type

TForm2 = class(TForm)

Label1: TLabel; ListBox1: TListBox;

Label2: TLabel; Edit1: TEdit;

Label3: TLabel; Edit2: TEdit;

Label4: TLabel; Edit3: TEdit;

Label5: TLabel; Label6: TLabel;

ListBox2: TListBox; Label7: TLabel;

ListBox3: TListBox;

private { Private declarations }

public { Public declarations } end;

var

Form2: TForm2;

Implementation

{$R *.DFM}

end.

Модуль без формы с подпрограммами

для использования из приложения:

unit Mas_PP;

interface

Type arr=Array of Integer;

Function Sum(n:integer;A:arr):integer;

Function Max(n:integer;A:arr):integer;

ProcedureKratn(n:integer;A:arr;k:integer;var B:arr;

var kk:integer);

Procedure Sort(n:integer;var A:arr);

implementation

Function Sum;

Var S,i:integer;

Begin

S:=0; For i:=0 to n-1 do S:=S+A[i]; Sum:=S

end;

Function Max;

var amax,i:integer;

begin amax:=A[0];

for i:=0 to n-1 do

if A[i]>amax then amax:=A[i];

Max:=amax; end;

Procedure Kratn;

Var i:integer;

Begin kk:=0;

for i:=0 to n-1 do if A[i] mod k =0 then

begin

SetLength(B,kk+1);

B[kk]:=A[i]; kk:=kk+1 end;

end;

Procedure Sort;

var i,k,x:integer;

Begin

for i:=0 to n-2 do

for k:=i downto 0 do

if A[k]>A[k+1] then

begin x:=A[k];A[k]:=A[k+1];A[k+1]:=x end;

end;

end.

Сценарий выполнения программы:

  1. Запустить программу (Run);

  2. На форме Form1 ввести в поле Edit1 значение n – количество элементов массива;

  3. В поле Edit2 ввести “n” элементов массива целого типа;

  4. Нажать кнопки: “Ввод массива”; “Вывод массива”; “Сумма”; “Максимальный элемент”;

  5. В поле Edit3 ввести значение “k” – коэффициент кратности;

  6. Нажать кнопки: “Кратность”; “Сортировка”; “Показ Form2”;

  7. Просмотреть и проанализировать результаты;

  8. Активизировать форму From1 и нажать кнопку “Освобождение памяти и выход”;

Ниже приведены вид формы Form1 после выполнения пунктов 2, 3, 4, 5:

и вид формы Form2 после нажатия кнопки “Показ From2”:

Задание к лабораторной работе

Для массива из n целых чисел сформировать новый массив, согласно выбранному варианту. Если “нужных” элементов нет, выдать соответствующие сообщение.

Варианты:

  1. Массив из сверхпростых чисел (Сверхпростым называется число, если оно простое, и “перевертыш” этого числа тоже простое число. Например: 13, 17).

  2. Массив из чисел Армстронга (153, 370, 371, 407, 9474, 54748, 92727, 548834 – числа Армстронга. 153 = ; 9474 = ; 548834 = . Натуральное число из N цифр является числом Армстронга, если сумма его цифр, возведенных в степень N, равна самому этому числу).

  3. Массив чисел перевертышей, состоящих из “k” цифр.

  4. Массив простых чисел, у которых последняя цифра “7”.

  5. Массив совершенных чисел (Совершенное число равно сумме своих делителей кроме самого значения. Например: 6 = 1+2+3).

  6. Массив чисел – “близнецов” (“Близнецы” – простые числа, разность между которыми равна 2).

  7. Массив взаимно – простых чисел (Взаимно простые числа – целые числа, не имеющие общих простых делителей.

  8. Массив чисел, представляющих степень двойки

  9. Массив чисел, принадлежащих заданному отрезку от А до В;

  10. Массив автоморфных чисел (Автоморфным называется число, равное последним разрядам квадрата этого числа. Например: 6/36, 25/625).

  11. Массив чисел, не принадлежащих отрезку от А до В;

  12. Массив из четных чисел, цифры которых записаны в обратном порядке (Например: , 254 ).