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.