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

12. jarduera (III) | Erakusleak eta funtzioak


ZER DAKIDAN:
Erakusle kontzeptua menperatzen dut.



ZER IKASIKO DUDAN:
Funtzio bati array bat pasatzearen ordez, arrayaren erakuslea pasarazi ahal zaiola ikasiko dut.


Array bat funtzioari pasatu beharrean erakusle bat pasatu

Jarraian ematen den programan fNotak[] arraya ez da funtzioen parametroa, bere ordez float bati seinalatzen dion erakuslea pasatzen da, float hori fNotak[] arrayaren lehen elementuaren helbidea izango da, hots, afNotak aldagaia.

Hona hemen funtzioen prototipoak eta funtzioei dagozkien deiak:

void NotakSartu(float *, int *);     // erreal bat eta oso bat, biak irteerakoak                                           
void NotakIkusi(const float *, int); // erreal bat eta oso bat, biak sarrerakoak
NotakSartu(afNotak, &iZenbatIkasle); // aldagai-erakuslea eta helbidea (irteerak)                                           
NotakIkusi(afNotak, iZenbatIkasle);  // konstante-erakuslea eta balioa (sarrerak)

NotakSartu() funtziora eta NotakIkusi() funtziora erakusleak pasatzen dira.

/* 12c1-Erakusleak-Arrayak: arraya erakusle bezala funtzioetan */

// Errealekin lan eginez. Array bat datuz bete funtzio batean
// eta arrayaren edukia pantailaratu erakusle bat erabiliz.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define IKASLE_MIN 1
#define LUZERA_MAX 15   // ikasle kopuru maximoa

void NotakSartu(float *, int *);
void NotakIkusi(const float *, int);

int main()
{
    float afNotak[LUZERA_MAX];
    int iZenbatIkasle;

    printf("\n");
    printf("\n\t Zerrenda auzaz betetzen zenbaki errealez");
    printf("\n\t ----------------------------------------\n");

    NotakSartu(afNotak, &iZenbatIkasle);
    NotakIkusi(afNotak, iZenbatIkasle);

    printf("\n");
    return 0;
}


void NotakSartu(float *p_fNota, int *iZenbatIkasle)  // lehen parametroa irterakoa da
{                                                    // bigarren parametroa irteerakoa da
    int iKont;
    float fKalifikazioa;

    srand(time(NULL));

    *iZenbatIkasle = rand() % (LUZERA_MAX - IKASLE_MIN + 1) + IKASLE_MIN;  // 1 eta 15 arteko balioa
    printf("\n\t *iZenbatIkasle = %d", *iZenbatIkasle);

    printf("\n");
    for (iKont=0; iKont < *iZenbatIkasle; iKont++)
    {
        fKalifikazioa = ((float)rand()/(float)(RAND_MAX)) * (10.0 - 0.0);
        // printf("\n\t %2d. ikaslearen nota: %.2f", iKont+1, fKalifikazioa);
        *(p_fNota + iKont) = fKalifikazioa;
    }
}


void NotakIkusi(const float *p_fNota, int iZenbatIkasle)  // bi parametroak sarrerakoak
{
    int iKont;

//  afNotak[3] = 3.33;   // babestuta dago

    printf("\n");
    printf("\t     Posizioa     Ikaslea     Nota\n");
    printf("\t     --------     -------     ----\n");
    for (iKont=0; iKont < iZenbatIkasle; iKont++)
    {
        printf("\t %9d %11d %11.2f\n", iKont, iKont+1, *(p_fNota + iKont));
    }
}


Erakusle biren areko kenketa

Jarraian ematen den adibidean programan strchr() funtzioaren adibide bat ematen da, ikusi nola IzenaZenbakiaBanatu() funtzioari sDatua eta sIzena arrayen erakusleak pasatzen zaizkion parametro bezala. Ikusi ere, arrayen helbideen artean kenketaren eragiketa aritmetikoa egin daitekeela kate baten luzera lortze aldera.

