2025(e)ko martxoaren 28(a), ostirala

Ariketa 58 | Hainbat noten media

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;
}






  • Ariketa-58_HainbatNotenMedia.cbp | main.c  


 

iruzkinik ez:

Argitaratu iruzkina