| ZER DAKIDAN: Arrayak eta erregistroak ezagutzen ditut. ZER IKASIKO DUDAN: Kateen bi arrayetatik abiatuta erregistroen array bat lortuko dut programa honetan. |
|
Elementuak ezabatu bi algoritmo desberdinez
Ikasleen informazioa biltzen duen bektore bat daukagu. Ikasle bakoitzaren informazioa izena eta adina dira. Ikasleen izenak ez dira errepikatu behar eta horregatik BektoreaDatuDesberdinezBete() funtzioak iIkasleaBilatu() funtzioa darabil konprobatzeko onartuko duen ikaslea benetan berria den. Bektorea datuz horniturik dagoenen bi ezabaketa egiten dira:
Bukatu aurretik ikasle berri baten datuak zerrendara eramaten dira. Lehenik tokirik dagoela konprobatzen da, gero ikasle berriaren posizioa zein den eskatzen da eta, azkenean, ikasle berriaren datuak jaso ondoren, erregistro hori dagokion posizioan zerrendan txertatzen da (desberdinduz benetako txertaketa den ala gehiketa den). |
/* Ariketa-72_ArrayBatetikElementuakKendu: erregistroen array bat datuz bete ondoren
zenbait baldintza betetzen duten elementuak
arraytik kendu. */
// Hasierako informazioa erregistroen bektore bat da. Lehen ezabaketa A letratik
// hasten diren izenen elementuena da. Bigarren ezabaketa adin txikikoen elementuena
// da. Gero, amaitzeko, elementu berri baten txertaketa/gehiketa egiten da.
#include <stdio.h>
#include <string.h> // memcpy(), strcasecmp(), strcspn() eta strcpy() funtzioetarako
#include <ctype.h> // tolower() funtziorako
#define BEHEMUGA 0
#define GOIMUGA 24
#define LUZERAMAX 15+1
typedef char tsKate16[LUZERAMAX];
typedef struct
{
char sIzena[LUZERAMAX];
int iAdina;
} trdIkaslea;
typedef trdIkaslea tardZerrenda[GOIMUGA];
int iIkasleaBilatu(const tardZerrenda ardIkasgela,
int iLuzera,
const tsKate16 sGakoa);
void BektoreaDatuDesberdinezBete(tardZerrenda ardIkasgela, int* iLuzera);
void BektorearenEdukiaIkusi(const tardZerrenda ardIkasgela, int iLuzera);
void ElementuBatEzabatu(tardZerrenda ardIkasgela,
int* iLuzera,
int k);
int boIzenarenHasiera_A_Da(const trdIkaslea* rdIkasleBat);
float rBatezbestekoaKalkulatu(const tardZerrenda ardIkasgela, int iLuzera);
void IkasleGazteakEzabatu(tardZerrenda ardIkasgela,
int* iLuzera,
float rBatezBestekoa);
void IkasleBatenDatuakJaso(trdIkaslea* rdIkasleBat);
void IkasleBatTxertatu(tardZerrenda ardIkasgela,
int* iLuzera,
const trdIkaslea* rdIkaslea,
int iNon);
int main()
{
tardZerrenda ardIkasgela;
int iLuzera, k;
float rBatezBestekoa;
int iNon;
trdIkaslea rdIkasleBerria;
printf("------------------------------------------------\n\n");
BektoreaDatuDesberdinezBete(ardIkasgela, &iLuzera);
printf("\n");
BektorearenEdukiaIkusi(ardIkasgela, iLuzera);
k = BEHEMUGA;
while (k < iLuzera)
{
if (boIzenarenHasiera_A_Da(&ardIkasgela[k]))
ElementuBatEzabatu(ardIkasgela, &iLuzera, k);
else
k++;
}
printf("\nIzenaren hasiera A denean ikasleak zerrendatik kendu ostean:\n");
BektorearenEdukiaIkusi(ardIkasgela, iLuzera);
printf("\n");
rBatezBestekoa = rBatezbestekoaKalkulatu(ardIkasgela, iLuzera);
printf("BatezBestekoa = %.3f\n", rBatezBestekoa);
IkasleGazteakEzabatu(ardIkasgela, &iLuzera, rBatezBestekoa);
printf("Mediatik beherako adina duten ikasleak zerrendatik kendu ostean:\n");
BektorearenEdukiaIkusi(ardIkasgela, iLuzera);
printf("\nIkasle berri baten datuak zerrendan gorde:\n");
if (iLuzera < GOIMUGA)
{
do
{
printf("Eman ikasle berriaren posizioa zerrendan (%d eta %d) artekoa: ", BEHEMUGA, iLuzera);
scanf("%d", &iNon);
fflush(stdin);
} while (iNon < BEHEMUGA || iNon > iLuzera);
IkasleBatenDatuakJaso(&rdIkasleBerria);
if (iNon == iLuzera)
{
ardIkasgela[iNon] = rdIkasleBerria;
iLuzera++;
}
else
IkasleBatTxertatu(ardIkasgela, &iLuzera, &rdIkasleBerria, iNon);
BektorearenEdukiaIkusi(ardIkasgela, iLuzera);
}
else
printf("Zerrenda beterik dago, ezin da ikasle berririk sartu.\n");
printf("\n\nAmaituta!----------------------------------------\n\n");
return 0;
}
int iIkasleaBilatu(const tardZerrenda ardIkasgela,
int iLuzera,
const tsKate16 sGakoa)
{
int k = BEHEMUGA;
int boAurkitua = 0;
while (k <= iLuzera && !boAurkitua)
{
// strcasecmp() funtzioa strcmp() bezalakoa baina majuskulak eta minuskulak kontutan hartu gabe,
// konparaketa hasi baino lehen letra guztiak minuskuletan jartzen ditu funtzioak berak
if (strcasecmp(ardIkasgela[k].sIzena, sGakoa) == 0)
boAurkitua = 1;
else
k++;
}
return boAurkitua ? k : -1;
}
void BektoreaDatuDesberdinezBete(tardZerrenda ardIkasgela, int* iLuzera)
{
int k, iPosizioa;
char sNor[LUZERAMAX];
do
{
printf("Ikasleen kopurua eman: ");
scanf("%d", iLuzera);
fflush(stdin);
} while (*iLuzera < BEHEMUGA || *iLuzera > GOIMUGA);
printf("\nLehen ikaslearen izena berria delako ez dago errepikaturik...\n\n");
printf("Eman %d. ikaslearen izena: ", BEHEMUGA);
fgets(ardIkasgela[BEHEMUGA].sIzena, LUZERAMAX, stdin);
ardIkasgela[BEHEMUGA].sIzena[strcspn(ardIkasgela[BEHEMUGA].sIzena, "\n")] = 0; // lerro-berri karakterea kendu
printf("Eman %d. ikaslearen adina: ", BEHEMUGA);
scanf("%d", &ardIkasgela[BEHEMUGA].iAdina);
fflush(stdin);
printf("\nGainerako ikaslen izenak ez dira errepikatzen...\n\n");
for (k = BEHEMUGA + 1; k < *iLuzera; k++)
{
do
{
printf("Eman %d. ikaslearen izena: ", k);
fgets(sNor, LUZERAMAX, stdin);
sNor[strcspn(sNor, "\n")] = 0; // lerro-berri karakterea kendu
iPosizioa = iIkasleaBilatu(ardIkasgela, k - 1, sNor);
if (iPosizioa != -1)
printf("\"%s\" izeneko ikaslerik badago %d. posizioan\n", sNor, iPosizioa);
} while (iPosizioa != -1);
strcpy(ardIkasgela[k].sIzena, sNor);
printf("Eman %d. ikaslearen adina: ", k);
scanf("%d", &ardIkasgela[k].iAdina);
fflush(stdin);
printf("\n");
}
}
void BektorearenEdukiaIkusi(const tardZerrenda ardIkasgela, int iLuzera)
{
for (int k = BEHEMUGA; k < iLuzera; k++)
{
printf("%d. ikaslea: %-15s%20d urte\n", k, ardIkasgela[k].sIzena, ardIkasgela[k].iAdina);
}
}
void ElementuBatEzabatu(tardZerrenda ardIkasgela,
int* iLuzera,
int k)
{
for (int i = k; i < *iLuzera; i++)
{
ardIkasgela[i] = ardIkasgela[i + 1];
}
(*iLuzera)--;
}
int boIzenarenHasiera_A_Da(const trdIkaslea* rdIkasleBat)
{
return tolower(rdIkasleBat->sIzena[0]) == 'a';
}
float rBatezbestekoaKalkulatu(const tardZerrenda ardIkasgela, int iLuzera)
{
float rMetagailua = 0.0;
for (int k = BEHEMUGA; k < iLuzera; k++)
{
rMetagailua += ardIkasgela[k].iAdina;
}
return rMetagailua / iLuzera;
}
void IkasleGazteakEzabatu(tardZerrenda ardIkasgela,
int* iLuzera,
float rBatezBestekoa)
{
tardZerrenda ardLaguntzailea;
int iZenbatIkasle = 0;
for (int k = BEHEMUGA; k < *iLuzera; k++)
{
if (ardIkasgela[k].iAdina >= rBatezBestekoa)
{
ardLaguntzailea[iZenbatIkasle] = ardIkasgela[k];
iZenbatIkasle++;
}
}
memcpy(ardIkasgela, ardLaguntzailea, iZenbatIkasle*sizeof(trdIkaslea));
*iLuzera = iZenbatIkasle;
}
void IkasleBatenDatuakJaso(trdIkaslea* rdIkasleBat)
{
printf("Eman ikaslearen izena: ");
fgets(rdIkasleBat->sIzena, LUZERAMAX, stdin);
rdIkasleBat->sIzena[strcspn(rdIkasleBat->sIzena, "\n")] = 0; // lerro-berri karakterea kendu
printf("Eman ikaslearen adina: ");
scanf("%d", &rdIkasleBat->iAdina);
fflush(stdin);
}
void IkasleBatTxertatu(tardZerrenda ardIkasgela,
int* iLuzera,
const trdIkaslea* rdIkaslea,
int iNon)
{
for (int k = *iLuzera; k >= iNon; k--)
{
ardIkasgela[k + 1] = ardIkasgela[k];
}
ardIkasgela[iNon] = *rdIkaslea;
(*iLuzera)++;
}
}

iruzkinik ez:
Argitaratu iruzkina