2024(e)ko apirilaren 4(a), osteguna

11. astea | erregistroen bektore baten elementuak ezabatu

 Elementuak ezabatu bi algoritmo desberdinez

Ikasleen informazioa biltzen duen bektore bat daukagu. Ikasle bakoitzaren informazioa izena eta adina dira.

Ikasleen izenak ez dira errepikatzen eta horregatik BektoreaDatuzBete prozedurak fniIkasleaBilatu funtzioa darabil konprobatzeko onartuko duen ikaslea benetan berria den.

Bektorea datuz horniturik dagoenen bi ezabaketa egiten dira:

  1. Ikasle baten izenaren hasiera A bada, ikasle hori zerrendatik kenduko da (ez da array laguntzailerik erabiltzen)
  2. Ikasle bat gaztea denean, bere adina mediatik behera dagoelako, ikasle hori zerrendatik kenduko da (array laguntzaile bat erabiltzen da)

Bukatu aurretik ikasle berri baten datuak zerrendara eramaten dira. Lehenik tokirik dagoela konprobatzen da, gero ikasle berriaren posizioa zein den eskatzen da eta, azkenean, ikasle berriaren datuak jaso ondoren, erregistro hori dagokion posizioan zerrendan txertatzen da (desberdinduz benetako txertaketa den ala gehiketa den).


Ariketaren balizko kodea ikusi:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
program IzenakEtaAdinakKendu;
const
   BEHEMUGA = 1;
   GOIMUGA = 25;
   
type
   tsKatea = string[15];
   trdIkaslea = record
                   sIzena: tsKatea;
                   iAdina: integer;
                end;
   tardZerrenda = array[BEHEMUGA..GOIMUGA] of trdIkaslea;
   
   
function fniIkasleaBilatu(const ardIkasgela: tardZerrenda;
                                    iLuzera: integer;
                                     sGakoa: tsKatea): integer;
var
   k: integer;
   boAurkitua: boolean;
begin
   k := BEHEMUGA;
   boAurkitua := FALSE;
   while (k <= iLuzera) and not boAurkitua do
   begin
      if UpCase(ardIkasgela[k].sIzena) = UpCase(sGakoa) then
        boAurkitua := TRUE
      else
        k := k+1;
   end;
  
   if boAurkitua then
     fniIkasleaBilatu := k
   else
     fniIkasleaBilatu := -1;    { -1 gezurrezko posizioa litzateke }
end;
  
   
procedure BektoreaDatuDesberdinezBete(var ardIkasgela: tardZerrenda;
                                          var iLuzera: integer);
var
    k, iPosizioa: integer;
    sNor: tsKatea;
begin
   repeat
      write('Ikasleen kopurua eman: ');
      readln(iLuzera);
   until (iLuzera >= BEHEMUGA) and (iLuzera <= GOIMUGA);
    
   writeln;
   writeln('Lehen ikaslearen izena berria delako ez dago errepikaturik...');
   writeln;
      
   write('Eman ', BEHEMUGA, '. ikaslearen izena: ');
   readln(ardIkasgela[BEHEMUGA].sIzena);
   write('Eman ', BEHEMUGA, '. ikaslearen adina: ');
   readln(ardIkasgela[BEHEMUGA].iAdina);
    
   writeln;
   writeln('Gainerako ikaslen izenak ez dira errepikatzen...');
   writeln;
   for k:=BEHEMUGA+1 to iLuzera do
   begin
      repeat
         write('Eman ', k, '. ikaslearen izena: ');
         readln(sNor);
         iPosizioa := fniIkasleaBilatu(ardIkasgela, k-1, sNor);
         if iPosizioa <> -1 then
            writeln('"',sNor, '" izeneko ikaslerik badago ', iPosizioa, '. posizioan');
      until iPosizioa = -1;
         
      ardIkasgela[k].sIzena := sNor;
      write('Eman ', k, '. ikaslearen adina: ');
      readln(ardIkasgela[k].iAdina);
      writeln;
   end;
end;
   
   
procedure BektorearenEdukiaIkusi(const ardIkasgela: tardZerrenda;
                                           iLuzera: integer);
var
    k: integer;
begin
   for k:=BEHEMUGA to iLuzera do
   begin
      write(k, '. ikaslea: ', ardIkasgela[k].sIzena:15);
      writeln(ardIkasgela[k].iAdina:20, ' urte');
   end;
end;
   
  
procedure ElementuBatEzabatu(var ardIkasgela: tardZerrenda;
                                 var iLuzera: integer;
                                           k: integer);
var
   iIndizea: integer;
begin
   for iIndizea:=k to iLuzera-1 do
   begin
      ardIkasgela[iIndizea] := ardIkasgela[iIndizea+1];
   end;
   iLuzera := iLuzera - 1;
end;
   
   
function fnboIzenarenHasiera_A_Da(const rdIkasleBat: trdIkaslea): boolean;
begin
   if (rdIkasleBat.sIzena[1] = 'A') OR
      (rdIkasleBat.sIzena[1] = 'a') then
      fnboIzenarenHasiera_A_Da := TRUE
   else
      fnboIzenarenHasiera_A_Da := FALSE;
