ZER DAKIDAN: Arrayak eta kateak ezagutzen ditut. ZER IKASIKO DUDAN: Kateen array baten ariketa bat egingo dut. |
Kateak gordetzen dituen array batekin lan egingo da. Kate bakoitzean letrak eta zifrak daude, izena eta kalifikazioa.
Ikasleen kopurua programaren hasieran irakurriko da. Hauek dira ikasle jakin baten datua den karaktere-katearen ezaugarriak:
- Datuaren luzera maximoa 25+1 karaktere
- Datuan izena eta nota daude
- Notak hiru zifra ditu (unitatea eta 2 dezimal)
- Notaren zifrak horrela datoz kokatuta katean:
- Unitatea katearen lehen karakterea da
- Hamartarrak katearen azken bi karaktereak dira
- Notarik txikiena 0.0 da
- notarik handiena 9.999 da
- Letrak katearen erdian daude, zifren artean
Zenbat ikasle diren teklatuaren bitartez harturik, datuak eman, notak eskuratu eta nota guztien batezbesteko aritmetiko eta desbideratze estandarra kalkulatu. Adibidez:
7Eleonor45 ------> 7.45 6Peru21 ------> 6.21 8Amagoia35 ------> 8.35 9Izaro00 ------> 9.00 Batezbestekoa: (+7.45 +6.21 +8.35 +9.00)/4 = 7.753 Desbideratze estandarra: 1.047
Datuen arraya banatu izenen eta noten arrayak lortuz. Ikasle baten izena teklatuz emanik izenen arrayan bilatu. Izenen arraya alfabetikoki ordenatu eta ondorioz, orden bera aplikatu noten arrayari.
/* Ariketa-59_IzenakEtaKalifikazioak: zenbait kate emanik bakoitzan dauden zifrak banatu eta eragiketa aritmetiko bat burutu. */ /* Kateak gordetzen dituen array batekin lan egingo da. Kate bakoitzean letrak eta zifrak daude, izena eta kalifikazioa. Ikasleen kopurua programaren hasieran irakurriko da. Hauek dira ikasle jakin baten datua den karaktere-katearen ezaugarriak: - Datuaren luzera maximoa 25+1 karaktere - Datuan izena, deitura eta nota daude - Notak hiru zifra ditu (unitatea eta 2 dezimal) - Notaren zifrak horrela datoz kokatuta katean: * Unitatea katearen lehen karakterea da * Hamartarrak katearen azken bi karaktereak dira - Letrak katearen erdian daude, zifren artean Zenbat ikasle diren teklatuaren bitartez harturik, datuak eman, notak eskuratu eta nota guztien batezbestekoa eta desbideratze estandarra kalkulatu. Adibidez: 7Eleonor45 ------> 7.45 6Peru21 ------> 6.21 8Amagoia35 ------> 8.35 9Izaro00 ------> 9.00 Batezbestekoa: (+7.45 +6.21 +8.35 +9.00)/4 = 7.753 Desbideratze estandarra: 1.047 Datuen arraya banatu izenen eta noten arrayak lortuz. Ikasle baten izena teklatuz emanik izenen arrayan bilatu. Izenen arraya alfabetikoki ordenatu eta ondorioz, orden bera aplikatu noten arrayari. */ #include <stdio.h> #include <string.h> // strcpy(), strcmp() eta strlen() funtzioetarako #include <stdlib.h> // atof() funtziorako #include <math.h> // pow() funtziorako #define BEHEMUGA 0 #define GOIMUGA 39 #define MAX_KATEA 26 typedef char tKate25[MAX_KATEA]; typedef tKate25 tasZerrenda[GOIMUGA]; typedef float tafNotak[GOIMUGA]; // Array bat bete datuak teklatuz emanik void KateenArrayaBete(tasZerrenda asDatuak, int* iLuzera); // Array baten edukia pantailaratzeko funtzioa void KateenArrayaErakutsi(const tasZerrenda asDatuak, int iLuzera); // Beste array baten edukia pantailaratzeko funtzioa void NotenArrayaErakutsi(const tafNotak afNotak, int iLuzera); // Ikaslearen nota lortzeko funtzioa float IkasleBatenNotaLortu(const tKate25 sIkaslearenDatuak); // Batezbestekoa kalkulatzeko funtzioa float BatezbestekoaKalkulatu(const tasZerrenda asDatuak, int iLuzera); // Desbideratze estandarra kalkulatzeko funtzioa float DesbideratzeaKalkulatu(const tasZerrenda asDatuak, int iLuzera, float fBatezbestekoa); // Izenen eta noten arrayak sortu void IzenenEtaNotenArrayakLortu(const tasZerrenda asDatuak, int iLuzera, tasZerrenda asIzenak, tafNotak afNotak); // Ikaslea bilatzeko funtzioa int fniIkasleaBilatu(const tKate25 sIkaslea, const tasZerrenda asIzenak, int iLuzera); // Ikaslearen izena alfabetikoki sailkatu eta nota dagokion posizioan kokatu void IzenenEtaNotenArrayakSailkatu(tasZerrenda asIzenak, tafNotak afNotak, int iLuzera); // Paraleloak diren bi arrayen edukia pantailaratzeko funtzioa void BiArrayakErakutsi(const tasZerrenda asIzenak, const tafNotak afNotak, int iLuzera); int main() { tasZerrenda asDatuak, asIzenak; tafNotak afNotak; int iLuzera; char sIkaslea[MAX_KATEA]; int iIkasleaNon; float fBatezbestekoa; float fDesbideratzeEstandarra; // Array bete eta erakutsi KateenArrayaBete(asDatuak, &iLuzera); KateenArrayaErakutsi(asDatuak, iLuzera); fBatezbestekoa = BatezbestekoaKalkulatu(asDatuak, iLuzera); printf("Batezbestekoa = %.3f\n", fBatezbestekoa); fDesbideratzeEstandarra = DesbideratzeaKalkulatu(asDatuak, iLuzera, fBatezbestekoa); printf("Desbideratze estandarra = %.3f\n", fDesbideratzeEstandarra); // Izenen eta noten arrayak lortu eta erakutsi IzenenEtaNotenArrayakLortu(asDatuak, iLuzera, asIzenak, afNotak); printf("Datuak bi zerrendetan banaturik:\n"); KateenArrayaErakutsi(asIzenak, iLuzera); NotenArrayaErakutsi(afNotak, iLuzera); printf("Bilatu nahi duzun ikaslearen izena eman: "); fgets(sIkaslea, MAX_KATEA, stdin); sIkaslea[strlen(sIkaslea)-1] = '\0'; // azkenaurreko posizioan dagoen lerro-berri karakterea kendu iIkasleaNon = fniIkasleaBilatu(sIkaslea, asIzenak, iLuzera); if (iIkasleaNon == 0) { printf("\"%s\" izeneko ikaslerik ez dago\n", sIkaslea); } else { afNotak[iIkasleaNon] = fBatezbestekoa; printf("Ikaslearen berritutako nota: %.2f\n", afNotak[iIkasleaNon]); } // Arrayak sailkatu eta erakutsi IzenenEtaNotenArrayakSailkatu(asIzenak, afNotak, iLuzera); printf("Ikasleen zerrenda izenez sailkaturik:\n"); BiArrayakErakutsi(asIzenak, afNotak, iLuzera); return 0; } // Array bat betetzeko funtzioa void KateenArrayaBete(tasZerrenda asDatuak, int* iLuzera) { int iKont; do { printf("Arrayak zenbat elementu izango ditu? "); scanf("%d", iLuzera); fflush(stdin); } while (*iLuzera < BEHEMUGA || *iLuzera > GOIMUGA); for (iKont = BEHEMUGA; iKont < *iLuzera; iKont++) { do { printf("'7Joseba43' itxurako %d. elementua eman: ", iKont); fgets(asDatuak[iKont], MAX_KATEA, stdin); asDatuak[iKont][strlen(asDatuak[iKont])-1] = '\0'; // azkenaurreko posizioan dagoen lerro-berri karakterea kendu // printf("\n------asDatuak[iKont]=|%s|\n------asDatuak[iKont][0]=|%c|\n------asDatuak[iKont][azkena]=|%c|------\n", asDatuak[iKont], asDatuak[iKont][0], asDatuak[iKont][strlen(asDatuak[iKont])-1]); if (asDatuak[iKont][0] < '0' || asDatuak[iKont][0] > '9') printf("Notaren unitatea falta da\n"); if (asDatuak[iKont][strlen(asDatuak[iKont])-2] < '0' || asDatuak[iKont][strlen(asDatuak[iKont])-2] > '9') printf("Notaren hamarrekoa falta da\n"); if (asDatuak[iKont][strlen(asDatuak[iKont])-1] < '0' || asDatuak[iKont][strlen(asDatuak[iKont])-1] > '9') printf("Notaren ehunekoa falta da\n"); } while ((asDatuak[iKont][0] < '0' || asDatuak[iKont][0] > '9') || (asDatuak[iKont][strlen(asDatuak[iKont])-2] < '0' || asDatuak[iKont][strlen(asDatuak[iKont])-2] > '9') || (asDatuak[iKont][strlen(asDatuak[iKont])-1] < '0' || asDatuak[iKont][strlen(asDatuak[iKont])-1] > '9')); } } // Array baten edukia pantailaratzeko funtzioa void KateenArrayaErakutsi(const tasZerrenda asDatuak, int iLuzera) { int iKont; for (iKont = BEHEMUGA; iKont < iLuzera; iKont++) printf(" %d. elementua: |%s|\n", iKont, asDatuak[iKont]); } // Beste array baten edukia pantailaratzeko funtzioa void NotenArrayaErakutsi(const tafNotak afNotak, int iLuzera) { int iKont; for (iKont = BEHEMUGA; iKont < iLuzera; iKont++) printf(" %d. elementua: |%.2f|\n", iKont, afNotak[iKont]); } // Ikaslearen nota lortzeko funtzioa float IkasleBatenNotaLortu(const tKate25 sIkaslearenDatuak) { char sNota[6]; snprintf(sNota, sizeof(sNota), "%c.%c%c", sIkaslearenDatuak[0], sIkaslearenDatuak[strlen(sIkaslearenDatuak)-2], sIkaslearenDatuak[strlen(sIkaslearenDatuak)-1]); return atof(sNota); } // Batezbestekoa kalkulatzeko funtzioa float BatezbestekoaKalkulatu(const tasZerrenda asDatuak, int iLuzera) { float fMetagailu = 0.0; int iKont; for (iKont = BEHEMUGA; iKont < iLuzera; iKont++) { fMetagailu += IkasleBatenNotaLortu(asDatuak[iKont]); } return fMetagailu / iLuzera; } // Desbideratze estandarra kalkulatzeko funtzioa float DesbideratzeaKalkulatu(const tasZerrenda asDatuak, int iLuzera, float fBatezbestekoa) { float fMetagailu = 0.0; int iKont; for (iKont = BEHEMUGA; iKont < iLuzera; iKont++) { fMetagailu += pow((IkasleBatenNotaLortu(asDatuak[iKont]) - fBatezbestekoa), 2); } fMetagailu = fMetagailu / iLuzera; return pow(fMetagailu, 0.5); } // Izenen eta noten arrayak sortu void IzenenEtaNotenArrayakLortu(const tasZerrenda asDatuak, int iLuzera, tasZerrenda asIzenak, tafNotak afNotak) { int iKont; for (iKont = BEHEMUGA; iKont < iLuzera; iKont++) { afNotak[iKont] = IkasleBatenNotaLortu(asDatuak[iKont]); strcpy(asIzenak[iKont], asDatuak[iKont] + 1); asIzenak[iKont][strlen(asIzenak[iKont]) - 2] = '\0'; // Azken bi karaktereak kendu } } // Ikaslea bilatzeko funtzioa int fniIkasleaBilatu(const tKate25 sIkaslea, const tasZerrenda asIzenak, int iLuzera) { int iKont; for (iKont = BEHEMUGA; iKont < iLuzera; iKont++) { if (strcmp(asIzenak[iKont], sIkaslea) == 0) return iKont; } return 0; } // Ikaslearen izena alfabetikoki sailkatu eta nota dagokion posizioan kokatu void IzenenEtaNotenArrayakSailkatu(tasZerrenda asIzenak, tafNotak afNotak, int iLuzera) { int k, j; char sIzenTxikiena[MAX_KATEA]; float rLaguntzailea; int iTxikienaNon; for (k = BEHEMUGA; k < iLuzera-1; k++) { strcpy(sIzenTxikiena, asIzenak[k]); iTxikienaNon = k; for (j = k + 1; j < iLuzera; j++) { if (strcmp(asIzenak[j], sIzenTxikiena) < 0) { strcpy(sIzenTxikiena, asIzenak[j]); iTxikienaNon = j; } } // izena aldatu strcpy(asIzenak[iTxikienaNon], asIzenak[k]); strcpy(asIzenak[k], sIzenTxikiena); // nota aldatu rLaguntzailea = afNotak[iTxikienaNon]; afNotak[iTxikienaNon] = afNotak[k]; afNotak[k] = rLaguntzailea; } } // Paraleloak diren bi arrayen edukia pantailaratzeko funtzioa void BiArrayakErakutsi(const tasZerrenda asIzenak, const tafNotak afNotak, int iLuzera) { int iKont; for (iKont = BEHEMUGA; iKont < iLuzera; iKont++) printf(" %d. elementua: |%.2f| |%s|\n", iKont, afNotak[iKont], asIzenak[iKont]); }
iruzkinik ez:
Argitaratu iruzkina