2025(e)ko martxoaren 8(a), larunbata

Ariketa 46 | Algoritmoak arrayetan (2)


ZER DAKIDAN:
Zenbaki errealen array datu-motako aldagai batekin lan eginez, oinarrizko algoritmo batzuk programatzen ikasi dut.



ZER IKASIKO DUDAN:
Zenbaki errealen array datu-motako aldagai batekin lanean jarraituz, beste algoritmo batzuk programatzen ikasiko dut.


Ezagutzen dugun zarekin jarraituz. Gogora ekar dezagun zenbaki errealen afBektorea izeneko array-aldagiak gehienez LUZMAX=20 elementu izan ditzakeela, eta bektore horrek 0.0 eta 99.9 zenbaki errealak gordetzen dituela. Adibidez, une jakin batean 5 elementu dituen afBektorea array horren edukia hau izan daiteke, non iLuzera aldagaiak bektorearen luzera efektiboa gordetzen duen:

afBektorea
62.70
17.68
32.21
98.41
9.82


0
1
2
3
4
...
19
iLuzera
5

Gogoratu ere iLuzera aldagaiak bektorearen luzera efektiboa gordetzen duela, hots, zenbat elementu dituen une horretan, bere mugak 0 eta LUZMAX=20 dira. Beraz, bektorea beterik izatean iLuzera aldagaian LUZMAX=20 balioa gordeko da, eta, aldiz, bektorea hutsik izatean iLuzera aldagaian 0 marka gordeko da.


Bere posizioa ezaguna delarik, arrayaren elementu bat aldatu edo ordeztu. Elementu berriaren balioa teklatuz irakurriko da.

Aurreko programa batean erabiltzaileak teklatuz erabakitzen zuen bektorean gordeko diren elementuen kopurua. Orain, iLuzera kopurua modu aleatorioan lortuko da (gehienez 20 elementu: 0. posiziotik 19. posizioraino), eta, modu aleatorioan ere 0.0 eta 99.99 arteko zenbakiak bektorean biltegituko dira. Funtzio nagusian ondoko funtzioak deituko dira: BektoreaAleatoriokiBete() eta BektoreaIkusi().

Elementu bat aldatzeko, onargarria den bere posizioa teklatuz eman eta posizio horretako arrayaren elementua ordeztu. Lehen hurbilpen honetan, elementu berriaren balioa teklatuz irakurriko da (0.0 eta 99.99 arteko kopurua, noski).

/* Ariketa-46a1_ElementuBatAldatu: arrayaren elementu bat aldatu  */

// Errealekin lan eginez. Array bat datuz auzaz bete funtzio batean
// eta ondoren arrayaren bere elementu baten balioa ordeztu.

#include <stdio.h>
#include <stdlib.h>   // rand() eta srand() funtzioetarako
#include <time.h>     // time() funtzioarako

#define BEHEMUGA 0.0
#define GOIMUGA 99.9
#define LUZMAX  20    // 20 elementu gehienez: 0. posiziotik 19. posizionarino

void BektoreaAleatoriokiBete(float[], int);
void BektoreaIkusi(const float[], int);
void BektorearenDatuBatOrdeztu1(float[], int);

