| ZER DAKIDAN: switch baldintzazko egitura ikasi nuen aukera anitzak antolatzeko (Ariketa 18 | Aukera anitzen arteko hautapena adibidea eta Ariketa 36 | Hainbat aukeren menu bat adibidea gogoratzen ditut). ZER IKASIKO DUDAN: Menu bat programatuko dut funtzioak erabiliz, erabiltzaileak gogoko duen hautapena iAukeraHautatu() funtzioan irakurtzen den karaktere bat izango da. |
Lau aukera dituen menu batek gidatuko du programa. Aukerak hautatzeko zenbaki osoak erabiltzen dira eta lau aukeretatik batek programa bukarazten du. Hautatutako aukerari esker switch agindu baten bitartez programaren exekuzioa gidatzen da (Ariketa 18 | Aukera anitzen arteko hautapena gogoratu). Menua pantailan aurkezteko lana eta erabiltzailearen aukeraren bat hautatzeko lana iAukeraHautatu() izeneko funtzioak egiten du:
![]() |
| iAukeraHautatu() funtzioaren lana: Menua aurkeztu eta aukera hautatu |
Lehenik idatzi behar dugun main() funtzio nagusia, funtsean, prozesu errepikakor bat da, errepikapenak eteteko eta programatik irteteko 0 balioa sartu behar da. Deskriba ditzagun, banan-banan gainerako hiru aukerak, eta ikus dezagun ere programa osoaren kodea.
iAukeraHautatu() funtzioan irakurritako 1 balioa main() funtzio nagusira helduko da eta funtzio nagusian DiagonalkiPantailaratu() funtzioak sarreratzat behar duen zenbaki osoa irakurriko da (funtzio horrek datu bakar bat behar du, 3 eta 17000 arteko zenbaki oso bat). Lehen aukera hau amaitzeko, DiagonalkiPantailaratu() funtzioak jarraian erakusten den mezua emateko gai da:
![]() |
| Laranjaz main() funtziokoa eta urdinez iFibonaccikoaDa() funtziokoa |
iAukeraHautatu() funtzioan irakurritako 2 balioa main() funtzio nagusira helduko da, ondoren, dbErroKuboaKalkulatu() funtzioak sarreratzat behar duen zenbaki erreala irakurriko da main() funtzio nagusian eta bere kuboaren balioa erakutsiko da ere. Emaitza lortzen duen dbErroKuboaKalkulatu() funtzioak pantailan erakusten duena urdinez markatu da jarraian erakusten den irudian:
![]() |
| Laranjaz main() funtziokoa eta urdinez fKosinuaKalkulatu() funtziokoa |
iAukeraHautatu() funtzioan irakurritako 3 balioa main() funtzio nagusira helduko da, ondoren, fKosinuaKalkulatu() funtzioak sarreratzat behar duen zenbaki erreala irakurriko da main() funtzio nagusian eta bere kuboaren balioa erakutsiko da ere. Emaitza lortzen duen fKosinuaKalkulatu() funtzioak pantailan erakusten duena urdinez markatu da jarraian erakusten den irudian:
![]() |
| Laranjaz main() funtziokoa eta urdinez dbErroKuboaKalkulatu() funtziokoa |
Hona hemen Ariketa-43a_MenuaAzpiprogramaz.cbp proiektuaren iturburu-programa:
/* Ariketa-43a_MenuaAzpiprogramaz: menuaren aukeratzailea int datu-motakoa */
#include <stdio.h>
#include <stdlib.h> // system() funtziorako
#include <math.h>
#define EPSILON_1 0.0005 // bost hamarmilaren
#define EPSILON_2 0.0000001 // miloiaren bat
int iAukeraHautatu(void);
double dbErroKuboaKalkulatu(double);
int iFibonaccikoaDa(int);
float fBerreketa(float fOinarria, int iAldiak);
long liFaktoriala(int iMuga);
float fKosinuaKalkulatu(float fX);
int main()
{
int iAukera;
int iZbk;
double dbZbk, dbKuboa;
float fAng, fX, fKosinua;
do
{
system("cls"); // pantaila garbitu
iAukera = iAukeraHautatu();
printf("\n");
switch (iAukera)
{
case 1:
do
{
printf("3 eta 17000 arteko zenbaki osoa eman: ");
scanf("%d", &iZbk);
} while (iZbk < 3 || iZbk > 17000);
if (iFibonaccikoaDa(iZbk) == 1)
printf("%d Fibonacciren sekuentziakoa da\n\n", iZbk);
else
printf("%d ez da Fibonacciren sekuentziakoa\n\n", iZbk);
break;
case 2:
do
{
printf("Zenbaki erreala eta positiboa eman: ");
scanf("%lf", &dbZbk);
} while (dbZbk < 0.0);
dbKuboa = dbErroKuboaKalkulatu(dbZbk);
printf("%0.5f-ren erro kuboa: %0.5f\n\n", dbZbk, dbKuboa);
break;
case 3:
printf("1. koadranteko angelu baten kosinua kalkulatu %.4f prezisioarekin\n\n", EPSILON_1);
do
{
printf("1. koadranteko angelua graduetan: ");
scanf("%f", &fAng);
} while (fAng < 0.0 || fAng >= 90.0);
fX = fAng * 2 * M_PI / 360; // graduak radianetara bihurtu
printf("Angelua radianetan: %8.5f\n", fX);
fKosinua = fKosinuaKalkulatu(fX);
printf("\n");
printf("Gure programaz lortutako kosinua[%.3f gradu] -----> %7.5f\n", fAng, fKosinua);
printf("cos() funtzioak ematen duena cos(%.3f gradu) -----> %7.5f\n", fAng, cos(fX));
printf("\n");
break;
case 0:
printf("Programa amaitzera doa. Edozein tekla sakatu.\n");
break;
}
getchar(); // bufferrean jarritako return karakterea hartzen du
if (iAukera != 0)
{
printf("Emaitzak ikusi ahal izateko itxaroten, aurrera egiteko INTRO sakatu... ");
getchar(); // itxaroteko
}
} while (iAukera != 0);
return 0;
}
int iAukeraHautatu()
{
int iHautapena;
printf("============================Menua=============================\n");
printf(" 1 Zenbaki bat Fibonacci-ren sekuentziakoa da\n");
printf(" 2 Zenbaki baten erro kuboa Newton-Raphson bitartez\n");
printf(" 3 Lehen koadranteko angelu baten kosinua Taylor bitartez\n");
printf("\n");
printf(" 0 Programatik irten\n");
printf("==============================================================\n");
printf(" Zure aukera: ");
do
{
scanf("%d", &iHautapena);
if (iHautapena < 0 || iHautapena > 3)
{
printf("Aukera ez da ondo hautatu. Berriro aukeratu: ");
}
} while (iHautapena < 0 || iHautapena > 3);
return iHautapena;
}
void DiagonalkiPantailaratu(char cLetra)
{
printf("Alfabeto zatia diagonalki pantailaratu:\n");
int iNon = 15;
for (char k = 'A'; k <= cLetra; k++)
{
printf("%*c\n", iNon, k);
iNon++;
}
printf("\n");
}
void TaulaPantailaratu(int iZbk)
{
printf("%d zenbakiaren biderkatzeko taula:\n", iZbk);
for (int k = 1; k <= 10; k++)
{
printf("%35d x %d = %2d\n", k, iZbk, k * iZbk);
}
printf("\n");
}
double dbErroKuboaKalkulatu(double dbZbk)
{
double dbKuboa = dbZbk / 3.0; // Lehendabiziko hurbilketa
double dbAurrekoa;
int iIterazioa = 1;
do
{
dbAurrekoa = dbKuboa;
dbKuboa = (dbZbk / (dbAurrekoa * dbAurrekoa) + 2 * dbAurrekoa) / 3;
dbKuboa = dbAurrekoa - (dbAurrekoa * dbAurrekoa * dbAurrekoa - dbZbk) / (3 * dbAurrekoa * dbAurrekoa);
printf("%d. iterazioan... kuboa = %.9lf eta errorea = %.9lf\n", iIterazioa, dbKuboa, fabs(dbKuboa - dbAurrekoa));
iIterazioa++;
} while (fabs(dbKuboa - dbAurrekoa) > EPSILON_2);
return dbKuboa;
}
int iFibonaccikoaDa(int iZbk)
{
int iFibo1 = 0;
int iFibo2 = 1;
int iFibo3 = iFibo1 + iFibo2;
while (iFibo3 < iZbk)
{
iFibo1 = iFibo2;
iFibo2 = iFibo3;
iFibo3 = iFibo1 + iFibo2;
printf("iFibo3 = %8d\n", iFibo3);
}
if (iFibo3 == iZbk)
return 1;
else
return 0;
}
float fBerreketa(float fOinarria, int iAldiak)
{
float fMetagailua = 1.0;
int i;
for (i = 0; i < iAldiak; i++)
{
fMetagailua *= fOinarria;
}
return fMetagailua;
}
long liFaktoriala(int iMuga)
{
long liMetagailua = 1;
int i;
for (i = 1; i <= iMuga; i++)
{
liMetagailua *= i;
}
return liMetagailua;
}
float fKosinuaKalkulatu(float fX)
{
int iKont = 0;
float fKosinua = 0.0;
float rBatugai = 1.0;
long int liFaktoreak;
float fBerredura;
float fZeinua;
while (fabs(rBatugai) > EPSILON_1)
{
fKosinua += rBatugai;
iKont += 2;
liFaktoreak = liFaktoriala(iKont);
fBerredura = fBerreketa(fX, iKont);
fZeinua = fBerreketa(-1, iKont / 2);
rBatugai = fZeinua * fBerredura / liFaktoreak;
printf("%d. iterazioan ==> kosinua: %8.5f | batugaia: %8.5f | aldea: %8.5f\n", iKont/2, fKosinua, rBatugai, fabs(fabs(rBatugai) - EPSILON_1));
}
return fKosinua;
}





iruzkinik ez:
Argitaratu iruzkina