Pascal: Dakiguna unitatea ikasleen notak kudeatzeko

Teknologia10,53 KB

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.

Deskargatu

PDF Word HTML