ZER DAKIDAN: Arrayak eta kateak ezagutzen ditut. ZER IKASIKO DUDAN: Kateen ariketa bat egingo dut. |
Zenbait ikasleren noten batezbesteko aritmetikoa kalkulatu behar da. Ikasle bakoitzaren nota, bere izena eta deiturarekin batera dator. Ikasleen kopurua programaren hasieran irakurriko da, eta kopuru hori teklatuz ematean kopurua onargarria dela ziurtatuko da.
Ikasle jakin baten datua den karaktere-katearen ezaugarriak:
- Datuaren luzera maximoa 30 karaktere
- Datuan izena, deitura eta nota daude
- Notak hainbat zifra ditu eta edozein tokitan izan daitezke:
- Gutxienez zifra bat dago
- Lehen zifra unitatea da eta gainerakoak hamartarrak
- Zifrak ez dira zertan jarraian egon behar
- Suposatu notarik txikiena 0.0 dela
- Suposatu notarik handiena 9.999 dela
- Letrak direla eta, izena deitura baino lehenago dago
- Izena letra larriz hasten da eta gainerakoak minuskulak dira
- Deitura letra larriz hasten da eta gainerakoak minuskulak dira
Zenbat ikasle diren teklatuaren bitartez harturik, datuak eman, notak eskuratu eta nota guztien batezbestekoa kalkulatu. Adibidez:
Eleo72norIz1a ------> 7.21 Peru6Sala8zar ------> 6.8 AmagoiaLaka5rra ------> 5 4RuyRuiz91 ------> 4.91 (+7.21 +6.8 +5 +4.91)/4 = 5.98
/* Ariketa-58_HainbatNotenMedia: zenbait kate emanik bakoitzan dauden zifrak banatu eta eragiketa aritmetiko bat burutu. */ /* Zenbait ikasleren noten batezbesteko aritmetikoa kalkulatu behar da. Ikasle bakoitzaren nota, bere izena eta deiturarekin batera dator. Ikasleen kopurua programaren hasieran irakurriko da, eta kopuru hori teklatuz ematean onargarria dela ziurtatu ahalko da eta ondorioz exekuzio-denborako errorerik ez da gertatuko. Ikasle jakin baten datua den karaktere-katearen ezaugarriak: - Datuaren luzera maximoa 30 karaktere - Datuan izena, deitura eta nota daude - Notak hainbat zifra ditu eta edozein tokitan izan daitezke: * Gutxienez zifra bat dago * Lehen zifra unitatea da eta gainerakoak hamartarrak * Zifrak ez dira zertan jarraian egon behar * Suposatu notarik txikiena 0.0 dela * Suposatu notarik handiena 9.999 dela - Letrak direla eta, izena deitura baino lehenago dago - Izena letra larriz hasten da eta gainerakoak minuskulak dira - Deitura letra larriz hasten da eta gainerakoak minuskulak dira Zenbat ikasle diren teklatuaren bitartez harturik, datuak eman, notak eskuratu eta nota guztien batezbestekoa kalkulatu. Adibidez: Eleo72norIz1a ------> 7.21 Peru6Sala8zarc ------> 6.8 AmagoiaLaka5rra ------> 5 4RuyRuiz91 ------> 4.91 (+7.21 +6.8 +5 +4.91)/4 = 5.98 */ #include <stdio.h> #include <string.h> // strcspn(), strncat(), strncpy() eta strcpy() funtzioetarako #include <stdlib.h> // atof() funtziorako #define MAX_KATEA 30 #define FALSE 0 #define TRUE 1 void LetrakNotaBanatu(char *sIkaslea, char *sLetrak, char *sNota); void IzenAbizenBanatu(char *sLetrak, char *sIzena, char *sAbizena); void NotarenPuntuaTxertatu(char *sNota); int iKonprobatuNotaZeroDela(char sNota[MAX_KATEA]); int main() { int iZenbatIkasle, iKont; char sIkaslea[MAX_KATEA]; char sLetrak[MAX_KATEA]; char sIzena[MAX_KATEA]; char sAbizena[MAX_KATEA]; char sNota[MAX_KATEA]; int iErrorea; float fNota; float rBatukaria = 0.0; do { printf("\n Zenbat ikasle izango dira (adibidez 4): "); scanf("%d", &iZenbatIkasle); fflush(stdin); if (iZenbatIkasle < 1 || iZenbatIkasle > 9) printf(" Ikasleen kopurua gutxienez 1 izan behar da eta gehienez 9"); } while (iZenbatIkasle < 1 || iZenbatIkasle > 9); for (iKont = 1; iKont <= iZenbatIkasle; iKont++) { do { iErrorea = FALSE; strcpy(sIzena, ""); strcpy(sAbizena, ""); strcpy(sNota, ""); printf("\n %d. ikaslearen datuak (adibidez: Eleo72norIz4a): ", iKont); gets(sIkaslea); // katea irakurri, neurria 30+1 /* fgets(sIkaslea, MAX_KATEA, stdin); sIkaslea[strcspn(sIkaslea, "\n")] = 0; // lerro-berri karakterea kendu printf(" %d. Datua, sIkaslea=|%s|", iKont, sIkaslea); */ LetrakNotaBanatu(sIkaslea, sLetrak, sNota); IzenAbizenBanatu(sLetrak, sIzena, sAbizena); // Izenik ote dagoen eta ea majuskulaz hasten den if (strlen(sIzena) == 0) { iErrorea = TRUE; printf("\n %d. txarto: %s (izenik ez dago)", iKont, sIkaslea); } else { if (sIzena[0] > 'Z') { iErrorea = TRUE; printf("\n %d. txarto: %s (izenaren lehen letra ez da larria)", iKont, sIkaslea); } } // Abizenik ote dagoen, egotekotan majuskulaz hasiko denez ez da konprobatzen if (strlen(sAbizena) == 0) { iErrorea = TRUE; printf("\n %d. txarto: %s (abizenik ez dago)", iKont, sIkaslea); } // Notarik ote dagoen eta egotekotan puntua txertatu if (strlen(sNota) == 0) { iErrorea = TRUE; printf("\n %d. datua txarto: %s (notarik ez dago)", iKont, sIkaslea); } else NotarenPuntuaTxertatu(sNota); if (!iErrorea) { printf("\n %d. ikaslea (kateak) >>> |%s| |%s| |%s|", iKont, sIzena, sAbizena, sNota); fNota = atof(sNota); printf("\n %d. ikaslea (zenbakiak) >>> fNota = %.3f\n", iKont, fNota); if (fNota == 0.0) iKonprobatuNotaZeroDela(sNota); } } while (iErrorea); rBatukaria += fNota; } printf("\n Batezbestekoa = %.3f\n", rBatukaria / iZenbatIkasle); return 0; } // Sarrera: sIkaslea (hasierako kate osoa) // Irteera: sLetrak (izena eta abizena) eta sNota void LetrakNotaBanatu(char *sIkaslea, char *sLetrak, char *sNota) { int iKont; strcpy(sNota, ""); strcpy(sLetrak, ""); for (iKont = 0; iKont < strlen(sIkaslea); iKont++) { if (sIkaslea[iKont] >= '0' && sIkaslea[iKont] <= '9') strncat(sNota, &sIkaslea[iKont], 1); else strncat(sLetrak, &sIkaslea[iKont], 1); } } // Sarrera: |LeireIza| // Emaitza: |Leire| |Iza| void IzenAbizenBanatu(char *sLetrak, char *sIzena, char *sAbizena) { int iKont = 1; // 0 posizioan izenaren lehen letra majuskula while (sLetrak[iKont] >= 'a' && sLetrak[iKont] <= 'z') { iKont++; // abizenaren lehen letra majuskularen posizioa zehaztu } strncpy(sIzena, sLetrak, iKont); // izena lortzeko n karaktere kopiatu sIzena[iKont] = '\0'; // Amaitu izena strcpy(sAbizena, &sLetrak[iKont]); // gainerakoa abizena da } // Sarrera: sNota punturik gabe // Irteera: sNota puntuarekin void NotarenPuntuaTxertatu(char *sNota) { char sBufferra[MAX_KATEA] = ""; int iKont; if (strlen(sNota) > 1) // Zenbat zifra dauden begiratu eta dagokionean puntu bat sartu { sBufferra[0] = sNota[0]; sBufferra[1] = '.'; for (iKont=1; iKont < strlen(sNota); iKont++) { sBufferra[iKont+1] = sNota[iKont]; } sBufferra[strlen(sNota) + 1] = '\0'; strcpy(sNota, sBufferra); } // printf("--------sNota=|%s|-------\n", sNota); } int iKonprobatuNotaZeroDela(char sNota[MAX_KATEA]) { int iKont; int iBaiZeroDa = TRUE; for (iKont=0; iKont < strlen(sNota); iKont++) { if (iKont != 1) // puntuaren posizioa ez prozesatu { if (sNota[iKont] != '0') iBaiZeroDa = FALSE; } printf(" Nota zero dela frogatzen... sNota[%d]=%c\n", iKont, sNota[iKont]); } return iBaiZeroDa; }
iruzkinik ez:
Argitaratu iruzkina