2024(e)ko abenduaren 18(a), asteazkena

Ariketa 25 | for habiaratuen hiru bertsio


ZER DAKIDAN:
Menpekoa den for agindu errepikakor bat beste for nagusi baten barnean nola erabili ikasi dut, hots, badakit for habiaratuak erabiltzen.



ZER IKASIKO DUDAN:
Menpekoa den for agindu errepikakor bat beste for nagusi baten barneko programaren bertsio hobetua programatuko dut (beharrezkoak ez diren iterazioak sahiestuz programa azkarrago ibiliko da).

Hurrengo lau ariketak berdintsuak dira:


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
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 % 2 != 0)   /* 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 % 2 != 0)   /* 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 % 2 != 0)   /* 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 % 2 != 0)   /* bai betetzen da */
              liBatukaria = liBatukaria + liFaktoriala ; 
                  27             3      +      4! 
     

 Barruko FOR
Barruko prozesu errepikakorrak faktoriala kalkulatuko du. Konkretuki, kanpoko i kontagailuaren faktoriala kalkulatuko du:
  liFaktoriala = 1 ;   /* i iterazioaren faktoriala kalkulatu */
  for (j=1; j<= i; j++)
  {
     liFaktoriala = liFaktoriala * j ;
     printf("i=%2d    j=%2d    liFaktoriala=%ld\n", i, j, liFaktoriala) ;
  }
    
/* Ariketa-25a_forHabiaratua-1: faktorialen batukari bat */

// iZenbat kopuru osoa, positiboa eta bikoitia teklatuaren bitartez irakurri
// eta batukari hau kalkulatu:
//      liBatukaria = 0! + 2! + 4! + ... + (iZenbat-2)! + iZenbat!

// 1. bertsioa: kanpoko begiztan iZenbat iterazio.

#include <stdio.h>

int main()
{
    int iZenbat, i, j;
    long liBatukaria, liFaktoriala;

    printf("\n\n");

    // erabiltzaileari datuak eskatu beharrezko baldintzak betetzen dituen bitartean
    do
    {
        printf("iZenbat zenbaki osoa, positiboa eta bikoitia eman: ");
        scanf("%d", &iZenbat);
        if (iZenbat < 0)
            printf("Kopuru positiboa behar da\n");
        if (iZenbat % 2 != 0)
            printf("Kopurua zenbaki bikoitia izan behar da\n");
    } while (iZenbat < 0 || iZenbat % 2 != 0);

    printf("\n");

    liBatukaria = 1; // 0! = 1, eta hasieran liBatukaria hori da

    printf("Hasieran, liBatukaria=%ld\n\n", liBatukaria);

    for (i = 1; i <= iZenbat; i++)
    {
        liFaktoriala = 1; // faktorialaren kalkulua hasieratu behar da i-rako
        for (j = 1; j <= i; j++)
        {
            liFaktoriala = liFaktoriala * j;
            printf("i=%2d    j=%2d    liFaktoriala=%ld\n", i, j, liFaktoriala);
        }

        if (i % 2 == 0)
            liBatukaria = liBatukaria + liFaktoriala;
        else
            printf("i=%2d bakoitia delako ez inkrementatu, ", i);

        printf("liBatukaria=%ld\n\n", liBatukaria);
    }

    printf("Batukaria = %ld\n", liBatukaria);

    printf("\n\n");
    printf("=======================\n");
    printf("RETURN sakatu amaitzeko\n");
    printf("=======================\n");
    getchar(); // Amaieran erabiltzailearen enter itxaron
    getchar();

    return 0;
}



      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
Kanpoko prozesu errepikakorra iZenbat/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
Barruko prozesu errepikakorrak faktoriala kalkulatuko du. Konkretuki, kanpoko i kontagailuaren dobleari dagokion faktoriala kalkulatuko du:
  liFaktoriala = 1 ;   /* i iterazioaren faktoriala kalkulatu */
  for (j=1; j<= i*2; j++)
  {
     liFaktoriala = liFaktoriala * j ;
     printf("i=%2d    j=%2d    liFaktoriala=%ld\n", i, j, liFaktoriala) ;
  }
    
/* Ariketa-25b_forHabiaratua-2: faktorialen batukari bat */

// iZenbat kopuru osoa, positiboa eta bikoitia teklatuaren bitartez irakurri
// eta batukari hau kalkulatu:
//      liBatukaria = 0! + 2! + 4! + ... + (iZenbat-2)! + iZenbat!

// 2. bertsioa: kanpoko begiztan iZenbat/2 iterazio.

#include <stdio.h>

