Esercitazioni di. Arnaud Nguembang Fadja : Alessandro Bertagnon :

Documenti analoghi
Il compilatore deve conoscere l interfaccia della funzione per fare il check sintattico di un istruzione che la usa, quindi:

Passaggio dei parametri per valore/riferimento

Esercizio 1. Esercizio 1 Soluzione

Lab 10 Passaggio per riferimento

Lab 10 Passaggio per riferimento

Obiettivi di questa esercitazione. Fondamenti di Informatica T-1 Modulo Passaggio dei parametri per valore/riferimento

Fondamenti di Informatica T-1 Modulo 2

Lab 7 Passaggio per riferimento

Introduzione al C Lez. 3. Puntatori

Introduzione al C. Lez. 2. Funzioni e Puntatori

Fondamenti di Informatica T-1 Modulo 2

Introduzione al C. Lez. 2 Funzioni e Puntatori

Obiettivi di questa esercitazione

Fondamenti di Informatica T-1 Modulo 2

cout << "Inserisci un numero:" << endl; cin >> n; ris = n*2; cout << "Il doppio di " << n << " e " << ris << endl;

Corso di Informatica A.A

I puntatori /2. Ad esempio. // inizio codice. #include <stdio.h> void mostra(int); int main() {int a = 10; mostra(a); return 0;}

Passare argomenti al programma

Passaggio di parametri per valore

Informatica. Appunti della lezione 9

Esercizi. La funzione swapint() primo tentativo

laboratorio di python

Introduzione ai puntatori in C Definizione

Il linguaggio C Puntatori

Introduzione al linguaggio C Puntatori

Passaggio dei parametri. Passaggio dei parametri

Puntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori

Puntatori. Obiettivi: Richiamare quanto noto sui puntatori dal modulo A Presentare l analogia tra puntatori e vettori e l aritmetica dei puntatori

Il linguaggio C. Puntatori e dintorni

C: panoramica. Violetta Lonati

Esercitazione di Reti degli elaboratori

ESEMPIO: le variabili LETTURA/SCRITTURA DI VARIABILI. Specifica Leggere da tastiera un intero, un carattere, un float e un double. Stamparli a video.

Il linguaggio C Puntatori

Introduzione al C Lez. 4

Introduzione al C. Lez. 1 Elementi

Fondamenti di Informatica T-1 Modulo 2

Introduzione al C. Lez. 1 Elementi. Rossano Venturini

Esercitazioni di Fondamenti di Informatica - Lez. 4 23/10/2018

Passaggio dei parametri

Parametri by reference. Funzioni. Passaggio dei parametri. Parametri by reference. Soluzione. Problemi

Fondamenti di Informatica e Laboratorio T-AB Ingegneria Elettronica e Telecomunicazioni. Lab 06 Array" Lab06 1

Indirizzi e puntatori

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. Puntatori. Marco D. Santambrogio Ver. aggiornata al 11 Marzo 2014

Laboratorio di Informatica I

RICORSIONE, PUNTATORI E ARRAY. Quarto Laboratorio

Le funzioni. Funzioni. Funzioni. Funzioni

Lezione 6: Array e puntatori

Introduzione al linguaggio C Puntatori

Quicksort e qsort() Alessio Orlandi. 28 marzo 2010

ARRAY E TYPEDEF. A volte è utile definire un nuovo tipo di dato come array. Si usa la solita sintassi del linguaggio C

ESERCIZIO: Analisi di un programma. Dato il seguente programma C:

Passaggio dei parametri Per valore Il valore viene copiato dall environment esterno all environment della funzione o procedura Cambiamenti dei paramet

Esercizio 1 Soluzione

Esercitazioni di FONDAMENTI DI INFORMATICA MODULO B

Lab 04 Programmazione Strutturata"

Informatica (A-K) 14. Linguaggio C -4

Capitolo 11. Puntatori

Prof. G. Ascia. I puntatori. Fondamenti di Informatica

I tipi strutturati e i record in C++

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE. Puntatori. Marco D. Santambrogio Ver. aggiornata al 4 Aprile 2013

Introduzione al C. Lezione 1 Elementi. Rossano Venturini. Pagina web del corso

Corso di Informatica A.A

Esercizio 1. Esercizio 1 Soluzione

Lab 08 Stringhe e strutture

C array. Problema: scrivere un programma che, ricevuto in input un intero n ed n interi positivi, li stampi in ordine inverso.

Fondamenti di Informatica e Laboratorio T-AB Ingegneria Elettronica e Telecomunicazioni. Lab 05 Array. Lab06 1

