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

4. astea | Errusiar Biderketaren Metodoa prestatzen

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

Errusiar Biderketaren Metodoa prestatzen artikulu honen helbura da zehaztea zenbat maila izango diren osoa den zenbaki jakin baterako. Datua: iZenbakia zenbaki osoa. Inkognita: iMailak zenbaki osoa.

Datua den iZenbakia zenbaki oso bat irakurriko dugu (0 eta MAXINT artekoa). Adibidez emandako datua 36 bada, eskatzen den pantailaraketaren zatirik mamitsuena hau da:
                                  Erdiak   Dobleak
                                  ------   -------
                        1. maila      18        72
                        2. maila       9       144
                        3. maila       4       288
                        4. maila       2       576
                        5. maila       1      1152
iZenbakia aldagaian 36 hartu bada, goiko taularen mailak 5 izango dira, zenbakiaren balioa eta mailen kopurua estuki lotuta daude 2 konstantearen bitartez (horri esker erdiak eta dobleak lortzen baitira). Maila kopurua iMailak aldagaian gordetzen bada, hauxe da bere antzeko den rMailak (zenbaki erreala) kalkulua egiteko formula:

2rMailak = iZenbakia
log2(2rMailak) = log2(iZenbakia)
rMailak·log2(2) = log2(iZenbakia)
rMailak·1 = ln(iZenbakia)/ln(2)

rMailak = ln(iZenbakia)/ln(2)
      non ln logaritmo nepertar funtzioa den (ikusi proiektuaren blogeko Proiektua | 7. Ariketa: zenbakien funtzio estandarrak artikuluan ematen diren (III), (IV) eta (V) programak).

Argi dago rMailak aldagaiaren balioa iZenbakia datuarekin lotuta dagoela. Bestalde, rMailak eta iMailak balioen arteko lotura Bi_ber_ZenbakiErreala.pas programaren bitartez azter daiteke; programa horren irteera hauxe da, non ikusten denez iMailak aldagaiaren balioa eskuratzeko rMailak balioari trunkaketa egiten zaion:


Hona hemen eskatzen den programaren balizko irteera bat, non iMailak kalkulatu ondoren zatirik interesgarriena  for iErrenkada:=1 to iMailak do  aginduarena den:


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

{ DATUAK:                                                                        }
{       Sarrerako datua positiboa den zenbaki osoa.                              }
{ EMAITZA:                                                                       }
{       Zenbakiaren balio erdiak pantailaratu behar dira, hots, datuaren erdia   }
{       eta erdiaren erdia eta horrela jaraituz  1 lortu arte. Bide batez, datua }
{       den zenbakiaren doblea (eta hurrengo doblearen dobleak) pantailaratu.    }

program ErrusiarBiderketarenMetodoaPrestatzen ;

const
   iMAXIMOA = 23456 ;

var
   iZenbakia: integer ;
   rMailak: real ;
   iMailak, iErrenkada: integer ;
   iErdia: integer ;
   liDoblea: longint ;    
   
begin 
   writeln ;
   writeln ;   
   writeln(' ------------------------------------------') ;
   writeln('| Errusiar Biderketaren Metodoa prestatzen |') ;
   writeln(' ------------------------------------------') ;   
   writeln ;
   
   repeat
      write('Datua eman (1 eta ', iMAXIMOA, ' artekoa), 4059 adibidez: ') ;
      readln(iZenbakia) ;
   until (iZenbakia >= 0) and (iZenbakia <= 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(iZenbakia) / ln(2) ;    (* x·ln(2) = ln(65) *)
   iMailak := trunc(rMailak) ;
   
   writeln ;
   writeln('2^x=', iZenbakia, ' ekuazioaren ebazpena ', rMailak:0:2, ' da. Mailak ', iMailak, ' dira.') ;
   writeln ;
   
   writeln('Erdiak':32, 'Dobleak':15) ;
   writeln('------':32, '-------':15) ;
   
   (* PROZESU ERREPIKAKORRA ABIATU *)
   for iErrenkada:=1 to iMailak do
   begin
      (* ... *)
   end ;
   (* PROZESU ERREPIKAKORRA AMAITU *)
   
   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.