Non riesco a risolvere questo esercizio

di il
14 risposte

Non riesco a risolvere questo esercizio

Data una struttura relativa ai libri(titolo,numero di copie e costo , devo:
1)inserire un nuovo libro
2)stampare i dati in ordine di immissione
3)calcolare il costo medio dei libri immessi
4)salvare su un file i dati per libri maggiori una certa soglia
5) leggere i dati da file


Ho problemi soprattutto con il primo e l’ultimo punto
Grazie in anticipo

14 Risposte

  • Re: Non riesco a risolvere questo esercizio

    "Inserire un nuovo libro" può cambiare molto a seconda del tipo di soluzione che vuoi (o devi) impiegare.

    1. in un array di dimensioni fisse, non allocato dinamicamente
    2. in un array di dimensioni "fisse" (in realtà si può anche modificare), allocato dinamicamente
    3. in una lista collegata di elementi creati dinamicamente

    Qual è la tua condizione?

    "Leggere i dati da file" si può risolvere sempre allo stesso modo, indipendentemente dalla soluzione che scegli per l'immagazzinamento dei dati: basta passare un puntatore a una struttura ad una apposita funzione e poi "popolare" la struttura stessa leggendo i dati con le funzioni standard fornite da stdio.h.
  • Re: Non riesco a risolvere questo esercizio

    Allora per leggere da file posso utilizzare fopen
    Per quando riguarda la condizione posso utilizzare anche gli array con memoria dinamica
  • Re: Non riesco a risolvere questo esercizio

    Visto il punto due direi che ti sta chiedendo di usare le liste concatenate.

    L'esercizio lo devi fare tu però, sennò non ha senso. Qui puoi chiedere lumi su un passaggio, una funzione o qualcosa che non ti torna. Ma non tutto l'esercizio, sennò cosa impari?
  • Re: Non riesco a risolvere questo esercizio

    Allora prova a vedere come funziona realloc(), da stdlib.h

    Con realloc() puoi modificare la dimensione di un array qualora risultasse insufficiente, preservando i dati già presenti. Attenzione perché ha un comportamento un po' "birichino" che può portare ad errori che implicano l'invalidamento del puntatore passato (occorre usare un puntatore ausiliario temporaneo e fare qualche minima "contorsione", ma basta leggere bene la documentazione per capire di cosa ti sto parlando).

    Nota: realloc() va bene anche per CREARE l'array quando ancora non ne esiste uno, per cui puoi mettere insieme un'unica tua funzione personalizzata che si occupi di ridimensionare l'array se necessario, ma che crei anche da zero l'array qualora non esista ancora.
  • Re: Non riesco a risolvere questo esercizio

    Non pretendere di fare tutto in un colpo solo.

    NESSUN programmatore procede in questo modo.

    Si inizia con un problema semplice che ha una soluzione semplice.
    Quindi si estende la soluzione con nuove funzionalita'

    Ad esempio:
    1) leggi un file riga per riga e stampi la riga
    2) 1) + smonti la riga nelle sue parti/colonne
    3) 2) + salvi quello che hai letto in un'altro file
    4) 3) + filtri I dati su una certa colonna per un certo valore
    5) 4) + ecc
  • Re: Non riesco a risolvere questo esercizio

    Grazie a tutti ,provo a farlo e vediamo cosa esce fuori
  • Re: Non riesco a risolvere questo esercizio

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define N 100
    #define DIM 100000
    struct libro
    {
    char autore[N];
    int anno;
    int copie;
    };
    typedef struct libro libro;
    void inserisci(libro book[], int pezzi);
    void visualizza(libro book[], int pezzi);
    void media_copie(libro book[], int pezzi);
    void svuota(libro book[]);
    int main()
    {
    libro book[N];
    int pezzi;
    int scelta;
    do
    {
    printf("Cosa vuoi fare?\n\n0. Inserire libri\n1. Visualizzare libri\n2. Calcolare media copie\n3. Chiudere\n\n");
    scanf("%d",&scelta);
    switch(scelta)
    {
    case 0:
    printf("Quanti libri vuoi inserire?\n"); scanf("%d", &pezzi); inserisci(book,pezzi); break;
    case 1:
    visualizza(book, pezzi); break;
    case 2:
    media_copie(book, pezzi); break;
    case 3:
    exit(1); break;
    default:
    printf("Inserire opzione valida\n");
    scelta=0; break;
    }
    }
    while(scelta<=3);
    return 0;
    }
    void inserisci(libro book[], int pezzi)
    {
    FILE *fp;
    fp=fopen("libro.txt", "a+");
    int invalid=0;
    int i;
    for(i=0;i<pezzi;i++)
    {
    while(getchar()!='\n');
    printf("Inserisci autore:\n");
    fgets(book.autore, N, stdin);
    printf("Inserisci anno pubblicazione:\n");
    scanf("%d", &book.anno);
    printf("Inserisci numero copie:\n");
    scanf("%d", &book.copie);
    printf("\n");
    if(book.anno>1990)
    {
    fprintf(fp, "Autore: %s\n", book.autore);
    fprintf(fp, "Anno pubblicazione: %d\n", book.anno);
    fprintf(fp, "Numero copie: %d\n\n", book.copie);
    }
    else
    {
    printf("Anno non valido");
    invalid=1;
    break;
    }
    if(invalid==1)
    break;
    }
    fclose(fp);
    }
    void visualizza(libro book[], int pezzi)
    {
    FILE *fp;
    fp=fopen("libro.txt", "r");
    char buffer[DIM];
    int c=0;
    while(!feof(fp))
    {
    fread(buffer, sizeof(libro), N, fp);
    printf("%s", buffer);
    c++;
    }
    fclose(fp);
    }
    void media_copie(libro book[], int pezzi)
    {
    FILE *fp;
    fp=fopen("libro.txt", "r+");
    float media_copie=0;
    char buffer[DIM];
    int c=0;
    while(!feof(fp))
    {
    fgets(buffer, sizeof(libro), fp);
    if((c)%3==0)
    media_copie= media_copie + atof(buffer+9);
    c++;
    }
    printf("\n Sono presenti %d libri\n", c/3);
    printf("Media copie: %f\n", (float)(media_copie/3));
    fclose(fp);
    }
  • Re: Non riesco a risolvere questo esercizio

    Non è completo ma è un inizio
  • Re: Non riesco a risolvere questo esercizio

    Usa i tag code per il codice

    Dicci qualcosa del codice. Funziona? Problemi?
  • Re: Non riesco a risolvere questo esercizio

    Avete qualche consiglio?
  • Re: Non riesco a risolvere questo esercizio

    Funziona ma mi mancano ancora alcuni punti ,avete anche qualche consiglio per semplificare o migliorare il codice ?
  • Re: Non riesco a risolvere questo esercizio

    NON si può leggere il codice chiaramente se non usi i tag CODE!
  • Re: Non riesco a risolvere questo esercizio

    Ma... non dovevi creare un catalogo dinamico?
  • Re: Non riesco a risolvere questo esercizio

    Tempo fa misi insieme una libreria (in C) per gestire una mia versione di un array dinamico. Il tuo esercizio me l'ha fatta riconsiderare, facendomi venire in mente alcune modifiche. Ecco il risultato, ammesso che ti possa interessare:

    https://dopiest-curtains.000webhostapp.com/libreria_array_dinamico/array_dinamico.zip
Devi accedere o registrarti per scrivere nel forum
14 risposte