PDA

Visualizza la versione completa : [C] Funzione reinserimento dati


simondin
25-12-2011, 13:07
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 :ciauz:

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 :dhò: 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 :incupito:

Grazie mille :D



#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;
}

SamIam
25-12-2011, 13:54
Ciao, e buon Natale :D
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 :zizi:

leggi (http://www.slideshare.net/kronat/08-programmazione-passaggio-valori-tra-funzioni-per-riferimenti)

:ciauz:

EDIT: Aggiungo indicazioni specifiche per il C

Lez_11-Passaggio_riferimento+vettori.pdf (http://informatica.scienze.unimo.it/dispense-programmazione-0607/Lez_11-Passaggio_riferimento+vettori.pdf)

simondin
25-12-2011, 15:53
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 :)

SamIam
25-12-2011, 16:20
Ecco la tua funzione, prendila come anticipazione sull'argomento puntatori :zizi:



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



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 &

:ciauz:

simondin
25-12-2011, 19:31
grazie! :)
comunque ho capito l'utilizzo dei puntatori, praticamente agiscono sull'indirizzo della cella di memoria anzichè sull'argomento in se stesso

perfetto :D

Loading