PROBLEMA [C] Esercizio con ciclo while controllato da un valore a sentinella

Pubblicità

Giovanni Montanaro

Nuovo Utente
Messaggi
15
Reazioni
0
Punteggio
35
Di seguito è scritto il codice, ovviamente da quello che si evince il codice non è completo, e volevo sapere se fino a qui c'è da migliorare qualcosa, e se il ciclo while con valore sentinella è giusto, in esecuzione non fà quello che deve fare.
Sto avendo delle difficoltà, spero in un'aiuto.
:thanks:
C:
/*
* libri.c
*
*  Created on: 22 feb 2019
*      Author: Giovanni Montanaro
*/

/*
    La libreria "Buona Lettura" gestisce l'approvvigionamento e la vendita dei libri
    mediante una tabella che per ogni libro riporta: codice, titolo, autori, numero copie disponibili,
    numero copie minimo di scorta. I clienti della libreria effettuano le loro richieste inviando il
    codice del libro e il numero di cope da ordinare.
    Progettare una soluzione al problema di gestione delle richieste che fornisca in output:

    ° per ogni richiesta trattata un messaggio di richiesta accettata o rifiutata;
    ° il codice del libro, il titolo e gli autori della richiesta evasa con il maggior numero di copie;
    ° i codici di tutti i libri le cui copie disponibili sono in esaurimento e la quantità da riordinare per
        mantenere il numero minimo di scorta;

    ° la tabella aggiornata.
*/

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int codice[2];
    char titolo[10];
    char autore [10];
    int numero_copie_disponibili;
    int numero_copie_di_scorta;
}libro;

void inserisci_dettagli(libro *libreria);
void gestione_richieste(libro libreria);
void stampa_dettagli(libro libreria);

int main(int argc, char *argv[]){

    libro libro_t;

    int numero_libri;
    int i;

    i=0;
    //ricevi il primo libro dell'utente
    printf("\t\t\n Inserisci il numero di Libri, quando hai finito digita -1\n\n");
    scanf("%d", &numero_libri);

while( numero_libri != -1){ //sentinella, l'utente inserisce di volta quanti libri gli servono, con -1 esce dal ciclo e stampa i risultati che gli servono

    i++;
    //ricevi il successivo libro dall'utente
    printf("\t\t\n Inserisci il primo libro e in seguito uno alla volta tutti gli altri, quando hai finito digita -1\n\n");
    scanf("%d", &numero_libri);

    inserisci_dettagli(&libro_t);
}

    printf("\t\t\n\n Tabella Libri Aggiornata \n\n");
    stampa_dettagli(libro_t);

    return 0;
}

void inserisci_dettagli(libro*libreria){
    printf("\n Inserisci codice Libro --> \n");
    scanf("%d", libreria->codice);
    printf("\n\n Inserisci Titolo --> ");
    scanf("%s", libreria->titolo);
    printf("\n\n Inserisci L'autore' --> ");
    scanf("%s", libreria->autore);
    printf("\n\n Disponibilita --> ");
    scanf("%d", &libreria->numero_copie_disponibili);
    printf("\n\n Scorta --> ");
    scanf("%d", &libreria->numero_copie_di_scorta);
}

void gestione_richieste(libro libreria){

void stampa_dettagli(libro libreria){
}
 
Ultima modifica da un moderatore:
Mi sembra manchino anche delle parentesi, ma probabilmente è solo perché da smartphone non è molto comodo.

Comunque, che vuol dire "non fa quello che deve"? Da errore, o funziona ma non come vorresti?

Sicuramente ci sono cose che non vanno: dalla seconda lettura di numero libri, verrà fatta comunque una chiamata alla funzione anche se il valore inserito è - 1.

Poi, il libro è uno solo. Ad ogni ciclo passi lo stesso riferimento, quindi cambi lo stesso libro. Ti serve un array di libri.
 
In quella maniera non funzionerà mai.
Ci sono parecchie soluzioni, per esempio:
1) digita quanti libri vuoi immettere e poi esegui un semplice ciclo for()
2) chiedi in un ciclo "Vuoi aggiungere un libro" e leggi un carattere (o una stringa), se la risposta' e "si" aggiungi un libro e continua, altrimenti esci dal ciclo
Come ti e' stato detto da @DispatchCode, hai comunque bisogno di un vettore o di una lista.
 
Aaaaaahhhhhhhhh orrore

C:
int codice[2];

Qua hai definito un vettore di 2 interi, non un intero di 2 cifre!

E infatti poi fai

C:
scanf("%d", libreria->codice);

E ci manca il &. Ci manca la graffa per chiudere gestione_richieste.

E ovviamente ci sono i problemi segnalati da @Andretti60 e @DispatchCode

Poi non capisco la logica di questo "Inserisci il numero di Libri, quando hai finito digita -1". Quando poi ad ogni nuovo inserimento chiede di digitare -1 per uscire. Metti qualcosa ( alla fine del ciclo, dopo aver chiamato inserisci_dettagli ) tipo "Premi I per nuovo inserimento o U per uscire". O qualcosa del genere.
 
Ultima modifica:
Nel suo caso sembra un errore. Altrimenti non si capisce il perchè di un vettore di 2 interi e di questo

C:
scanf("%d", libreria->codice);
Non sto dicendo che non ci sia un errore, solo che non sapendo come sia definito il codice in questo esercizio non sappiamo "dove" sia l'errore. Nella definizione o nella lettura?
 
Non sto dicendo che non ci sia un errore, solo che non sapendo come sia definito il codice in questo esercizio non sappiamo "dove" sia l'errore. Nella definizione o nella lettura?

In questo caso entra in gioco pure l'interpretazione che l'op ha dato della traccia. Dovremmo entrare nella testa del professore per una conferma. Magari può chiedere chiarimenti e farci sapere.
 
Grazie a tutti di avermi risposto.

In quella maniera non funzionerà mai.
Ci sono parecchie soluzioni, per esempio:
1) digita quanti libri vuoi immettere e poi esegui un semplice ciclo for()
2) chiedi in un ciclo "Vuoi aggiungere un libro" e leggi un carattere (o una stringa), se la risposta' e "si" aggiungi un libro e continua, altrimenti esci dal ciclo
Come ti e' stato detto da @DispatchCode, hai comunque bisogno di un vettore o di una lista.

@Andretti60 la mia intenzione è di chiedere in un ciclo se si vuole aggiungere un libro, quindi la soluzione 2 da te proposta. Ma non ricordo come si fà :cav:, mi sto perdendo in bicchiere d'acqua :boh:.

Quindi mostrami per favore come dovrei fare, inoltre come faccio a creare una lista ??

P.s. Per quanto riguarda
C:
int codice[2];
è un'errore, lì avrei dovuto inserire
C:
int codice[13];
come mi hai fatto notare.

:thanks:
 
Forse è preferibile l'array così non devi gestire una lista puntata.

Ti sarebbe sufficiente quindi creare un array di libri con il numero di elementi che viene inserito da tastiera; in questo modo sposti la dichiarazione dell'array sotto alla lettura della dimensione.
Se la mantieni in cima dovrai allocare dinamicamente in base a quanto verrà poi inserito da tastiera.

Il codice comunque è un intero? Solitamente si usa una stringa.
 
pseudocodice:

Codice:
int i = 0     // contatore libro
for(;;)        // ciclo infinito
    print "inserisci libro (s/n)"
    leggi risposta
    if risposta != "s" then esci ciclo
    leggi libro[i]
    i=i+1
 
Pubblicità
Pubblicità
Indietro
Top