Pascal: Dakiguna unitatea ikasleen notak kudeatzeko
Dokumentu honek ikasleen izenak, azterketen notak eta estatistikak (batez besteko aritmetiko zein geometrikoa, gehienezko eta gutxieneko balioak) kudeatzeko Pascal lengoaiako UNIT Dakiguna unitate osoa biltzen du.
Pascalen garatutako Dakiguna unitatea
Interfazea: konstanteak, motak eta goiburuak
UNIT Dakiguna;
INTERFACE
CONST
BEHEMUGA = 1;
GOIMUGA = 50;
TYPE
DM_Katea = String;
DM_Zerrenda = ARRAY[BEHEMUGA..GOIMUGA] OF DM_Katea;
DM_Notak = ARRAY[BEHEMUGA..GOIMUGA] OF Real;
PROCEDURE DatuakSartu (VAR asGela : DM_Zerrenda; VAR Luzera : Byte);
PROCEDURE DatuakEman (VAR asGela : DM_Zerrenda; VAR Luzera : Byte);
PROCEDURE DatuakIkusi (CONST asGela : DM_Zerrenda; Luzera : Byte);
PROCEDURE DatuakBanatu (CONST asIzenakNotak : DM_Zerrenda; Luzera : Byte; VAR asIzenak, asNotak : DM_Zerrenda);
FUNCTION IkasleaBilatu (CONST asGela : DM_Zerrenda; Nondik, Luzera : Byte; sGakoa : DM_Katea) : Byte;
PROCEDURE AzterketakBanatu (CONST asIzenak, asNotak : DM_Zerrenda; Luzera : Byte;
VAR asIzenak1, asNotak1 : DM_Zerrenda; VAR Luzera1 : Byte;
VAR asIzenak2, asNotak2 : DM_Zerrenda; VAR Luzera2 : Byte);
PROCEDURE NotakZenbakiBihurtu (CONST asNotak : DM_Zerrenda; Luzera : Byte; VAR arNotak : DM_Notak);
PROCEDURE NotakIkusi (CONST arNotak : DM_Notak; Luzera : Byte);
FUNCTION fnrBBaritmetikoaLortu (CONST arNotak : DM_Notak; Luzera : Byte) : Real;
FUNCTION fnrBBgeometrikoaLortu (CONST arNotak : DM_Notak; Luzera : Byte) : Real;
PROCEDURE BatazBestekoakLortu (CONST arNotak : DM_Notak; Luzera : Byte; VAR rBBaritmetiko, rBBgeometriko : Real);
FUNCTION fnbMaxPosizioaLortu (CONST arNotak : DM_Notak; Luzera : Byte) : Byte;
FUNCTION fnbMinPosizioaLortu (CONST arNotak : DM_Notak; Luzera : Byte) : Byte;
PROCEDURE MaxMinPosizioakLortu (CONST arNotak : DM_Notak; Luzera : Byte; VAR MaxNon, MinNon : Byte);Inplementazio atala: prozedurak eta funtzioak
Datuak sartzeko eta bistaratzeko prozedurak
Lehenengo parametroa array bat delako eta irteerakoa delako erreferentziaz pasatzen da. Gauza bera bigarren parametroarekin: erreferentziaz pasatzen da bere balioa prozedura barruan hartzen duelako eta irteerakoa delako.
IMPLEMENTATION
(* Bi azterketen datuak eman *)
PROCEDURE DatuakSartu (VAR asGela : DM_Zerrenda; VAR Luzera : Byte);
VAR
Kont : Byte;
sIzena, sDatua, sNota, sZenbakia : String;
iZenbakia : Integer;
Erantz : Char;
BEGIN
Randomize;
Erantz := 'B';
Kont := 0;
WHILE (Kont < GOIMUGA) AND (Erantz = 'B') DO
BEGIN
Kont := Kont + 1;
Write(Kont, '. posizioko ikaslearen izena eman: ');
ReadLn(sIzena);
iZenbakia := Random(9); (* Unitatea *)
Str(iZenbakia, sZenbakia);
sNota := sZenbakia;
iZenbakia := Random(9); (* Hamarrena *)
Str(iZenbakia, sZenbakia);
sNota := sNota + '.' + sZenbakia;
WriteLn(Kont, '. posizioko ikaslearen nota ', sNota, ' da');
sDatua := sIzena + sNota;
asGela[Kont] := sDatua;
REPEAT
Write('Ikasle gehiagorik? (B/E): ');
ReadLn(Erantz);
Erantz := UpCase(Erantz);
UNTIL (Erantz = 'B') OR (Erantz = 'E');
END;
Luzera := Kont; { Arrayaren luzera logikoa zehaztu }
END;
(* Enuntziatuaren datuak itzultzen dituen prozedura *)
PROCEDURE DatuakEman (VAR asGela : DM_Zerrenda; VAR Luzera : Byte);
CONST
IZENAKETANOTAK : DM_Zerrenda = (
'Koldo7.5', 'Paula5.2', 'Josune8.7', 'Koldo7.1', 'Jokin6.6', 'Ainize5.2',
'Martin8.0', 'Martin7.2', 'Sven8.8', 'Josune6.7', 'Jokin5.0', 'Adrian4.3',
'Marta6.5', 'Justine8.2', 'Marta6.5', 'Erik5.5', 'Paula1.8',
'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''
);
BEGIN
asGela := IZENAKETANOTAK;
Luzera := 17; { Arrayaren luzera logikoa zehaztu }
END;
(* Nahiz eta parametro biak sarrerakoak izan, lehenengoa array bat delako eta
memorian kopia berriak saihesteko erreferentziaz pasatzen da; CONST denez,
babestuta dago. Bigarren parametroa, berriz, balioz pasatzen da. *)
PROCEDURE DatuakIkusi (CONST asGela : DM_Zerrenda; Luzera : Byte);
VAR
Indizea : Byte;
BEGIN
WriteLn(' edukia: ');
FOR Indizea := BEHEMUGA TO Luzera DO
BEGIN
WriteLn(Indizea:2, '. posizioko datua--->', asGela[Indizea], '<---');
END;
WriteLn;
END;Datuak banatzea eta notak zenbaki bihurtzea
PROCEDURE DatuakBanatu (CONST asIzenakNotak : DM_Zerrenda; Luzera : Byte; VAR asIzenak, asNotak : DM_Zerrenda);
VAR
Indizea : Byte;
ZenbatKaraktere : Byte;
BEGIN
FOR Indizea := BEHEMUGA TO Luzera DO
BEGIN
ZenbatKaraktere := Length(asIzenakNotak[Indizea]);
asNotak[Indizea] := Copy(asIzenakNotak[Indizea], ZenbatKaraktere - 3 + 1, 3);
asIzenak[Indizea] := Copy(asIzenakNotak[Indizea], 1, ZenbatKaraktere - 3);
END;
END;
PROCEDURE NotakZenbakiBihurtu (CONST asNotak : DM_Zerrenda; Luzera : Byte; VAR arNotak : DM_Notak);
VAR
Indizea : Byte;
iErrorea : Integer;
BEGIN
FOR Indizea := BEHEMUGA TO Luzera DO
BEGIN
Val(asNotak[Indizea], arNotak[Indizea], iErrorea);
END;
END;
PROCEDURE NotakIkusi (CONST arNotak : DM_Notak; Luzera : Byte);
VAR
Indizea : Byte;
BEGIN
WriteLn(' edukia: ');
FOR Indizea := BEHEMUGA TO Luzera DO
BEGIN
WriteLn(Indizea:2, '. posizioko datua--->', arNotak[Indizea]:0:3, '<---');
END;
WriteLn;
END;Ikasleen bilaketa eta azterketen banaketa
{ ZERTARAKO DA Nondik PARAMETROA? ZER GERTATUKO LITZATEKE Nondik PARAMETROA KENDUKO BALITZ? }
FUNCTION IkasleaBilatu (CONST asGela : DM_Zerrenda; Nondik, Luzera : Byte; sGakoa : DM_Katea) : Byte;
VAR
Indizea : Byte;
Aurkitua : Boolean;
BEGIN
Indizea := Nondik;
Aurkitua := FALSE;
WHILE (Indizea <= Luzera) AND NOT Aurkitua DO
BEGIN
IF asGela[Indizea] = sGakoa THEN
Aurkitua := TRUE
ELSE
Indizea := Indizea + 1;
END;
IF Aurkitua THEN
IkasleaBilatu := Indizea
ELSE
IkasleaBilatu := 0; { 0 posizio baliogabea litzateke }
END;
PROCEDURE AzterketakBanatu (CONST asIzenak, asNotak : DM_Zerrenda; Luzera : Byte;
VAR asIzenak1, asNotak1 : DM_Zerrenda; VAR Luzera1 : Byte;
VAR asIzenak2, asNotak2 : DM_Zerrenda; VAR Luzera2 : Byte);
VAR
Indizea, Indize1, Indize2 : Byte;
sGakoa : DM_Katea;
Posizioa, k : Byte;
asIzenakLagun, asNotakLagun : DM_Zerrenda;
BEGIN
asIzenakLagun := asIzenak;
asNotakLagun := asNotak;
Indize1 := 1;
Indize2 := 1;
Indizea := 0;
WHILE Indizea < Luzera DO
BEGIN
Indizea := Indizea + 1;
sGakoa := asIzenakLagun[Indizea];
Posizioa := IkasleaBilatu(asIzenakLagun, Indizea + 1, Luzera, sGakoa);
IF Posizioa = 0 THEN (* Gakoa ez dago arrayan, azterketa bakarra egin du *)
BEGIN
asIzenak1[Indize1] := asIzenakLagun[Indizea];
asNotak1[Indize1] := asNotakLagun[Indizea];
Indize1 := Indize1 + 1;
END
ELSE (* Gakoa arrayan dago, bi azterketa egin ditu *)
BEGIN
asIzenak1[Indize1] := asIzenakLagun[Indizea];
asNotak1[Indize1] := asNotakLagun[Indizea];
asIzenak2[Indize2] := asIzenakLagun[Posizioa];
asNotak2[Indize2] := asNotakLagun[Posizioa];
{ ZERGATIK DA ZATI HAU DERRIGORREZKOA? }
// Ikaslearen bigarren azterketa ezabatu, hasiera
FOR k := Posizioa TO Luzera - 1 DO
BEGIN
asIzenakLagun[k] := asIzenakLagun[k + 1];
asNotakLagun[k] := asNotakLagun[k + 1];
END;
Luzera := Luzera - 1;
// Ikaslearen bigarren azterketa ezabatu, amaiera
{ IKUSI PROGRAMAREN EMAITZA ZATI HAU KENDU OSTEAN }
Indize1 := Indize1 + 1;
Indize2 := Indize2 + 1;
END;
Luzera1 := Indize1 - 1;
Luzera2 := Indize2 - 1;
END;
END;Batez bestekoak eta balio maximo/minimoak
{ Funtzio batek emaitza bakarra itzultzen du }
FUNCTION fnrBBaritmetikoaLortu (CONST arNotak : DM_Notak; Luzera : Byte) : Real;
VAR
Indizea : Byte;
rMetagailua : Real;
BEGIN
rMetagailua := 0.0;
FOR Indizea := BEHEMUGA TO Luzera DO
BEGIN
rMetagailua := rMetagailua + arNotak[Indizea];
END;
fnrBBaritmetikoaLortu := rMetagailua / Luzera;
END;
{ Funtzio batek emaitza bakarra itzultzen du }
FUNCTION fnrBBgeometrikoaLortu (CONST arNotak : DM_Notak; Luzera : Byte) : Real;
VAR
Indizea : Byte;
rMetagailua : Real;
BEGIN
rMetagailua := 1.0;
FOR Indizea := BEHEMUGA TO Luzera DO
BEGIN
rMetagailua := rMetagailua * arNotak[Indizea];
END;
fnrBBgeometrikoaLortu := Exp(1.0 / Luzera * Ln(rMetagailua));
END;
{ Prozedura batek emaitza bat baino gehiago itzul ditzake }
PROCEDURE BatazBestekoakLortu (CONST arNotak : DM_Notak; Luzera : Byte; VAR rBBaritmetiko, rBBgeometriko : Real);
VAR
Indizea : Byte;
rMetagailuBBa, rMetagailuBBg : Real;
BEGIN
rMetagailuBBa := 0.0;
rMetagailuBBg := 1.0;
FOR Indizea := BEHEMUGA TO Luzera DO
BEGIN
rMetagailuBBa := rMetagailuBBa + arNotak[Indizea];
rMetagailuBBg := rMetagailuBBg * arNotak[Indizea];
END;
rBBaritmetiko := rMetagailuBBa / Luzera;
rBBgeometriko := Exp(1.0 / Luzera * Ln(rMetagailuBBg));
END;
{ Funtzio batek emaitza bakarra itzultzen du }
FUNCTION fnbMaxPosizioaLortu (CONST arNotak : DM_Notak; Luzera : Byte) : Byte;
VAR
Indizea, Posizioa : Byte;
rMax : Real;
BEGIN
rMax := arNotak[BEHEMUGA];
Posizioa := BEHEMUGA;
FOR Indizea := BEHEMUGA + 1 TO Luzera DO
BEGIN
IF arNotak[Indizea] > rMax THEN
BEGIN
rMax := arNotak[Indizea];
Posizioa := Indizea;
END;
END;
fnbMaxPosizioaLortu := Posizioa;
END;
{ Funtzio batek emaitza bakarra itzultzen du }
FUNCTION fnbMinPosizioaLortu (CONST arNotak : DM_Notak; Luzera : Byte) : Byte;
VAR
Indizea, Posizioa : Byte;
rMin : Real;
BEGIN
rMin := arNotak[BEHEMUGA];
Posizioa := BEHEMUGA;
FOR Indizea := BEHEMUGA + 1 TO Luzera DO
BEGIN
IF arNotak[Indizea] < rMin THEN
BEGIN
rMin := arNotak[Indizea];
Posizioa := Indizea;
END;
END;
fnbMinPosizioaLortu := Posizioa;
END;
{ Prozedura batek emaitza bat baino gehiago itzul ditzake }
PROCEDURE MaxMinPosizioakLortu (CONST arNotak : DM_Notak; Luzera : Byte; VAR MaxNon, MinNon : Byte);
VAR
Indizea, PosizioMax, PosizioMin : Byte;
rMax, rMin : Real;
BEGIN
rMax := arNotak[BEHEMUGA];
PosizioMax := BEHEMUGA;
rMin := arNotak[BEHEMUGA];
PosizioMin := BEHEMUGA;
FOR Indizea := BEHEMUGA + 1 TO Luzera DO
BEGIN
IF arNotak[Indizea] > rMax THEN
BEGIN
rMax := arNotak[Indizea];
PosizioMax := Indizea;
END;
IF arNotak[Indizea] < rMin THEN
BEGIN
rMin := arNotak[Indizea];
PosizioMin := Indizea;
END;
END;
MaxNon := PosizioMax;
MinNon := PosizioMin;
END;
END.