1. BENVENUTO SU CONSOLE TRIBE

    Benvenuto, stai navigando nella nostra community come ospite

    Avere un account su Console Tribe ti permetterà di creare e partecipare alle discussioni e al mercatino, organizzare tornei e partite online, iniziare conversazioni personali con gli altri giocatori del forum e di utilizzare tutte le funzioni di questo sito.

    Registra il tuo account in meno di 5 secondi, se vuoi puoi sfruttare i login social via Facebook, Google Plus o Twitter.

Problema programmazione in C

Discussione in 'Computer & Technology' iniziata da D@nt£, 6 Gennaio 2013.

  1. D@nt£

    D@nt£ Tribe Member

    Registrato:
    20 Aprile 2008
    Messaggi:
    713
    "Mi Piace" ricevuti:
    28
    Punteggio:
    16
    Località:
    Nella mia vecchia PS1
    Salve gente, sto facendo un programma per gestire una biblioteca (attraverso l'uso delle liste). Ho un problema però per quanto riguarda la ricerca ed il confronto di alcuni elementi...
    Questa è la funzione che preso in input la testa di una lista (di tipo struct libro) chiede all'utente di inserire 3 parole, la funzione deve stampare codice, autore e tiolo dei libri nei quali almeno una delle 3 parole compare tra le parole chiave (precedentemente inserite). Nonostante abbia fatto più tentativi provando e riprovando ad inserire i dati non mi stampa nessun libro... riuscite ad aiutarmi?

    Codice:
    /*------------------------------------------------------------*/
    struct libro { /*STRUCT DEL LIBRO*/
    	char codice[10];
    	char autore[20];
    	char titolo[20];
    	char chiave[5][20];
    	struct libro *next;
    };
    
    
    /*---------------------FUNZIONE DI RICERCA-----------------------------------*/
    void ricerca1(struct libro* testa)
    {
    	int i,j;
    	char key[5][20];
    	printf("%s", testa->codice);
    	for (i=0; i<3; i++){
    		printf("Inserisci la %i parola chiave da ricercare. ", i+1);
    		scanf("%s" , key[i]);
    	}
    	while (testa != NULL){
    		for (i=0; i<8; i++)
    			for(j=0; j<8; j++){
    				if (testa->chiave[j]== key[i]){
    					stampalib(testa);
    					j=5;
    					
    					i=3;
    				}
    				else if (i==2 && j==4)
    					testa=testa->next;
    	};		};
    };	
    
    
    
    /*----------------------FUNZIONE STAMPALIB----------*/
    void stampalib (struct libro* testa)
    {
    	printf("\n");
    	printf("%s \n", testa->codice);
    	printf("%s \n", testa->autore);
    	printf("%s \n", testa->titolo);
    	printf("\n");
    };
  2. numerone

    numerone Tribe Member

    Registrato:
    16 Febbraio 2012
    Messaggi:
    641
    "Mi Piace" ricevuti:
    59
    Punteggio:
    99
    PSN Tag:
    numerone
    Xbox Live Tag:
    numerunix
    Nintendo Network ID:
    numerone
    L'errore che hai fatto è un errore banale che fanno tutti quelli che conoscono poco il c.
    Te lo spiego: l'errore sta nel doppio for
    if (testa->chiave[j]==key) non fa un confronto sulle stringhe, ma lo fai sui puntatori, il che significa che il carattere nella posizione testa->chiave[j][0] deve essere perfettamente uguale al carattere che si trova in posizione key[0], se no l'if non viene mai eseguito.

    Quello che ti serve, se ho capito bene il codice, è una cosa differente.
    In C la stringa non è un tipo a se, ma è un vettore di caratteri, di conseguenza la parola "ciao" non va considerata come la parola "ciao", ma come i caratteri "c", "i", "a", "o", di conseguenza non esiste alcun modo per usare le funzioni base del linguaggio sulle stringhe. Quello che ti serve è la funzione di libreria strcmp o la più sicura strncmp che esegue il confronto di due stringhe carattere per carattere.
    A D@nt£ piace questo elemento.
  3. D@nt£

    D@nt£ Tribe Member

    Registrato:
    20 Aprile 2008
    Messaggi:
    713
    "Mi Piace" ricevuti:
    28
    Punteggio:
    16
    Località:
    Nella mia vecchia PS1
    Ah ah ah grazie me ne ero giusto accorto questa mattina :) un'errore del piffero, grazie comunque ;)
    A numerone piace questo elemento.
  4. D@nt£

    D@nt£ Tribe Member

    Registrato:
    20 Aprile 2008
    Messaggi:
    713
    "Mi Piace" ricevuti:
    28
    Punteggio:
    16
    Località:
    Nella mia vecchia PS1
    Ragazzi ho ancora bisogno di aiuto, questa è la funzione che mi elimina un libro dalla lista quando il codice del libro inserito è presente.
    Va tutto ok tranne nel caso in cui l'elemento da eliminare sia quello inserito per primo. Mi da errore di segmentazione.
    Codice:
    struct libro* elimina(struct libro* testa)
    {
    	struct libro* p;
    	char codice[10];
    	printf("Digita il codice del libro che vuoi eliminare. ");
    	buff;
    	fgets(codice, 12, stdin);
    	p=testa;
    	if (strcmp(codice, testa->codice)==0){	
    		testa=testa->next;
    		printf("Eliminazione avvenuta con successo");
    	}
    	else 
    		while (p->next!=NULL){
    			if (strcmp(codice, p->next->codice)==0){
    				if (p->next->next== NULL){
    					printf("Dentro");
    					p->next=NULL;
    				}
    				else {
    					p->next=p->next->next;
    					printf("Eliminazione avvenuta con successo");
    				}
    			}
    			p=p->next;
    		}
    	return testa;
    };
    Codice:
    struct libro* inserisci(struct libro* testa)/*INSERISCI LIBRO NUOVO*/
    {
            int i;
    	struct libro *new;
    	new= (struct libro*) malloc(sizeof(struct libro));
    	printf("Inserisci il codice del libro. ");
    	buff;
    	fgets(new->codice, 12, stdin);
    	printf("Inserisci autore. ");
    	fgets(new->autore, 22, stdin);
    	printf("Inserisci il Titolo. ");
    	fgets(new->titolo, 22, stdin);
    	for (i=0; i<5; i++){
    		printf("Inserisci la %i parola chiave. ", i+1);
    		scanf("%s" , new->chiave[i]);
    	}
    	new->next= testa;
    	testa= new;
    	stampalib(testa); 
    	return testa;
    };
    Ultima modifica: 13 Gennaio 2013