ZER DAKIDAN: Dagoeneko for, do-while eta while agindu errepikakorra erabili ditut. Baina bakoitza edozein egoeratan erabil baiteke? ZER IKASIKO DUDAN: Prozesu errepikorraren iterazio kopurua ezaguna denean for agindu errepikakorra erabiliko dut. Aldiz, prozesu errepikorraren iterazio kopurua ezezaguna denean, do-while edo while agindu errepikakorrek erabiliko ditut. |
Teklatuaren bitartez N zenbaki osoa eta positiboa irakurriz ondoko biderkariaren emaitza lortu:Hau da, biderkagaien kopurua ezaguna denez FOR-DO agindua erabili ahal izango da, sarrerako datua 5 denean biderkaria hau delarik:
(1 - 1/4) * (1 + 1/9) * (1 - 1/16) * (1 + 1/25) * ...
/* Ariketa-32a_Biderkaria_for: iterazio-kopuru ezaguna */ //---------------------------------------------------------------- // iMuga emanda biderkaria lortu: // fBiderkaria = (1 - 1/4) * (1 + 1/9) * (1 - 1/16) * ... // iKontagailua ----> 2 3 4 //---------------------------------------------------------------- #include <stdio.h> int main() { int iMuga, iKontagailua; float fZeinua, fBiderkagaia, fBiderkaria; do // mugaren balioa eskatu { printf("Muga adierazten duen zenbaki osoa eta positiboa eman: "); scanf("%d", &iMuga); } while (iMuga <= 0); printf("\n"); // hasierako balioak fBiderkaria = 1.0; fZeinua = 1.0; for (iKontagailua = 2; iKontagailua <= iMuga; iKontagailua++) { fBiderkagaia = 1 - fZeinua / (iKontagailua * iKontagailua); fBiderkaria *= fBiderkagaia; printf("%3d. itzulian ---> Zeinua=%2.0f Biderkagaia=%0.4f Biderkaria=%0.4f\n", iKontagailua, fZeinua, fBiderkagaia, fBiderkaria); fZeinua *= -1; // zeinua aldatu } printf("\nBiderkaria = %0.4f\n", fBiderkaria); printf("\n"); printf("=======================\n"); printf("RETURN sakatu amaitzeko\n"); printf("=======================\n"); getchar(); // ENTER teklari itxaron (bufferra garbitzeko) getchar(); // edozein tekla sakatu programatik irteteko return 0; }
Bigarren biderkari hau kalkulatzerakoan ez digute ematen biderkagaien kopurua. Horren ordez erabiltzaileak hauta dezake bi biderkarien (bi emaitzen) arteko aldea zein txikia izango den, hots, zenbat eta biderkagai gehiago aintzat hartu biderkaria zehatzagoa da baina gero eta garrantzi txikiago du beste biderkagai berri bat biderkatzeak. Hortaz, biderkagaiak joan biderkatzen jarraian erakusten den baldintza bete arte Abs(rAzkenEmaitza - rAurrekoEmaitza) < rDiferentzia non rDiferentzia teklatuaren bitartez irakurritako zenbaki erreala eta positiboa den, eta rAzkenEmaitza zein rAurrekoEmaitza programan kalkulatutako balioak diren.
Hona hemen batukaria do-while aginduaren bitartez kalkulatzen duen Ariketa-31b_Batukaria_do-while programaren kodea:
/* Ariketa-32b_Biderkaria_do-while: iterazio-kopuru ezezaguna */ //---------------------------------------------------------------- // Bi emaitzen arteko diferentzia emanda fBiderkaria lortu: // fBiderkaria = (1 - 1/4) * (1 + 1/9) * (1 - 1/16) * ... // iKontagailua ----> 2 3 4 // Prozesu errepikorraren iterazio kopurua ez da ezagutzen. Hori // dela eta, ariketa hau ezin daiteke egin for egitura erabiliz. //---------------------------------------------------------------- #include <stdio.h> #include <math.h> // fabs() funtziorako int main() { int iKontagailua; float fZeinua, fDiferentzia, fBiderkagaia, fBiderkaria, fAurrekoEmaitza, fAzkenEmaitza; do // bi emaitzen arteko gehienezko diferentzia eskatu { printf("Eman bi emaitzen arteko diferentzia maximoa (adibidez, 0.003): "); scanf("%f", &fDiferentzia); } while (fDiferentzia <= 0); printf("\n"); // hasierako balioak fBiderkaria = 1.0; fZeinua = 1.0; iKontagailua = 2; // lehen kalkulua begiztatik kanpo fBiderkagaia = 1 - fZeinua / (iKontagailua * iKontagailua); fBiderkaria *= fBiderkagaia; printf("%3d. itzulia begiztatik kanpo, Biderkaria=%0.4f\n", iKontagailua, fBiderkaria); do // kalkulua egiten jarraitu diferentziaren irizpidea betetzen den arte { fAurrekoEmaitza = fBiderkaria; fZeinua *= -1; // Zeinua aldatu iKontagailua++; fBiderkagaia = 1 - fZeinua / (iKontagailua * iKontagailua); fBiderkaria *= fBiderkagaia; fAzkenEmaitza = fBiderkaria; printf("%3d. ---> Zeinua=%2.0f Biderkagaia=%0.4f Biderkaria=%0.4f Diferentzia=%0.4f\n", iKontagailua, fZeinua, fBiderkagaia, fBiderkaria, fabs(fAzkenEmaitza - fAurrekoEmaitza)); } while (fabs(fAzkenEmaitza - fAurrekoEmaitza) >= fDiferentzia); printf("\nBiderkaria = %0.4f\n", fBiderkaria); printf("\n"); printf("=======================\n"); printf("RETURN sakatu amaitzeko\n"); printf("=======================\n"); getchar(); // ENTER teklari itxaron (bufferra garbitzeko) getchar(); // edozein tekla sakatu programatik irteteko return 0; }
Hona hemen batukaria while aginduaren bitartez kalkulatzen duen Ariketa-31c_Batukaria_while programaren kodea:
/* Ariketa-32c_Biderkaria_while: iterazio-kopuru ezezaguna */ //---------------------------------------------------------------- // Bi emaitzen arteko diferentzia emanda fBiderkaria lortu: // fBiderkaria = (1 - 1/4) * (1 + 1/9) * (1 - 1/16) * ... // iKontagailua ----> 2 3 4 // Prozesu errepikorraren iterazio kopurua ez da ezagutzen. Hori // dela eta, ariketa hau ezin daiteke egin for egitura erabiliz. //---------------------------------------------------------------- #include <stdio.h> #include <math.h> // fabs() funtziorako int main() { int iKontagailua; float fZeinua, fDiferentzia, fBiderkagaia, fBiderkaria, fAurrekoEmaitza, fAzkenEmaitza; printf("///////////////////////\n\n"); do // emaitzen arteko gehienezko diferentzia eskatu { printf("Eman bi emaitzen arteko diferentzia maximoa (adibidez, 0.003): "); scanf("%f", &fDiferentzia); } while (fDiferentzia <= 0); printf("\n"); // hasierako balioak fBiderkaria = 1.0; fZeinua = +1.0; iKontagailua = 2; // lehen kalkulua begiztatik kanpo fBiderkagaia = 1 - fZeinua / (iKontagailua * iKontagailua); fBiderkaria *= fBiderkagaia; printf("%3d. itzulia begiztatik kanpo, Batukaria=%7.4f\n", iKontagailua, fBiderkaria); fAurrekoEmaitza = fBiderkaria; // bigarren kalkulua begiztatik kanpo fZeinua = -1.0; iKontagailua = 3; fBiderkagaia = 1 - fZeinua / (iKontagailua * iKontagailua); fBiderkaria *= fBiderkagaia; printf("%3d. itzulia begiztatik kanpo, Batukaria=%7.4f\n", iKontagailua, fBiderkaria); fAzkenEmaitza = fBiderkaria; while (fabs(fAzkenEmaitza - fAurrekoEmaitza) > fDiferentzia) { fAurrekoEmaitza = fBiderkaria; fZeinua *= -1; // zeinua aldatu iKontagailua++; fBiderkagaia = 1 - fZeinua / (iKontagailua * iKontagailua); fBiderkaria *= fBiderkagaia; fAzkenEmaitza = fBiderkaria; printf("%3d. --> Zeinua=%2.0f Biderkagaia=%7.4f Biderkaria=%7.4f Dif.=%7.4f\n", iKontagailua, fZeinua, fBiderkagaia, fBiderkaria, fabs(fAzkenEmaitza - fAurrekoEmaitza)); } printf("\n"); printf("Biderkaria = %.4f\n", fBiderkaria); printf("\n"); printf("=======================\n"); printf("RETURN sakatu amaitzeko\n"); printf("=======================\n"); getchar(); // ENTER teklari itxaron (bufferra garbitzeko) getchar(); // edozein tekla sakatu programatik irteteko return 0; }
|
iruzkinik ez:
Argitaratu iruzkina