Non stampa le scritte...

Stato
Discussione chiusa ad ulteriori risposte.

Francesco C.

Utente Attivo
256
37
CPU
Intel Celeron
HDD
SSD 256 GB
RAM
4GB di ram
Monitor
Integrato nel PC
Net
FTTC Vodafone 200mb
OS
Windows 10 Home 64bit
Buon giorno!

Stavo facendo qualche programma di eercitazione con i record (struct) in C in vista del compito di informatica.

Ho creato un programma che crea una ricevuta di un acquisto che funziona però mi da un problema.

I calcoli di IVA al 22%, il totale, il subtotale non da nessun problema.
Ho creato un array in Char di dimensione 50 dove va inserito il nome del prodotto.
Il programma lo prende in input senza problemi però quando deve mostrarlo in output non me lo mostra, passa direttamente alla stampa dei totali...

Vi allego il codice e lo screen di quello che vedo in output.
C:
#include <stdio.h>
#include <stdlib.h>

/*
Algoritmo che effettui la fattura
*/

struct {
        char nameproduct[50];
            float price;
                int ivastatale;
                    float molt, iva, tot;
        } c1;

int main(int argc, char *argv[])
{
    
    c1.ivastatale=22;
    c1.molt=0;
    c1.price=0;
    c1.tot=0;
    c1.iva=0;
    
        printf("Inserire il nome del prodotto: \n");
        scanf(" %s", &c1.nameproduct[50]);
        
        printf("Inserire il prezzo: \n");
        scanf("%f", &c1.price);
        
    c1.molt= c1.price*c1.ivastatale;
    c1.iva= c1.molt/100;
    c1.tot= c1.price+c1.iva;
    
        printf("************************************ \n");
        printf(" %s \n", c1.nameproduct);
        printf("Subtotale = %f EUR \n", c1.price);
        printf("IVA al 22 % = %f EUR \n", c1.iva);
        printf("Totale (Iva Incl.) = %f EUR \n", c1.tot);
        printf("************************************ \n");
        
    return 0;
}
Come posso risolvere? Grazie a tutti e Buona domenica
 

Allegati

  • output.png
    output.png
    16.9 KB · Visualizzazioni: 24

Andretti60

Utente Èlite
5,823
4,426
Quello che succede è che memorizzi il nome del prodotto a partire dall’elemento di indice 50 del vettore, che tra l’altro è anche l’ultimo.
Un altro errore è che utilizzi una variabile (il membro ivastatale) che non è stato inizializzato.
Da quello che vedo la stampa del risultato non coincide con il codice che hai scritto. Sei sicuro che hai postato il codice giusto?
 
  • Mi piace
Reazioni: Moffetta88

Francesco C.

Utente Attivo
256
37
CPU
Intel Celeron
HDD
SSD 256 GB
RAM
4GB di ram
Monitor
Integrato nel PC
Net
FTTC Vodafone 200mb
OS
Windows 10 Home 64bit
Quello che succede è che memorizzi il nome del prodotto a partire dall’elemento di indice 50 del vettore, che tra l’altro è anche l’ultimo.
Un altro errore è che utilizzi una variabile (il membro ivastatale) che non è stato inizializzato.
Da quello che vedo la stampa del risultato non coincide con il codice che hai scritto. Sei sicuro che hai postato il codice giusto?
Ciao! No, il codice è giusto. Il membro "Ivastatale" l'ho valorizzato a 22, è stata proprio la prima variabile che ho valorizzato nel main...
Post unito automaticamente:

Ciao, ho "risolto", tra virgolette perché adesso stampa qualcosa in output la variabile "nameproduct" però se per esempio scrivo "abc def" stampa solo "abc" e non mi fa inserire il prezzo.. come mai?

Ho risolto togliendo "[50]" allo scanf che prende in input il nome prodotto. Re inserisco il codice e l'output aggiornato.
Grazie e Buona Domenica

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

/*
Algoritmo che effettui la fattura
*/

struct {
        char nameproduct[50];
            float price;
                int ivastatale;
                    float molt, iva, tot;
        } c1;

int main(int argc, char *argv[])
{
   
    c1.ivastatale=22;
    c1.molt=0;
    c1.price=0;
    c1.tot=0;
    c1.iva=0;
   
        printf("Inserire il nome del prodotto: \n");
        scanf(" %s", &c1.nameproduct);
       
        printf("Inserire il prezzo: \n");
        scanf(" %f", &c1.price);
       
    c1.molt= c1.price*c1.ivastatale;
    c1.iva= c1.molt/100;
    c1.tot= c1.price+c1.iva;
   
        printf("************************************ \n");
        printf("%s \n", c1.nameproduct);
        printf("Subtotale = %f EUR \n", c1.price);
        printf("IVA al 22 % = %f EUR \n", c1.iva);
        printf("Totale (Iva Incl.) = %f EUR \n", c1.tot);
        printf("************************************ \n");
       
    return 0;
}
 

Allegati

  • output.png
    output.png
    72.1 KB · Visualizzazioni: 16
Ultima modifica:

Andretti60

Utente Èlite
5,823
4,426
Ah, vedo, non ho notato la linea di codice che inizializza il membro ivastatale.
Ma perché la inizializzi a 22 e poi dividi per 100 in seguito? Ha ben poco senso, inizializzala con il suo valore reale (0.22 e rotti)
Quello che sta succedendo è che leggi il prodotto con il formato %s, che legge una stringa quindi si ferma al primo carattere di separazione che trova (spazio, tab, ritorno). Quindi tutto il resto rimane nel buffer di ingresso e quando leggi il prezzo cerca di convertire “bcd” in float, non ci riesce e quindi il prezzo rimane a zero.
Per leggere l’intera riga devi usare gets() (sconsigliata perché non sicura)o fgets() (sicura).
 
  • Mi piace
Reazioni: Moffetta88
Stato
Discussione chiusa ad ulteriori risposte.

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

Entra

oppure Accedi utilizzando

Discussioni Simili