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 |
2 |
24 |
720 |
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: Barruko FOR Barruko prozesu errepikakorrak faktoriala kalkulatuko du. Konkretuki, kanpoko i kontagailuaren faktoriala kalkulatuko du: /* 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: Barruko FOR Barruko prozesu errepikakorrak faktoriala kalkulatuko du. Konkretuki, kanpoko i kontagailuaren dobleari dagokion faktoriala kalkulatuko du: /* 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: Barruko FOR Barruko prozesu errepikakorrak faktoriala kalkulatuko du. Konkretuki, kanpoko i kontagailuaren dagokion faktoriala kalkulatuko du: /* 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; } |
|
iruzkinik ez:
Argitaratu iruzkina