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

4. astea | FOR-DO bat beste FOR-DO baten barruan

Batugaien iZenbat kopurua zehaztuko duen balioa teklatuz irakurriz, kalkulatu ondoko batukaria eta emaitza liBatukaria aldagaian gorde. Ziurtatu iZenbat kopuru osoa, positiboa eta bikoitia dela.

Batukariaren batugaiak zenbait zenbakien faktorialak dira, hauek:

liBatukaria = 0! + 2! + 4! + 6! + ... + (iZenbat-2)! + iZenbat!

Batukaria lortzen duen programaren bi bertsio egingo ditugu.




1. BERTSIOA                 iZenbat=8                        
Kanpoko  i
hasieraketa
0!=1
1
2
3 4
5 6
7 8
Barruko  j
1
1..2
1..3
1..4
1..5
 1..6
1..7 1..8
liFaktoriala
1
2
6 24
120  720
5040 40320
liBatukaria
1
1
3
3 27
27 747
747 41067


  1. BERTSIOA 

 Kanpoko FOR-TO-DO
Kanpoko prozesu errepikakorra iZenbat aldiz errepikatuko da. Gogoratu prozesu errepikakorrera sartu aurretik beharrezkoak diren hasieraketak egin behar direla. Suposatuz prozesu errepikakorraren 0! lehen batugaia kanpoan egiten dela, lehen iterazioa i=1 hau izango litzateke:
           liBatukaria :=  liBatukaria  + liFaktoriala ;
           liBatukaria    [hasieraketa] + [lehenengoa]
           liBatukaria       (0!=1)     +      1!         
           
           if i mod 2 = 0 then   (* ez da betetzen *)
              liBatukaria := liBatukaria + liFaktoriala ; 
    
Suposatuz prozesu errepikakorraren 0! kanpoan egiten dela, bigarren iterazioa i=2 hau izango litzateke:
           liBatukaria :=  liBatukaria  + liFaktoriala ;
           liBatukaria     [metatua]    + [bigarrena]
           liBatukaria         1        +      2!            
           
           if i mod 2 = 0 then   (* bai betetzen da *)
              liBatukaria := liBatukaria + liFaktoriala ; 
                   3              1      +      2! 
    
Suposatuz prozesu errepikakorraren 0! kanpoan egiten dela, hirugarren iterazioa i=3 hau izango litzateke:
           liBatukaria :=  liBatukaria  + liFaktoriala ;
           liBatukaria     [metatua]    + [hirugarrena]
           liBatukaria         3        +      3!            
           
           if i mod 2 = 0 then   (* ez da betetzen *)
              liBatukaria := liBatukaria + liFaktoriala ; 
    
Suposatuz prozesu errepikakorraren 0! kanpoan egiten dela, laugarren iterazioa i=4 hau izango litzateke:
           liBatukaria :=  liBatukaria  + liFaktoriala ;
           liBatukaria     [metatua]    + [laugarrena]
           liBatukaria         3        +      4!            
           
           if i mod 2 = 0 then   (* bai betetzen da *)
              liBatukaria := liBatukaria + liFaktoriala ; 
                  27              3      +      4! 
     

 Barruko FOR-TO-DO
Barruko prozesu errepikakorrak faktoriala kalkulatuko du. Konkretuki, kanpoko i kontagailuaren faktoriala kalkulatuko du:
  liFaktoriala := 1 ;   (* i iterazioaren faktoriala kalkulatu *)
  for j:=1 to  i  do
  begin
     liFaktoriala := liFaktoriala * j ;
     writeln('i=', i, '    j=', j, '    liFaktoriala=', liFaktoriala) ;
  end ;
    
{----------------------------------------------------------------------------
  1. BERTSIOA
  
  iZenbat kopuru osoa, positiboa eta bikoitia teklatuaren bitartez irakurri
  eta batukari hau kalkulatu:

      liBatukaria = 0! + 2! + 4! + ... + (iZenbat-2)! + iZenbat!
-----------------------------------------------------------------------------}

program FOR_bat_beste_FOR_baten_barruan_1 ;
 
var
   iZenbat, i, j: integer ;
   liBatukaria, liFaktoriala: longint ;

