Problemi con funzione che restituisce percentuale.

di Anonimizzato20093 il
3 risposte
Salve!
Ho questa parte di esame che mi chiede:
Definisca la funzione CaricaDatiParti che riceve in ingresso il numero di articoli che l’ingegnere assemblatore vuole caricare (chiesto nel main e passato in ingresso alla funzione), li faccia inserire leggendoli da tastiera e li memorizzi nel vettore ElencoParti restituendo, alla fine, la % di parti in acciaio e la % di parti kevlar. Il sistema deve stampare, a fine caricamento, il numero di teste, tronchi, braccia e gambe caricate nel magazzino.
Ho scritto la funzione ed il main, il problema è che qualunque valore inserisca mi stampa sempre che la percentuale di parti kevlar è zero.
Domani ho l'esame, aiuto!

Questo è quello che ho scritto io:
#include<stdio.h>
#include<stdlib.h>
#include <string.h>

#define DIM 200
#define SIZE 25

typedef struct
{
    char matricola [SIZE];
    char disponibile;
    char stato [SIZE];
    char categoria [SIZE];
    char materiale [SIZE];
} Magazzino;

Magazzino ElencoParti [DIM];

float CaricaDatiParti (int);
void AssemblaDrone (int, char []);
void StampaDisponibili (int);

int main()
{
  int num_parti;
  float p_kevlar;
  char materiale[SIZE];
  printf ("\nInserire numero di parti da caricare:\n");
  scanf ("%d", &num_parti);

  p_kevlar = CaricaDatiParti( num_parti );

  printf ("\nPERCENTUALE PARTI KEVLAR:\t%.2f\n", p_kevlar);
  printf ("\nPERCENTUALE PARTI ACCIAIO:\t%.2f\n", 100 - p_kevlar);

  printf ("\nScegliere materiale drone ( kevlar/acciaio ): ");
  scanf ("%s", materiale);

  AssemblaDrone (num_parti, materiale);
  StampaDisponibili (num_parti);

     system("PAUSE");
     return 0;
}


float CaricaDatiParti( int num_parti )
{
    int i, num_testa = 0, num_tronco = 0, num_braccia = 0, num_gambe = 0, num_kevlar =0, num_acciaio=0;
    float percentuale;
    for ( i = 0; i < num_parti; i++)
    {
        printf ("\n\n\tARTICOLO NUMERO %d:\n", i+1);

        printf ("\nMatricola: ");
        scanf ("%s", ElencoParti[i].matricola);
        printf ("\nDisponibilita\' ( s / n ): ");
        ElencoParti[i].disponibile = getch ();

        printf ("\n\nStato ( nuovo / usato ): ");
        scanf ("%s", ElencoParti[i].stato);

        printf ("\nCategoria ( testa / tronco / braccia / gambe ): ");
        scanf ("%s", ElencoParti[i].categoria);

        printf ("\nMateriale ( kevlar/acciaio ): ");
        scanf ("%s", ElencoParti[i].materiale);


        if ((strcmp (ElencoParti[i].materiale, "kevlar"))== 0) num_kevlar++;
        if ((strcmp (ElencoParti[i].materiale, "acciaio"))== 0) num_acciaio++;

        if ((strcmp (ElencoParti[i].categoria, "testa"))== 0) num_testa++;
        else if ((strcmp (ElencoParti[i].categoria, "tronco"))== 0) num_tronco++;
        else if ((strcmp (ElencoParti[i].categoria, "braccia"))== 0) num_braccia++;
        else if ((strcmp (ElencoParti[i].categoria, "gambe"))== 0) num_gambe++;
    }

    percentuale = (float) 100*((num_kevlar/num_parti));

    printf ("\nNUMERO testa: %d", num_testa);
    printf ("\nNUMERO tronco: %d", num_tronco);
    printf ("\nNUMERO braccia: %d", num_braccia);
    printf ("\nNUMERO gambe: %d", num_gambe);
 return percentuale;
}
Grazie per l'attenzione.

3 Risposte

  • Scusami ma sono tarda,
    non ho ben capito dove richiamare questa funzione e quale variabile inserisco?

    Ho capito male vero?
     
    printf ("\nMateriale ( kevlar/acciaio ): ");
    scanf ("%s", ElencoParti[i].materiale);
    togli_invio (&ElencoParti[i].materiale);
     
  • Tameiki ha scritto:


    Questo è quello che ho scritto io:
    ...dunque a me funziona, ma cambiando il tipo di valore alle variabili num_kevlar e num_acciaio, che devono diventare di tipo float:
    float percentuale, num_kevlar =0.00, num_acciaio=0.00;
  • Non bisogna cambiare il tipo di nessuna variabile ma bisogna modificare l'espressione in modo che la divisione non venga effettuata tra interi.

    Usa questa riga di codice e tutto andrà a posto

    percentuale = 100.0 * ( (float) num_kevlar/num_parti);
Devi accedere o registrarti per scrivere nel forum
3 risposte