PDA

View Full Version : [C] Funzioni.. Help!


piumone
23-06-2007, 14:22
Ciao a tutti, sono disperato sto preparando un esame di informatica e leggendo i vecchi temi d'esame non capisco come si svolge questo esercizio:
Mostrare i valori stampati dal seguente programma C:
#include <stdio.h>
int fz(int a, int *b)
{ int c = 0;
for( a=1; a<4; a++)
c = c + *b;
return a;
}
int main()
{ int a=12, b=-3;
for (b=1;b<5; b++)
b = fz(13,&a);
printf("%d %d\n",a,b);
return 0;
}

non riesco a capire come si sviluppa questa funzione nel programma, perchè b= fz(13, &a)???? Grazie a chiunque voglia aiutarmi..:help:

Furla
23-06-2007, 14:35
come secondo argomento la funzione ha un puntatore ad intero; l'operatore & ricava l'indirizzo del suo argomento, indirizzo che viene quindi passato alla funzione per chiamarla correttamente.

..::DAVE::..
23-06-2007, 14:36
Ciao a tutti, sono disperato sto preparando un esame di informatica e leggendo i vecchi temi d'esame non capisco come si svolge questo esercizio:
Mostrare i valori stampati dal seguente programma C:
#include <stdio.h>
int fz(int a, int *b)
{ int c = 0;
for( a=1; a<4; a++)
c = c + *b;
return a;
}
int main()
{ int a=12, b=-3;
for (b=1;b<5; b++)
b = fz(13,&a);
printf("%d %d\n",a,b);
return 0;
}

non riesco a capire come si sviluppa questa funzione nel programma, perchè b= fz(13, &a)???? Grazie a chiunque voglia aiutarmi..:help:


a B si assegna il valore della funzione fz, alla quale si passano i parametri a=13 ed al parametro b (che è un puntatore) si assegna l'indirizzo di a.
Per trovare il valore di B devi "svolgere" la funzione.
ricorda che se nella funzione modifichi *b modifichi il valore della variabile a nel main.

ndakota
23-06-2007, 14:40
edit: mi sono incasinato :D

piumone
23-06-2007, 15:20
grazie delle risposte ma voi capite cosa fa questa funzione?? Anche perchè come risultati mi da 12 e 5 (credo a=12 e b=5) e provando a svolgere la funzione non riesco a capire come possano venire questi risultati.. disperazione.. :confused:

ndakota
23-06-2007, 15:30
a è 12 nel main.. viene passata per riferimento ma il suo valore non viene cambiato ergo rimane 12.. mentre b(che nella funzione sarebbe a) viene ritornato ed assegnato ad a con valore 5 perchè l'ultima volta che viene incrementato è 5 poi c'è il test 5<4 che fallisce e viene restituito.. sbaglio?

