Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    20

    Funzione reinserimento dati

    Ciao a tutti, sono nuovo del forum, anche se seguo molte delle discussioni e devo dire che sono assolutamente esplicative e efficienti quindi complimenti a tutti voi

    Quest'anno, 3 superiore di un ITIS, mi sto avvicinando abbastanza rapidamente al linguaggio di programmazione C da programma della mia scuola.. Siccome non sono per niente soddisfatto dell'insegnamento molto lento e abbastanza scadente sto cercando di fare un po di esperienza da solo, seguendo tra l'altro una guida trovata su questo sito, la migliore che fin'ora abbia trovato..

    Inizio dicendo che so che le funzioni scanf e forse altre sono deprecate, ma prima di passare ad altre più efficienti voglio scoprire un po come funziona tutto il c nelle sue potenzialità.

    Il mio problema è che ho un programma in cui inserisco una ventina di dati, per calcolare alcune cose, in pratica sto facendo un programma per una busta paga per mio fratello.
    Ho creato quindi una funzione che permetta di reinserire il dato se si preme "esc", senza creare una funzione diversa per ogni inserimento.
    Il problema è che, provando il funzionamento con un prodotto tra i primi due dati inseriti, e i valori anche se li reinserisco sono i primi che ho messo.
    Il codice è il seguente, ma vorrei che se possibile non mi diate alternative con funzioni diverse che forse ancora non conosco, ma che possiate spiegarmi come mai non funziona il codice che ho scritto io, mi reputo ancora un novellino, anche se della mia classe sono quello che sa di più, pensate che pena di scuola

    Grazie mille

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    float reins(float x)
    {
         char a;
         do{
         printf("Premere invio per continuare, esc per reinserire il dato");
         a=getch();
         if (a==27)
         {
                  printf("\nReinserire: ");
                  scanf("%f", &x);
         }
         }
         while (a!=13);
         printf("\n");
         return x;
    }
    
    
    int main()
    {
        char trasf;
        int fsmin, fsmag, fhmin, fhmag, g_trasf;
        float retr_base, scat, sup_ind, premio_prod, str, ind_cassa, ind_trasf,
              ind_mensa, fest_ng, fer_ng, mens_agg, ind_mal;
        printf("\n\n\n\t\t\tBusta Paga by Simo\n");
        printf("\nInserire i seguenti dati:\n");
        printf(">> Retribuzione Base: ");
        scanf("%f", &retr_base);
        reins(retr_base);
        printf(">> Scatti di anzianita': ");
        scanf("%f", &scat);
        reins(scat);
        printf(">> Superminimo Individuale: ");
        scanf("%f", &sup_ind);
        printf(">> Premio di produzione: ");
        scanf("%f", &premio_prod);
        printf(">> Lavoro Straordinario: ");
        scanf("%f", &str);
        printf(">> Indennita' di cassa: ");
        scanf("%f", &ind_cassa);
        printf(">> Indennita' di trasferta: ");
        scanf("%f", &ind_trasf);
        printf(">> Indennita' di mensa: ");
        scanf("%f", &ind_mensa);
        printf(">> Festivita' non godute: ");
        scanf("%f", &fest_ng);
        printf(">> Ferie non godute: ");
        scanf("%f", &fer_ng);
        printf(">> Mensilita' Aggiuntive: ");
        scanf("%f", &mens_agg);
        printf(">> Indennita' di malattia: ");
        scanf("%f", &ind_mal);
        printf("\n>> Figli: ");
        printf("\tSani Minori di 3 anni: ");
        scanf("%d", &fsmin);
        printf("\n\tSani Maggiori di 3 anni: ");
        scanf("%d", &fsmag);
        printf("\tHandicap Minori di 3 anni: ");
        scanf("%d", &fhmin);
        printf("\tHandicap Maggiori di 3 anni: ");
        scanf("%d", &fhmag);
        printf("\n>> Numero di giorni di trasferta: ");
        scanf("%d", &trasf);
        if (trasf>0)
        {
           printf("\tEstero (e), o Italia (i)? ");
           trasf=getch();
        }
        
        return 0;
    }

  2. #2
    Utente di HTML.it L'avatar di SamIam
    Registrato dal
    Oct 2011
    Messaggi
    20
    Ciao, e buon Natale
    Credo che il problema sia che alla funzione reins passi la variabile float come valore e non come "riferimento"
    In pratica la funzione userà una copia della variabile che gli passi come argomento, ma così facendo il valore non verrà memorizzato nella variabile del main (come invece dovrebbe essere) e andrà perso una volta terminata la funzione stessa ^_^

    Soluzione
    passa la variabile come riferimento

    leggi



    EDIT: Aggiungo indicazioni specifiche per il C

    Lez_11-Passaggio_riferimento+vettori.pdf

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    20
    Innanzitutto grazie mille e buon natale anche a te!

    ho letto sulla guida che hai postato che in c la funzione non è disponibile ma bisogna simularla tramite i puntatori, se è così allora credo che dovrò aspettare perchè dei puntatori ancora non so molto..
    Inizio a guardarmeli lo stesso, così vedo se è fattibile entrare nell'argomento anche se non ho le basi

    grazie comunque

  4. #4
    Utente di HTML.it L'avatar di SamIam
    Registrato dal
    Oct 2011
    Messaggi
    20
    Ecco la tua funzione, prendila come anticipazione sull'argomento puntatori

    codice:
    float reins(float *x) // la funziona ora accetta il puntatore alla variabile float
    {
    	char a;
    	do
    	{
    		printf("Premere invio per continuare, esc per reinserire il dato");
    		a=getch();
    		if (a==27)
    		{
    			printf("\nReinserire: ");
    			scanf("%f", x);     // Nota : 'x' è già un puntatore, quindi non serve più il dereferenziatore '&'
    		}
    	}
    	while (a!=13);
    	printf("\n");
    	return *x;  // restituisce il valore contenuto nella variabile a cui punta 'x '
    }
    funzione che richiamerai, passandole la variabile in questo modo

    codice:
    reins( &retr_base)
    come vedi il modo è analogo a quello che già hai usato con la scanf( )
    ovvero il passaggio del puntatore alla variabile tramite il dereferenziatore &


  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    20
    grazie!
    comunque ho capito l'utilizzo dei puntatori, praticamente agiscono sull'indirizzo della cella di memoria anzichè sull'argomento in se stesso

    perfetto

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.