Errusiar Biderketaren Metodoa 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:
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 | { "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 ; 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 ' , MAXINT, ' artekoa), 4059 adibidez: ' ) ; readln(iZenbakia) ; until (iZenbakia >= 0 ) and (iZenbakia <= MAXINT) ; //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