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

Giovanni Montanaro

Nuovo Utente
15
0
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:

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,220
1,852
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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.
 
  • Mi piace
Reazioni: Andretti60

Andretti60

Utente Èlite
6,440
5,091
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.
 

pabloski

Utente Èlite
2,868
916
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:

pabloski

Utente Èlite
2,868
916

Andretti60

Utente Èlite
6,440
5,091
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?
 

pabloski

Utente Èlite
2,868
916
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.
 

Giovanni Montanaro

Nuovo Utente
15
0
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:
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,220
1,852
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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.
 
  • Mi piace
Reazioni: Andretti60

Andretti60

Utente Èlite
6,440
5,091
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
 
  • Mi piace
Reazioni: DispatchCode

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili