Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    643

    [C] Problemino con questo programma

    Ciao,
    ho fatto un esercizio per laboratorio di programmazione.
    Consiste in un programma che chiede nome e cognome di 200 impiegati e mette i dati in un array di strutture, quando alla richiesta del nome si preme invio deve terminare...il programma compila e funziona ma c'è qualche errorino con la logica...mi sembra che ne chiede uno in più...

    codice:
    #include <stdio.h>
    #include <string.h>
    
    int main(){
    	
    	struct impiegato{
    		char nome[30];
    		char cognome[30];
    	};
    	
    	typedef struct impiegato impiegato;
    	
    	impiegato vettore[200];
    	int i=1;
    	int a;
    
    	char name[30];
    	char surname[30];
    
    	printf("Inserire il nome dell'impiegato numero %d, niente per terminare il programma:\n", i);
    	gets(name);
    	
    	if(name[0] != '\0'){
    		printf("Inserire il cognome dell'impiegato numero %d\n", i);
    		gets(surname);
    		i++;
    		
    		while(i<200 && name[0]!='\0'){
    			 strcpy(vettore[i].nome, name);
    			 strcpy(vettore[i].cognome, surname);
    
    			 printf("Inserire il nome dell'impiegato numero %d, niente per terminare il programma:\n", i);
            		 gets(name);
    			 printf("Inserire il cognome dell'impiegato numero %d\n", i);
                    	 gets(surname);
    			 i++;
    		}
    	}
    	
    	printf("\n\n\nLista degli impigati:\n\n");
    	
    	for(a=0; a<=i; a++)
    		printf("Nome: %s	Cognome: %s\n", vettore[a].nome, vettore[a].cognome);
    
    	printf("\n\n");
    	
    	return 0;
    }
    Grazie
    Andrea

  2. #2
    Ho modificato leggermente il codice , adesso dovrebbe andare
    codice:
    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
    	
    	struct impiegato
    	{
    		char nome[30];
    		char cognome[30];
    	};
    	
    	typedef struct impiegato impiegato;
    	
    	impiegato vettore[200];
    	int i=0;
    	int a;
        int flgend=1;
    	char name[30];
    	char surname[30];
    
    	while(i<200 && flgend)
    	{
    		printf("Inserire il nome dell'impiegato numero %d, niente per terminare il programma:\n", i);
                              gets(name);
    	 	printf("Inserire il cognome dell'impiegato numero %d\n", i);
                             gets(surname);
    		strcpy(vettore[i].nome, name);
    		strcpy(vettore[i].cognome, surname);
    		if (strcmp(name,"")==0)
    			flgend=0;
    		else
    			i++;
    	}	
    	printf("\n\n\nLista degli impigati:\n\n");	
    	for(a=0; a<i; a++)
    		printf("Nome: %s	Cognome: %s\n", vettore[a].nome, vettore[a].cognome);
    	printf("\n\n");	
    
    	return 0;
    }

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    643
    grazie..appena rivato sotto linux lo provo...cmq dici che come logica il mio ci poteva stare? cioè come esercizio sarebbe stato una totale insufficienza o ci poteva quasi stare? sincero così mi regolo per l'esame

    Ancora grazie
    Andrea

  4. #4
    In effetti mi sono limitato solo ad eliminare il seguente pezzo di codice:
    codice:
    	printf("Inserire il nome dell'impiegato numero %d, niente per terminare il programma:\n", i);
    	gets(name);
    	
    	if(name[0] != '\0'){
    		printf("Inserire il cognome dell'impiegato numero %d\n", i);
    		gets(surname);
    		i++;
    che ho ritenuto ridondante poichè lo stesso viene ripetuto nel loop :master: . Questo introduceva nella visualizzazione dei nomi dei campi vuoti . Inoltre ho inserito una variabile di fine ciclo di lettura , flgend , con relativo testo test , che viene resettata quando si introduce un campo vuoto per il nome . Tutto il resto è opera tua . Comunque non giudicherei il tuo lavoro una totale insufficienza , ma una maggiore applicazione non guasterebbe . Saluti

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    643
    grazie :-)

    stavo però vedendo sulle specifiche dell'esercizio (anche se credo ci sai un minimo di flessibilità) dicevano che appena veniva immesso il carattere \0 premendo invio come primo carattere del nome dell'impiegato doveva subito terminare e visualizzare la lista degli impiegati

    Io ora ho pensato che l'unico modo (almeno l'unico che mi venga in mente ora) sia di far prendere il nome con la gets e metterlo in un array di char, confrontare il primo elemento dell'array con il carattere \0 e se risponde true allora fare una break; ed uscire dal ciclo...perchè da quel poco che sò è l'unico modo per terminare il ciclo ad una determinata condizione senza andare avanti...ma non fà un po' scchifo usare la break? o in casi come questo è accettabile?

    Grazie

  6. #6
    Basta solo spostare il test sulla variabile di uscita del loop dopo la lettura del nome dell'impiegato , e questo è il codice corrispondente:
    codice:
    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
    	
    	struct impiegato
    	{
    		char nome[30];
    		char cognome[30];
    	};
    	
    	typedef struct impiegato impiegato;
    	
    	impiegato vettore[200];
    	int i=0;
    	int a;
        int flgend=1;
    	char name[30];
    	char surname[30];
    
    	while(i<200 && flgend)
    	{
    		printf("Inserire il nome dell'impiegato numero %d, niente per terminare il programma:\n", i);
            gets(name);
    		if (strcmp(name,"")==0)  
    			flgend=0;
    		else
    		{
    	 		printf("Inserire il cognome dell'impiegato numero %d\n", i);
            	gets(surname);
    			strcpy(vettore[i].nome, name);
    			strcpy(vettore[i].cognome, surname);
    			i++;
    		}
    	}	
    	printf("\n\n\nLista degli impigati:\n\n");	
    	for(a=0; a<i; a++)
    		printf("Nome: %s	Cognome: %s\n", vettore[a].nome, vettore[a].cognome);
    	printf("\n\n");	
    
    	return 0;
    }
    Saluti

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    643
    vero...oddio mi sento proprio una pippaaaa :-( un tempo ero più bravo...ora non mi ricordo nulla...perso l'allenamentooo

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    643
    ohh mi sento stupidissimo....ho provato a rifarlo a modo mio per sbattermici un po' senza copiarlo usando sempre un controllo sul ciclo while ma non funziona e non mi spiego il perchè...

    codice:
    #include <stdio.h>
    #include <string.h>
    
    int main(){
    	
    	struct impiegati{
    		char nome[30];
    		char cognome[30];
    	};
    
    	typedef struct impiegati impiegati;
    
    	impiegati array[200];
    	char name[30];
    	char surname[30];
    	int count = 0;
    	int booleano = 1;
    	int a;
    
    	while(count < 200 && booleano == 1){	// Finchè l'array non è finito e la condizione è rispettata
    		printf("Inserire il nome dell'impiegato numero %d: ", count+1);
    		scanf("%s", name);
    	
    		if(name[0] == '\0')	// Se la condizione non è più rispettata imposta booleano a 0
    			booleano = 0;
    		
    		else{			// altrimenti se la condizione è ancora rispettata
    			printf("Inserire il cognome dell'impiegato numero %d: ", count+1);
    			scanf("%s", surname);
    			strcpy(array[count].nome, name);
    			strcpy(array[count].cognome, surname);
    		}
    	
    		count ++;
    	}
    			
    
    	for(a=0; a<count; a++)
    		printf("Nome: %s		Cognome: %s\n", array[a].nome, array[a].cognome);
    
    	return 0;
    }

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2004
    Messaggi
    643
    ops...avevo fatto con gli scanf questa volta e non col gets...sostituendo le scanf con le gets funziona...ma perchè con la scanf non và?copsa cambia? e perchè il compilatore quando compilo mi dà un warning che dice che la funzione gets è pericolosa?

    Grazie per la pazienza
    Andrea

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    La scanf presenta dei problemi di "bufferizzazione" ... con compilatori Microsoft si risolve con una chiamata

    fflush(stdin);

    subito dopo la scanf stessa.

    La gets e' "pericolosa" perche' inserisce i dati nella stringa senza controllare se lo spazio della stringa stessa termina. E quindi causa facilmente dei pericolosi "buffer overflow".
    Puo' essere rimpiazzata con funzioni "safe" che fanno questo controllo. Dipende un po' da quale compilatore usi sapere quale puo' essere tale funzione.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.