2023(e)ko martxoaren 23(a), osteguna

9. astea | izenak eta kalifikazioak



AUTOEBALUAZIOA



Datuen array bat daukagu. Datuak honelakoak dira: lehen karakterea nota eta azken bi karaktereak notaren dezimalak, zifren artean izena. Eskatzen dena: noten arteko batezbestekoa. Jarraian programa ematen da, eta 09astea_IzenakEtaKalifikazioak [28 minutu 28 segundo] bideoan ikus dezakezu programa horren azalpen zehatza.

{
Kateak gordetzen dituen array batekin lan egin.
Kate bakoitzean letrak eta zifrak daude.
Zifrekin eragiketaren bat egin (adibidean
batezbesteko aritmetikoa kalkulatzen da).

Arrayaren datuak kateak dira, itxura honetako datuak dira:
lehen karakterea nota eta azken bi karaktereak dezimalak.
Adibidez:

'5Jokin40'
'8Isabelle00'
'4Luismari34'
'6Ana66'

- Emaitza batezbestekoa: 5.40 + 8.00 + 4.34 + 6.66 ==> 24.40 / 4 = 6.10
}

program IzenakEtaKalifikazioak ;

uses
crt ; { readkey funtzioa erabili ahal izateko }
const
BEHEMUGA = 1 ;
GOIMUGA = 40 ;
type
tKate25 = string[25] ;
tasZerrenda = array[BEHEMUGA..GOIMUGA] of tKate25 ;


(* Lehenengo parametroa array bat delako eta irteerakoa *)
(* delako erreferentziaz pasatzen da. Gauza bera bigarren *)
(* parametroarekin erreferentziaz ere bere balioa prozedura *)
(* barruan hartu eta irteerakoa delako. *)
procedure ArrayaBete1(var asDatuak: tasZerrenda; var iLuzera: integer) ;
var
k: integer ;
begin
repeat
write('Arrayak zenbat elementu izango ditu? ') ;
readln(iLuzera) ;
until (iLuzera >= BEHEMUGA) and (iLuzera <= GOIMUGA) ;

