C, Inserimento - Rappresentazione sequenziale delle pile

di Anonimizzato14377 il
9 risposte

#define MaxPila 100
typedef int TipoElemPila;

struct tipoPila{
	
	TipoElemPila pila[MaxPila];
	int pos;
};

typedef struct tipoPila TipoPila;

//Per la pila vuota: p.pos viene scelta pari a -1
void InitPila(TipoPila *p);
void Inserimento(TipoPila *p, int n);
void Stampa(TipoPila p, int n);
bool TestPilaPiena(TipoPila p);

int main()
{
   TipoPila P;
	
	InitPila(&P);
	
	Inserimento(&P, 5);
	
	Stampa(P, 5);

}

void InitPila(TipoPila *p)
{
	p -> pos = - 1;
}

void Inserimento(TipoPila *p, int n)
{
	if(TestPilaPiena(*p))
	{
		printf("Pila piena!");
		return;
	}
	int i;
	for(i = 0; i < n; i++)
	{
		printf("p->pila[%d]: ", p->pos); 
		scanf("%d", &p->pila[p->pos]); 
		p->pos++;
	}
}

void Stampa(TipoPila p, int n)
{
	int i;
	p.pos = -1;
	for(i = 0; i < n; i++)
	{
		printf("[%d]", p.pila[p.pos]);
		p.pos++;
	}
}

bool TestPilaPiena(TipoPila p)
{
	if(p.pos == MaxPila - 1)
		return true;
	return false;
}
Quando eseguo, questo è quello che accade:

p->pila[-1]: 1
p->pila[0]: 2
p->pila[1]: 3
p->pila[2]: 4
p->pila[3]: 5

Stampa:
[0][2][3][4][5]


1) Perché nella stampa il primo elemento è 0 e non 1 (come dovrebbe essere)?

2) Cambiando typedef int TipoElemPila; in typedef char TipoElemPila; nonostante nello scanf cambi %d con %c ecco cosa accade:

p->pila[-1]: 1
p->pila[0]: p->pila[1]: 2
p->pila[2]: p->pila[3]: 3


Non mi fa inserire i valori correttamente. Perché?

Invece se mettessi %s nell scanf e %c nella stampa:

p->pila[-1]: a
p->pila[0]: b
p->pila[1]: c
p->pila[2]: d
p->pila[3]: e

Stampa:
[][c][d][e]

Sempre lo stesso problema..

9 Risposte

  • Scusa, ma dopo quasi 200 post e tanto tempo che studi il C vuoi utilizzare un indice negativo in un vettore? Cioè, in una riga del genere

    p.pila[p.pos]

    per te è normale che p.pos valga -1 ?
  • Ti riferisci alla stampa?
  • Sì ... ma in ogni posto dove lo usi ... è normale un indice negativo per un vettore?
  • No, però mi sono attenuto alle dispense dei prof

  • La dispensa non ti dice di usare p->pos come indice quando questo contiene -1

    Ripeto ... è una regola di base del C, non puoi non conoscerla dopo mesi di studio ....
  • Capito.. Hai ragione. Ho mischiato le due cose.

    Devo utilizzare un indice a parte per la stampa? Per la 2), invece, come risolvo?
  • Per l'indice pensaci su ...

    Per il problema della scanf penso che troveresti mille indicazioni in questo stesso forum (e milioni su internet) se solo facessi una ricerca.

    In ogni caso, con Windows puoi usare la funzione fflush mentre, in generale, puoi usare un ciclo while per ripulire il buffer di input.
  • Utilizzo xubuntu, ho cercato e ho risolto così:
    	for(i = 0; i < n; i++)
    	{
    		printf("p->pila[%d]: ", p->pos); 
    		scanf("%c", &p->pila[p->pos]); 
    		p->pos++;
    		while ( getchar() != '\n' );
    	}
    Ho risolto anche per l'indice. Più che risolto ho fatto chiarezza, grazie
  • Va bene per il while ...

    Per l'indice, ricorda in futuro che non può essere negativo ...
Devi accedere o registrarti per scrivere nel forum
9 risposte