Newsgroup: it.comp.lang.c
Titolo: Perplessita' su archivio strutturato

Salve a tutti,
sto provando a creare un archivio mediante array e sono quasi riuscito
ad ottenere quello che volevo. Ma mi sfugge un problema e non ci sto
capendo una mazza :-/
In sostanza perche' quando inserisco i dati e' come se i successivi
sovrascrivessero i precedenti? (spero si capisca cosa intendo; non
riesco a spiegarlo bene, non avendo appunto capito l'intoppo)
Ringrazio per la gentilezza chiunque vorra' aiutarmi,
ciao
Marco
Ecco il codice:
--------------------------------------------
#include <stdio.h>
#define N 5
struct allievo {
		char cognome[20];
		char nome[20];
		int matricola;
		int materia[5];
				 };
typedef struct allievo ALLIEVO;
/*prototipi*/
void inizializza(ALLIEVO archivio[]);
void inserisci_voti(ALLIEVO archivio[]);
void visualizza(ALLIEVO archivio[]);
int ricerca(ALLIEVO archivio[]);
ALLIEVO archivio[N];
int main(void)
{
	int c;
	do
	{
		printf("\nMAIN MENU	\n"
	        "\t\t1 - inizializza archivio:	\n"
		"\t\t2 - visualizza:	\n"
		"\t\t3 - inserisci voti:	\n"
		"\t\t0 - ESCI.	\n");
		scanf("%d", &c);
 
		if(c < 0 || c > 3)
			printf("numero errato");
		else
		    {
		     	switch(c)
				{
					case 1:
						inizializza(archivio);
						break;
					case 2:
						visualizza(archivio);
						break;
					case 3:
inserisci_voti(archivio);
						break;
					default:
						printf("Fine Letture");
						break;
							}
				}
			}
			while(c != 0);
			return 0;
}
void inizializza(ALLIEVO archivio[])
{
	int i, id, j, trov;
	printf("inserisci matricola (diverso da 0):	\n");
	scanf("%d", &id);
	trov = 0;
	i = 0;
 
	while((!trov) && (i < N))
	{
		if(archivio[i].matricola == id)
		trov = 1;
 
		else
			if(archivio[i].matricola == 0)
			{
				archivio[i].matricola = id;
				printf("inserisci cognome:\n");
				scanf("%s", archivio[i].cognome);
				printf("inserisci nome:	\n");
				scanf("%s", archivio[i].nome);
				for(j = 1; j <= 5; ++j)
					archivio[i].materia[j] = 0;
				return;
			}
		i++;
	}
	if(!trov)
		{
		if(i == N)
		printf("array pieno: fine inizializzazione");
		}
	else
	printf("allievo gia' presente o numero errato \n");
	return;
}
void visualizza(ALLIEVO archivio[])
{		
	int i, j;
	for(i = 0; i < N; i++)
	{
		printf("matricola %d :\n", archivio[i].matricola);
		printf("cognome: %s \n", archivio[i].cognome);
		printf("nome: %s \n", archivio[i].nome);
		for(j = 1; j <= 5; ++j)
		printf("materia %d: %d \n", j, archivio[i].materia[j]);
		}
return;
}
void inserisci_voti(ALLIEVO archivio[])
{
	int j, trov;
	int voto;
	trov = ricerca(archivio);
	if(trov == -1)
	{
		printf("allievo inesistente\n");
		return;
	}
	else
	{
		for(j = 1; j <= 5; ++j)
		{
			printf("immetti voto materia %d\n", j);
			scanf("%d", &voto);
			archivio[trov].materia[j] = voto;
		}
	}
	return;
}
int ricerca(ALLIEVO archivio[])
{
	int i, id;
	printf("immetti matricola allievo\n");
	scanf("%d", &id);
	for(i = 0; i < N; i++)
	{
		if(archivio[i].matricola == id)
		return i;
			}
	return (-1);
}
-- 
Marco Messina >>>remove .invalid to reply<<<

Perche nn fai una lista?

Perche nn fai una lista?
Sto lavorando pure sulle liste e naturalmente ho problemi anche con
quelle. Nonostante tutto vorrei capire bene i due approcci, ma penso
farei meglio a darmi al giardinaggio ^^;
Ciao!

 sovrascrivessero i precedenti?
Non e' "come se sovrascrivessero", sovrascrivono...
for(j = 1; j <= 5; ++j)
   archivio[i].materia[j] = 0;
materia e' un array di 5 elementi, indicizzati da 0 a 4 ma tu stai
azzerando gli elementi da 1 a 6: prova ad indovinare cosa succede?
:-)
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 azzerando gli elementi da 1 a 6: prova ad indovinare cosa succede?
da 1 a 5, non da 1 a 6. Sorry.


:-)
L'illuminazione (ho letto anche la rettifica successiva).
Proprio una bella topica non c'e' che dire! E meno male che dappertutto
mettono in guardia che l'indicizzazione parte da 0.
Grazie 1000 per l'indicazione, vado a mettermi in ginocchio sui ceci :-)
Ciao!
Marco