Compito A. Compito A Sintesi (main(

ESERCIZIO: SHIFT ARRAY (1)

Esercitazioni di Fondamenti di Informatica - Lez. 7 20/11/2018

E9 Esercizi sul Capitolo 9 Array

Lezione 8: Stringhe ed array multidimensionali

Laboratorio di Python

E17 Esercizi sugli Array in Java

Laboratorio di Informatica

Il C nel C++: Funzioni

Funzioni (1) Il C nel C++: Funzioni. Funzione (2) Vantaggi delle Funzioni. Localizzazione della funzionalità correggibilità manutenibilità

Associazione Variabile-Indirizzo

dare un nome a una istruzione non denota un valore, quindi non c è tipo di ritorno void

Procedure. Una procedura permette di dare un nome a una istruzione rendendola parametrica non denota un valore, quindi non c è tipo di ritorno void

I/O da tastiera + Alessandra Giordani Lunedì 2 maggio

float somma_float(float a, float b) int get_ascii(char c)

IEIM Esercitazione II Elementi di programmazione C. Alessandro A. Nacci -

ESEMPIO 1. #include <math.h> void eq2gr(float a, float b, float c, int* reali, float* x1,float* x2)

Fondamenti di Informatica T-1 Modulo 2

Il linguaggio C. Notate che...

Transcript:

Esercitazioni di Arnaud Nguembang Fadja : ngmrnd@unife.it Alessandro Bertagnon : alessandro.bertagnon@student.unife.it

Il compilatore deve conoscere l interfaccia di una funzione per fare il check sintattico di un istruzione che la usa, quindi: 1. O la funzione viene definita prima delle funzioni che la invocano (ancheil main è una funzione); 2. Oppure se ne dichiara il prototipo all inizio e poi si può implementare la funzione ovunque nel file.

1. La funzione è definita prima delle funzioni che la invocano float somma_float(float a, float b) { return a+b; float somma_float_3(float a, float b, float c) { int sum_temp; sum_temp=somma_float(b, c); return somma_float(a, sum_temp); main() { float sum; sum=somma_float_3(4.0, 0.06, 33.101);

2. Oppure se ne dichiara il proto3po all inizio e poi la si può implementare ovunque nel file. float somma_float_3(float a, float b, float c); float somma_float(float a, float b); main() { float sum; sum=somma_float_3(4.0, 0.06, 33.101); float somma_float_3(float a, float b, float c) { int sum_temp; sum_temp=somma_float(b, c); return somma_float(a, sum_temp); float somma_float(float a, float b) { return a+b;

Esiste un (po di dato par(colare a0o a contenere indirizzi di memoria rela(vi ad altre variabili int *p; char *car; persona *per; p conterrà indirizzi di variabili intere, car di variabili char e per di variabili persona L indirizzo di una variabile si estrae con l operatore "&" int c; p = &c; p ora con(ene l indirizzo di c. Posso accedere a c, tramite p a0raverso l operatore di dereferenziazione "*" *p = 55;

I parametri di una funzione possono essere passa0 per copia o per riferimento (sia 0pi predefini0 che utente) Per copia: il parametro formale è una variabile locale che con0ene una copia del valore del parametro a(uale Per riferimento: il parametro formale è una variabile locale di 0po puntatore che con0ene l indirizzo di una cella di memoria esterna al record di a0vazione della funzione. La funzione può quindi modificarne il valore accedendo a tale cella di memoria, aaraverso l operatore di dereferenziazione "*". void incrementa(int contatore) { contatore++; void incrementa(int* contatore) { (*contatore)++;

void incrementa(int contatore) { contatore++; main() { int c = 0; incrementa(c); printf("c=%d",c); void incrementa(int* contatore) { (*contatore)++; main() { int c = 0; incrementa(&c); printf("c=%d",c); c=0 c=1 main c RA 0 DL main c RA 0 DL 1 incrementa RA DL contatore 0 1 incrementa contatore RA DL

Si scriva un programma che legge da tastiera due float a e b, poi invoca una funzione (o procedura) divisione che comunica al main se la divisione è possibile o no qualora la divisione sia possibile, il risultato della divisione Il main deve quindi stampare se la divisione è impossibile: Divisione impossibile altrimenti il risultato della divisione (quoziente)

Dal testo è evidente che la funzione divisione deve fornire due risultati al main: se la divisione è possibile o no il risultato della divisione Sappiamo che tramite il valore di ritorno si può fornire al massimo un risultato L unico altro metodo con cui una funzione può fornire risultati è tramite il passaggio per riferimento Æ Quindi dobbiamo passare almeno uno dei due risultati per riferimento. Abbiamo 3 possibilità: 1. Entrambi i risultati sono passati per riferimento e la funzione non ha un valore di ritorno (void) 2. Il valore di ritorno fornisce il quoziente e un parametro per riferimento dice se la divisione è possibile 3. il valore di ritorno dice se la divisione è possibile e il quoziente è dato per riferimento

1. Entrambi i risultati sono passati per riferimento e la funzione non ha un valore di ritorno void divisione(float a, float b, int *ok, float *q) { if (b==0) *ok=0; // è falso che la divisione sia possibile else { *ok = 1; *q = a/b; main() { float a,b,q; int ok; scanf("%f %f",&a,&b); divisione(a,b,&ok,&q); if (ok) printf("quoziente=%f",q); else printf("divisione impossibile");

2. Il valore di ritorno fornisce il quoziente e un parametro per riferimento dice se la divisione è possibile float divisione(float a, float b, int *ok) { if (b==0) *ok = 0; else { *ok = 1; return a/b; main() { float a,b,q; int ok; scanf("%f %f",&a,&b); q = divisione(a,b,&ok); if (ok) printf("quoziente=%f",q); else printf("divisione impossibile");

3. il valore di ritorno dice se la divisione è possibile e il quoziente è dato per riferimento int divisione(float a, float b, float *q) { if (b==0) return 0; else { *q = a/b; return 1; main() { float a,b,q; scanf("%f %f",&a,&b); if (divisione(a,b,&q)) printf("quoziente=%f",q); else printf("divisione impossibile");

Si scriva un programma che legge da tas3era due numeri complessi, ne calcola la somma e stampa il risultato Un numero complesso è dato da una coppia rappresentante la parte reale e la parte immaginaria. La somma deve essere effe:uata tramite la procedura con la seguenteinterfaccia: void somma_complex(float rea, float ima, float reb, float imb, float* reresult, float* imresult); Il risultato dovrà ancora essere una coppia di numeri.

Un sistema di cronometraggio per la Formula 1 registra i tempi in millisecondi. Tu5avia tali tempi devono essere presenta7 in termini di minu7, secondi e millisecondi. Creare una procedura che, ricevu7 in ingresso un tempo dato in millisecondi, fornisca al main l equivalente in termini di minu7, secondi, millisecondi. void frommillisec(int millisec, int* mm, int* sec, int* min) Si realizzi un main che invoca la funzione, e che dopo aver chiesto all utente un valore indicante una durata in millisecondi, stampi a video il tempo nel formato min:sec.millisec.

Un sistema di ges+one mp3 perme0e di calcolare in an+cipo la duratadi unacompila+on di brani. La durata di ogni brano è definita da tre variabili di +po intero (ore, minu+, secondi). Creare una procedura void sommatempi(int o1, int m1, int s1, int o2, int m2, int s2, int* or, int* mr, int* sr); che, ricevu+ in ingresso la durata di due pezzi musicali, res+tuisca la durata risultante dalla somma dei duebrani. Si realizzi un main che chieda all utente di inserire la durata di diversi brani musicali, e si stampi a video la durata totale. l utente segnala il termine dei brani da inserire con un brano specialedilunghezza 0:00.00).

Proge&are e codificare in C una procedura che da1 tre interi calcoli contemporaneamente il massimo e il minimo. void minmax(int a, int b, int c, int* min, int* max); Scrivere poi un programma che legga da tas1era tre numeri interi e stampi a video il massimo e il minimo invocando la funzione appena descri&a.

Si scriva un programma C che legge da tastiera un numero x e calcoli tramite una funzione quadratoperfetto se x è un quadrato perfetto; nel caso che lo sia, il main deve stamparne anche la radice quadrata. La funzione quadratoperfetto ha fra i parametri il numero x e comunica al main se x è un quadrato perfe6o oppure no la radice quadrata di x (qualora x sia un quadrato perfe6o)

Si scriva un programma C che, dati 3 valori a, b e c, fornisce le soluzioni dell equazione di secondo grado: ax 2 + bx + c = 0 Nel main, il programma deve leggere da tastiera i coefficienti a, b e c poi deve invocare una funzione radici infine deve stampare i risultati La funzione radici deve comunicare al main se le radici sono reali o no il valore delle radici (nel caso queste siano reali)

Quando si dichiara un array, ad esempio di interi int interi[10]; si crea una collezione di 10 interi adiacenti, il nome dell array (interi) viene interpretato come un sinonimo per il riferimento (o indirizzo) alla prima cella dell'array stesso, quindi come un sinonimo per un puntatore che punta la prima cella dell array (interi[0]). Attraverso l'operatore [] si può accedere alle varie celle. Per valutare l espressione interi[n] il compilatore parte dall indirizzo interi a questo aggiunge il numero di byte necessari per accedere alla n-esima cella.

Quindi quando ad una funzione viene passato un array void inverti(int bits[], int dim); in realtà si passa solo l'indirizzo della prima cella dell array; Affinch e la funzione possa conoscere la dimensione dell'array (dimensione logica), questa va passata esplicitamente come ulteriore parametro. /* Se bits è popolato di soli 0 ed 1 * inverte 0 e 1 */ void inverti(int bits[], int n); { int i=0; for(i=0; i<n; i++) bits[i]=1-bits[i];

Si scriva un programma C che: legge da tas5era, tramite una funzione, un intero n (al massimo 100) e un array di n interi; calcola la somma degli elemen5 dell'array, tramite una funzione; calcola la media degli elemen5 dell'array, tramite una funzione; calcola il numero degli elemen- pari dell'array, tramite una funzione; infine, mostri a video i risulta5 oaenu5.

1. Si scriva una procedura che, prendendocome parametri: un array di numeri (interi) una soglia (intero) eventuali altri parametri ponga a 0 i valori inferiori alla soglia. 2. Si scriva un programma che: legge da input, tramite una procedura o funzione, una sequenza di n interi terminata dal numero -1 e la memorizza in un array. Il valore -1 non va inserito nell array. Il valore n è al massimo 100; legge datastiera ilvalore della soglia; invoca la procedura al punto 1 passando l'array inserito; stampa a video,tramite una procedura, l'array ottenuto.