for k:=BEHEMUGA to iLuzera do
begin
write('''7Joseba43'' itxurako ', k, '. elementua enan: ') ;
readln(asDatuak[k]) ;
end ;
end ;



(* Datuak bektorean jasotzen dira baina beste modu batez. *)
procedure ArrayaBete2(var asDatuak: tasZerrenda; var iLuzera: integer) ;
var
cErantz: char ;
begin
iLuzera := 0 ;
repeat
iLuzera := iLuzera + 1 ;
write('''7Joseba43'' itxurako ', iLuzera, '. datua eman: ') ;
readln(asDatuak[iLuzera]) ;
repeat
write('Datu gehiagorik? (B/E): ') ;
cErantz := readkey ;
writeln(cErantz) ;
cErantz := upcase(cErantz) ;
until (cErantz = 'B') or (cErantz = 'E') ;
writeln ;
until (cErantz = 'E') or (iLuzera = GOIMUGA) ;
end ;



(* Nahiz eta parametro biak sarrerakoak izan, lehenengoa *)
(* array bat delako eta memorian kopia berriak ekiditeko *)
(* erreferentziaz pasatzen da, const delako babesturik *)
(* dago. Bigarren parametroa berriz balioz doa. *)
procedure ArrayaIkusi(const asDatuak: tasZerrenda; iLuzera: integer) ;
var
iIndizea: integer ;
begin
writeln ;
writeln('Arrayaren edukia: ') ;
for iIndizea:=BEHEMUGA to iLuzera do
begin
writeln(iIndizea:2, '. datua = ', asDatuak[iIndizea]) ;
end ;
writeln ;
end ;



(* Funtzio batean parametroak BETI sarrerakoak. *)
function fnrIkaslearenNotaLortu(sIkaslearenDatuak: tKate25): real ;
var
sNota, sDezimalak: tKate25 ;
rNota: real ;
begin
sNota := sIkaslearenDatuak[1] + '.' ;
sDezimalak := copy(sIkaslearenDatuak, Length(sIkaslearenDatuak)-1, 2) ;
sNota := sNota + sDezimalak ;
writeln('|', sNota, '|') ;

val(sNota, rNota) ;

fnrIkaslearenNotaLortu := rNota ;
end ;



(* Funtzio batean parametroak BETI sarrerakoak. *)
function fnrBatezbestekoaKalkulatu(const asDatuak: tasZerrenda;
iLuzera: integer): real ;
var
rMetagailu, rNota: real ;
k: integer ;
begin
rMetagailu := 0.0 ;
for k:=BEHEMUGA to iLuzera do
begin
rNota := fnrIkaslearenNotaLortu(asDatuak[k]) ;
rMetagailu := rMetagailu + rNota ;
end ;

fnrBatezbestekoaKalkulatu := rMetagailu / iLuzera ;
end ;


(* ---------------------- programa nagusia ---------------------- *)

var
asDatuak: tasZerrenda ;
iLuzera: integer ;
rBatezbestekoa: real ;
begin
ArrayaBete1(asDatuak, iLuzera) ;
//ArrayaBete2(asDatuak, iLuzera) ;
ArrayaIkusi(asDatuak, iLuzera) ;

rBatezbestekoa := fnrBatezbestekoaKalkulatu(asDatuak, iLuzera) ;

writeln('Batezbestekoa = ', rBatezbestekoa:0:3) ;

readln ;
end.







Aurreko ariketatik abiatuta ondokoarekin jarraitu.



Datuen array bat daukagu. Datuak honelakoak dira: lehen karakterea nota eta azken bi karaktereak notaren dezimalak, zifren artean izena. Eskatzen dena: Noten arteko batezbestekoa.



Jarraipena:


  • Noten arteko batezbestekoa  

  • Izenak gordetzen dituen array berri bat lortu

  • Notak gordetzen dituen beste array berri bat lortu

  • Ikasle bat bilatu izenen arrayan:


    • Ez badago, mezu informatibo bat pantailaratu

    • Baldin badago, bere nota aldatu eta noten batezbestekoa izan dadila


  • Izen berri bat txertatu izenak gordetzen dituen arrayan eta berari dagokion nota berri bat txertatu notak gordetzen dituen beste arrayan. Horretarako:


    • Izen berria teklatuz eskatuko zaio erabiltzaileari

    • Nota berria batezbestekoa izan dadila, noten arrayak dituen azken balioiekin batezbestekoa berriro kalkulatu eta kalifikazio hori txertatu  


  • Izenak gordetzen dituen arraya alfabetikoki sailkatu eta ordena berbera aplikatu notak gordetzen dituen arrayri 


Baina, mesedez, zure programa ez dadila izan irudi honek adierazten duena:








    Ikusi hemen jarraipenaren balizko soluzioa bat:

    program IzenakEtaKalifikazioak_Jarraipena ;

    uses
    crt ; { readkey funtzioa erabili ahal izateko }
    const
    BEHEMUGA = 1 ;
    GOIMUGA = 40 ;


           programa osoa laster ikusgai... 





    {
    Kateak gordetzen dituen array batekin lan egin.
    Kate bakoitzean letrak eta zifrak daude.
    Zifrekin eragiketaren bat egin (adibidean
    batezbesteko aritmetikoa kalkulatzen da).

    Arrayaren datuak kateak dira, itxura honetako datuak dira:
    lehen karakterea nota eta azken bi karaktereak dezimalak.
    Adibidez:

    '5Jokin40'
    '8Isabelle00'
    '4Luismari34'
    '6Ana66'

    - Emaitza batezbestekoa: 5.40 + 8.00 + 4.34 + 6.66 = 6.10
    - Izenak gordetzen dituen array bat lortu.
    - Notak gordetzen dituen array bat lortu.
    - Ikasle bat bilatu izenen arrayean:
    * Ez badago, mezu informatibo bat pantailaratu.
    * Baldin badago, bere nota batezbestekoa izan dadila.
    - Ikasle baten datuak txertatu bi arrayetan:
    * Izena, teklatuz eskatu.
    * Nota, batezbestekoaren kalkulua izan dadila.
    - Izenak gordetzen dituen arraya alfabetikoki sailkatu eta
    ordena berbera aplikatu notak gordetzen dituen arrayari.
    }

    program IzenakEtaKalifikazioak_Jarraipena ;

    uses
    crt ; { readkey funtzioa erabili ahal izateko }
    const
    BEHEMUGA = 1 ;
    GOIMUGA = 40 ;
    type
    tKate25 = string[25] ;
    tasZerrenda = array[BEHEMUGA..GOIMUGA] of tKate25 ;
    tarNotak = array[BEHEMUGA..GOIMUGA] of real ;


    (* Lehenengo parametroa array bat delako eta irteerakoa *)
    (* delako erreferentziaz pasatzen da. Gauza bera bigarren *)
    (* parametroarekin erreferentziaz ere bere balioa prozedura *)
    (* barruan hartu eta irteerakoa delako. *)
    procedure ArrayaBete1(var asDatuak: tasZerrenda; var iLuzera: integer) ;
    var
    k: integer ;
    begin
    repeat
    write('Arrayak zenbat elementu izango ditu? ') ;
    readln(iLuzera) ;
    until (iLuzera >= BEHEMUGA) and (iLuzera <= GOIMUGA) ;

    for k:=BEHEMUGA to iLuzera do
    begin
    write('''7Joseba43'' itxurako ', k, '. elementua enan: ') ;
    readln(asDatuak[k]) ;
    end ;
    end ;



    (* Datuak bektorean jasotzen dira baina beste modu batez. *)
    procedure ArrayaBete2(var asDatuak: tasZerrenda; var iLuzera: integer) ;
    var
    cErantz: char ;
    begin
    iLuzera := 0 ;
    repeat
    iLuzera := iLuzera + 1 ;
    write('''7Joseba43'' itxurako ', iLuzera, '. datua eman: ') ;
    readln(asDatuak[iLuzera]) ;
    repeat
    write('Datu gehiagorik? (B/E): ') ;
    cErantz := readkey ;
    writeln(cErantz) ;
    cErantz := upcase(cErantz) ;
    until (cErantz = 'B') or (cErantz = 'E') ;
    writeln ;
    until (cErantz = 'E') or (iLuzera = GOIMUGA) ;
    end ;



    (* Nahiz eta parametro biak sarrerakoak izan, lehenengoa *)
    (* array bat delako eta memorian kopia berriak ekiditeko *)
    (* erreferentziaz pasatzen da, const delako babesturik *)
    (* dago. Bigarren parametroa berriz balioz doa. *)
    procedure ArrayaIkusi(const asDatuak: tasZerrenda; iLuzera: integer) ;
    var
    iIndizea: integer ;
    begin
    writeln ;
    writeln('Arrayaren edukia: ') ;
    for iIndizea:=BEHEMUGA to iLuzera do
    begin
    writeln(iIndizea:2, '. datua = ', asDatuak[iIndizea]) ;
    end ;
    writeln ;
    end ;



    (* Funtzio batean parametroak BETI sarrerakoak. *)
    function fnrIkaslearenNotaLortu(sIkaslearenDatuak: tKate25): real ;
    var
    sNota, sDezimalak: tKate25 ;
    rNota: real ;
    begin
    sNota := sIkaslearenDatuak[1] + '.' ;
    sDezimalak := copy(sIkaslearenDatuak, Length(sIkaslearenDatuak)-1, 2) ;
    sNota := sNota + sDezimalak ;
    //writeln('|', sNota, '|') ;

    val(sNota, rNota) ;

    fnrIkaslearenNotaLortu := rNota ;
    end ;



    (* Funtzio batean parametroak BETI sarrerakoak. *)
    function fnrBatezbestekoaKalkulatu(const asDatuak: tasZerrenda;
    iLuzera: integer): real ;
    var
    rMetagailu, rNota: real ;
    k: integer ;
    begin
    rMetagailu := 0.0 ;
    for k:=BEHEMUGA to iLuzera do
    begin
    rNota := fnrIkaslearenNotaLortu(asDatuak[k]) ;
    rMetagailu := rMetagailu + rNota ;
    end ;

    fnrBatezbestekoaKalkulatu := rMetagailu / iLuzera ;
    end ;



    (* Parametro biak sarrerakoak dira. *)
    procedure NotakIkusi(const arNotak: tarNotak; iLuzera: integer) ;
    var
    k: integer ;
    begin
    for k:=BEHEMUGA to iLuzera do
    begin
    writeln(k:2, '. datua = ', arNotak[k]:0:2) ;
    end ;
    writeln ;
    end ;



    (* Funtzio batean parametroak BETI sarrerakoak. *)
    function fnsIkaslearenIzenaLortu(sIkaslearenDatuak: tKate25): tKate25 ;
    begin
    delete(sIkaslearenDatuak, 1, 1) ;
    delete(sIkaslearenDatuak, Length(sIkaslearenDatuak)-1, 2) ;
    writeln('|', sIkaslearenDatuak, '|') ;

    fnsIkaslearenIzenaLortu := sIkaslearenDatuak ;
    end ;



    (* Lehen parametro biak emaitzak direlako irteerakoak dira, *)
    (* beste bi parametroak datuak direlako eta aldatzen ez *)
    (* direlako sarrerakoak dira: hasierako arraya eta luzera. *)
    procedure IzenenEtaNotenArrayakLortu(var asIzenak: tasZerrenda;
    var arNotak: tarNotak;
    const asDatuak: tasZerrenda;
    iLuzera: integer) ;
    var
    k: integer ;
    begin
    for k:=BEHEMUGA to iLuzera do
    begin
    arNotak[k] := fnrIkaslearenNotaLortu(asDatuak[k]) ;
    asIzenak[k] := fnsIkaslearenIzenaLortu(asDatuak[k]) ;
    end ;
    end ;



    (* Funtzio batean parametroak BETI sarrerakoak. *)
    function fniIkasleaBilatu( sIkaslea: tKate25;
    const asIzenak: tasZerrenda;
    iLuzera: integer): integer ;
    var
    k: integer ;
    boAurkitua: boolean ;
    begin
    boAurkitua := FALSE ;
    k := BEHEMUGA ;
    WHILE (k <= iLuzera) and NOT boAurkitua do
    begin
    if asIzenak[k] = sIkaslea then
    boAurkitua := TRUE
    else
    k := k + 1 ;
    end ;

    if boAurkitua then
    fniIkasleaBilatu := k
    else
    fniIkasleaBilatu := 0 ; { 0 gezurrezko posizioa litzateke }
    end ;



    (* Funtzio batean parametroak BETI sarrerakoak. *)
    function fnrBatezbestekoaBerriroKalkulatu(const arNotak: tarNotak;
    iLuzera: integer): real ;
    var
    rMetagailu: real ;
    k: integer ;
    begin
    rMetagailu := 0.0 ;
    for k:=BEHEMUGA to iLuzera do
    begin
    rMetagailu := rMetagailu + arNotak[k] ;
    end ;

    fnrBatezbestekoaBerriroKalkulatu := rMetagailu / iLuzera ;
    end ;



    (* Lehen parametroa irteerako eta beste hirurak sarrerakoak. *)
    (* Adi: iLuzera bi arrayena delako programa nagusian aldatu. *)
    procedure IzenenArrayanTxertaketaEgin(var asIzenak: tasZerrenda;
    iLuzera: integer;
    iIkasleaNon: integer;
    sIkaslea: tKate25) ;
    var
    k: integer ;
    begin
    (* tokia egin *)
    for k:=iLuzera downto iIkasleaNon do
    begin
    asIzenak[k+1] := asIzenak[k] ;
    end ;
    asIzenak[iIkasleaNon] := sIkaslea ;
    end ;



    (* Lehen parametroa irteerako eta beste hirurak sarrerakoak. *)
    (* Adi: iLuzera bi arrayena delako programa nagusian aldatu. *)
    procedure NotenArrayanTxertaketaEgin(var arNotak: tarNotak;
    iLuzera: integer;
    iIkasleaNon: integer;
    rBatezbestekoa: real) ;
    var
    k: integer ;
    begin
    (* tokia egin *)
    for k:=iLuzera downto iIkasleaNon do
    begin
    arNotak[k+1] := arNotak[k] ;
    end ;
    arNotak[iIkasleaNon] := rBatezbestekoa ;
    end ;



    (* Lehen parametro biak irteerakoak dira aldatuko direlako *)
    (* eta hirugarrena sarrerakoa bere balioa mantenduko delako. *)
    procedure IzenenEtaNotenArrayakSailkatu(var asIzenak: tasZerrenda;
    var arNotak: tarNotak;
    iLuzera: integer) ;
    var
    k, j: integer ;
    sIzenTxikiena: tKate25 ;
    sTxikienaNon: integer ;
    rLaguntzailea: real ;
    begin
    for k:=BEHEMUGA to iLuzera-1 do
    begin
    sIzenTxikiena := asIzenak[k] ;
    sTxikienaNon := k ;
    for j:=k+1 to iLuzera do
    begin
    if asIzenak[j] < sIzenTxikiena then
    begin
    sIzenTxikiena := asIzenak[j] ; { izen txikiena zehazten }
    sTxikienaNon := j ;
    end ;
    end ;
    asIzenak[sTxikienaNon] := asIzenak[k] ; { izen txikiena sailkatzen }
    asIzenak[k] := sIzenTxikiena ;

    rLaguntzailea := arNotak[sTxikienaNon] ; { dagokion nota sailkatzen }
    arNotak[sTxikienaNon] := arNotak[k] ;
    arNotak[k] := rLaguntzailea ;
    end ;
    end ;



    (* ---------------------- programA NAGUSIA ---------------------- *)

    var
    asDatuak: tasZerrenda ;
    iLuzera: integer ;
    rBatezbestekoa: real ;

    asIzenak: tasZerrenda ;
    arNotak: tarNotak ;
    sIkaslea: tKate25 ;
    iIkasleaNon: integer ;
    begin
    ArrayaBete1(asDatuak, iLuzera) ;
    //ArrayaBete2(asDatuak, iLuzera) ;
    ArrayaIkusi(asDatuak, iLuzera) ;

    rBatezbestekoa := fnrBatezbestekoaKalkulatu(asDatuak, iLuzera) ;

    writeln('Batezbestekoa = ', rBatezbestekoa:0:3) ;

    writeln ;
    writeln('========================================================') ;
    writeln ;

    IzenenEtaNotenArrayakLortu(asIzenak, arNotak, asDatuak, iLuzera) ;

    ArrayaIkusi(asIzenak, iLuzera) ;
    NotakIkusi(arNotak, iLuzera) ;

    writeln(rBatezbestekoa:0:3, ' balioa ikasle bati esleitu.') ;
    write('Bilatu nahi duzun ikaslearen izena eman: ') ;
    readln(sIkaslea) ;

    iIkasleaNon := fniIkasleaBilatu(sIkaslea, asIzenak, iLuzera) ;

    if iIkasleaNon = 0 then
    begin
    writeln('"', sIkaslea,'" izeneko ikaslerik ez dago') ;
    writeln ;
    end
    else
    begin
    arNotak[iIkasleaNon] := rBatezbestekoa ;
    NotakIkusi(arNotak, iLuzera) ;
    end ;

    if iLuzera < GOIMUGA then
    begin
    writeln('Batezbestekoa berriro kalkulatu eta ikasle bati ezarri.') ;
    writeln('Posizioa eman eta bertan elementu berri hori txertatu.') ;
    repeat
    write('Zein posiziotan txertatuko da elementu berria? ') ;
    readln(iIkasleaNon) ;
    until (iIkasleaNon >= BEHEMUGA) and (iIkasleaNon <= iLuzera+1) ;

    rBatezbestekoa := fnrBatezbestekoaBerriroKalkulatu(arNotak, iLuzera) ;
    write('Txertatu behar den ikaslearen izena eman: ') ;
    readln(sIkaslea) ;

    IzenenArrayanTxertaketaEgin(asIzenak, iLuzera, iIkasleaNon, sIkaslea) ;
    NotenArrayanTxertaketaEgin(arNotak, iLuzera, iIkasleaNon, rBatezbestekoa) ;

    iLuzera := iLuzera + 1 ; { txertaketa prozeduretan ez delako luzera aldatu }

    ArrayaIkusi(asIzenak, iLuzera) ;
    NotakIkusi(arNotak, iLuzera) ;
    end
    else
    begin
    writeln('Elementu berririk ezin daiteke txertatu bektorea beterik dagoelako.') ;
    writeln ;
    end ;

    writeln('========================================================') ;
    writeln ;

    IzenenEtaNotenArrayakSailkatu(asIzenak, arNotak, iLuzera) ;

    writeln('Sailkatu ondoren:') ;
    ArrayaIkusi(asIzenak, iLuzera) ;
    NotakIkusi(arNotak, iLuzera) ;

    readln ;
    end.



    iruzkinik ez:

    Argitaratu iruzkina