end;
   
  
function fnrBatezbestekoaKalkulatu(const ardIkasgela: tardZerrenda;
                                             iLuzera: integer): real;
var
    k: integer;
    rMetagailua: real;
begin
   rMetagailua := 0.0;
   for k:=BEHEMUGA to iLuzera do
   begin
      rMetagailua := rMetagailua + ardIkasgela[k].iAdina;
   end;
     
   fnrBatezbestekoaKalkulatu := rMetagailua/iLuzera;
end;
  
   
procedure IkasleGazteakEzabatu(var ardIkasgela: tardZerrenda;
                                   var iLuzera: integer;
                                rBatezBestekoa: real);
var
   ardLaguntzailea: tardZerrenda;
   iZenbatIkasle, k: integer;
begin
   iZenbatIkasle := 0;
   for k:=BEHEMUGA to iLuzera do
   begin
      if ardIkasgela[k].iAdina >= rBatezBestekoa then
      begin
         iZenbatIkasle := iZenbatIkasle + 1;
         ardLaguntzailea[iZenbatIkasle] := ardIkasgela[k];
      end;
   end;
  
   ardIkasgela := ardLaguntzailea;
   iLuzera := iZenbatIkasle;
end;
 
 
procedure IkasleBatenDatuakJaso(var rdIkasleBat: trdIkaslea);
begin
   write('Eman ikaslearen izena: ');
   readln(rdIkasleBat.sIzena);
   write('Eman ikaslearen adina: ');
   readln(rdIkasleBat.iAdina);
end;
 
 
procedure IkasleBatTxertatu(var ardIkasgela: tardZerrenda;
                                var iLuzera: integer;
                            const rdIkaslea: trdIkaslea;
                                       iNon: integer);
var
   k: integer;
begin
   for k:=iLuzera downto iNon do
   begin
      ardIkasgela[k+1] := ardIkasgela[k];
   end;
   ardIkasgela[iNon] := rdIkaslea;
   iLuzera := iLuzera + 1;
end;
 
 
{=============Programa nagusia eta programa nagusiko aldagaiak=============}
var
   ardIkasgela: tardZerrenda;
   iLuzera, k: integer;
   rBatezBestekoa: real;
   iNon: integer;
   rdIkasleBerria: trdIkaslea;
begin
   writeln('------------------------------------------------');
   writeln;
   BektoreaDatuDesberdinezBete(ardIkasgela, iLuzera);
   writeln;
   BektorearenEdukiaIkusi(ardIkasgela, iLuzera);
  
   k := BEHEMUGA;            (* for k:=BEHEMUGA to iLuzera do *)
   while k <= iLuzera do     (* txarto egongo litzateke       *)
   begin
      if fnboIzenarenHasiera_A_Da(ardIkasgela[k]) then
         ElementuBatEzabatu(ardIkasgela, iLuzera, k)
      else
         k := k+1;
   end;
   
   writeln;
   writeln('Izenaren hasiera A denean ikasleak zerrendatik kendu ostean:');
   BektorearenEdukiaIkusi(ardIkasgela, iLuzera);
   
   writeln;
   rBatezBestekoa := fnrBatezbestekoaKalkulatu(ardIkasgela, iLuzera);
   writeln('BatezBestekoa = ', rBatezBestekoa:0:3);
    
   IkasleGazteakEzabatu(ardIkasgela, iLuzera, rBatezBestekoa);
    
   writeln('Mediatik beherako adina duten ikasleak zerrendatik kendu ostean:');
   BektorearenEdukiaIkusi(ardIkasgela, iLuzera); 
    
   writeln;
   writeln('Ikasle berri baten datuak zerrendan gorde:');
   if iLuzera < GOIMUGA then
   begin
      repeat
         write('Eman ikasle berriaren posizioa zerrendan (');
         write(BEHEMUGA, ' eta ', iLuzera+1, ') artekoa: ');
         readln(iNon);
      until (iNon >= BEHEMUGA) and (iNon <= iLuzera+1);
       
      IkasleBatenDatuakJaso(rdIkasleBerria);
      if iNon = iLuzera+1 then    { txertaketa baino gehiago gehiketa da }
      begin
         ardIkasgela[iNon] := rdIkasleBerria;
         iLuzera := iLuzera+1;
      end
      else                        { elementu berri baten txertaketa }
      begin
         IkasleBatTxertatu(ardIkasgela, iLuzera, rdIkasleBerria, iNon);
      end;
      BektorearenEdukiaIkusi(ardIkasgela, iLuzera);
   end
   else
   begin
      writeln('Zerrenda beterik dago, ezin da ikasle berririk sartu.');
   end;
 
   writeln;
   writeln;
   writeln('Amaituta!----------------------------------------');
   readln;
end. { Programaren bukaera }
 

iruzkinik ez:

Argitaratu iruzkina

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