2024(e)ko martxoaren 14(a), osteguna

8. astea | zenbakiak teklatuz irakurtzen

Behin baino gehiagotan gertatu zaigu readln(iZenbakia)eta readln(rZenbakia) instrukzioak exekutatzean programa bukatu zaigula datu okerra sartu dugulako.

Adibidez, aurreko readln(iZenbakia)instrukzioarako -12.5 ematean puntua ez da onartzen eta programak abortatu egiten du. Arazo bera gertatuko litzateke -2M5 ematean edo  +2E5 ematean, batean M karakterea ez delako onartzen eta bestean E karakterea delako onartzen ez dena.

Zenbaki errealekin antzeko zerbait gertatzen da, osoek baino karaktere gehiago onartzen dituzte errealek (adibidez e, E eta puntua) baina karaktere desegoki bat ematean programak abortatu egiten du ere. Esate baterako, aurreko readln(rZenbakia)instrukzioarako ezin daiteke -2.7M5 eman.

Ondoko programa bi hauek zenbakien sarrera zaintzen dute. Horretarako zenbakia string bezala irakurtzen da, gero val prozedura aplikatuz erabakitzen da zer egin sarrera desegokia izan bada.



Kateen azpiprogramak: length(), val()
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
{-----------------------------------------------------------------
 Programa honen bitartez integer datu-motako datuak jasoko ditugu.
 -----------------------------------------------------------------}
program IntegerBatIrakurtzenKateBatenBitartez;
 
uses
   crt;
 
type
   tsKatea = string[15];
 
 
{------------------------Programa Nagusia--------------------}
var
   sDatua: tsKatea;
   iDatua: integer;
   iErrorea: integer;
   cAukera: char;
begin
   { Programak behin eta berriro exekutatuko da erabiltzaileak amaitzeko erabakia hartu arte }
   repeat
      writeln('Programak honek zenbaki oso bat eskatuko du, teklatuz jasotako zenbaki hori');
      writeln('string batean gordeko da eta val prozeduraren bitartez integer datu-motakoa');
      writeln('den aztertuko da. Kopuru osoa teklatuz sartu ezean prozesua errepikatuko da');
      writeln;
   
      repeat
         {zenbakia string bezala irakurtzen da, honek ez du sekulan errorerik sortzen}
         write('Sar ezazu zenbaki oso bat: ');
         readln(sDatua);
          
         {datua den string hori zenbaki bihurtu eta aztertu errorerik gertatu den}
         val(sDatua, iDatua, iErrorea);
          
         if iErrorea <> 0 then
         begin
            writeln('Sarrera onartezina, ', iErrorea, '. posizioko zifra ez da egokia: ', sDatua[iErrorea]);
            writeln('berriro errepikatu');
            writeln;
         end;       
      until iErrorea = 0;
       
      {datua den string hori zenbaki bihurtu dela frogatzeko bere doble pantailaratu}
      writeln('Sartutako datuaren doblea: ', iDatua*2);
      writeln;
      writeln;
       
      write('Beste zenbakirik? (B ala E): ');
      repeat
         cAukera := upcase(readkey);
      until (cAukera = 'E') or (cAukera = 'B');
      clrscr;
   until cAukera = 'E';
end.                                                { Programaren amaiera }



Kateen azpiprogramak: val()
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
{-----------------------------------------------------------------
 Programa honen bitartez real datu-motako datuak jasoko ditugu.
 -----------------------------------------------------------------}
program RealBatIrakurtzenKateBatenBitartez;
 
uses
   crt;
 
type
   tsKatea = string[15];
 
 
{------------------------Programa Nagusia--------------------}
var
   sDatua: tsKatea;
   rDatua: real;
   iErrorea: integer;
   cAukera: char;
begin
   { Programak behin eta berriro exekutatuko da erabiltzaileak amaitzeko erabakia hartu arte }
   repeat
      writeln('Programak honek zenbaki bat eskatuko du, teklatuz jasotako zenbaki hori');
      writeln('string batean gordeko da eta val prozeduraren bitartez real datu-motakoa');
      writeln('den aztertuko da. Zenbaki teklatuz sartu ezean prozesua errepikatuko da');
      writeln;
   
      repeat
         {zenbakia string bezala irakurtzen da, honek ez du sekulan errorerik sortzen}
         write('Sar ezazu zenbaki bat: ');
         readln(sDatua);
          
         {datua den string hori zenbaki bihurtu eta aztertu errorerik gertatu den}
         val(sDatua, rDatua, iErrorea);
          
         if iErrorea <> 0 then
         begin
            writeln('Sarrera onartezina, ', iErrorea, '. posizioko zifra ez da egokia: ', sDatua[iErrorea]);
            writeln('berriro errepikatu');
            writeln;
         end;       
      until iErrorea = 0;
       
      {datua den string hori zenbaki bihurtu dela frogatzeko bere doble pantailaratu}
      writeln('Sartutako datuaren doblea: ', rDatua*2:0:3);
      writeln;
      writeln;
       
      write('Beste zenbakirik? (B ala E): ');
      repeat
         cAukera := upcase(readkey);
      until (cAukera = 'E') or (cAukera = 'B');
      clrscr;
   until cAukera = 'E';
end.                                                { Programaren amaiera }


 

iruzkinik ez:

Argitaratu iruzkina

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