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.



{-----------------------------------------------------------------
 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 }



{-----------------------------------------------------------------
 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.