Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [C] programma non funzionante...chi mi aiuta un po?

    Salve ragazzi in pratica il mio problema è questo...dovrei scrivere il codice di un programma che gestisce una biblioteca...al primo punto mi chiede di far scrivere il titolo di un libro e controllare se è presente o meno nell'archivio della biblioteca. Il programma me lo compila ma anche quando immetto il titolo di un libro non presente nmi dice che il libro è disponibile.
    Comunque il codice che ho fatto fino ad ora è questo:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define QLIB 100
    
    struct libreria {
    char categoria [50];
    char titolo [50];
    char autori [100];
    int codice_identificativo;
    } LIBRERIA [QLIB][4]={
    {"Matematica","Esercizi di Analisi 1","Pitagora Euclide",1001},
    {"Fisica","Termodinamica","Mencuccini Silvestrini",1002},
    {"Informatica","Introduzione al linguaggio C","Giunta  Ciaramella",1003},
    {"Chimica","Chemistry's Elements","Pauling",1004},
    {"Biologia","La cellula","V.Venuto G.A.Maccacaro M.Mazzoli",1005},
    {"Informatica","Programmazione Java","D.Cappetta",1006},
    {"Fisica","Moto accelerato e circolare","Merola",1007},
    {"Matematica","Matematica per il biennio","E.Amaldi L.Caterino Maxwell",1008},
    {"Biologia","Apparato respiratorio","Cerruti Mariani",1009},
    {"Chimica","Esercizi di stechiometria","Catauro Corvino",1010}
    };
    int main()
    {
        char ric_tit[50];
        char ric_max_aut[100];
        int menu;
        int x, y=1;
        while (y!=0){
            system("cls");
        printf("       ---------------------| LIBRERIA DELLA BIBLIOTECA |-------------------\n");
        printf("      | 1) Richiedere Un Libro Tramite Titolo                               |\n");
        printf("      | 2) Inserire Una Categoria E Visualizzare Il Libro Con Piu Autori    |\n");
        printf("      | 3) Aggiungere Un Libro All'archivio                                 |\n");
        printf("      | 0) Esci Dall'archivio                                               |\n");
        printf("       ---------------------------------------------------------------------\n");
        scanf("%d", &menu);
        switch(menu){
    case 1:
        system("cls");
        printf ("Richiedi un libro tramite titolo");
        scanf("%s",ric_tit);
        for(x=0;x<QLIB;x++){
            if (strcmp (LIBRERIA[x][4].titolo,ric_tit)==0){
                printf("Il libro non è disponibile perche' e' in prestito\n\n\n");
            }
            else{
                printf("il libro e' disponibile\n\n\n");
            }
            break;
    
            }
            }
        system("PAUSE");
        }
    
        return 0;
        }
    Mi sapete dire in cosa sbaglio dato che mi da sempre la solita risposta anche quando scrivo un libro non presente?

  2. #2
    Ci sono due problemi qui:
    codice:
        scanf("%s",ric_tit);
        for(x=0;x<QLIB;x++){
            if (strcmp (LIBRERIA[x][4].titolo,ric_tit)==0){
                printf("Il libro non è disponibile perche' e' in prestito\n\n\n");
            }
            else{
                printf("il libro e' disponibile\n\n\n");
            }
    in primis, strcmp restituisce zero quando le due stringhe coincidono; pertanto i due rami dell'if dovrebbero essere invertiti:
    codice:
            if (strcmp (LIBRERIA[x][4].titolo,ric_tit)==0)
                puts("Il libro e' disponibile");
            else
                puts("Libro non trovato");
    A questo punto, però, noterai che ottieni sempre "Libro non trovato", anche per libri presenti. Il problema sta nella scanf di prima: scanf("%s", ric_tit) legge una sola parola, non tutta la riga, per cui, a meno che il titolo del libro non sia di una sola parola, il codice non troverà niente. Per ovviare a questo problema, usa la fgets per leggere l'intera riga (ricordandoti di eliminare il newline finale che essa acquisisce).

    ---

    Per inciso, il codice va racchiuso tra tag [code] ... [/code], altrimenti perde l'indentazione; ora ho sistemato io, in futuro ricordatene.

    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    grazie mille per la veloce risposta...quello che mi rimaneva perplesso è che sia se inserivo un titolo presente che uno non presente mi dava sempre la solita risposta...comunque ora provo così.
    P.S. scusa per il code me lo sono dimenticato...lo terrò a mente per le prossime volte

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Scusa, ma perché questo
    codice:
    [4]
    che pende dovunque? Che senso ha?
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    sta anche nella dichiarazione della libreria come array 2D [QLIB][4] quando l'ho richiamato alla function strcmp se mettevo solo la x mi dava errore.

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    La mia domanda era diversa -_-
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  7. #7
    ho dichiarato un array 2D che ha come size di colonne [4]...adesso per richiamare l'array alla function se scrivevo:
    codice:
    if (strcmp (LIBRERIA[x].titolo,ric_tit)==0){
    me lo da come errore perche a questo punto andrei a richiamare un array 1D
    per questo ho messo:
    codice:
    if (strcmp (LIBRERIA[x][4].titolo,ric_tit)==0){

  8. #8
    Sì, ma il punto che non è chiaro è proprio perché hai dichiarato un array bidimensionale - quello che ti serve è un array ad una dimensione (di struct).
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    l'ho dichiarato così perche in un altro punto dell'esercizio mi chiede di aggiungere un libro all'archivio quindi mi è sembrato giusto aumentare le righe con QLIB=100 e rimanere le colonne a quattro che sono quelle dello struct...ovviamente potevo anche omettere il tutto ma mi è sembrato giusto dichiararlo come array 2D in quanto la traccia dice che nella libreria ci possono essere massimo 100 libri. Da questo è partito il fatto di dichiararlo come array bidimensionale in modo da avere altro spazio a disposizione per aggiungere.

  10. #10
    P.S. puo darsi che sto ragionando male ma mi sembrava giusto attenermi alla traccia :-)

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.