2024(e)ko otsailaren 7(a), asteazkena

4. astea | Errusiar Biderketaren Metodoa programatzen

4. astea | Errusiar Biderketaren Metodoa zertan den izenburuko artikulua gogoratuz, ariketa honetan bi zenbiren arteko biderkadura kalkulatzen duen programari bukaera emango diogu.

Datuak iBiderkagai1 eta iBiderkagai2 kopuru osoak eta positiboak izango dira (biak 0 eta MAXINT artekoak). Adibidez emandako datuak 40 eta 30 badira, eskatzen den pantailaraketaren zatirik mamitsuena hau da:
                   Erdiak   Dobleak
                   ------   -------
         0. maila      40        30  <<< errenkada hau ez da konputatuko
         1. maila      20        60  <<< errenkada hau ez da konputatuko
         2. maila      10       120  <<< errenkada hau ez da konputatuko
         3. maila       5       240
         4. maila       2       480  <<< errenkada hau ez da konputatuko
         5. maila       1       960
Goiko taulan adierazten den bezala iBiderkagai1 aldagaiaren balioa bikoitia bada edo bere erdiak bikoitiak badira, mezu bat agertzeaz gain  iBiderkagai2 aldagaiaren balioa eta bere dobleak ez dira batuketan kontuan izango.

Hona hemen programaren balizko irteera bat emandako datuak 40 eta 30 izatean:



Eta hemen programa beraren irteera emandako datuak 41 eta 30 izatean:


{ "Errusiar Biderketaren Metodoa" aplikatzen duen programa bat idatzi nahi da,   }
{ baina horretarako kalkulu errepikakorrak egin behar dira.                      }

{ DATUAK:                                                                        }
{       Sarrerako datuak, positiboak diren bi zenbaki oso.                       }
{ EMAITZA:                                                                       }
{       Irteera biderkadura izango da, bere datu-mota LONGINT izango da.         }

{ Prozesu errepikakorraren iterazio kopurua zehazteko, iMailak kalkulatuko dugu: } 
{                                2^rMailak = iBiderkagai1                        }
{                                rMailak·ln(2) = ln(iBiderkagai1)                }
{                                iMailak = trunc(ln(iBiderkagai1) / ln(2)        }

program ErrusiarBiderketarenMetodoaProgramatzen ;
const
   iMAXIMOA = 23456 ;     
var
   iBiderkagai1, iBiderkagai2: integer ;
   rMailak: real ;
   iMailak, iErrenkada: integer ;
   iErdia: integer ;
   liDoblea, liBiderkadura: longint ;    
begin
   writeln ;
   writeln ;
   
   writeln(' -------------------------------') ;
   writeln('| Errusiar Biderketaren Metodoa |') ;
   writeln(' -------------------------------') ;
   
   writeln ;
   
   repeat
      write('      Lehen biderkagaia eman (1 eta ', iMAXIMOA, ' artekoa), 4059 adibidez: ') ;
      readln(iBiderkagai1) ;
   until (iBiderkagai1 > 0) and (iBiderkagai1 <= iMAXIMOA) ;      
   
   //writeln('Adibidea -->  2^x=63 ekuazioaren ebazpena 5,98 da eta mailak 5 dira.') ;
   //writeln('Adibidea -->  2^x=64 ekuazioaren ebazpena 6,00 da eta mailak 6 dira.') ;
   //writeln('Adibidea -->  2^x=65 ekuazioaren ebazpena 6,02 da eta mailak 6 dira.') ;     
                                            (* 2^x = 65         *)
   rMailak := ln(iBiderkagai1) / ln(2) ;    (* x·ln(2) = ln(65) *)
   iMailak := trunc(rMailak) ;
   
   //writeln ;
   //writeln(iBiderkagai1, ' zenbakiari dagokion maila kopurua ', iMailak, ' da:') ;
   //writeln ;
   
   repeat
      write('   Bigarren biderkagaia eman (0 eta ', iMAXIMOA, ' artekoa), 1378 adibidez: ') ;
      readln(iBiderkagai2) ;
   until (iBiderkagai2 >= 0) and (iBiderkagai2 <= iMAXIMOA) ;  
   
   writeln ;
   
   writeln('Erdiak':23, 'Dobleak':14) ;
   writeln('------':23, '-------':14) ;
   
   liBiderkadura := 0 ;    { hasieraketa 0 da, biderkadura lortzeko batuketak egingo direlako }
   
   if iBiderkagai1 mod 2 = 0 then    { erdiak eta dobleak kalkulatzen hasi aurretik biderkagaien txanda }
   begin
      writeln('0. maila':13, iBiderkagai1:10, iBiderkagai2:14, '  <<< errenkada hau ez da konputatuko') ;
   end   
   else
   begin
      writeln('0. maila':13, iBiderkagai1:10, iBiderkagai2:14) ; 
      liBiderkadura := liBiderkadura + iBiderkagai2 ;
   end ;      
   
   iErdia := iBiderkagai1 ;
   liDoblea := iBiderkagai2 ;
   for iErrenkada:=1 to iMailak do
   begin
      iErdia := iErdia div 2 ;
      liDoblea := liDoblea * 2 ;  
      
      if iErdia mod 2 = 0 then
      begin
         writeln(iErrenkada:6, '. maila', iErdia:10, liDoblea:14, '  <<< errenkada hau ez da konputatuko') ;
      end   
      else
      begin
         writeln(iErrenkada:6, '. maila', iErdia:10, liDoblea:14) ; 
         liBiderkadura := liBiderkadura + liDoblea ;
      end ;  
   end ; 
   
   writeln ;
   writeln(iBiderkagai1:6, ' x ', iBiderkagai2, ' = ', liBiderkadura, '  Errusiar Metodoaren arabera') ;    
   writeln(iBiderkagai1:6, ' * ', iBiderkagai2, ' = ', iBiderkagai1*iBiderkagai2, '  ohiko * eragilea erabiliz') ;
   
   writeln ;
   writeln ; 
   writeln('====================================================') ;
   writeln('             RETURN sakatu amaitzeko                ') ;
   write  ('====================================================') ;
   readln ;
end.
 

iruzkinik ez:

Argitaratu iruzkina

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