begin
   writeln ;
   writeln ;
   
   repeat
      write('iZenbat zenbaki osoa, positiboa eta bikoitia eman: ') ;
      readln(iZenbat) ;
      if iZenbat < 0 then
         writeln('Kopuru positiboa behar da') ;
      if iZenbat mod 2 <> 0 then
         writeln('Kopurua zenbaki bikoitia izan behar da') ;
   until (iZenbat >= 0) and (iZenbat mod 2 = 0) ;

   writeln ;

   liBatukaria := 1 ;
   (* 0! = 1 eta hasieran egiten dugulako liBatukaria = 1 *)

   writeln('Hasieran, liBatukaria=', liBatukaria) ;
   writeln ;
   for i:=1 to iZenbat do
   begin
      liFaktoriala := 1 ;   (* i iterazioaren faktoriala kalkulatu *)
      for j:=1 to i do
      begin
         liFaktoriala := liFaktoriala * j ;
         writeln('i=', i:2, '    j=', j:2, '    liFaktoriala=', liFaktoriala) ;
      end ;

      if i mod 2 = 0 then
         liBatukaria := liBatukaria + liFaktoriala
      else
         write('i=', i:2, ' bakoitia delako ez inkrementatu, ') ;

      writeln('liBatukaria=', liBatukaria) ;
      writeln ;
   end ;

   writeln('Batukaria = ', liBatukaria) ;

   writeln ;
   writeln ;
   writeln('=======================') ;
   writeln('RETURN sakatu amaitzeko') ;
   writeln('=======================') ;
   readln ;
end.         { lehen bertsioaren amaiera }




      2. BERTSIOA                 iZenbat=8             
Kanpoko  i
hasieraketa
0!=1
1
2
3 4
Barruko  j
1..1x2
1..2x2
1..3x2
1..4x2
liFaktoriala
2
24
720 40320
liBatukaria
1
3
27
747 41067


  2. BERTSIOA 

 Kanpoko FOR-TO-DO
Kanpoko prozesu errepikakorra iZenbat div 2 aldiz errepikatuko da. Gogoratu prozesu errepikakorrera sartu aurretik beharrezkoak diren hasieraketak egin behar direla. Suposatuz prozesu errepikakorraren 0! lehen batugaia kanpoan egiten dela, lehen iterazioa i=1 hau izango litzateke:
           liBatukaria :=  liBatukaria  + liFaktoriala ;
           liBatukaria    [hasieraketa] + [lehenengoa]
           liBatukaria       (0!=1)     +    (2*1)!
           
           liBatukaria := liBatukaria + liFaktoriala ; 
                3              1      +      2!           
Suposatuz prozesu errepikakorraren 0! kanpoan egiten dela, bigarren iterazioa i=2 hau izango litzateke:
           liBatukaria :=  liBatukaria  + liFaktoriala ;
           liBatukaria     [metatua]    + [bigarrena]
           liBatukaria         3        +    (2*2)!            
           
           liBatukaria := liBatukaria + liFaktoriala ; 
               27              3      +      4! 
    

 Barruko FOR-TO-DO
Barruko prozesu errepikakorrak faktoriala kalkulatuko du. Konkretuki, kanpoko i kontagailuaren dobleari dagokion faktoriala kalkulatuko du:
  liFaktoriala := 1 ;   (* i iterazioaren faktoriala kalkulatu *)
  for j:=1 to  i*2  do
  begin
     liFaktoriala := liFaktoriala * j ;
     writeln('i=', i, '    j=', j, '    liFaktoriala=', liFaktoriala) ;
  end ;
    
{----------------------------------------------------------------------------
  2. BERTSIOA
  
  iZenbat kopuru osoa, positiboa eta bikoitia teklatuaren bitartez irakurri
  eta batukari hau kalkulatu:

      liBatukaria = 0! + 2! + 4! + ... + (iZenbat-2)! + iZenbat!
-----------------------------------------------------------------------------}

program FOR_bat_beste_FOR_baten_barruan_2 ;
 
var
   iZenbat, i, j: integer ;
   liBatukaria, liFaktoriala: longint ;

begin
   writeln ;
   writeln ;
   
   repeat
      write('iZenbat zenbaki osoa, positiboa eta bikoitia eman: ') ;
      readln(iZenbat) ;
      if iZenbat < 0 then
         writeln('Kopuru positiboa behar da') ;
      if iZenbat mod 2 <> 0 then
         writeln('Kopurua zenbaki bikoitia izan behar da') ;
   until (iZenbat >= 0) and (iZenbat mod 2 = 0) ;

   writeln ;

   liBatukaria := 1 ;
   (* 0! = 1 eta hasieran egiten dugulako liBatukaria = 1 *)

   writeln('Hasieran, liBatukaria=', liBatukaria) ;
   writeln ;
   for i:=1 to iZenbat div 2 do
   begin
      liFaktoriala := 1 ;   (* i iterazioaren faktoriala kalkulatu *)
      for j:=1 to i*2 do
      begin
         liFaktoriala := liFaktoriala * j ;
         writeln('i=', i:2, '    j=', j:2, '    liFaktoriala=', liFaktoriala) ;
      end ;

      liBatukaria := liBatukaria + liFaktoriala ;

      writeln('liBatukaria=', liBatukaria) ;
      writeln ;
   end ;

   writeln('Batukaria = ', liBatukaria) ;

   writeln ;
   writeln ;
   writeln('=======================') ;
   writeln('RETURN sakatu amaitzeko') ;
   writeln('=======================') ;
   readln ;
end.        { bigarren bertsioaren amaiera }

iruzkinik ez:

Argitaratu iruzkina

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