04.06.2008 | 22:12:22
immagine
Ing. Emanuele Scapin

C, es1, proposta di correzione esercitazione n.1 su elenco libri.
  • Classi quarte TPSIT,
    prima esercitazione per casa in linguaggio C:

    a) gestire i dati di un libro
    1. titolo
    2. autore
    3. numero pagine
    4. casa editrice
    5. prezzo

    b) gestire un elenco di libri

    c) dato un titolo trovare se il libro è presente nell'elenco

    d) ordinamento per titolo
    e) ordinamento per autore

    f) trovare libro con più pagine
    g) trovare libro meno costoso


  • Definizione della struct.

                typedef struct libro {
                   char titolo[30]; 
                   char autore[30]; 
                   int numeropagine;
                   float prezzo;
                   char editore[30];
                } t_libro;
            
  • Procedura per l'inserimento dei dati in elenco (array).
    Si utilizza gets per gestire le stringhe con spazi all'interno.

                void inserimento(t_libro elenco[], const int n) {
                    int i=0;
                    for(i=0; i<n; i++) {
                        printf("\ninserire titolo libro ");
                        //scanf("%s", elenco[i].titolo);
                        gets(elenco[i].titolo);
                        printf("\ninserire autore libro ");
                        //scanf("%s", elenco[i].autore);
                        gets(elenco[i].autore);
                        printf("\ninserire editore libro ");
                        //scanf("%s", elenco[i].editore); 
                        gets(elenco[i].editore);
                        printf("\ninserire numero pagine libro ");
                        scanf("%d", &elenco[i].numeropagine);
                        printf("\ninserire prezzo libro ");
                        scanf("%f", &elenco[i].prezzo);        
                    }
                }
            
  • Metodo di ricerca di un libro nell'elenco.
    Il metodo restituisce un puntatore a struct anziché una struct per evitare di avere gli stessi dati inutilmente ripetuti.

                t_libro *ricerca(t_libro elenco[], const int n, 
                        char *titolo) {
                    t_libro *ret = NULL;
    
                    if (titolo != NULL) {
                        if (strlen(titolo) > 0) {
                            int i=0;
                            int trovato = 0;
                            while(i<n && trovato==0) {
                                if (strcmp(elenco[i].titolo, titolo) == 0) {
                                    trovato = 1;
                                    ret = &elenco[i];
                                }
                                i++;
                            }
                        }
                    }
    
                    return ret;
                }
            
  • Procedura per la stampa dei dati del libro ricercato.
    Avento come parametro un puntatore a strcut e non una struct si utilizza l'operatore -> per leggere i campi.

                void stampalibro(t_libro *lib) {
                    if (lib != NULL) {
                        printf("\n dati libro trovato \n");
                        printf("titolo: %s\n", lib->titolo);
                        printf("autore: %s\n", lib->autore);
                        printf("editore: %s\n", lib->editore);
                        printf("numero pagine: %d\n", lib->numeropagine);
                        printf("prezzo: %f\n", lib->prezzo);
                    }
                }
            
  • Procedura di ordinamento per titolo del libro.

                void ordinamentoTitolo(t_libro elenco[], const int n) {
                    int i=0;
                    int j=0;
                    for(i=0; i<n-1; i++) {
                        for(j=i+1; j<n; j++) {
                            if (strcmp(elenco[i].titolo, elenco[j].titolo) > 0) {
                                t_libro app = elenco[i];
                                elenco[i] = elenco[j];
                                elenco[j] = app;
                            } 
                        }
                    }
                }
            
  • Procedura di ordinamento per autore del libro.

                void ordinamentoAutore(t_libro elenco[], const int n) {
                    int i=0;
                    int j=0;
                    for(i=0; i<n-1; i++) {
                        for(j=i+1; j<n; j++) {
                            if (strcmp(elenco[i].autore, elenco[j].autore) > 0) {
                                t_libro app = elenco[i];
                                elenco[i] = elenco[j];
                                elenco[j] = app;
                            } 
                        }
                    }
                }
            
  • Funzione che restituisce i dati del libro con più pagine.
    Il metodo restituisce un puntatore a struct anziché una struct per evitare di avere gli stessi dati inutilmente ripetuti.

                t_libro *libromaxpagine(t_libro elenco[], const int n) {
                    t_libro *ret = NULL;
                    int i=0;
                    int max = -1;
                    for(i=0; i<n; i++) {
                        if (elenco[i].numeropagine > max) {
                            max = elenco[i].numeropagine;
                            ret = &elenco[i];
                        }
                    }
    
                    return ret;
                }
            
  • Funzione che restituisce i dati del libro meno costoso.
    Il metodo restituisce un puntatore a struct anziché una struct per evitare di avere gli stessi dati inutilmente ripetuti.
    La costante INT_MAX che indica il valore massimo tra gli interi è presente includendo la libreria "limits.h"

                t_libro *librominprezzo(t_libro elenco[], const int n) {
                    t_libro *ret = NULL;
                    int i=0;
                    int min = INT_MAX;
                    for(i=0; i<n; i++) {
                        if (elenco[i].prezzo < min) {
                            min = elenco[i].prezzo;
                            ret = &elenco[i];
                        }
                    }
    
                    return ret;
                }
            

© Emanuele Scapin 2009-2016

 

Valid HTML 4.01! Valid CSS!