int main()
{
	float afBektorea[LUZMAX];
	int iLuzera;
	int iPosizioa;

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

	srand(time(NULL));  // srand() zenbaki aleatorioak berriro hasiarazteko, hazia behar du
                        // time(NULL) funtzioak igarotako segundoak itzultzen ditu 1970-01-01 datatik hasita
	iLuzera = rand() % LUZMAX + 1;   // [hondarra + 1] = [(0 eta 19 artekoa) + 1]   gutxienez elementu bat
 // printf("\n %d \t\t %d", iKont, iLuzera);


	printf("\n\t %d datu auzaz hartuko dira, %.1f eta %.1f arteko balioekin. \n", iLuzera, BEHEMUGA, GOIMUGA);
	BektoreaAleatoriokiBete(afBektorea, iLuzera);

	printf("\n\t Arrayaren iLuzera=%d elementuak: \n", iLuzera);
	BektoreaIkusi(afBektorea, iLuzera);

	printf("\n Eman posizioa eta bertan jarri nahi dugun elementu berria (aurrekoa galduko da)\n");
	do
    {
        printf(" Zein posizioatan gordeko da elementu berria? (0 eta %d artekoa): ", iLuzera-1);
        scanf("%d", &iPosizioa);
    } while ((iPosizioa < 0) || (iPosizioa >= iLuzera));

    BektorearenDatuBatOrdeztu1(afBektorea, iPosizioa);
	printf("\n\t Arrayaren elementu berriak: \n");
	BektoreaIkusi(afBektorea, iLuzera);

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


void BektoreaAleatoriokiBete(float afBektorea[], int iLuzera)   // lehen parametroa irteerakoa da
{                                                               // bigarren parametroa sarrerakoa da
	int iKont;

 // printf("\n");
 // printf("\n\t [%.2f <= BalioOnargarria <= %.2f]", BEHEMUGA, GOIMUGA);
 // printf("\n\t ----------------------------------");

    srand(time(NULL));  // srand() zenbaki aleatorioak berriro hasiarazteko, hazia behar du
                        // time(NULL) funtzioak igarotako segundoak itzultzen ditu 1970-01-01 datatik hasita
    for (iKont=0; iKont < iLuzera; iKont++)
	{
		afBektorea[iKont] = ((float)rand()/RAND_MAX) * (GOIMUGA-BEHEMUGA);                 // 0.0 eta 0.999 artekoa bider (GOIMUGA-BEHEMUGA)
     // printf("\n %15.2f  (0.0 eta %.2f artekoa)", afBektorea[iKont], GOIMUGA-BEHEMUGA);  // 0.0 eta 99.9 artekoa
	}
 // printf("\n");
}


void BektoreaIkusi(const float afBektorea[], int iLuzera)  // bi parametroak sarrerakoak
{
	int iKont;

 // afBektorea[3] = 3.33;   babestuta dago

	printf("\n");
	printf("\t     Posizioa     Balioa\n");
	printf("\t     --------     ------\n");
	for (iKont=0; iKont < iLuzera; iKont++)
	{
		printf("\t %9d %13.2f\n", iKont, afBektorea[iKont]);
	}
}


void BektorearenDatuBatOrdeztu1(float afBektorea[], int iPosizioa)
{
    float fDatuBerria;

    printf("\n");
    do
    {
        printf(" %d. posizioko elementu berriaren balioa eman (0.0 eta 99.9 artekoa): ", iPosizioa);
        scanf("%f", &fDatuBerria);
    } while ((fDatuBerria < 0.0) || (fDatuBerria >= 100));
    afBektorea[iPosizioa] = fDatuBerria;
}


Bere posizioa ezaguna delarik, arrayaren elementu bat aldatu edo ordeztu. Elementu berriaren balioa kalkulu bat izango da.

Aurreko programa batean erabiltzaileak teklatuz erabakitzen zuen bektorean gordeko diren elementuen kopurua. Orain, iLuzera kopurua modu aleatorioan lortuko da (gehienez 20 elementu: 0. posiziotik 19. posizioraino), eta, modu aleatorioan ere 0.0 eta 99.99 arteko zenbakiak bektorean biltegituko dira. Funtzio nagusian ondoko funtzioak deituko dira: BektoreaAleatoriokiBete() eta BektoreaIkusi().

Onargarria den posizio teklatuz eman eta posizio horretako arrayaren elementua ordeztu. Bigarren hurbilpen honetan, elementu berriaren balioa kalkulu batetik lortuko dugu:

  • Teklatuz emandako posizioa 0 izatean, elementu berria bektorearen lehen posizioan kokatuko da eta bere balioa azken posizioko elementuaren erdia izango da.
  • Teklatuz emandako posizioa iLuzera-1 izatean, elementu berria bektoreari azken posizioan kokatuko da eta elementu berriaren balioa lehen posizioko elementuaren doblea izango da.
  • Emandako posizioa 1 eta iLuzera-2 bitartekoa izatean (biak barne), elementu berriaren balioa bere inguruko bi posizioetako zenbakien batezbesteko aritmetikoa izango da.
/* Ariketa-46a2_ElementuBatAldatu: arrayaren elementu bat aldatu  */

// Errealekin lan eginez. Array bat datuz auzaz bete funtzio batean
// eta ondoren arrayaren bere elementu baten balioa ordeztu.

#include <stdio.h>
#include <stdlib.h>  // rand() eta srand() funtzioetarako
#include <time.h>    // time() funtzioarako

#define BEHEMUGA 0.0
#define GOIMUGA 99.9
#define LUZMAX  20    // 20 elementu gehienez: 0. posiziotik 19. posizionarino

void BektoreaAleatoriokiBete(float[], int);
void BektoreaIkusi(const float[], int);
void BektorearenDatuBatOrdeztu2(float[], int, int);

int main()
{
	float afBektorea[LUZMAX];
	int iLuzera;
	int iPosizioa;

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

	srand((unsigned int)time(NULL));   // srand() zenbaki aleatorioak berriro hasiarazteko, hazia behar du
                                       // time(NULL) funtzioak igarotako segundoak itzultzen ditu 1970-01-01 datatik hasita
	iLuzera = (rand() % LUZMAX) + 1;   // (hondarra + 1) = [(0 eta 19 artekoa) + 1]
 // printf("\n %d \t\t %d", iKont, iLuzera);

	printf("\n\t %d datu auzaz hartuko dira, %.1f eta %.1f arteko balioekin. \n", iLuzera, BEHEMUGA, GOIMUGA);
	BektoreaAleatoriokiBete(afBektorea, iLuzera);

	printf("\n\t Arrayaren iLuzera=%d elementuak: \n", iLuzera);
	BektoreaIkusi(afBektorea, iLuzera);

	printf("\n Eman posizioa eta bertan jarri nahi dugun elementu berria (aurrekoa galduko da)\n");
	do
    {
        printf(" Zein posizioatan gordeko da elementu berria? (0 eta %d artekoa): ", iLuzera-1);
        scanf("%d", &iPosizioa);
    } while ((iPosizioa < 0) || (iPosizioa >= iLuzera));

    BektorearenDatuBatOrdeztu2(afBektorea, iLuzera, iPosizioa);
	printf("\n\t Arrayaren elementu berriak: \n");
	BektoreaIkusi(afBektorea, iLuzera);

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


void BektoreaAleatoriokiBete(float afBektorea[], int iLuzera)   // lehen parametroa irteerakoa da
{                                                               // bigarren parametroa sarrerakoa da
	int iKont;

 // printf("\n");
 // printf("\n\t [%.2f <= BalioOnargarria <= %.2f]", BEHEMUGA, GOIMUGA);
 // printf("\n\t ----------------------------------");

    srand(time(NULL));  // srand() zenbaki aleatorioak berriro hasiarazteko, hazia behar du
                        // time(NULL) funtzioak igarotako segundoak itzultzen ditu 1970-01-01 datatik hasita
    for (iKont=0; iKont < iLuzera; iKont++)
	{
		afBektorea[iKont] = ((float)rand()/RAND_MAX) * (GOIMUGA-BEHEMUGA);                 // 0.0 eta 0.999 artekoa bider (GOIMUGA-BEHEMUGA)
     // printf("\n %15.2f  (0.0 eta %.2f artekoa)", afBektorea[iKont], GOIMUGA-BEHEMUGA);  // 0.0 eta 99.9 artekoa
	}
 // printf("\n");
}


void BektoreaIkusi(const float afBektorea[], int iLuzera)  // bi parametroak sarrerakoak
{
	int iKont;

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

	printf("\n");
	printf("\t     Posizioa     Balioa\n");
	printf("\t     --------     ------\n");
	for (iKont=0; iKont < iLuzera; iKont++)
	{
		printf("\t %9d %13.2f\n", iKont, afBektorea[iKont]);
	}
}


void BektorearenDatuBatOrdeztu2(float afBektorea[], int iLuzera, int iPosizioa)
{
    float fDatuBerria;

    printf("\n");

    if (iPosizioa == 0)
    {
        fDatuBerria = afBektorea[iLuzera-1] / 2;
        afBektorea[iPosizioa] = fDatuBerria;
    }
    if (iPosizioa == iLuzera-1)
    {
        fDatuBerria = afBektorea[0] * 2;
        afBektorea[iPosizioa] = fDatuBerria;
    }
    if (iPosizioa > 0 && iPosizioa < iLuzera-1)
    {
        fDatuBerria = (afBektorea[iPosizioa-1] + afBektorea[iPosizioa+1]) / 2;
        afBektorea[iPosizioa] = fDatuBerria;
    }
}


Datuak dituen array batean elementu berri bat gehituko da bere bukaeran. Horretarako, lehenik eta behin frogatu beharko da arrayan toki librerik dagoela. Baiezkoan, elementu berriaren balioa teklatuz irakurri ondoren iLuzera posizioan gordeko da, eta, ondoren, iLuzera inkrementatu beharko da unitate batean.

/* Ariketa-46b_ElementuBerriaGehitu: elementu berri bat gehitu */

// Array baten hasieraketa. Datuak dituen array batean elementu berri bat
// gehituko da bukaeran baldin eta tokirik badago. Elementu berriaren
// balioa teklatuz emango da (0.0 eta 99.9 artekoa).

#include <stdio.h>

#define BEHEMUGA 0.0
#define GOIMUGA 99.9
#define LUZMAX  10   // 20 elementu gehienez: 0. posiziotik 19. posizionarino

void BektoreaIkusi(const float[], int);
void ElementuBatGehitu(float[], int *);

int main()
{
	static float afBektorea[LUZMAX] = { 67.34, 2.17, 89.37, 15.08, 16.16, 72.44, 5.09, 38.77 };
	int iLuzera = 8;

	printf("\n");
	printf("\n\t Arrayaren eta bere luzera efektiboaren hasieraketak");
	printf("\n\t ---------------------------------------------------\n");

	printf("\n\t Arrayaren iLuzera=%d elementuak hasieraketa ondoren: \n", iLuzera);
	BektoreaIkusi(afBektorea, iLuzera);

	if (iLuzera == LUZMAX)
	    printf("\n\t Arraya beterik dago eta ez da elementu gehiagorik onartzen! \n");
    else
    {
        ElementuBatGehitu(afBektorea, &iLuzera);
        printf("\n\t Balio berria gehitu ondoren: \n");
	    BektoreaIkusi(afBektorea, iLuzera);
    }

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


void BektoreaIkusi(const float afBektorea[], int iLuzera)  // bi parametroak sarrerakoak
{
	int iKont;

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

	printf("\n");
	printf("\t     Posizioa     Balioa\n");
	printf("\t     --------     ------\n");
	for (iKont=0; iKont < iLuzera; iKont++)
	{
		printf("\t %9d %13.2f\n", iKont, afBektorea[iKont]);
	}
}


void ElementuBatGehitu(float afBektorea[], int *iLuzera)   // bi parametroak irterakoak dira
{
	float fDatuBerria;

    printf("\n");
    do
    {
        printf(" %d. posizioko elementu berriaren balioa eman (0.0 eta 99.9 artekoa): ", *iLuzera);
        scanf("%f", &fDatuBerria);
    } while (fDatuBerria < 0.0 || fDatuBerria >= 100);

    afBektorea[*iLuzera] = fDatuBerria;
    *iLuzera = *iLuzera + 1;
}


Arrayaren azken elementua kentzea oso eragiketa erraza da, nahikoa da iLuzera luzera efektiboa dekrementatzea.

/* Ariketa-46c_AzkenElementuaKendu: arrayaren azken elementua kendu */

// Array baten hasieraketa. Datuak dituen array batean azken elementua kenduko da.

#include <stdio.h>

#define BEHEMUGA 0.0
#define GOIMUGA 99.9
#define LUZMAX  10   // 20 elementu gehienez: 0. posiziotik 19. posizionarino

void BektoreaIkusi(const float[], int);

int main()
{
	static float afBektorea[LUZMAX] = { 67.34, 2.17, 89.37, 15.08, 16.16, 72.44, 5.09, 38.77 };
	int iLuzera = 8;

	printf("\n");
	printf("\n\t Arrayaren eta bere luzera efektiboaren hasieraketak");
	printf("\n\t ---------------------------------------------------\n");

	printf("\n\t Arrayaren iLuzera=%d elementuak hasieraketa ondoren: \n", iLuzera);
	BektoreaIkusi(afBektorea, iLuzera);

	iLuzera = iLuzera - 1;   // azken elementua kendu

	printf("\n\t Arrayaren iLuzera=%d elementuak azkena kendu ondoren: \n", iLuzera);
	BektoreaIkusi(afBektorea, iLuzera);

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


void BektoreaIkusi(const float afBektorea[], int iLuzera)  // bi parametroak sarrerakoak
{
	int iKont;

 // afBektorea[3] = 3.33;   babestuta dago

	printf("\n");
	printf("\t     Posizioa     Balioa\n");
	printf("\t     --------     ------\n");
	for (iKont=0; iKont < iLuzera; iKont++)
	{
		printf("\t %9d %13.2f\n", iKont, afBektorea[iKont]);
	}
}


Bere posizioa ezaguna delarik, arrayan elementu berri bat sartu. Elementu berriaren balioa teklatuz irakurriko da.

Datuak dituen array batean elementu berri bat txertatu. Horretarako, lehenik eta behin frogatu beharko da arrayan toki librerik dagoela. Baiezkoan, helburuko posizio teklatuz irakurriko da (0 eta iLuzera-1 balio bat), ondoren elementu berri bat sartuko da arrayan ElementuBatTxertatu1() funtzioaren bitartez, zeinek array laguntzaile bat erabiliz.

/* Ariketa-46d1_ElementuBerriaTxertatu: elementu berri bat txertatu
                                        array laguntzaile bat erabiliz */

// Array baten hasieraketa. Datuak dituen array batean elementu berri bat
// txertatuko dugu baldin eta tokirik badago. Elementu berriaren posizioa
// teklatuz emango da (0 eta iLuzera-1 arteko posizioa, biak barne).

#include <stdio.h>

#define BEHEMUGA 0.0
#define GOIMUGA 99.9
#define LUZMAX  20   // 20 elementu gehienez: 0. posiziotik 19. posizionarino

void BektoreaIkusi(const float[], int);
void ElementuBatTxertatu1(float[], int *, int);

int main()
{
	static float afBektorea[LUZMAX] = { 67.34, 2.17, 89.37, 15.08, 6.16, 72.44, 5.09, 38.77, 94.06 };
	int iLuzera = 9;
	int iPosizioa;

	printf("\n");
	printf("\n\t Arrayaren eta bere luzera efektiboaren hasieraketak");
	printf("\n\t ---------------------------------------------------\n");

	printf("\n\t Arrayaren iLuzera=%d elementuak hasieraketa ondoren: \n", iLuzera);
	BektoreaIkusi(afBektorea, iLuzera);

	if (iLuzera == LUZMAX)
	    printf("\n\t Arraya beterik dago eta ez da elementu gehiagorik onartzen! \n");
    else
    {
	    printf("\n");
	    do
        {
            printf(" Zein posizioatan txertatuko da elementu berria? (0 eta %d artekoa): ", iLuzera-1);
            scanf("%d", &iPosizioa);
        } while (iPosizioa < 0 || iPosizioa >= iLuzera);

        ElementuBatTxertatu1(afBektorea, &iLuzera, iPosizioa);
        printf("\n\t %d. indizeko posizioan balio berria txertatu ondoren: \n", iPosizioa);
	    BektoreaIkusi(afBektorea, iLuzera);
    }

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


void BektoreaIkusi(const float afBektorea[], int iLuzera)  // bi parametroak sarrerakoak
{
	int iKont;

 // afBektorea[3] = 3.33;   babestuta dago

	printf("\n");
	printf("\t     Posizioa     Balioa\n");
	printf("\t     --------     ------\n");
	for (iKont=0; iKont < iLuzera; iKont++)
	{
		printf("\t %9d %13.2f\n", iKont, afBektorea[iKont]);
	}
}


void ElementuBatTxertatu1(float afBektorea[], int *iLuzera, int iPosizioa)   // bi parametroak irteerakoak dira
{                                                                            // hirugarren parametroa sarrerakoa
	float fDatuBerria;
	int iKont;
	float afLaguntzailea[LUZMAX];

    printf("\n");
    do
    {
        printf(" %d. posizioko elementu berriaren balioa eman (0.0 eta 99.9 artekoa): ", *iLuzera);
        scanf("%f", &fDatuBerria);
    } while (fDatuBerria < 0.0 || fDatuBerria >= 100.0);

 // afBektorea[] arrayaren [0] posiziotik [iPosizioa-1] posizioraino afLaguntzailea[] kargatu
    for (iKont = 0; iKont < iPosizioa; iKont++)
    {
        afLaguntzailea[iKont] = afBektorea[iKont];
    }
 // [iPosizioa] posizioan datu berria gorde afLaguntzailea[] arrayan
    afLaguntzailea[iPosizioa] = fDatuBerria;
 // afBektorea[] arrayaren [iPosizioa] posiziotik [iLuzera] posizioraino afLaguntzailea[] kargatu
    for (iKont = iPosizioa; iKont < *iLuzera; iKont++)
    {
        afLaguntzailea[iKont+1] = afBektorea[iKont];
    }
 // luzera efektiboa inkrementatu
    *iLuzera = *iLuzera + 1;
 // afLaguntzailea[] arraytik abiatuta afBektorea[] arraya kargatu
    for (iKont = 0; iKont < *iLuzera; iKont++)
    {
        afBektorea[iKont] = afLaguntzailea[iKont];
    }
}


Bere posizioa ezaguna delarik, arrayan elementu berri bat sartu. Elementu berriaren balioa teklatuz irakurriko da.

Datuak dituen array batean elementu berri bat txertatu. Horretarako, lehenik eta behin frogatu beharko da arrayan toki librerik dagoela. Baiezkoan, helburuko posizio teklatuz irakurriko da (0 eta iLuzera-1 balio bat), ondoren elementu berri bat sartuko da arrayan ElementuBatTxertatu2() funtzioaren bitartez, zeinek array laguntzailerik ez da erabiltzen.

/* Ariketa-46d2_ElementuBerriaTxertatu: elementu berri bat txertatu
                                        array laguntzailerik gabe */

// Array baten hasieraketa. Datuak dituen array batean elementu berri bat
// txertatuko dugu baldin eta tokirik badago. Elementu berriaren posizioa
// teklatuz emango da (0 eta iLuzera-1 arteko posizioa, biak barne).

#include <stdio.h>

#define BEHEMUGA 0.0
#define GOIMUGA 99.9
#define LUZMAX  20   // 20 elementu gehienez: 0. posiziotik 19. posizionarino

void BektoreaIkusi(const float[], int);
void ElementuBatTxertatu2(float[], int *, int);

int main()
{
	static float afBektorea[LUZMAX] = { 67.34, 2.17, 89.37, 15.08, 16.16, 72.44, 5.09, 38.77 };
	int iLuzera = 8;
	int iPosizioa;

	printf("\n");
	printf("\n\t Arrayaren eta bere luzera efektiboaren hasieraketak");
	printf("\n\t ---------------------------------------------------\n");

	printf("\n\t Arrayaren iLuzera=%d elementuak hasieraketa ondoren: \n", iLuzera);
	BektoreaIkusi(afBektorea, iLuzera);

	if (iLuzera == LUZMAX)
	    printf("\n\t Arraya beterik dago eta ez da elementu gehiagorik onartzen! \n");
    else
    {
	    printf("\n");
	    do
        {
            printf(" Zein posizioatan txertatuko da elementu berria? (0 eta %d artekoa): ", iLuzera-1);
            scanf("%d", &iPosizioa);
        } while (iPosizioa < 0 || iPosizioa >= iLuzera);

        ElementuBatTxertatu2(afBektorea, &iLuzera, iPosizioa);
        printf("\n\t Balio berria txertatu ondoren: \n");
	    BektoreaIkusi(afBektorea, iLuzera);
    }

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


void BektoreaIkusi(const float afBektorea[], int iLuzera)  // bi parametroak sarrerakoak
{
	int iKont;

 // afBektorea[3] = 3.33;   babestuta dago

	printf("\n");
	printf("\t     Posizioa     Balioa\n");
	printf("\t     --------     ------\n");
	for (iKont=0; iKont < iLuzera; iKont++)
	{
		printf("\t %9d %13.2f\n", iKont, afBektorea[iKont]);
	}
}


void ElementuBatTxertatu2(float afBektorea[], int *iLuzera, int iPosizioa)   // bi parametroak irterakoak dira
{                                                                            // hirugarren parametroa sarrerakoa
	float fDatuBerria;
	int iKont;

    printf("\n");
    do
    {
        printf(" %d. posizioko elementu berriaren balioa eman (0.0 eta 99.9 artekoa): ", *iLuzera);
        scanf("%f", &fDatuBerria);
    } while (fDatuBerria < 0.0 || fDatuBerria >= 100.0);

    for (iKont = *iLuzera-1; iKont >= iPosizioa; iKont--)
    {
        afBektorea[iKont+1] = afBektorea[iKont];
    }
    afBektorea[iPosizioa] = fDatuBerria;
    *iLuzera = *iLuzera + 1;
}


Arraytik elementu bat kendu bere posizioa ezaguna delarik. Elementua kentzeko edo ezabatzeko ElementuBatKendu1() funtzioan egingo da, zeinek array laguntzaile bat erabiltzen duen.

/* Ariketa-46e1A_ElementuBakarraKendu: arraytik elementu bat kendu
                                       array laguntzaile bat erabiliz */

// Array baten hasieraketa. Datuak dituen array batean elementu bat
// kenduko dugu. Kenduko den elementuaren posizioa teklatuz emango
// da (0 eta iLuzera-1 arteko posizioa, biak barne).

#include <stdio.h>

#define BEHEMUGA 0.0
#define GOIMUGA 99.9
#define LUZMAX  20   // 20 elementu gehienez: 0. posiziotik 19. posizionarino

void BektoreaIkusi(const float[], int);
void ElementuBatKendu1(float[], int *, int);

int main()
{
	static float afBektorea[LUZMAX] = { 67.34, 2.17, 89.37, 15.08, 6.16, 72.44, 5.09, 38.77, 94.06 };
	int iLuzera = 9;
	int iPosizioa;

	printf("\n");
	printf("\n\t Arrayaren eta bere luzera efektiboaren hasieraketak");
	printf("\n\t ---------------------------------------------------\n");

	printf("\n\t Arrayaren iLuzera=%d elementuak hasieraketa ondoren: \n", iLuzera);
	BektoreaIkusi(afBektorea, iLuzera);

    printf("\n");
    do
    {
        printf(" Zein posizioko elementua kenduko da? (0 eta %d artekoa): ", iLuzera-2);
        scanf("%d", &iPosizioa);
    } while (iPosizioa < 0 || iPosizioa >= iLuzera-1);

    ElementuBatKendu1(afBektorea, &iLuzera, iPosizioa);
    printf("\n\t %d. indizedun elementua kendu ondoren: \n", iPosizioa);
    BektoreaIkusi(afBektorea, iLuzera);

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


void BektoreaIkusi(const float afBektorea[], int iLuzera)  // bi parametroak sarrerakoak
{
	int iKont;

 // afBektorea[3] = 3.33;   babestuta dago

	printf("\n");
	printf("\t     Posizioa     Balioa\n");
	printf("\t     --------     ------\n");
	for (iKont=0; iKont < iLuzera; iKont++)
	{
		printf("\t %9d %13.2f\n", iKont, afBektorea[iKont]);
	}
}


// Hurrengo azpiatalean baliokidea den beste algoritmo bat
void ElementuBatKendu1(float afBektorea[], int *iLuzera, int iPosizioa)   // bi parametroak irteerakoak dira
{                                                                         // hirugarren parametroa sarrerakoa
	int iKont;
	float afLaguntzailea[LUZMAX];

 // afBektorea[] arrayaren [0] posiziotik [iPosizioa-1] posizioraino afLaguntzailea[] kargatu
    for (iKont = 0; iKont <= iPosizioa; iKont++)
    {
        afLaguntzailea[iKont] = afBektorea[iKont];
    }
 // afBektorea[] arrayaren [iPosizioa+1] posiziotik [iLuzera] posizioraino afLaguntzailea[] kargatu
    for (iKont = iPosizioa+1; iKont < *iLuzera; iKont++)
    {
        afLaguntzailea[iKont-1] = afBektorea[iKont];
    }
 // luzera efektiboa dekrementatu
    *iLuzera = *iLuzera - 1;
 // afLaguntzailea[] arraytik abiatuta afBektorea[] arraya kargatu
    for (iKont = 0; iKont < *iLuzera; iKont++)
    {
        afBektorea[iKont] = afLaguntzailea[iKont];
    }
}


Arraytik elementu bat kendu bere posizioa ezaguna delarik. Elementua kentzeko edo ezabatzeko ElementuBatKendu1() funtzioan egingo da, zeinek array laguntzaile bat erabiltzen duen.

/* Ariketa-46e1B_ElementuBakarraKendu: arraytik elementu bat kendu
                                       array laguntzaile bat erabiliz */

// Array baten hasieraketa. Datuak dituen array batean elementu bat
// kenduko dugu. Kenduko den elementuaren posizioa teklatuz emango
// da (0 eta iLuzera-1 arteko posizioa, biak barne).

#include <stdio.h>

#define BEHEMUGA 0.0
#define GOIMUGA 99.9
#define LUZMAX  20   // 20 elementu gehienez: 0. posiziotik 19. posizionarino

void BektoreaIkusi(const float[], int);
void ElementuBatKendu1(float[], int *, int);

int main()
{
	static float afBektorea[LUZMAX] = { 67.34, 2.17, 89.37, 15.08, 6.16, 72.44, 5.09, 38.77, 94.06 };
	int iLuzera = 9;
	int iPosizioa;

	printf("\n");
	printf("\n\t Arrayaren eta bere luzera efektiboaren hasieraketak");
	printf("\n\t ---------------------------------------------------\n");

	printf("\n\t Arrayaren iLuzera=%d elementuak hasieraketa ondoren: \n", iLuzera);
	BektoreaIkusi(afBektorea, iLuzera);

    printf("\n");
    do
    {
        printf(" Zein posizioko elementua kenduko da? (0 eta %d artekoa): ", iLuzera-2);
        scanf("%d", &iPosizioa);
    } while (iPosizioa < 0 || iPosizioa >= iLuzera-1);

    ElementuBatKendu1(afBektorea, &iLuzera, iPosizioa);
    printf("\n\t %d. indizedun elementua kendu ondoren: \n", iPosizioa);
    BektoreaIkusi(afBektorea, iLuzera);

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


void BektoreaIkusi(const float afBektorea[], int iLuzera)  // bi parametroak sarrerakoak
{
	int iKont;

 // afBektorea[3] = 3.33;   babestuta dago

	printf("\n");
	printf("\t     Posizioa     Balioa\n");
	printf("\t     --------     ------\n");
	for (iKont=0; iKont < iLuzera; iKont++)
	{
		printf("\t %9d %13.2f\n", iKont, afBektorea[iKont]);
	}
}


// Aurreko azpiatalaren baliokidea den beste algoritmo bat
void ElementuBatKendu1(float afBektorea[], int *iLuzera, int iPosizioa)   // bi parametroak irteerakoak dira
{                                                                         // hirugarren parametroa sarrerakoa
	int iKont;
	float afLaguntzailea[LUZMAX];
	int iNonGorde;

 // afBektorea[] arraytik abiatuta afLaguntzailea[] arraya kargatu
    iNonGorde = -1;   // afLaguntzailea[] hasieran hutsik
    for (iKont = 0; iKont < *iLuzera; iKont++)
    {
        if (iKont != iPosizioa)
        {
            iNonGorde++;
            afLaguntzailea[iNonGorde] = afBektorea[iKont];
        }
    }

    printf("\n\t Array laguntzailea: iNonGorde+1=%d \n", iNonGorde+1);
    BektoreaIkusi(afLaguntzailea, iNonGorde+1);

 // afLaguntzailea[] arraytik abiatuta afBektorea[] arraya kargatu
    for (iKont = 0; iKont <= iNonGorde; iKont++)
    {
        afBektorea[iKont] = afLaguntzailea[iKont];
    }
 // luzera efektiboa dekrementatu
    *iLuzera = *iLuzera - 1;
}


Arraytik elementu bat kendu bere posizioa ezaguna delarik. Elementua kentzeko edo ezabatzeko ElementuBatKendu2() funtzioan egingo da, zeinek array laguntzailerik ez den erabiltzen.

/* Ariketa-46e2_ElementuBakarraKendu: arraytik elementu bat kendu
                                      array laguntzailerik gabe */

// Array baten hasieraketa. Datuak dituen array batean elementu bat
// kenduko dugu. Kenduko den elementuaren posizioa teklatuz emango
// da (0 eta iLuzera-1 arteko posizioa, biak barne).

#include <stdio.h>

#define BEHEMUGA 0.0
#define GOIMUGA 99.9
#define LUZMAX  20   // 20 elementu gehienez: 0. posiziotik 19. posizionarino

void BektoreaIkusi(const float[], int);
void ElementuBatKendu2(float[], int *, int);

int main()
{
	static float afBektorea[LUZMAX] = { 67.34, 2.17, 89.37, 15.08, 16.16, 72.44, 5.09, 38.77 };
	int iLuzera = 8;
	int iPosizioa;

	printf("\n");
	printf("\n\t Arrayaren eta bere luzera efektiboaren hasieraketak");
	printf("\n\t ---------------------------------------------------\n");

	printf("\n\t Arrayaren iLuzera=%d elementuak hasieraketa ondoren: \n", iLuzera);
	BektoreaIkusi(afBektorea, iLuzera);

	printf("\n");
    do
    {
        printf(" Zein posizioko elementua kenduko da? (0 eta %d artekoa): ", iLuzera-2);
        scanf("%d", &iPosizioa);
    } while (iPosizioa < 0 || iPosizioa >= iLuzera-1);


    ElementuBatKendu2(afBektorea, &iLuzera, iPosizioa);
    printf("\n\t %d. indizedun elementua kendu ondoren: \n", iPosizioa);
    BektoreaIkusi(afBektorea, iLuzera);

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


void BektoreaIkusi(const float afBektorea[], int iLuzera)  // bi parametroak sarrerakoak
{
	int iKont;

 // afBektorea[3] = 3.33;   babestuta dago

	printf("\n");
	printf("\t     Posizioa     Balioa\n");
	printf("\t     --------     ------\n");
	for (iKont=0; iKont < iLuzera; iKont++)
	{
		printf("\t %9d %13.2f\n", iKont, afBektorea[iKont]);
	}
}


void ElementuBatKendu2(float afBektorea[], int *iLuzera, int iPosizioa)   // bi parametroak irterakoak dira
{                                                                         // hirugarren parametroa sarrerakoa
	int iKont;

    for (iKont = iPosizioa; iKont < *iLuzera; iKont++)
    {
        afBektorea[iKont] = afBektorea[iKont+1];
    }
    *iLuzera = *iLuzera - 1;
}


Arraytik elementu batzuk kendu haien balioek baldintza bat betetzen dutelako. Adibidez, fMuga baino txikiago diren elementu guztiak kendu arraytik. Elementuak kentzeko edo ezabatzeko ElementuBatzukKendu() funtzioan egingo da, zeinek array laguntzaile bat erabiltzen duen.

/* Ariketa-46f_HainbatElementuKendu: arraytik elementu batzuk kendu
                                     array laguntzaile bat erabiliz */

// Array baten hasieraketa. Datuak dituen array batean, baldintza bat
// betetzen dituzten elementu guztiak kendu.

#include <stdio.h>

#define BEHEMUGA 0.0
#define GOIMUGA 99.9
#define LUZMAX  20   // 20 elementu gehienez: 0. posiziotik 19. posizionarino

void BektoreaIkusi(const float[], int);
void ElementuBatzukKendu(float[], int *, float);

int main()
{
	static float afBektorea[LUZMAX] = { 67.34, 2.17, 89.37, 15.08, 6.16, 72.44, 5.09, 38.77, 94.06, 10.10, 22.99 };
	int iLuzera = 11;
	float fMuga;

	printf("\n");
	printf("\n\t Arrayaren eta bere luzera efektiboaren hasieraketak");
	printf("\n\t ---------------------------------------------------\n");

	printf("\n\t Arrayaren iLuzera=%d elementuak hasieraketa ondoren: \n", iLuzera);
	BektoreaIkusi(afBektorea, iLuzera);

    printf("\n");
    do
    {
        printf(" 0.0 eta 99.9 arteko muga bat eman (biak barne)\n eta txikiagoan diren elementuak kenduko dira: ");
        scanf("%f", &fMuga);
    } while (fMuga < 0.0 || fMuga >= 100.0);

    ElementuBatzukKendu(afBektorea, &iLuzera, fMuga);
    printf("\n\t %.2f baino txikiagoak kendu ondoren: \n", fMuga);
    BektoreaIkusi(afBektorea, iLuzera);

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


void BektoreaIkusi(const float afBektorea[], int iLuzera)  // bi parametroak sarrerakoak
{
	int iKont;

 // afBektorea[3] = 3.33;   babestuta dago

	printf("\n");
	printf("\t     Posizioa     Balioa\n");
	printf("\t     --------     ------\n");
	for (iKont=0; iKont < iLuzera; iKont++)
	{
		printf("\t %9d %13.2f\n", iKont, afBektorea[iKont]);
	}
}


void ElementuBatzukKendu(float afBektorea[], int *iLuzera, float fMuga)   // bi parametroak irterakoak dira
{                                                                         // hirugarren parametroa sarrerakoa
	int iKont;
	float afLaguntzailea[LUZMAX];
	int iNonGorde;
	int iZenbatElementu;

 // afBektorea[] arraytik abiatuta afLaguntzailea[] arraya kargatu
    iNonGorde = -1;        // afLaguntzailea[] hasieran hutsik
    iZenbatElementu = 0;   // afLaguntzailea[] hasieran hutsik
    for (iKont = 0; iKont < *iLuzera; iKont++)
    {
        if (afBektorea[iKont] >= fMuga)   // txikiak saltatu
        {
            iNonGorde++;
            afLaguntzailea[iNonGorde] = afBektorea[iKont];
        }
    }
    iZenbatElementu = iNonGorde + 1;

    printf("\n\t Array laguntzailea: (iZenbatElementu=%d) \n", iZenbatElementu);
    BektoreaIkusi(afLaguntzailea, iZenbatElementu);

 // afLaguntzailea[] arraytik abiatuta afBektorea[] arraya kargatu
    for (iKont = 0; iKont < iZenbatElementu; iKont++)
    {
        afBektorea[iKont] = afLaguntzailea[iKont];
    }
 // luzera efektiboa eguneratu
    *iLuzera = iZenbatElementu;
}






  • Ariketa-46a1_ElementuBatAldatu.cbp | main.c
  • Ariketa-46a2_ElementuBatAldatu.cbp | main.c
  • Ariketa-46b_ElementuBerriaGehitu.cbp | main.c         (bukaeran gehitu)
  • Ariketa-46c_AzkenElementuaKendu.cbp | main.c       (azkena kendu)
  • Ariketa-46d1_ElementuBerriaTxertatu.cbp | main.c     (array laguntzailez)
  • Ariketa-46d2_ElementuBerriaTxertatu.cbp | main.c
  • Ariketa-46e1A_ElementuBakarraKendu.cbp | main.c     (array laguntzailez)
  • Ariketa-46e1B_ElementuBakarraKendu.cbp | main.c     (array laguntzailez)
  • Ariketa-46e2_ElementuBakarraKendu.cbp | main.c
  • Ariketa-46f_HainbatElementuKendu.cbp | main.c        (array laguntzailez)


 

iruzkinik ez:

Argitaratu iruzkina