| ZER DAKIDAN: Arrayak eta estrukturak ezagutzen ditut. ZER IKASIKO DUDAN: Kateen array batetik abiatuta, estrukturen array bat lortuko dut programa honetan. |
Laborategiko gela batean, gehienez, 25 ikasle izango dira. Ikasleen datuak bektore batean biltzen dira, adibidez irudiko hurrengo 5 ikasleren datuak. Bektorearen elementuak kateak izanik bertan izena eta zenbaki bat daude koma batez banaturik. Jatorrizko kateak moztuz, beste array bat lortu behar da, 5 elementukoa ere, baina array berriaren elementuak estrukturak izango dira:
Horretarako, ezinbestekoa da datu-motak era egokian definitzea. Ondoko irudian erakusten da programatzaile batek egindako datu-mota definizioa:
Eta hauek dira aldagai garrantzitsuenak, kateen arraya eta estrukturen arraya:
/* Ariketa-70_EstrukturenBektoreBatLortu: kateen array batetik estrukturen array batera */
#include <stdio.h>
#include <string.h> // strcspn(), strchr(), strcpy(), strncpy() eta strcmp() funtzioetarako
#include <stdlib.h> // srand() eta rand() funtzioterako
#include <time.h> // time() funtziorako
#include <ctype.h> // toupper() funtziorako
#include <conio.h> // getche() funtziorako
#include <math.h> // fabs() funtziorako
#define IKASLE_KOP_MAX 25
#define KATEEN_LUZ_MAX 31
struct tstElementu
{
char sNor[31];
float fNota;
};
void DatuakSartu(char asZerrenda_1[IKASLE_KOP_MAX][KATEEN_LUZ_MAX],
int *iLuzera);
void DatuakIkusi(const char asZerrenda_1[IKASLE_KOP_MAX][KATEEN_LUZ_MAX],
int iLuzera);
int iElementuaBilatu(const char asZerrenda_1[IKASLE_KOP_MAX][KATEEN_LUZ_MAX],
int iLuzera,
const char sGakoDatuOsoa[31]);
void IzenaZenbakiaBanatu( char *sDatua,
char sIzena[31],
float *fZbk);
void BektoreBerriaSortu( char asZerrenda_1[IKASLE_KOP_MAX][KATEEN_LUZ_MAX],
struct tstElementu astZerrenda_2[IKASLE_KOP_MAX],
int iLuzera);
void BektoreBerriaIkusi(const struct tstElementu astZerrenda_2[IKASLE_KOP_MAX],
int iLuzera);
int iIkasleaIzenezBilatu(const struct tstElementu astZerrenda_2[IKASLE_KOP_MAX],
int iLuzera,
const char sGakoa[31]);
int iIkasleaNotazBilatu(const struct tstElementu astZerrenda_2[IKASLE_KOP_MAX],
int iLuzera,
float fGakoa);
int main()
{
char asZerrenda_1[IKASLE_KOP_MAX][KATEEN_LUZ_MAX];
struct tstElementu astZerrenda_2[IKASLE_KOP_MAX]; // gehienez 25 ikasle, indizeak 0-tik 24-ra
int iLuzera, iNon;
char sGakoa[KATEEN_LUZ_MAX];
float fGakoa;
DatuakSartu(asZerrenda_1, &iLuzera);
printf("\n");
DatuakIkusi(asZerrenda_1, iLuzera);
printf("Ikaslearen datuak eman (adibidez 'Jokin,+1.38')\nelementu horren posizioa zehazteko: ");
gets(sGakoa);
iNon = iElementuaBilatu(asZerrenda_1, iLuzera, sGakoa);
if (iNon == -1)
printf("'%s' elementu hori ez dago gelan\n", sGakoa);
else
printf("'%s' elementuaren posizioa gelan %d da\n", sGakoa, iNon);
printf("\n\n");
BektoreBerriaSortu(asZerrenda_1, astZerrenda_2, iLuzera);
BektoreBerriaIkusi(astZerrenda_2, iLuzera);
printf("Ikaslearen izena eman (adibidez 'Jokin')\nbere posizioa zehazteko: ");
gets(sGakoa);
iNon = iIkasleaIzenezBilatu(astZerrenda_2, iLuzera, sGakoa);
if (iNon == -1)
printf("'%s' izeneko ikaslerik ez dago gelan\n", sGakoa);
else
printf("'%s' ikaslearen posizioa gelan %d da\n", sGakoa, iNon);
printf("Ikaslearen nota eman bere posizioa zehazteko: ");
scanf("%f", &fGakoa);
iNon = iIkasleaNotazBilatu(astZerrenda_2, iLuzera, fGakoa);
if (iNon == -1)
printf("%.2f nota duen ikaslerik ez dago gelan\n", fGakoa);
else
printf("%.2f nota duen ikaslearen posizioa gelan %d da\n", fGakoa, iNon);
printf("\n");
getchar();
return 0;
}
void DatuakSartu(char asZerrenda_1[IKASLE_KOP_MAX][KATEEN_LUZ_MAX],
int *iLuzera)
{
int iKont = 0;
char cErantz;
char sIzena[KATEEN_LUZ_MAX];
char sZeinua[2] = "";
char sZbk[5] = "";
srand(time(NULL));
cErantz = 'B';
while (iKont < IKASLE_KOP_MAX && cErantz == 'B')
{
strcpy(asZerrenda_1[iKont], "");
printf("\n\nasZerrenda_1[%d]=|%s| (hasieran hutisk)", iKont, asZerrenda_1[iKont]);
printf("\n%d posizioko ikaslearen izena eman (adibidez, Danel): ", iKont);
gets(sIzena);
strcat(asZerrenda_1[iKont], sIzena);
strcat(asZerrenda_1[iKont], ",");
printf("asZerrenda_1[%d]=|%s| (izena,)", iKont, asZerrenda_1[iKont]);
if (rand() % 2 == 0)
sZeinua[0] = '-';
else
sZeinua[0] = '+';
strcat(asZerrenda_1[iKont], sZeinua);
printf("\nasZerrenda_1[%d]=|%s| (izena,+)izena,-)", iKont, asZerrenda_1[iKont]);
srand(time(NULL));
sZbk[0] = (char)(rand()%10 + (int)'0');
sZbk[1] = '.';
sZbk[2] = (char)(rand()%10 + (int)'0');
sZbk[3] = (char)(rand()%10 + (int)'0');
// printf("\nsZbk=|%s|\n\n", sZbk);
strcat(asZerrenda_1[iKont], sZbk);
printf("\nasZerrenda_1[%d]=|%s| (izena,+1.23)\n", iKont, asZerrenda_1[iKont]);
iKont++;
do
{
printf("Ikasle gehiagorik? (B/E): ");
cErantz = getche();
cErantz = toupper(cErantz);
if (cErantz != 'B' && cErantz != 'E')
printf("\n'B' ala 'E'\n");
} while (cErantz != 'B' && cErantz != 'E');
}
*iLuzera = iKont;
}
void DatuakIkusi(const char asZerrenda_1[IKASLE_KOP_MAX][KATEEN_LUZ_MAX],
int iLuzera)
{
printf("\nEdukiak:\n");
for (int i = 0; i < iLuzera; i++)
{
printf("%2d. ikaslea: %s\n", i + 1, asZerrenda_1[i]);
}
}
int iElementuaBilatu(const char asZerrenda_1[IKASLE_KOP_MAX][KATEEN_LUZ_MAX],
int iLuzera,
const char sGakoDatuOsoa[])
{
for (int iKont = 0; iKont < iLuzera; iKont++)
{
if (strcmp(asZerrenda_1[iKont], sGakoDatuOsoa) == 0)
return iKont;
}
return -1; // aurkitzen ez denean
}
void IzenaZenbakiaBanatu( char *sDatua,
char sIzena[31],
float *fZbk)
{
char *KomaErak;
char sLaguntzaile[KATEEN_LUZ_MAX];
printf("--------------------------------------------------\n");
printf(" ---sDatua=|%s|---\n", sDatua);
KomaErak = strchr(sDatua, ',');
printf("\n ---KomaErak=|%s|---\n", KomaErak);
printf("\n ___(helbidea) sDatua=%li___", (long)sDatua);
printf("\n ___(helbidea) KomaErak=%li___", (long)KomaErak);
printf("\n ___KomaErak - sDatua=%li (karaktere kopurua)___\n", (long)(KomaErak - sDatua));
if (KomaErak != NULL)
{
strncpy(sIzena, sDatua, KomaErak - sDatua);
sIzena[KomaErak - sDatua] = '\0';
printf("\n ---sIzena=|%s|---\n", sIzena);
printf("\n ---KomaErak=|%s|---", KomaErak);
printf("\n ---KomaErak+1=|%s|---", KomaErak+1);
printf("\n ---KomaErak-1=|%s|---", KomaErak-1);
strcpy(sLaguntzaile, KomaErak + 1);
*fZbk = atof(sLaguntzaile);
}
printf("\n--------------------------------------------------\n\n");
}
void BektoreBerriaSortu( char asZerrenda_1[IKASLE_KOP_MAX][KATEEN_LUZ_MAX],
struct tstElementu astZerrenda_2[IKASLE_KOP_MAX],
int iLuzera)
{
for (int i = 0; i < iLuzera; i++)
{
IzenaZenbakiaBanatu(asZerrenda_1[i], astZerrenda_2[i].sNor, &astZerrenda_2[i].fNota);
}
}
void BektoreBerriaIkusi(const struct tstElementu astZerrenda_2[IKASLE_KOP_MAX],
int iLuzera)
{
for (int i = 0; i < iLuzera; i++)
{
printf("%2d. ikaslea:\n", i + 1);
printf("Izena = %s\n", astZerrenda_2[i].sNor);
printf("Nota = %.2f\n\n", astZerrenda_2[i].fNota);
}
}
int iIkasleaIzenezBilatu(const struct tstElementu astZerrenda_2[IKASLE_KOP_MAX],
int iLuzera,
const char sGakoa[31])
{
for (int iKont = 0; iKont < iLuzera; iKont++)
{
if (strcmp(astZerrenda_2[iKont].sNor, sGakoa) == 0)
return iKont;
}
return -1; // aurkitzen ez denean
}
int iIkasleaNotazBilatu(const struct tstElementu astZerrenda_2[IKASLE_KOP_MAX],
int iLuzera,
float fGakoa)
{
#define DOITASUNA 0.0001
int iKont;
for (iKont = 0; iKont < iLuzera; iKont++)
{
if (fabs(astZerrenda_2[iKont].fNota - fGakoa) < DOITASUNA)
return iKont;
}
return -1; // aurkitzen ez denean
}



iruzkinik ez:
Argitaratu iruzkina