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