piumone
23-06-2007, 15:36
a è 12 nel main.. viene passata per riferimento ma il suo valore non viene cambiato ergo rimane 12.. mentre b(che nella funzione sarebbe a viene ritornato ed assegnato ad a con valore 5 perchè l'ultima volta che viene incrementato è 5 poi c'è il test 5<4 che fallisce e viene restituito.. sbaglio?

Ma non dovrebbe uscire a 4? for (a=1; a<4; a++), un altro dubbio: allora la variabile c non mi serve ai fini della soluzione dell'esercizio?? in pratica l'unica difficoltà sta nel capire che la a vale 5?

ndakota
23-06-2007, 15:41
Ma non dovrebbe uscire a 4? for (a=1; a<4; a++), un altro dubbio: allora la variabile c non mi serve ai fini della soluzione dell'esercizio?? in pratica l'unica difficoltà sta nel capire che la a vale 5?

secondo me la difficoltà sta nel fatto che nell'esericzio ci sono tutti i modi possibili ed immaginabili per farti confondere.. :D sbagli perchè guardi la a come primo argomento nel prototipo e nella definizione, mentre devi guardare la chiamata e seguire lo stesso ordine.. se nella chiamata a è il secondo argomento devi guardare il secondo argomento del prototipo e della definizione, in questo caso a si chiamerà b nella funzione.. spero di non dire cavolate, sono ancora agli inizi..

ndakota
23-06-2007, 15:46
#include <stdio.h>

int fz(int a, int *b)
{
int c = 0;

for( a=1; a<4; a++)
c = c + *b; /* b è la a del main passata con valore 12 e non viene modificata
perciò rimane 12 */
return a;
}

int main()
{
int a=12, b=-3;

for (b=1;b<5; b++)
b = fz(13,&a);

printf("%d %d\n",a,b);

return 0;
}

piumone
23-06-2007, 15:50
#include <stdio.h>

int fz(int a, int *b)
{
int c = 0;

for( a=1; a<4; a++)
c = c + *b; /* b è la a del main passata con valore 12 e non viene modificata
perciò rimane 12 */
return a;
}

int main()
{
int a=12, b=-3;

for (b=1;b<5; b++)
b = fz(13,&a);

printf("%d %d\n",a,b);

return 0;
}




Allora per la a ci sono ho capito bene. Per la b mi sta fondendo il cervello, si dovrebbe passare dal valore 12 che è quello di a nel main al valore 5 cioè il risultato della funzione.. come si calcola sto benedetto 5??? Mi viene da piangere..

ndakota
23-06-2007, 16:01
b è -3 ma diventa 1 nell'intestazione del for.. e non ci importa di quello che diventa nella funzione perchè è passata per valore quindi quando torna nel main avrà lo stesso valore che aveva prima e l'ultimo valore che avrà sarà 5 perchè nel ciclo viene incrementata fino a quando rende falsa la condzione 5<5.. e così stamperà 5.. credo..

piumone
23-06-2007, 16:07
#include <stdio.h>
int fz(int *a, int b)
{
int c = 0;
for( *a=b; *a<4; *a++)
c = c + b;
return *a;
}
int main()
{
int a=12, b=-3;
for (b=1;b<5; b++)
b = fz(&a,13);
printf("%d %d\n",a,b);
return 0;
}
Ok! Ed in questo caso sapresti dirmi quali valori vengono stampati e perchè? Scusami ma io sti esercizi faccio proprio fatica a comprenderli..

ndakota
23-06-2007, 16:19
a credo sia 13


#include <stdio.h>

int fz(int *a, int b)
{

int c = 0;

for( *a=b; *a<4; *a++) // a=13 condizione falsa, 13 restituito
c = c + b;

return *a;
}

int main()
{

int a=12, b=-3;

for (b=1;b<5; b++)
b = fz(&a,13);

printf("%d %d\n",a,b);

return 0;
}

piumone
23-06-2007, 16:23
Effettivamente a è 13 ma il valore di b mi dice che è 14 e qui siamo sempre allo stesso problema.. non riesco a capire perchè 14.. (la mia facoltà è economia):rolleyes:

squall15
23-06-2007, 16:46
Se guardi la funzione fz(), questa restituisce 13 (il valore che sarà quello di a); se fino qui non hai problemi, il valore 13 viene caricato in b, quindi al momento b=13; il 1° ciclo for termina, b viene incrementato e va a 14, la condizione b<5 è falsa e si esce dal ciclo. A questo punto la stampa mostra b come 14. Cosa non ti è chiaro?

piumone
23-06-2007, 16:57
Mah a fatica credo di aver capito.. la a assume valore 13 perchè nella funz abbiamo (&a,13) e poi nella funzione mi dice for *a=b cioè *a=13??? dopodichè abbiamo il return *a che viene caricato in b che a sua volta viene incrementato di 1 nel for del main (b=14) salvo poi constatare che la condizione non è vera e restituircelo a valore 14.. giusto? dunque a= 13 e b= 14?

squall15
23-06-2007, 17:03
Tutto giusto, dovresti aver capito

piumone
23-06-2007, 18:27
Questo è l'ultimo al quale vi sottopongo.. poi non vi stresso più. Mi trovate i valori di a e b? me li spieghereste x l'ultima volta? Vi ringrazio ragazzi.
#include <stdio.h>
int f(int *a, int b)
{
*a = b + 3;
return b – 1;
}
int main()
{ int a=4, b;

for (b=5; b<9; b++)
b = f(&a, a);
printf(“%d %d\n”,a,b);
return 0;
}

ndakota
23-06-2007, 19:21
secondo me a=10 e b=9 ma non me lo compila da errori che non ho mai visto.. a te lo compila?

piumone
23-06-2007, 19:35
che compilatore usi??

ndakota
23-06-2007, 19:38
ho visual c++ e dev-cpp.. in questo caso ho usato il dev-cpp.

piumone
23-06-2007, 20:09
mah non saprei il perchè.. tuttavia mi risulta a= 13 e b= 10 forse perchè nel for del main abbiamo b = 10 trasportato nella funzione b+3= 13?? Sto un pò sparando..:mc:

squall15
23-06-2007, 20:32
Il risultato è come dici a=13 e b=10; spiegartelo è un pò complesso tramite forum, devi sempre seguire la funzione, comunque provo a farlo velocemente;
alla partenza del programma hai a=4 e b=5 (perchè lo imposti nel for); la condizione è vera e quindi nella funzione passi (4,4) (ricordati che la funzione modifica il valore di a poichè va tramite puntatore); dalla funzione si ha a=4+3=7 e si restituisce b (che era 4) come 4-1=3; termina il primo ciclo for con l'incremento di b che va da 3 a 4; ora si vede che b<9, si entra nella funzione passando i valori di a cioè (7,7); dalla funzione hai a=7+3=10 e b=7-1=6; termina il for e b passa da 6 a 7; ora si vede b<9, quindi si entra nella funzione passando (10,10) e hai a=10+3=13 e b=13-1=12; si fa l'incremento per la fine del ciclo for e hai b=13; a questo punto b<9=falso, esci dal for e la stampa ti dà gli ultimi 2 valori di a e b, cioè proprio 13 e 10. Non hai probabilmente ben chiari i cicli, prendi un foglio e segnati i valori che hanno le variabili volta per volta, vedrai che non è difficile, questo es ad esempio era solo un pò + lungo da completare rispetto agli altri 2.
Ciao

piumone
23-06-2007, 20:48
Il risultato è come dici a=13 e b=10; spiegartelo è un pò complesso tramite forum, devi sempre seguire la funzione, comunque provo a farlo velocemente;
alla partenza del programma hai a=4 e b=5 (perchè lo imposti nel for); la condizione è vera e quindi nella funzione passi (4,4) (ricordati che la funzione modifica il valore di a poichè va tramite puntatore); dalla funzione si ha a=4+3=7 e si restituisce b (che era 4) come 4-1=3; termina il primo ciclo for con l'incremento di b che va da 3 a 4; ora si vede che b<9, si entra nella funzione passando i valori di a cioè (7,7); dalla funzione hai a=7+3=10 e b=7-1=6; termina il for e b passa da 6 a 7; ora si vede b<9, quindi si entra nella funzione passando (10,10) e hai a=10+3=13 e b=13-1=12; si fa l'incremento per la fine del ciclo for e hai b=13; a questo punto b<9=falso, esci dal for e la stampa ti dà gli ultimi 2 valori di a e b, cioè proprio 13 e 10. Non hai probabilmente ben chiari i cicli, prendi un foglio e segnati i valori che hanno le variabili volta per volta, vedrai che non è difficile, questo es ad esempio era solo un pò + lungo da completare rispetto agli altri 2.
Ciao

Semplicemente perfetto.. Ho davvero capito.. Sei stato preciso ed esauriente, spero di non dover più incappare in sti dubbi. Grazie a tutti! Al prossimo dubbio..:)