int main()
{
    int iZenbat, i, j;
    long liBatukaria, liFaktoriala;

    printf("\n\n");

    // erabiltzaileari datuak eskatu beharrezko baldintzak betetzen dituen bitartean
    do
    {
        printf("iZenbat zenbaki osoa, positiboa eta bikoitia eman: ");
        scanf("%d", &iZenbat);
        if (iZenbat < 0)
            printf("Kopuru positiboa behar da\n");

        if (iZenbat % 2 != 0)
            printf("Kopurua zenbaki bikoitia izan behar da\n");
    } while (iZenbat < 0 || iZenbat % 2 != 0);

    printf("\n");

    liBatukaria = 1; // 0! = 1, eta hasieran liBatukaria hori da

    printf("Hasieran, liBatukaria=%ld\n\n", liBatukaria);

    for (i = 1; i <= iZenbat / 2; i++)
    {
        liFaktoriala = 1; // faktorialaren kalkulua hasieratu behar da i*2-rako
        for (j = 1; j <= i * 2; j++)
        {
            liFaktoriala = liFaktoriala * j;
            printf("i=%2d    j=%2d    liFaktoriala=%ld\n", i, j, liFaktoriala);
        }

        liBatukaria = liBatukaria + liFaktoriala;

        printf("liBatukaria=%ld\n\n", liBatukaria);
    }

    printf("Batukaria = %ld\n", liBatukaria);

    printf("\n\n");
    printf("=======================\n");
    printf("RETURN sakatu amaitzeko\n");
    printf("=======================\n");
    getchar(); // amaieran erabiltzailearen enter itxaron
    getchar();

    return 0;
}



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


  3. BERTSIOA 

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

 Barruko FOR
Barruko prozesu errepikakorrak faktoriala kalkulatuko du. Konkretuki, kanpoko i kontagailuaren dagokion faktoriala kalkulatuko du:
  liFaktoriala = 1 ;   /* i iterazioaren faktoriala kalkulatu */
  for (j=1; j<=i; j++)
  {
     liFaktoriala = liFaktoriala * j ;
     printf("i=%2d    j=%2d    liFaktoriala=%ld\n", i, j, liFaktoriala) ;
  }
    
/* Ariketa-25c_forHabiaratua-3: faktorialen batukari bat */

// iZenbat kopuru osoa, positiboa eta bikoitia teklatuaren bitartez irakurri
// eta batukari hau kalkulatu:
//      liBatukaria = 0! + 2! + 4! + ... + (iZenbat-2)! + iZenbat!

// 3. bertsioa: kanpoko begiztan iZenbat iterazio eta kontrol-aldagaia i=i+2.

#include <stdio.h>

int main()
{
    int iZenbat, i, j;
    long liBatukaria, liFaktoriala;

    printf("\n\n");

    // erabiltzaileari datuak eskatu beharrezko baldintzak betetzen dituen bitartean
    do
    {
        printf("iZenbat zenbaki osoa, positiboa eta bikoitia eman: ");
        scanf("%d", &iZenbat);
        if (iZenbat < 0)
            printf("Kopuru positiboa behar da\n");

        if (iZenbat % 2 != 0)
            printf("Kopurua zenbaki bikoitia izan behar da\n");
    } while (iZenbat < 0 || iZenbat % 2 != 0);

    printf("\n");

    liBatukaria = 1; // 0! = 1, eta hasieran liBatukaria hori da

    printf("Hasieran, liBatukaria=%ld\n\n", liBatukaria);

    for (i = 2; i <= iZenbat; i = i + 2)
    {
        liFaktoriala = 1; // faktorialaren kalkulua hasieratu behar da i-rako
        for (j = 1; j <= i; j++)
        {
            liFaktoriala = liFaktoriala * j;
            printf("i=%2d    j=%2d    liFaktoriala=%ld\n", i, j, liFaktoriala);
        }

        liBatukaria = liBatukaria + liFaktoriala;

        printf("liBatukaria=%ld\n\n", liBatukaria);
    }

    printf("Batukaria = %ld\n", liBatukaria);

    printf("\n\n");
    printf("=======================\n");
    printf("RETURN sakatu amaitzeko\n");
    printf("=======================\n");
    getchar(); // amaieran erabiltzailearen enter itxaron
    getchar();

    return 0;
}







  • Ariketa-25a_forHabiaratuak.cbp | main.c  
  • Ariketa-25b_forHabiaratuak.cbp | main.c  
  • Ariketa-25c_forHabiaratuak.cbp | main.c  


 

iruzkinik ez:

Argitaratu iruzkina