Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    643

    [C] cos'è che non và in questo programma?!?!

    Oddio,
    lesame si avvicina (Lunedi)...il programma è una mailing list, inserisce gli utenti in un array di strutture che contengono i campi relativi ai vari utenti, si possono aggiungere, eliminare, visualizzare, salvare su file e leggere da file...compila ma dopo che effettuo l'inserimento degli utenti e gli dico di visualizzarli non me li visualizza correttamente come se non li avesse inseriti bene...sono disperato...cos'è che non funziona?!? è grave

    codice:
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    #define MAX 100
    
    struct addr{
    	char name[30];
    	char street[40];
    	char city[20];
    	char state[3];
    	unsigned long int zip;
    }addr_list[MAX];			// Dichiara un vettore di MAX locazioni di tipo struct addr
    
    void init_list(void);	// Inizializza l'array di strutture, non riceve alcun paramentro, non ritorna nulla
    void enter(void);
    void delete(void);
    void list(void);
    void load(void);
    void save(void);
    int menu_select(void);
    int find_free(void);
    
    int main(){
    	
    	char choice;
    
    	init_list();	// Inizializza l'array di strutture	
    	
    	for(;;){
    	
    		choice = menu_select();	 // metti in choice la scelta effettuata: valore ritornato da menu_select()
    	
    		switch(choice){
    			case 1: enter();
    		     	     break;
    			case 2: delete();
    		             break;
    			case 3: list();
    		             break;
    			case 4: save();
    	   	             break;
    			case 5: load();
    		             break;
    			case 6: exit(0);
    		}
    	}
    	
    	return 0;
    }
    
    /* La funzione init_list() inizializza l'array di strutture, non riceve alcun parametro e non restituisce nulla */
    
    void init_list(void){
    	
    	register int t;
    	
    	for(t=0; t<MAX; ++t)
    		addr_list[t].name[0] = '0';	// Se il primo carattere del nome è \0 la locazione è vuota
    }
    
    /* La funzione menu_select() legge la scelta dell'utente, non riceve alcun parametro, restituisce un intero */
    
    int menu_select(void){
    	
    	char s[80];
    	int c;
    
    	printf("1: Inserire un nuovo utente\n");
    	printf("2: Cancellare un untente\n");
    	printf("3: Elenca gli utenti\n");
    	printf("4: Salva il file\n");
    	printf("5: Carica il file\n");
    	printf("6: Termina il programma\n");
    
    	do{
    		printf("Scegliere un'opzione valida: ");
    		gets(s);	// Metti l'opzione scelta nella stringa s
    		c = atoi(s);	// Trasforma la stringa in un valore intero accettabile e lo mette in c
    	}while(c<1 || c>6);	// Continua a chiedere di inserire una scelta finchè questa non è valida
    
    	return c;		// Ritorna al main la scelta effettuata
    }
     
    /* La funzione enter() inserisce i nomi nell'array di strutture, non riceve alcun parametro, non restituisce nulla */
    
    void enter(void){
    	
    	int slot;
    	char s[80];
    	
    	slot = find_free();	// Metti dentro a slot il valore resituito da find_free(): prima locazione libera
    	
    	if(slot == -1){		// Se find_free() restituisce -1 l'array di strutture è completo
    		printf("Elenco completo");
    		return;		// Non inserisce nulla e ritona al chiamante
    	}
    	
    	printf("Inserire il nome: ");
    	gets(addr_list[slot].name);
    	printf("Inserire la via: ");
    	gets(addr_list[slot].street);
    	printf("Inserire la città: ");
    	gets(addr_list[slot].city);
    	printf("Inserire la provincia: ");
    	gets(addr_list[slot].state);
    	printf("Inserire il CAP: ");
    	gets(s);
    	addr_list[slot].zip = strtoul(s, '\0', 10);
    }
    
    /* La funzione find_free() trova una struttura inutilizzata, non riceve alcun parametro e restituisce al chiamante 
       -1 se non ci sono più locazioni vuote all'interno dell'array o la prima locazione libera nell'array */
    
    int find_free(void){
    		
    	register int t;
    	
    	/* Incrementa t finchè il primo carattere del campo name delle varie strutture dell'array contiene un 
    	   valore (struttura non libera) e finchè t è minore di MAX (array pieno) */
    	for(t=0; addr_list[t].name[0] && t<MAX; ++t)
    
    	if(t == MAX)	return -1;	// Se l'array è pieno torna il valore -1 al chiamante
    	return t;			// Se l'array non è completo ritorna al chiamante la prima locazione libera
    }
    
    /* La funzione delete() cancella un elemento dalla lista, non riceve alcun parametro e non restituisce nulla */
    
    void delete(void){
    	
    	register int slot;
    	char s[80];
    	
    	printf("Inserire il numero del record da eliminare: ");
    	gets(s);
    	slot = atoi(s);		// Trasforma la stringa in s in un valore intero  accettabile e lo mette in slot
    	
    	if(slot>=0 || slot<MAX)	// Se il valore di slot è valido (se appartiene ad una delle locazioni della lista)
    		addr_list[slot].name[0] = '\0';	    // Rendi '\0' il primo carattere del campo name della struttura
    }
    
    /* La funzione list() visualizza l'elenco dei nominativi nella lista, non riceve alcun paramentro e non restituisce 
       nulla */
    
    void list(void){
    	
    	register int t;
    	
    	for(t=0; t<MAX; ++t){
    		/* Se il primo carattere del campo name della struttura corrente nell'array è diverso da '\0' */
    		if(addr_list[t].name[0]){
    			printf("%s\n", addr_list[t].name);
    			printf("%s\n", addr_list[t].street);
    			printf("%s\n", addr_list[t].city);
    			printf("%s\n", addr_list[t].state);
    			printf("%lu\n\n", addr_list[t].zip);
    		}
    	}
    	printf("\n\n");
    }
    
    /* La funzione save() salva l'elenco degli utenti inseriti nella lista su un file, non riceve alcun parametro e non 
       restituisce nulla al chiamante */
    
    void save(void){
    
    	FILE *fp;	// Dichiaro un puntatore a file
    	register int i;
    	
    	/* Prova ad aprire un file binario in modalità scrittura ed assegna il puntatore a tale file a fp, se non
    	   riesce ad aprire il file allora avverti l'utente e torna al chiamante senza fare nulla */ 
    	if((fp=fopen("maillist", "wb")) == NULL){
    		printf("Impossibile aprire il file\n");
    		return;			// Torna al chiamante senza fare nulla
    	}
    
    	for(i=0; i<MAX; i++)
    		if(*addr_list[i].name) //Se il primo carattere del campo name della struttura corrente diverso da '\0'
    			if(fwrite(&addr_list[i], sizeof(struct addr), 1,fp) !=1)   // Se non può scrivere sul file
    				printf("Errore di scrittura dul file\n");
    
    	fclose(fp);			// Chiudi il file
    }
    
    /* La funzione load() carica una mailing list precedentemente salvata su file, non riceve alcun parametro e non 
       restituisce nulla al chiamante */
    
    void load(void){
    	
    	FILE *fp;			// Dichiaro un puntatore a file
    	register int i;
    	
    	/* Prova ad aprire il file binario in modalità di lettura, se al puntatore fp viene assegnato il valore 
    	   NULL fopen() non è riuscita ad aprire il file e viene dato un messaggio di errore e si torna al 
    	   chiamante senza aver fatto nulla */ 
    	if((fp=fopen("maillist", "rb")) == NULL){
    		printf("Impossibile aprire il file\n");
    		return;			// Torna al chiamante
    	}
    
    	init_list();			// Altrimenti inizializza il nuovo array di strutture
    
    	for(i=0; i<MAX; i++)		// e carica i valori salvati sul file nella nuova lista inizializzata
    		if(fread(&addr_list[i], sizeof(struct addr), 1, fp) != 1){
    			if(feof(fp))
    				break;
    			printf("Errore di lettura dal file\n");
    		}
    	
    	fclose(fp);
    }
    Grazie

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,288

    Moderazione

    [C] cos'è che non và in questo programma?!?!
    Per favore, usa titoli più significativi... ogni volta devo correggere o togliere il superfluo.
    E' normale che ci sia qualcosa che non va in un un programma se si scrive una domanda in un forum di Programmazione.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Non è bene utilizzare il nome delete per una tua funzione,
    in quanto, benchè tu utilizzi il c, è una parola riservata del c++.

    Hai dimenticato un backslash nella funzione init_list().

    codice:
    void init_list(void)
    {
    	register int t;
    	for(t=0; t<MAX; ++t)
    		addr_list[t].name[0] = '\0';	// Se il primo carattere del nome è \0 la locazione è vuota
    }
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    643
    dopo lo provo..ora stò su win...per te è solo per quello che non andava...senti ma questi errori sono facilmente rintracciabili con un debugger? te lo chiedo perchè ci hanno fatto solo una lezione sui debugger e non ne sò molto..in pratica ancora mai usati...può essere unos trumento utile per rintracciare tale tipo di errori?

  5. #5
    Non ho usato debugger, sono semplicemente andato a ritroso nel programma a partire
    da dove si verificava il problema.
    Io modificherei il programma, eliminando la funzione init_list().
    E' sufficiente azzerare solo il primo valore di addr_list, all'inizio del main (fuori dal ciclo).
    Poi quando hai inserito un nuovo utente, azzeri l'elemento successivo.

    Modificherei anche la funzione list così.
    codice:
    void list(void)
    {
    	register int t;
    	for(t=0; t<MAX && addr_list[t].name[0]; ++t)
    	{
    		/* Se il primo carattere del campo name della struttura corrente nell'array è diverso da '\0' */
    		printf("%s\n", addr_list[t].name);
    		printf("%s\n", addr_list[t].street);
    		printf("%s\n", addr_list[t].city);
    		printf("%s\n", addr_list[t].state);
    		printf("%lu\n\n", addr_list[t].zip);
    	}
    	printf("\n\n");
    }
    P.S. Anche in ambiente windows esistono i compilatori
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.