piumone
29-06-2007, 10:38
C
#include <stdio.h>
double fz
(double b)
{ int a; int i;
a=10;
for (i = 1; i <= b + 1; i++)
a = a / i;
return (a);
}
int main(void)
{
double b;
b = fz(2.0);
printf(“%f\n”,b);
return 0;
}


Come fa a valere1.0 b???

CartaIgienica
29-06-2007, 16:55
a=13 b=10

piumone
29-06-2007, 17:54
a=13 b=10

io intendevo l'ultima che ho messo.. :rolleyes:

piumone
30-06-2007, 01:47
x me non c'è soluzione.. è complicata...
:cry:

squall15
30-06-2007, 12:16
Il risultato è 1 perchè si ottiene dall'ultima divisione del for della funzione; nell'ultimo ciclo hai i=3 e a che è pari a 5; 5/3=1 nella divisione tra interi (non hai la parte dopo la virgola). Più chiaro adesso?

piumone
30-06-2007, 12:26
Il risultato è 1 perchè si ottiene dall'ultima divisione del for della funzione; nell'ultimo ciclo hai i=3 e a che è pari a 5; 5/3=1 nella divisione tra interi (non hai la parte dopo la virgola). Più chiaro adesso?

in pratica fa 10/1 con i=1 poi 10/2 (5) con i=2 poi 5/3=1 con i=3 chiarissimo.. fine ciclo for.. Grazie! Una volta spiegato è facile io facevo sempre a=10 quindi con i=3 mi veniva 3! ripassare i cicli urgentemente..
:muro:

squall15
30-06-2007, 12:47
Esatto, ovviamente a viene modificato e quindi passa da 10 ad 1 alla fine; se ti può consolare appena ho visto il codice mi sono confuso anche io e ho lasciato ad a il valore 10, infatti non veniva 1...:D

piumone
08-07-2007, 17:23
qualcuno mi spiega questa?? Risultati 5 e 5

#include <stdio.h>
int fx(int a, int *b)
{
*b = a + 1;
return a;
}
int main()
{
int a=-3, b=4;
for(b=1; b<3; b++)
b = fx(4,&a);
printf("%d %d\n",a,b);
return 0;
}


ed anche questa risultati 4 e 6?
#include <stdio.h>
int fx(int a, int *b)
{
*b = a + 1;
return a;
}
int main()
{
int a=-3, b=4;
for(b=1; b<3; b++)
a = fx(4,&b);
printf("%d %d\n",a,b);
return 0;
}

carter100
08-07-2007, 20:49
La prima: a vale 5 poichè alla funzione passi a tramite puntatore (il suo valore sarà così modificato) e hai in pratica *b(che sarà a del programma)=4+1=5. La funzione ritorna 4 che è passato a b e che fa terminare il for dopo un ciclo e l'incremento di 1,quindi anche b=5.
La seconda: nella funzione b=4+1=5 e a sarà 4 (valore di ritorno della funzione), b viene incrementato di 1 quindi =6 e si esce dal for.

piumone
06-09-2007, 17:31
#include <stdio.h>
int fx(int a, int *b)
{ int c;
c = a + *b;
*b = 3;
return (c - *b);
}
int main()
{ int a=7, b=-4;

for(a=0; a<3; a++)
b = fx(a,&a);
printf("%d %d\n",a,b);
return 0;
}


Allora qui sono d'accordo sul fatto che la a sia 4, ma a me la b non risulta -3!
Perchè se alla funzione sono passati i valori 7 e 7 e c diventa 7+7= 14 come può 14-3 a fare -3???:muro: