Problemi con C in esecuzione

di il
17 risposte

Problemi con C in esecuzione

Buongiorno a tutti. Ho provato a fare un esercizio di C che sintatticamente sembrava essere ok e , mandando in esecuzione il programma fino a l'altro ieri, sembrava funzionare.
Ritrovo però,in fase di esecuzione, dati e numeri irregolari rispetto a quelli da me inseriti o da me previsti in output. Mi servirebbe urgentemente una mano ( domani ho l'esame ).
Posto qui sotto la traccia
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
copie 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.
E qui il mio codice
#include <stdio.h>
#include <stdlib.h>
#define max 20

struct SData{
int cod[5];
char tit[15];
char aut[15];
int cop;
int min;
int ric;};
typedef struct SData lib;


int main()
{int n,m,i,flag,l;
int c;
lib libro[max];
printf("BENVENUTI NELLA LIBRERIA BUONA LETTURA!\n\n");
//Registrazione libri
do{
    printf("\nQuanti libri si vogliono registrare?\n");
    scanf("%d",&n);
if (n>max){
flag++;
printf("Errore,non e' possibile registrare piu' di 20 libri!\n");
        }
else{
    flag=0;
}}while (flag>=1);


for(i=0;i<n;i++){
   printf("\n\nLibro %d\n",i);
   printf("\nInserire il codice del libro(Il codice e' composto da 5 cifre,qualunque\ncifra in eccesso non verra' considerata!):");
   scanf("%d",&libro[i].cod);
   fflush(stdin);
   printf("\nInserire il titolo del libro:");
   gets(libro[i].tit);
   fflush(stdin);
   printf("\nInserire autori del libro:");
   gets(libro[i].aut);
   fflush(stdin);
   printf("\nInserire il numero di copie disponibili:");
   scanf("%d",&libro[i].cop);
   printf("\nInserire numero minimo di copie da conservare nella scorta:");
   scanf("%d",&libro[i].min);
   libro[i].ric=0;}

//Richieste
printf("\nInserire il codice del libro di cui si vuol fare richiesta:\n");
scanf("%d",&c);
m=0;
for (i=0;i<n;i++){
if(c==libro[i].cod){
    flag++;
    m=i;
    i=n;}
else{
    flag=0;
    i++;
};};
system("pause");
if(flag==0&&i==n){
    printf("\n\aLibro non trovato!\n\n");}
    else{
        printf("\n\aLibro trovato!\n\n");
    };
printf("Quante copie desidera ordinare?\n");
fflush(stdin);
scanf("%d",&l);
system("pause");
if(l<=libro[m].cop-libro[m].min){
libro[m].cop=(libro[m].cop)-l;
libro[m].ric=(libro[m].ric)+l;
printf("\nOrdine accettato!\n");
}
else{
printf("\nImpossibile accettare la richiesta per scarsa disponibilità!\n");
};

//Libro più richiesto
for(i=0;i<n;i++){
    if(libro[i+1].ric>=libro[i].ric){
        m=i+1;}
    else{m=i;};};
printf("\n\nIl libro con piu' copie vendute e' libro cod%d\n",libro[m].cod);
printf("\nDati libro\n");
printf("\nTitolo:%s",libro[m].tit);
printf("\nAutore:%s",libro[m].aut);
printf("\nCopie vendute:%d",libro[m].ric);
printf("\nCopie disponibili:%d",libro[m].cop);
printf("\nCopie nella scorta minima:%d\n",libro[m].min);

//Tabella aggiornata
printf("\n\nInserire il codice del libro da visualizzare:\n");
fflush(stdin);
scanf("%d",&c);
m=0;
for (i=0;i<n;i++){
if(c==libro[i].cod){
    flag++;
    m=i;
    i=n;}
else{
    flag=0;
    i++;
};};
system("pause");
if(flag==0&&i==n){
    printf("\n\aLibro non trovato!\n\n");}
    else{
        printf("\n\aLibro trovato!\n\n");
    };
printf("\nVisualizzazione dati:\n");
printf("\nLibro cod%d",libro[m].cod);
printf("\nTitolo:%s",libro[m].tit);
printf("\nAutore:%s",libro[m].aut);
printf("\nCopie disponibili:%d",libro[m].cop);
printf("\nCopie nella scorta minima:%d\n",libro[m].min);


return 0;
}

17 Risposte

  • Re: Problemi con C in esecuzione

    Puoi indicare con maggiore precisione quali valori inserisci e quali ottieni (sbagliati) ?
    Così acceleri eventuali risposte ...
  • Re: Problemi con C in esecuzione

    La condizione degli if sembra non verificarsi mai ( non si trova una corrispondenza tra il codice del libro e quello inserito da me". Stampa a video sempre: " libro non trovato".

    Le stringhe char della struttura dati non vengono restituiti o viene restituita una "P".
    I valori numerici sono completamente diversi da quelli inseriti , sembra quasi che stampi a video degli indirizzi di memoria.
  • Re: Problemi con C in esecuzione

    Questo è un warning ricorrente nel mio codice
    warning: format expect artgument of type int* but argument has type int(*)[5]
    warning: format expect artgument of type int* but argument has type int*
  • Re: Problemi con C in esecuzione

    C'è un problema di fondo nel tuo programma, prima di controllare tutte le linee di codice.

    Quello che chiami "codice" del libro, primo elemento della struttura, è dichiarato come

    int cod[5];

    ovvero per ogni libro prevedi 5 codici diversi !

    Se il codice è un numero allora devi scrivere

    int cod;

    mentre, se prevedi un codice alfanumerico di 5 caratteri massimo, allora sarà

    char cod[6];

    Decidi questa cosa prima di continuare a correggere il programma, o non funzionerà nulla.
  • Re: Problemi con C in esecuzione

    Ho cambiato le caratteristiche del codice . Adesso però per verificare la corrispondenza dovrei usare uno strcmp tra il codice e la variabile che uso per la ricerca?

    Perchè facendo così, comunque mi da lo stesso errore di prima.
  • Re: Problemi con C in esecuzione

    Se usi una stringa, ovviamente sì
  • Re: Problemi con C in esecuzione

    L'errore è lo stesso ,pur avendo modificato il codice considerando sia c che cod come delle stringhe di char alfanumerici da 5 elementi.
    Nei controlli ho inserito una variabile k=strcmp(c,libro.cod). Se tale variabile è nulla, i codici corrispondono . Questa condizione non si verifica mai però.
    Se può aiutare , posto il pezzo di codice modificato fino a quel punto.
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define max 20
    
    struct SData{
    char cod[5];
    char tit[15];
    char aut[15];
    int cop;
    int min;
    int ric;};
    typedef struct SData lib;
    
    
    int main()
    {int n,m,i,flag,l,k;
    char c[5];
    lib libro[max];
    printf("BENVENUTI NELLA LIBRERIA BUONA LETTURA!\n\n");
    //Registrazione libri
    do{
        printf("\nQuanti libri si vogliono registrare?\n");
        scanf("%d",&n);
    if (n>max){
    flag++;
    printf("Errore,non e' possibile registrare piu' di 20 libri!\n");
            }
    else{
        flag=0;
    }}while (flag>=1);
    
    
    for(i=0;i<n;i++){
       printf("\n\nLibro %d\n",i);
       printf("\nInserire il codice del libro(Il codice e' composto da 5 cifre,qualunque\ncifra in eccesso non verra' considerata!):");
       fflush(stdin);
       gets(libro[i].cod);
       fflush(stdin);
       printf("\nInserire il titolo del libro:");
       gets(libro[i].tit);
       fflush(stdin);
       printf("\nInserire autori del libro:");
       gets(libro[i].aut);
       fflush(stdin);
       printf("\nInserire il numero di copie disponibili:");
       scanf("%d",&libro[i].cop);
       printf("\nInserire numero minimo di copie da conservare nella scorta:");
       scanf("%d",&libro[i].min);
       libro[i].ric=0;}
    
    //Richieste
    printf("\nInserire il codice del libro di cui si vuol fare richiesta:\n");
    fflush(stdin);
    gets(c);
    m=0;
    for (i=0;i<n;i++){
    k=strcmp(c,libro[i].cod);
    if((k=0)){
        flag++;
        m=i;
        i=n;}
    else{
        flag=0;
        i++;
    };};
    system("pause");
    if(flag==0&&i==n){
        printf("\n\aLibro non trovato!\n\n");
        return 0;}
        else{
            printf("\n\aLibro trovato!\n\n");
        };
    Giuro, non riesco davvero a venirne a capo ( anche perchè ormai non dà nemmeno dei warning)
  • Re: Problemi con C in esecuzione

    Hai letto nella mia risposta quanti caratteri devi prevedere per il codice? E quanti ne hai previsto tu?
  • Re: Problemi con C in esecuzione

    Corretto anche quello, ma ancora nulla
  • Re: Problemi con C in esecuzione

    A me però funziona. Quando esegui il programma quali dati inserisci?
  • Re: Problemi con C in esecuzione

  • Re: Problemi con C in esecuzione

    Io facevo la prova con un solo libro e casualmente funzionava. Il problema è nella riga

    if((k=0)){

    che ovviamente deve essere

    if((k==0)){
  • Re: Problemi con C in esecuzione

    Non capisco davvero perchè se considero un libro che non sia il primo , non funziona.
    Avendo questo problema anche nella funzione di visualizzazione delle strutture, inizio a pensare che forse il problema sia a monte, ovvero quando creo gli elementi della tabella.
  • Re: Problemi con C in esecuzione

    Perché la ricerca non ha molto senso ... la puoi correggere così
    
    m=0;
    for (i=0;i<n;i++)
    {
    	k=strcmp(c,libro[i].cod);
    	if((k==0))
    	{
    		flag++;
    		m=i;
    		break;
    	}
    }
    
Devi accedere o registrarti per scrivere nel forum
17 risposte