[C] Esercizi su stampa a video

di il
3 risposte

[C] Esercizi su stampa a video

Salve a tutti!

Sono uno studente di ingegneria e dopo alcuni anni di "inattività", sono ormai giunto (non senza fatica) alla conclusione dei miei studi! L'ultimo esame è proprio quello di informatica generale!

L'esame consiste in un questionario comprendente 7 domande teoriche a risposta breve e 3 esercizi riguardanti il C! In particolare, questi esercizi non richiedono la scrittura di un programma ma la deduzione di un risultato, sulla base di una o più funzioni date e una chiamata di funzione...il tutto sul modello cliente-servitore!

Sostanzialmente, la conoscenza richiesta è legata alla capacità di interpretare le varie operazioni descritte sinteticamente nel codice proposto e giungere ad un risultato finale, cioè la stampa a video sulla base di una precisa formattazione del risultato! Poi segue l'esempio...ma prima volevo premettere una cosa importante: non mi aspetto che mi diate "gratis" la conoscenza del C (ammesso che fosse possibile...non avrebbe senso), ma sono alla ricerca di un "how to" sintetico che mi permetta di trasferire sulla "pratica" le nozioni teoriche che sto cercando di acquisire in questa fase dello studio!
Negli esercizi ci saranno array, puntatori (che non ho ancora approfondito benissimo), funzioni, dati e strutture tipiche del C e che sto studiando in contemporanea con questo post, si può dire!
Ultima nota: purtroppo il mio professore non ci ha fornito degli svolgimenti (per lui dovrebbe essere tutto molto chiaro con la teoria) ma per me non lo è...faccio fatica e ho bisogno di una mano!
Non volendo essere troppo prolisso, parto subito con un esempio recente!

Se f.1 e f2 sono definite nel seguente modo:
int f1(int *x) { int i=0,y=0; 
for (i=0; i<*x; i+=3) *x+=y++; 
return ++(*x);} 
int f2(int *x, int **y) { 
*x+=f1(*y); return --(**y);} 
Cosa stampa il seguente frammento di codice?
int x=3, y=5, *p=&y; *p+=f2(&x, &p); 
printf("\nx=%d, y=%d", x, ++(*p));
Che io ho riscritto in modo tale da poter essere compilato correttamente, in questo modo
#include <stdio.h>

int f1(int *x) { int i=0,y=0; 
for (i=0; i<*x; i+=3) *x+=y++; 
return ++(*x);} 

int f2(int *x, int **y) { 
*x+=f1(*y); return --(**y);}

main(){
    int x=3, y=5, *p=&y; *p+=f2(&x, &p); 
printf("\nx=%d, y=%d", x, ++(*p));
}
Il compilatore restituisce
x=10, y=12

Quello che vi chiedo, è di spiegarmi i passaggi "sequenziali" che si fanno per giungere al risultato...i "conti" in somma...anche in maniera "chiacchierata"! Ci sono esercizi almeno in apparenza diversi per contenuti delle strutture (qui mancano array ad esempio), che magari vi proporrò più avanti, se riusciremo a capirci con questo!

Spero che possiate aiutarmi! Grazie di cuore fin da subito!

3 Risposte

  • Re: [C] Esercizi su stampa a video

    Ciao,
    il codice è abbastanza disordinato (soprattutto il primo pezzo), comunque cerco di spiegarti più o meno come funziona la funzione 1 (a quel punto la seconda è più semplice).

    Dunque, quella funzione prende in input l'indirizzo in memoria di una variabile intera; questo serve di fatto a far sì che una funzione chiamata possa modificare più di una variabile della chiamante (una viene modificata col valore di ritorno, l'altra viene modificata perché nella funzione hai toccato direttamente la sua area di memoria (col puntatore) anziché una copia (come avviene di default (anzi, sempre, ma ne parleremo dopo)).
    All'interno della funzione si dereferenzia il puntatore (in modo da lavorare sull'area che contiene il valore puntato e non su quella che memorizza l'indirizzo puntato) e si esegue una sequenza di operazioni di pre o post incremento di quel valore (e qui devi studiare la precedenza degli operatori in c per capire come valutare quelle espressioni.
    Alla fine, il valore puntato da x viene incrementato di 1 e ritornato alla funzione chiamante. Questo vuol dire che sia il valore ritornato da f.1 che quello puntato da x sono = *x+1.

    Prova tu adesso a seguire i passaggi della funzione f2, sapendo che int **y è un puntatore a puntatore a intero (quindi se viene dereferenziato 1 volta ottieni il puntatore a un intero (che infatti viene passato a ), se viene dereferenziato 2 volte ottieni l'intero puntato).

    Effettivamente non è facile come esercizio, dal momento che si tratta solo di un corso di informatica generale. Per curiosità, che facoltà fai? In che città?

    ciao

    EDIT: ora ho capito perché hai scritto f.1 anziché , pensavo fosse un errore di battitura
  • Re: [C] Esercizi su stampa a video

    Ciao dvaosta e grazie della risposta!

    dvaosta ha scritto:


    il codice è abbastanza disordinato (soprattutto il primo pezzo)
    Se dipendeva da me il codice sarebbe stato
    main(){
    printf("L'Informatica è strana");
    }


    Cmq mi sono fatto l'idea che l'esercizio sia posto in maniera volutamente ingarbugliata!

    Allora, non entro subito nel merito della tua spiegazione poichè IN QUESTO PRECISO MOMENTO non ho ancora i mezzi per capirla a pieno in quanto ho cominciato la teoria dei puntatori solo ieri pomriggio! Quindi spero entro questa sera di rispondere meglio!

    Quello che mi lascia perplesso è che io non "vedo" le operazioni da fare...cioè i passaggi numerici in sostanza! Ma penso che tutto nasca dalla comprensione delle operazioni che esegue la funzione, quindi sarebbe inutile parlare subito di svolgimento!

    Ci risentiamo in serata!


    ps: sono studente di Ingegneria Edile-Architettura: l'esame in realtà non è di Informatica Generale, ma "Informatica Grafica" che con il C non c'entra molto...ma la parte dello scritto è a tutti gli effetti un esame di informatica generale e elementi sulla programmazione con il linuaggio C!
  • Re: [C] Esercizi su stampa a video

    Studiati bene anche le regole di precedenza degli operatori.
    ciao
Devi accedere o registrarti per scrivere nel forum
3 risposte