ZER DAKIDAN: Hainbat funtzio estandar ikasi dut eta for agindua ikasi dut ere. ZER IKASIKO DUDAN: Agindu errepikakor habiaraturkin sakondu aurretik, for agindu isolatua erabiliko dut jarduera handiago batean. |
Dakigunez, artikulu honekin lotuta daude bi artikulu hauek:
- 3. jarduera (I) | Errusiar Biderketaren Metodoa zertan den
- 3. jarduera (II) | Errusiar Biderketaren Metodoa prestatzen
3. jarduera (I) | Errusiar Biderketaren Metodoa zertan den izenburuko artikulua gogoratuz, ariketa honetan bi zenbiren arteko biderkadura kalkulatzen duen programari bukaera emango diogu.
Datuak iBiderkagai1 eta iBiderkagai2 kopuru osoak eta positiboak izango dira (biak 0 eta 1000000 artekoak, zero eta miloi bat artekoak). Adibidez emandako datuak 30 eta 40 badira, eskatzen den pantailaraketaren zatirik mamitsuena hau da:Erdiak Dobleak ------ ------- 0. maila 30 40 <<< errenkada hau ez da konputatuko 1. maila 15 80 2. maila 7 160 3. maila 3 320 4. maila 1 640Goiko taulan adierazten den bezala iBiderkagai1 aldagaiaren balioa bikoitia bada edo bere erdiak bikoitiak badira, mezu bat agertzeaz gain iBiderkagai2 aldagaiaren balioa eta bere dobleak ez dira batuketan kontuan izango.
Hona hemen programaren balizko irteera bat emandako datuak 30 eta 40 izatean:
Hemen programa beraren irteera emandako datuak 31 eta 40 izatean. Ikus daitekeenez, errekada guztiak konputatzen dira, for kanpoko errenkada eta for barruko lau errenkadak:
Eta hemen programa beraren irteera emandako datuak 32 eta 40 izatean. Non, konputatzen den errenkada bakarra azkena den:
Erdiak Dobleak ------ ------- 0. maila 32 40 <<< errenkada hau ez da konputatuko 1. maila 16 80 <<< errenkada hau ez da konputatuko 2. maila 8 160 <<< errenkada hau ez da konputatuko 3. maila 4 320 <<< errenkada hau ez da konputatuko 4. maila 2 640 <<< errenkada hau ez da konputatuko 5. maila 1 1280
/* 3c-Jarduera_ErrusiarBiderketa_1: for aginduaren adibidea. */ // Errusiar Biderketaren Metodoa' aplikatzen duen programa bat idatzi nahi da, // horretarako kalkulu errepikarrak egin behar dira. // DATUAK: // Sarrerako datuak, positiboak diren bi zenbaki osoko. // EMAITZA: // Irteera bi datuen arteko biderkadura izango da. Zenbaki osoen ariketa // izanik, emaitzaren eta doblearen datu-mota 'long int' aukeratuko dugu. // Kasu horretan, gainezkatzea gertatu ez dadin balio maximoa 45000 da. // 3c-Jarduera_ErrusiarBiderketa_2.cbp beste bertsioan 'double' datu-motak // hartzen dira eta maximoa 1000000000 (1000 miloi) izan daiteke. // Prozesu errepikakorraren iterazio kopurua zehazteko, iIterazioak kalkulatu: // 2^fMailak = iBiderkagai1; // fMailak·log2(2) = log2(iBiderkagai1); // fMailak = log2(iBiderkagai1); // iIterazioak = (int)fMailak; // iIterazioak = (int)log2(iBiderkagai1); #include <stdio.h> // printf() eta scanf() funtzioetarako #include <math.h> // log2() funtzioarako #define GUREMINIMOA 0 #define GUREMAXIMOA 45000 // long datu-mota erabiliz int main() { int iBiderkagai1, iBiderkagai2; int iErrenkada; int iIterazioak; int iErdia; long lDoblea; long lBiderkadura, lKonprobazioa; printf("\n"); printf("\n ---------------------------------"); printf("\n | Errusiar Biderketaren Metodoa |"); printf("\n ---------------------------------\n"); printf("\n Bi biderkagaiak eman... \n\n"); do { printf(" Lehen biderkagaia (%d eta %d artekoa), 4059 adibidez: ", GUREMINIMOA, GUREMAXIMOA); scanf("%d", &iBiderkagai1); if (iBiderkagai1 < GUREMINIMOA) printf("\a Lehen datua %d edo handiago izango da! \n", GUREMINIMOA); if (iBiderkagai1 > GUREMAXIMOA) printf("\a Lehen datua %d edo txikiago izango da! \n", GUREMAXIMOA); } while (iBiderkagai1 < GUREMINIMOA || iBiderkagai1 > GUREMAXIMOA); do { printf(" Bigarren biderkagaia (%d eta %d artekoa), %d adibidez: ", iBiderkagai1, GUREMAXIMOA, iBiderkagai1); scanf("%d", &iBiderkagai2); if (iBiderkagai2 < iBiderkagai1) printf("\a Bigarren datua %d edo handiago izango da! \n", iBiderkagai1); if (iBiderkagai2 > GUREMAXIMOA) printf("\a Bigarren datua %d edo txikiago izango da! \n", GUREMAXIMOA); } while (iBiderkagai2 < iBiderkagai1 || iBiderkagai2 > GUREMAXIMOA); printf("\n Erdiak Dobleak"); printf("\n ------ -------"); iErdia = iBiderkagai1; lDoblea = iBiderkagai2; iIterazioak = (int)log2(iBiderkagai1); lBiderkadura = 0; // hasieraketa 0 da, biderkadura lortzeko batuketak egingo direlako if (iBiderkagai1 % 2 == 0) // bikoiti { printf("\n %2d. (kanpokoa) %7d %d <<< errenkada hau ez da konputatuko", 0, iBiderkagai1, iBiderkagai2); } else { printf("\n %2d. (kanpokoa) %7d %d", 0, iBiderkagai1, iBiderkagai2); lBiderkadura = lBiderkadura + lDoblea; } for (iErrenkada=1; iErrenkada<=iIterazioak; iErrenkada++) { iErdia = iErdia / 2; lDoblea = lDoblea*2; if (iErdia % 2 == 0) // bikoiti { printf("\n %2d. iterazioa %7d %ld <<< errenkada hau ez da konputatuko", iErrenkada, iErdia, lDoblea); } else // bakoiti { printf("\n %2d. iterazioa %7d %ld", iErrenkada, iErdia, lDoblea); lBiderkadura = lBiderkadura + lDoblea; } } printf("\n"); printf("\n\t %9d x %d = %ld Errusiar Metodoaren arabera", iBiderkagai1, iBiderkagai2, lBiderkadura); lKonprobazioa = iBiderkagai1*iBiderkagai2; printf("\n\t %9d x %d = %ld ohiko * eragilea erabiliz", iBiderkagai1, iBiderkagai2, lKonprobazioa); printf("\n\n"); return 0; }
|
iruzkinik ez:
Argitaratu iruzkina