Zamiana FUNKCJI na PROCEDURE?

0

Jak zamienic ponizsze dwie funkcje na procedury ? Ponizsze dwie dzialaja bez zarzutu, ale maja to byc PROCEDURY, a nie funkcje...

---------------------------------- 1 ------------------------------------------
Procedura oblicza sumę liczb zapisanych w komórkach o indeksie nieparzystym w tablicy 40-elementowej wypełnionej wartościami losowanymi z przedziału . Parametrem wejściowym jest wypełniona tablica, a wyjściowym suma liczb z komórek o indeksie nieparzystym.

type
typ_tab40int=array [1..40] of integer;

function nieparzyste(tab40int:typ_tab40int):byte;
var
il_nieparzystych:byte;
nr_komorki:byte;
begin
il_nieparzystych:=0;
for nr_komorki:=1 to 40 do
if tab40int[nr_komorki] mod 2=1 then
il_nieparzystych:= il_nieparzystych+1;
result:=il_nieparzystych;
end;

I procedura onclick dla przycisku wywolujacego zdarzenie :

procedure TForm1.Button6Click(Sender: TObject);
var
tab_liczb:typ_tab40int;
k,il:byte;
begin
lb.Clear;
for k:=1 to 40 do
begin
tab_liczb[k]:=random(1000);
lb.items.add(inttostr(tab_liczb[k]));
end;
il:=nieparzyste(tab_liczb);
edit7.text:='suma nieparzystych='+inttostr(il);
end;

---------------------------------- 2 ------------------------------------------
Procedura sortująca tablice 30 elementową wypelnioną liczbami losowanymi z zakresu . Parametrem wejściowym jest wypełniona nieposortowana tablica, a parametrem wyjściowym tablica posortowana.

type
typ_tab30int=array[1..30] of integer;

function ilosc(tab30int:typ_tab30int):byte;
var
ilosc_dz:byte;
nr_komorki:byte;
begin
ilosc_dz:=0;
for nr_komorki:=1 to 30 do
if tab30int[nr_komorki] mod 1=0 then
ilosc_dz:=ilosc_dz+1;
result:=ilosc_dz;
end;
end.

Pierwsze zdarzenie onclick dla funkcji (wypisanie 30):

procedure TForm1.Button4Click(Sender: TObject);
var
tab_liczb:typ_tab30int;
k,il:byte;
begin
lb.clear;
for k:=1 to 30 do
begin
tab_liczb[k]:=random(100)-20;
lb.items.add(inttostr(tab_liczb[k]));
end;
il:=ilosc(tab_liczb);
end;

Drugie zdarzenie onclick dla funkcji (sortowanie wypisanych wczesniej 30):

procedure TForm1.Button7Click(Sender: TObject);
begin
lb.Sorted := true;
end;

Czy jakaś dobra dusza mogłaby napisać jak w przykładzie 2 zrobic, aby jedno zdarzenie onclick odpowiadało za wypiysanie i posortowanie ?
Z gory WIELKIE dzieki dla wszystkich za pomoc!

0

Jak wiadomo procedura różni się od funkcji tym, że nie zwraca wartości. Może spróbuj zadeklarować zmienną globalną i odwołać się do niej w procedurze :-8.

Pozdrowionka

0

Schemat:

function fsuma(a, b: Integer): Integer;
begin
Result:=a + b
end;

procedure psuma(a, b: Integer; var Result: Integer);
begin
Result:=a + b
end;

var
a, b, c: Integer;
begin
a:=1;
b:=2;
c:=fsuma(a, b);
psuma(a, b, c)
end.

0

Wersja gotowa i działająca. Autor już to dostał na e-mail, ale może innym się do czegoś przyda :-)

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
typ_tab40int=array [1..40] of integer;
TForm1 = class(TForm)
Button6: TButton;
Edit7: TEdit;
lb: TListBox;
procedure Button6Click(Sender: TObject);
procedure nieparzyste(tab40int:typ_tab40int);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
il:byte; { il dałem do globalnych }

implementation

{$R *.dfm}

procedure TForm1.Button6Click(Sender: TObject);
var
tab_liczb:typ_tab40int;
k:byte;
begin
lb.Clear;
for k:=1 to 40 do
begin
tab_liczb[k]:=random(1000);
lb.items.add(inttostr(tab_liczb[k]));
end;
nieparzyste(tab_liczb);
edit7.text:='suma nieparzystych='+inttostr(il);
end;

procedure TForm1.nieparzyste(tab40int: typ_tab40int);
var
nr_komorki:byte;
begin
il:=0; { zerujemy il }
for nr_komorki:=1 to 40 do
if tab40int[nr_komorki] mod 2=1 then
inc(il);
end;

end.

1 użytkowników online, w tym zalogowanych: 0, gości: 1