| 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 S zenbaki osoa eta positiboa irakurriz ondoko batukariaren emaitza lortu:Argi dagoenez, batugaien kopurua ezaguna denez for agindua erabili ahal izango da, sarrerako datua 7 denean batukaria hau delarik:
-1/1 +1/4 -1/9 +1/16 -1/25 +1/36 -1/49
/* Ariketa-31a_Batukaria_for: iterazio-kopuru ezaguna */
//-----------------------------------------------------------------------------------
// iMuga emanda batukaria lortu: fBatukaria = -1/1 +1/4 -1/9 + ... +1/(iMuga*iMuga)
//-----------------------------------------------------------------------------------
#include <stdio.h>
int main()
{
int iMuga, iKontagailua;
double fZeinua, fBatugaia, fBatukaria;
printf("///////////////////////\n\n");
do // muga eskatu
{
printf("Muga adierazten duen zenbaki osoa eta positiboa eman: ");
scanf("%d", &iMuga);
} while (iMuga <= 0);
printf("\n");
fBatukaria = 0.0; // batukariaren hasierako balioa
fZeinua = -1.0; // hasierako zeinua
// kalkulua burutu iterazio koputu jakin baten bidez
for (iKontagailua = 1; iKontagailua <= iMuga; iKontagailua++)
{
fBatugaia = fZeinua / (iKontagailua * iKontagailua);
fBatukaria += fBatugaia;
printf("%3d. itzulian ---> Zeinua=%2.0f Batugaia=%7.4f Batukaria=%7.4f\n",
iKontagailua, fZeinua, fBatugaia, fBatukaria);
fZeinua *= -1; // Zeinua aldatzea
}
printf("\n");
printf("Batukaria = %.4f\n", fBatukaria);
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;
}
Batukari hau kalkulatzerakoan ez digute ematen batugaien kopurua. Horren ordez, bi batukarien arteko aldea zein txikia izango den erabiltzaileak hautatuko du, hots, zenbat eta batugai gehiago gehitu batukaria zehatzagoa da, baina beste batugai berri bat gehitzeak gero eta garrantzi txikiago du. Hortaz, baldintza honelako zerbait izango da: batugaiak joan gehitzen ondokoa bete arte fabs(fAzkenEmaitza - fAurrekoEmaitza) < fDiferentzia non fDiferentzia teklatuaren bitartez irakurritako zenbaki erreala eta positiboa den, eta fAzkenEmaitza zein fAurrekoEmaitza programan kalkulatutako balioak diren.
Hona hemen batukaria do-while aginduaren bitartez kalkulatzen duen Ariketa-31b_Batukaria_do-while programaren kodea:
/* Ariketa-31b_Batukaria_do-while: iterazio-kopuru ezezaguna */
//----------------------------------------------------------------
// Bi emaitzen arteko diferentzia emanda fBatukaria lortu:
// fBatukaria = -1/1 +1/4 -1/9 +1/16 -1/25 + ...
// 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 rZeinua, fDiferentzia, fBatugaia, fBatukaria, 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
fBatukaria = 0.0;
rZeinua = -1.0;
iKontagailua = 1;
fBatugaia = rZeinua / (iKontagailua * iKontagailua);
fBatukaria += fBatugaia;
printf("%3d. itzulia begiztatik kanpo, Batukaria=%7.4f\n", iKontagailua, fBatukaria);
do // kalkulua egiten jarraitu diferentziaren irizpidea betetzen den arte
{
fAurrekoEmaitza = fBatukaria;
rZeinua *= -1; // Zeinua aldatu
iKontagailua++;
fBatugaia = rZeinua / (iKontagailua * iKontagailua);
fBatukaria += fBatugaia;
fAzkenEmaitza = fBatukaria;
printf("%3d. ---> Zeinua=%2.0f Batugaia=%7.4f Batukaria=%7.4f Diferentzia=%7.4f\n",
iKontagailua, rZeinua, fBatugaia, fBatukaria, fabs(fAzkenEmaitza - fAurrekoEmaitza));
} while (fabs(fAzkenEmaitza - fAurrekoEmaitza) >= fDiferentzia);
printf("\n");
printf("Batukaria = %.4f\n", fBatukaria);
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-31c_Batukaria_while: iterazio-kopuru ezezaguna */
//----------------------------------------------------------------
// Bi emaitzen arteko diferentzia emanda fBatukaria lortu:
// fBatukaria = -1/1 +1/4 -1/9 +1/16 -1/25 + ...
// 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, fBatugaia, fBatukaria, 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 balioa
fBatukaria = 0.0;
// lehen kalkulua begiztatik kanpo
fZeinua = -1.0;
iKontagailua = 1;
fBatugaia = fZeinua / (iKontagailua * iKontagailua);
fBatukaria += fBatugaia;
printf("%3d. itzulia begiztatik kanpo, Batukaria=%7.4f\n", iKontagailua, fBatukaria);
fAurrekoEmaitza = fBatukaria;
// bigarren kalkulua begiztatik kanpo
fZeinua = +1.0;
iKontagailua = 2;
fBatugaia = fZeinua / (iKontagailua * iKontagailua);
fBatukaria += fBatugaia;
printf("%3d. itzulia begiztatik kanpo, Batukaria=%7.4f\n", iKontagailua, fBatukaria);
fAzkenEmaitza = fBatukaria;
while (fabs(fAzkenEmaitza - fAurrekoEmaitza) > fDiferentzia)
{
fAurrekoEmaitza = fBatukaria;
fZeinua *= -1; // Zeinua aldatu
iKontagailua++;
fBatugaia = fZeinua / (iKontagailua * iKontagailua);
fBatukaria += fBatugaia;
fAzkenEmaitza = fBatukaria;
printf("%3d. ---> Zeinua=%2.0f Batugaia=%7.4f Batukaria=%7.4f Diferentzia=%7.4f\n",
iKontagailua, fZeinua, fBatugaia, fBatukaria, fabs(fAzkenEmaitza - fAurrekoEmaitza));
}
printf("\n");
printf("Batukaria = %.4f\n", fBatukaria);
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