Adibide honen gakoa dago strchr() funtzioak itzultzen duen emaitzan, hots, strchr() funtzioak itzultzen helbidearen erakuslean: NULL karakterea aurkitzen ez badu eta karakterearen helbidea baldin eta aurkitzen badu.

/* 12c2-Erakusleak-Arrayak.cbp */

// strchr(katea, karak) funtzioak karak karakterea bilatzen du kate katean.
// Aurkitzen badu, karakterearen lehen agerpenaren erakuslea itzultzen du.
// Ez badu aurkitzen null erakuslea itzultzen du. Bilatutako karkaterearen
// posizioa zehazteko helbideen arteko kenketa egingo da.

#include <stdio.h>
#include <stdlib.h>   // atof() funtziorako
#include <string.h>   // strchr(), strlen(), strcpy() eta strncpy() funtzioetarako
#include <conio.h>    // getch() eta getche() funtzioetarako

#define MAXIMOA 21    // katea mugatzeko konstantea,
                      // 20 karaktere + null mugatzailea

void IzenaZenbakiaBanatu(char *sDatua, char *sIzena, float *fZbk);

int main()
{
    char sKatea[MAXIMOA] = "Kaixo mundua!";  // 13 letra + null mugatzailea
    char cKarakterea;
    char *erakuslea;

    printf("\n");
    printf("\n Luzera=%d      sKatea=|%s|", (int)strlen(sKatea), sKatea);

    printf("\n");
    printf("\n Bilatu nahi den karaktere eman (adibidez: a edo u edo k): ");
    cKarakterea = getche();

    erakuslea = strchr(sKatea, cKarakterea);
    printf("\n Bilaketaren emaitza: ||%s||", erakuslea);
    if (erakuslea != NULL)
        printf("\n Bilaketaren posizioa: |%d|", (int)(erakuslea - sKatea));

    printf("\n\n Edozein tekla sakatu adibidearekin jarraitzeko... ");
    getch();

    char sDatua[MAXIMOA] = "Ana#7.25";  // 8 karaktere + null mugatzaile
    char sIzena[MAXIMOA];
    float fZbk;

    printf("\n");
    printf("\n Luzera=%d      sDatua=|%s|\n", (int)strlen(sDatua), sDatua);

    IzenaZenbakiaBanatu(sDatua, sIzena, &fZbk);
    printf("\n sIzena=||%s||    (fZbk+1.11)=%.2f", sIzena, fZbk+1.11);

    printf("\n\n Edozein tekla sakatu exekuzioa amaitzeko...\n\n");
    return 0;
}


void IzenaZenbakiaBanatu(char *sDatua, char *sIzena, float *fZbk)
{
    char *TraolaErak;
    char sLaguntzaile[MAXIMOA];

    printf("\n                ---sDatua=|%s|---", sDatua);
    TraolaErak = strchr(sDatua, '#');
    printf("\n            ---TraolaErak=|%s|---", TraolaErak);
    printf("\n     ___(helbidea) sDatua=%li___", (long)sDatua);
    printf("\n ___(helbidea) TraolaErak=%li___", (long)TraolaErak);
    printf("\n     ___TraolaErak-sDatua=%li (karaktere kopurua)___\n", (long)(TraolaErak - sDatua));
    if (TraolaErak != NULL)
    {
        strncpy(sIzena, sDatua, TraolaErak - sDatua);
        sIzena[TraolaErak - sDatua] = '\0';
        printf("\n                ---sIzena=|%s|---\n", sIzena);
        printf("\n            ---TraolaErak=|%s|---", TraolaErak);
        printf("\n          ---TraolaErak+1=|%s|---", TraolaErak+1);
        printf("\n          ---TraolaErak-1=|%s|---\n", TraolaErak-1);
        strcpy(sLaguntzaile, TraolaErak + 1);
        *fZbk = atof(sLaguntzaile);
    }
}






  • 12c1-Jarduera_Erakusleak.cbp | main.c
  • 12c2-Jarduera_Erakusleak.cbp | main.c


 

iruzkinik ez:

Argitaratu iruzkina