2024(e)ko martxoaren 18(a), astelehena

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.

Datuen array bat daukagu. Datuak honelakoak dira: lehen karakterea nota eta azken bi karaktereak notaren dezimalak, zifren artean izena. Aurreko adibide-ariketan egin dena: Noten arteko batezbestekoa. Jarraipena den programan hauxe eskatzen dena:

  •  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 soluzio bat:

     programa osoa laster ikusgai... 

     

    iruzkinik ez:

    Argitaratu iruzkina

    Iruzkinen bat idazteko Google-ko kontu bat behar duzu. Iruzkin guztien moderazio-ardura blogeko administratzaileari dagokio.