ANALISI: cicli e funzioni. Non sarà consentito consultare appunti o testi di qualunque tipo durante la prova intermedia
|
|
- Gianluigi Bini
- 7 anni fa
- Visualizzazioni
Transcript
1 Esercizi di preparazione alla I Prova Intermedia di Fondamenti di Informatica L-A a.a. 2003/2004 Prof. Paola Mello, Prof. Paolo Bellavista ANALISI: cicli e funzioni Il compitino comprenderà uno o più esercizi (simili a uno di quelli qui esemplificati) su ciascuno dei seguenti argomenti: ESERCIZI DI ANALISI: Cicli e Funzioni ESERCIZI DI SINTESI: Cicli e Funzioni ESERCIZI SU FUNZIONI RICORSIVE e RECORD DI ATTIVAZIONE ESERCIZI SULLE GMMATICHE DOMANDE DI TEORIA Non sarà consentito consultare appunti o testi di qualunque tipo durante la prova intermedia Al termine degli esercizi è presente sia un compito intermedio di un anno accademico precedente, sia alcune domande di teoria che possono essere molto utili per verificare la propria comprensione e preparazione degli argomenti svolti finora. Si ricorda agli studenti che altri esercizi possono essere comunque reperiti sul sito web del corso. Dato il seguente programma C: main() { int A=0; int i; for (i=1; i<6; i+=3) A = A + i; if (A) printf("%d\n", i-a); else printf("%d\n", A); Qual è l'uscita del programma? La risposta deve essere opportunamente motivata. Nel ciclo for nel main si modificano i valori di A con indice i = 1 e 4. A diventa = 5; i esce con valore 7; l istruzione if, essendo A non nulla (valore vero), stampa 7-5 cioè
2 Si indichino, nel giusto ordine, i valori stampati dal seguente programma C, motivando la risposta data. void main () { int i, j; for (i=0; i<5; i=i+2) { for (j=0; j<3; j++) printf(" %d", i+j); printf("\n"); All interno del primo ciclo for si assegna il valore 0 a i e di conseguenza si stampa: successivamente a i si assegna il valore 2 e si stampa: ancora, si assegna a i il valore 4 e si stampa: Poi si termina. Si indichino, nel giusto ordine, i valori stampati dal seguente programma C, motivando la risposta data. main() { int i,j,x,y; printf("inserire valori interi compresi fra 1 e 20: "); scanf("%d:%d", &x, &y); for (i=1; i<=y; i++) { for (j=1; j<=x; j++) printf("@"); printf("\n"); Dopo aver inserito i due numeri interi separati fra loro da :, il programma stampa un numero di righe pari a y (secondo valore inserito, ciclo for esterno), ciascuna delle quali contiene un numero x (primo valore inserito, ciclo for interno) di caratteri '@'. N.B.: In realtà il programma non effettua nessun controllo sul fatto che gli interi inseriti siano compresi nell'intervallo [1, 20]. 3 4
3 Dato il seguente programma C: int Dim=8; int f(int k) {int i, s=dim; for(i=dim-1; i>=0; i-=k) s+=i; return s; main() {printf("%d\n", f(3)); Qual è l'uscita del programma? La risposta deve essere opportunamente motivata. Soluzione L'uscita del programma è 20. La funzione f() viene infatti invocata con valore attuale di k=3. Il ciclo for viene eseguito con i inizialmente uguale a 7 e decrementato ogni volta di k fino a che i non diventa minore di 0. Ad ogni ciclo viene sommato ad s il valore corrente di i. La funzione poi restituisce s al programma principale. Quindi: s = Dim + (Dim-1) +(Dim-1-k) + (Dim-1-2*k) = = 20 Dato il seguente programma C: void f(int a, int * b) { int limit = a; int i; for(i=0; i<limit; i++) { *b = (*b) * (*b); a++; return; main() { int Esp = 2; int Num = 2; f(esp,&num); printf("%d, %d\n", Esp, Num); Qual è l'uscita del programma? La risposta deve essere opportunamente motivata. Soluzione L'uscita del programma è: 2, 16 La funzione f riceve due argomenti, il primo passato per valore ed il secondo passato per riferimento. Di conseguenza ogni 5 6
4 azione compiuta sulla prima variabile, a, non avrà side-effects sull originale presente nel main, mentre qualsiasi operazione compiuta sulla seconda variabile, b, modificherà anche la variabile originale nel main. Per tale ragione la prima istruzione all interno del ciclo for modifica il contenuto della variabile b e quindi il contenuto della variabile Num presente nel main, mentre la seconda istruzione del ciclo for ha effetti sulla variabile a locale alla funzione f, ma nessun effetto secondario sulla variabile Esp presente nel main. Da notare infine che la prima istruzione del ciclo for assegna immediatamente il risultato del prodotto alla variabile b, e quindi questo valore verrà usato nei cicli successivi. Alla prima iterazione del ciclo for, i vale 0, la condizione di continuazione è soddisfatta, *b vale 2 prima dell assegnamento, e 4 subito dopo. Alla seconda iterazione del ciclo for, i vale 1, la condizione di continuazione è soddisfatta, *b vale 4 prima dell assegnamento e 16 subito dopo. La terza iterazione del ciclo non avviene perché la condizione di continuazione (i<2) non è verificata, e quindi la funzione termina. Il main si limita poi a stampare i valori delle variabili Esp e Num. Per quanto già detto, Esp risulta essere invariata (vale 2), mentre Num risulta avere valore 16. Dato il seguente programma C: int f(int * a, int * b) { int result = 1; for( ; *a > 0 ; (*a)-- ) { result = result * (*b); return result; main() { int base = 3; int esp = 3; int power; power = f(&esp, &base); printf("%d ^ %d = %d\n", base, esp, power); Qual è l'uscita del programma? La risposta deve essere opportunamente motivata. Soluzione L'uscita del programma è: 3 ^ 0 = 27 Nel corpo del main sono inizialmente dichiarate tre variabili (le prime due sono anche istanziate al valore 3); subito dopo viene invocata la funzione f, il cui valore di ritorno è assegnato alla 7 8
5 variabile power, e quindi viene stampato il valore delle tre variabili. La funzione f riceve due argomenti, entrambi passati per riferimento. E dunque importante prestare particolare attenzione a ciò che succede all interno di questa funzione, in quanto potrebbero esserci dei side-effects sui valori delle variabili originali presenti nel main. La funzione f computa l elevamento a potenza di un numero, dove esponente e base sono rispettivamente il primo ed il secondo parametro ricevuti in ingresso da f. Da notare però il modo con cui esegue questo calcolo: utilizza un ciclo (istruzione for), dove non c è l istruzione di inizializzazione, e dove si utilizza come variabile indice proprio uno dei parametri ricevuti per riferimento. Particolare attenzione deve essere prestata all espressione di modifica del ciclo for, che operando su uno dei due parametri origina un side-effect. Siccome la funzione f e invocata con parametri 3 e 3, il risultato è ovviamente 27, mentre il primo parametro ricevuto all interno della funzione ha subito un decremento fino a 0. Per tal motivo al ritorno della funzione esp vale 0, mentre base vale ancora 3. Dato il seguente programma C: int f (int * a, int * b) { if ( ++(*a) < 10) return (*b)++; else return ++(*b); main() { int a = 8; int b = 4; printf("a=%d \nb=%d\n", a, b); printf("f restituisce:%d\n", f(&a, &b)); printf("a=%d \nb=%d\n", a, b); printf("f restituisce:%d\n", f(&a, &b)); printf("a=%d \nb=%d\n", a, b); Qual è l'uscita del programma? La risposta deve essere opportunamente motivata. Soluzione L uscita del programma è la seguente: a=8 b=4 f restituisce:4 a=9 b=5 f restituisce:6 a=10 b=6 9 10
6 Il main non fa altro che dichiarare (ed istanziare) le variabili a e b (la cui visibilità è ristretta al solo main). Quindi stampa il loro valore una prima volta: a=8 b=4 Poi viene stampato il risultato della funzione f, invocata con gli attuali valori di a e b. La funzione f riceve i parametri per riferimento, e quindi potrebbero esserci dei side-effects. La funzione f contiene subito un istruzione condizionale, il cui test è un espressione con un pre-incremento del valore di a (questo comporta sicuramente un side-effect). Quindi il valore di a viene prima incrementato, e poi testato nella condizione. Il pre-incremento porta a al valore 9, che soddisfa la condizione di test: quindi si esegue la prima parte dell istruzione if. Questa contiene solo l istruzione di ritorno del valore contenuto in b post-incrementato. Siccome abbiamo un post-incremento, b prima viene valutato per sapere che valore ritornare, e poi viene incrementato. Quindi f restituisce il valore corrente di b (che vale 4) e poi il valore di b è incrementato a 5 (con side effect). seconda parte dell istruzione if. Questa restituisce il valore di b pre-incrementato (ancora con side-effect), e quindi viene stampato: f restituisce:6 Alla fine il main ristampa ancora i valori di a e b, che a causa dei side-effects di cui prima, ora valgono: a=10 b=6 Viene stampato: f restituisce:4 Il main ristampa i valori di a e b, che in seguito ai side-effects avvenuti nella funzione f, risultano valere: a=9 b=5 A questo punto la funzione f viene invocata una seconda volta: il valore di a viene dapprima incrementato (perché c è un preincremento) e viene a valere 10 (con side-effect), e poi viene testato. La condizione di test fallisce, e quindi viene eseguita la 11 12
7 (tratto dal compito del 13/11/2002) Dato il seguente programma C: int f1(int b, int y) { if (b%2) return b; else { b++; return y; main() { int a=-8, b=0; while (a++ < 0) { a+=2; b = f1(a,b); printf("%d\n", b++); Che cosa fa la funzione f1? Che cosa stampa il programma (motivare opportunamente la risposta)? La terza esecuzione del ciclo comincia dunque con a=-1 e b=-4; a viene subito incrementato di 2 e f1() viene invocata con parametri attuali 1 e -4. Poiché il primo parametro di invocazione è dispari, questa volta f1() restituisce 1; tale valore viene assegnato a b nel main() e stampato a video. La variabile a ha ora valore +1, la condizione del ciclo while non è più verificata, quindi il corpo del ciclo non è eseguito e il programma termina. Soluzione Il programma stampa a video la sequenza di interi, ciascuno su una linea diversa: Infatti, la prima esecuzione del ciclo avviene con a inizialmente uguale a -7 e poi immediatamente incrementato di 2 (prima istruzione del ciclo). La funzione f1() viene quindi invocata con parametri attuali -5, 0. f1() non fa altro che restituire il primo parametro in caso di primo parametro dispari, il secondo parametro altrimenti (l'incremento di b prima di return y non può influire in alcun modo sul parametro b del chiamante). printf() stampa il valore di b nel main() e quindi -5, e l'incremento di b avviene solo dopo la stampa. La seconda esecuzione del ciclo comincia dunque con a=-4 e b=-4; a viene subito incrementato di 2 e f1() viene invocata con parametri attuali -2 e -4. Poiché il primo parametro di invocazione è pari, f1() restituisce -4; tale valore viene assegnato a b nel main() e stampato a video
8 ESERCIZI DI SINTESI: Cicli e Funzioni Si scriva una funzione: int dispari(int num) che restituisca il valore 1 se num è dispari, 0 altrimenti. Si scriva poi una funzione ricorsiva: int quad(int tot) che calcoli la somma dei primi tot numeri dispari, a partire da 0. Si scriva poi un programma che, letto da input un valore intero minore di 10 (si controlli che sia tale: in caso contrario si richieda il numero all utente), stampi a video il risultato della funzione quad() applicata a tutti i numeri pari minori del valore inserito dall utente (per determinare se un numero è pari si riutilizzi la funzione dispari()). int dispari(int num) { return num%2; int quad(int tot) { int i = 0; int count = 0; int result = 0; while (count < tot) { if ( dispari(i) ) { result += i; count++; i++; return result; main() { int numuser; int i; do { printf( Inserire un numero: ); scanf( %d, &numuser); while (numuser > 10); for (i=0; i<numuser; i++) { if (! dispari(i)) printf( Il risultato di quad() di %d è: %d\n, i, quad(i)); 15 16
9 Si realizzi una funzione: int power(int base, int esp); che calcoli la potenza di un numero data base ed esponente. Si realizzi poi una funzione: double pigreco(int precision); che restituisca come valore il risultato della seguente formula matematica: precision i 4 pi = ( 1) 2i i= Si realizzi una terza funzione: void cylinder(double pi, double radius, double length, double * volume) che calcoli il volume di un cilindro, dove pi è appunto il numero pigreco, radius è il raggio, length è l altezza del cilindro, ed il risultato viene messo nella variabile volume. Si scriva infine un programma che: 1. Chieda all utente un valore di precisione, calcoli pigreco utilizzando tale valore e stampi a video il valore calcolato (si controlli che la precisione sia > 0; in caso contrario si ripeta la richiesta all utente) 2. Chieda all utente un valore intero come raggio della base di un cilindro (si controlli che sia > 0; in caso contrario si ripeta la richiesta all utente) 3. Chieda all utente un valore intero come altezza del cilindro (si controlli che sia > 0; in caso contrario si ripeta la richiesta all utente) 17 Si calcoli quindi il volume del cilindro, se ne stampi il risultato, e quindi si chieda all utente se vuole calcolare un nuovo volume (si chieda all utente di digitare un carattere y/n). In caso affermativo si ricominci il programma a partire dal punto 1. int power(int base, int esp) { if (esp==0) return 1; else return base * power(base, esp-1); double pigreco(int precision) { int i; double result = 0; for (i=0; i<=precision; i++) result = result + power(-1, i)*(4.0/(2*i +1)); return result; void cylinder(double pi, double radius, double length, double * volume) { *volume = radius * radius * pi * length; main() { char answer; int precision; int radius; int length; double pi; double volume; 18
10 do { /* lettura della precisione */ do { printf("\ninserire la precisione: "); scanf("%d", &precision); while (precision < 0); pi = pigreco(precision); printf("pi greco vale: %f\n", pi); /* lettura del raggio */ do { printf("\ninserire il raggio: "); scanf("%d", &radius); while (radius < 0); /* lettura dell'altezza del cilindro */ do { printf("\ninserire l'altezza: "); scanf("%d", &length); while (length < 0); /* calcolo del volume */ cylinder(pi, radius, length, &volume); printf("\nil volume del cilindro è: %f\n", volume); printf("vuoi calcolare un altro volume [y/n]? "); scanf("\n%c", &answer); while (answer == 'y'); Una ditta specializzata nell organizzazione di feste di capodanno vuole regalare come promozione un programma che, presi in ingresso l ora e la data attuale, restituisce quanti secondi sono passati dall ultimo capodanno, e quanti ne mancano al prossimo. Si realizzi a tale che: 1. implementi una funzione: int month_to_days(int month); che restituisce il numero di giorni dato il mese (si faccia uso dell istruzione switch). 2. una funzione: long month_to_seconds(int month); che riceve in ingresso un mese e restituisce il numero di secondi di cui è composto quel mese. 3. una funzione: long time_elapsed(int month, int day, int hour, int minute, int sec); che restituisce il numero di secondi passati fino ad ora. 4. una funzione: long time_remaining(int month, int day, int hour, int minute, int sec); che calcola il numero di secondi rimanenti al prossimo capodanno. Il programma deve chiedere tutti i dati all utente (nella forma hh:mm:ss gg/mm). Qualora uno di questi dati sia incorretto, il programma deve provvedere a richiedere solo il dato errato. Ottenuti i dati, il programma deve stampare a video i secondi trascorsi, i secondi rimanenti al prossimo capodanno e, se mancano meno di 10 secondi, stampare a video la scritta AUGURI!!! tante volte quanti sono i secondi mancanti
11 #define JAN 1 #define FEB 2 #define MAR 3 #define APR 4 #define MAY 5 #define JUN 6 #define JUL 7 #define AUG 8 #define SEP 9 #define OCT 10 #define NOV 11 #define DEC 12 int month_to_days(int month) { long result; switch (month) { case FEB: result = 28; break; case APR: case JUN: case SEP: case NOV: result = 30; break; case JAN: case MAR: case MAY: case JUL: case AUG: case OCT: case DEC: result = 31; break; default: result = -1; return result; long month_to_seconds(int month) { long result; result = month_to_days(month) * 24 * 60 * 60; return result; long time_elapsed(int month, int day, int hour, int minute, int sec) { long result = 0; int i; for (i=1; i<month; i++) result = result + month_to_seconds(i); result = result + (day-1)*24*60*60 + hour*60*60 + minute*60 + sec; return result; long time_remaining(int month, int day, int hour, int minute, int sec) { long result = 0; int i; for (i=1; i<=12; i++) result = result + month_to_seconds(i); result = result - time_elapsed(month, day, hour, minute, sec); return result; main() { int month; int day; int hour; int minute; int sec; long elapsed_time; long remaining_time; int i; printf("inserire la data completa (hh:mm:ss gg/mm): "); scanf("%d:%d:%d %d/%d", &hour, &minute, &sec, &day, &month); while ((hour<0) (hour>23)) { 21 22
12 printf("ora non corretta. Per favore ripetere: "); scanf("%d", &hour); while ((minute<0) (minute>59)) { printf("minuti non corretti. Per favore ripetere: "); scanf("%d", &minute); while ((sec<0) (sec>59)) { printf("secondi non corretti. Per favore ripetere: "); scanf("%d", &sec); while ((month<1) (month>12)) { printf("mese non corretto. Per favore ripetere: "); scanf("%d", &month); while ((day<1) (day>month_to_days(month))) { printf("giorno non corretto. Per favore ripetere: "); scanf("%d", &day); elapsed_time = time_elapsed(month, day, hour, minute, sec); remaining_time = time_remaining(month, day, hour, minute, sec); printf("dallo scorso capodanno sono trascorsi %d secondi\n", elapsed_time); printf("al prossimo capodanno mancano %d secondi.\n", remaining_time); if (remaining_time < 10) for (i=0; i<remaining_time; i++) printf("auguri!!!!.\n"); Si scriva un programma C che legga da terminale una sequenza di numeri interi terminati dal valore 0 e stampi a terminale la media degli interi positivi pari letti. main() { float media; int num, n_pos_pari; media=0; n_pos_pari=0; do { printf("inserisci un numero (0 per terminare)\n"); scanf("%d", &num); if (num>0) if (num%2==0) {media=media+num; n_pos_pari++; while (num!=0); media = media/n_pos_pari; printf("la media vale: %f\n", media); 23 24
13 Si realizzi un programma C che legga da standard input i dati relativi ai corsi tenuti presso un'università. In particolare, l utente inserisce per ogni corso (si supponga che il numero dei corsi sia inserito dall utente all inizio della computazione) un intero che indica il numero di studenti che frequentano il corso ed un altro intero che ne indica il codice. Il programma deve stampare il codice di tutti i corsi che hanno il numero di iscritti maggiore o uguale al valore 30. Soluzione main() { int isc, corso, i, nc; printf("inserisci il numero dei corsi: "); scanf("%d", &nc); /* inserimento dati */ for (i=0; i<nc; i++) { printf("iscritti e codice corso ); scanf("%d%d", &isc, &corso); if (isc>=30) printf("corso con più di 30 iscritti: %d\n",corso); : Numeri Primi Si scriva una funzione C che calcola se un numero è primo, utilizzando la seguente specifica definita ricorsivamente: 2 è primo. un numero N è primo se non è divisibile per alcun numero primo strettamente compreso fra 2 ed N/2. int div(int N,int M) { return (N % M) == 0; int primo(int N) { int i, Trovato = 1; if (N==2) return 1; else{ for (i=2; i<n/2; i++) if (primo(i)) Trovato = Trovato &&!div(n, i); return Trovato; 25 26
14 Si scrivano le versioni ricorsiva ed iterativa (utilizzo di while) di una funzione: che calcoli il seguente valore: n Σ (a - i\a) i=1 double f(double a, int n); Si scrivano le versioni ricorsiva ed iterativa (ciclo while) di una funzione: che calcoli il seguente valore m n/i i=1 double f(int m, double n); Soluzione ricorsiva double f(double a, int n) { if (n==1) return a 1/a; else return a n/a + f(a, n-1); Soluzione ricorsiva : double f(int m, double n) { if (m==1) return n; else return n/m * f(m-1,n); Soluzione iterativa double f(double a, int n) { int i=1; double sum=0; while(i<=n) {sum = sum + a i/a; i++; return sum; Soluzione iterativa : double f(int m, double n) { int i=1; double prod=1; while (i<=m) { prod = prod * (n/i); i++; return prod; 27 28
15 ESERCIZI su FUNZIONI RICORSIVE e RECORD di ATTIVAZIONE if (N<=0) return 1; else return -1+4*F(N-1) + F(N-2); Si consideri la seguente funzione F la cui specifica è data in modo ricorsivo (si supponga N intero): F(N) = restituisce 1 se N <= 0, -1+4*F(N-1) + F(N-2), altrimenti N=3 N=2 Viene invocata F con N=3, che richiama F(2), che richiama F(1), infine F(0). F(0) restituisce 1 al chiamante 1. Si scriva la funzione C che realizza tale specifica; 2. Si scriva il risultato della funzione quando chiamata con N=3 e si mostri la sequenza dei record di attivazione; 3. Si scriva il programma main che chiama tale funzione con N=3 e ne stampa il risultato a terminale. 1 N=1 N=0 Soluzione int F(int N) { if (N<=0) return 1; else return -1+4*F(N-1) + F(N-2); main (){ printf( risultato %d, F(3)) ; oppure: int F(int N); 1 4 N=3 N=2 N=1 N=-1 F(1), terminata l esecuzione di F(0), invoca F(-1), poi termina e fornisce il risultato 4 al chiamante. F(1)=4 main (){ printf( risultato %d, F(3)) ; int F(int N) { 29 30
16 16 1 N=3 N=2 N=0 F(2) invoca F(0), che restituisce 1. F(2)=-1+4*F(1)+F(0) = *4 +1 =16 F(2) restituisce il valore 16 al chiamante N=3 N=1 F(1) invoca F(-1), che restituisce 1. F(1) termina restituendo 4 al chiamante F(3). F(3)= -1+4*F(2)+F(1) =-1+4*16+4 =67 F(3) termina e restituisce 67 N=-1 N=3 F(3) invoca F(1), che invoca F(0). Come prima, F(0) restituisce 1. 1 N=1 N=
17 Si consideri la seguente funzione F la cui specifica è data in modo ricorsivo (si supponga N intero): Record di attivazione della chiamata con N=3 F(N) = restituisce 2 se N <= 0, F(N-2) * F(N-3), altrimenti a) Si scriva il risultato della funzione quando chiamata con N = 3 e si mostrino i valori intermedi assunti da N; N 3 N 1 La F(3) chiama la F(1) che a sua volta chiama F(-1). Quest ultima finisce restituendo il valore 2 b) Si scriva la funzione C che realizzerebbe tale specifica c) Si mostrino i record di attivazione nello stack 2 Sequenza di attivazioni: N -1 F(3) F(-1) F(1) 2 2 F(-2) 4 2 F(3) restituisce il valore 8 Valori assunti da N: F(0) N 3 N Dopo di che la funzione F(1) chiama F(-2). Quest ultima finisce restituendo il valore 2. Quindi finisce anche F(1) restituendo il valore 4 (risultato della moltiplicazione tra 2 e 2). int F(int N) {if (N<=0) return 2; else return F(N-2)*F(N-3); N
18 N 3 N Dopo di che la funzione F(3) chiama F(0). Quest ultima finisce restituendo il valore 2. Quindi finisce anche F(3) restituendo il valore 8 (risultato della moltiplicazione tra 4 e 2). Si consideri la seguente funzione P la cui specifica è data in modo ricorsivo (si supponga N intero): P(N) = stampa N se N <= 10, stampa N e invoca P(N-10), altrimenti a) Scrivere il codice C di tale funzione; b) La funzione è tail ricorsiva? c) Si scriva la sequenza di valori stampati quando la funzione è chiamata con N = 30. Si mostri anche la sequenza dei record di attivazione, sia nel caso il compilatore effettui l'ottimizzazione tail, sia se non la effettua. a) Codice della funzione void P(int N) { printf("%d ", N); if (N>10) { P(N-10); b) La funzione è tail ricorsiva, in quanto la chiamata ricorsiva è l'ultima operazione effettuata. c) La funzione stampa la sequenza
19 N=30 N=20 N=10 La funzione stampa 30, poi invoca P(20), che stampa il valore 20 ed invoca P(10). P(10) stampa 10 e termina. Il controllo torna a P(20) che termina, poi a P(30) che termina. Se il compilatore effettua l'ottimizzazione tail, viene riutilizzato sempre lo stesso record di attivazione: N = La funzione stampa 30, poi invoca P(20), senza allocare un nuovo record di attivazione. Stampa il valore 20 ed invoca P(10). P(10) stampa 10 e termina. Il controllo torna direttamente al programma chiamante. ESERCIZI SULLE GMMATICHE Si consideri la grammatica G=(Vn,Vt,P,S), con Vn={<U>,<D>, Vt={1,2,3, S=<U> e P={ <U> ::= 1<D>3 <D> ::= 2<U> 2 Si dica se la stringa è sintatticamente corretta rispetto a tale grammatica e se ne mostri la derivazione left-most. Si dica se la stringa è sintatticamente corretta rispetto a tale grammatica e se ne mostri l albero sintattico
20 Derivazione left-most <U> 1 <D> <U> <D> Albero sintattico <U> 1 <D> 3 2 <U> 1 <D> 3 2 Data la grammatica G={VN,VT,S,P), VN={<T>,<F>, S=<T> VT={and, not, true, false, P={ <T> ::= <F> and <T> <F> <F> ::= not <F> true false Dire se la stringa not true and false and not false è sintatticamente corretta rispetto a tale grammatica e se ne mostri la derivazione left-most. Dire se la stringa not true and false and not false è sintatticamente corretta rispetto a tale grammatica e se ne mostri l albero sintattico. Derivazione left-most <T> <F> and <T> not <F> and <T> not true and <T> not true and <F> and <T> not true and false and <T> not true and false and <F> not true and false and not <F> not true and false and not false 39 40
21 Albero sintattico <T> Data la grammatica G con scopo S e simboli terminali {a,b,c,d,0,1 S::= Aa bb bc A::= 1B 0 B::= 0A 1 C::= Cc d <F> and <T> Si mostri (mediante derivazione left-most) che la stringa b011 appartiene alla grammatica, mentre la stringa b111 no. not <F> true <F> false and <T> <F> Derivazione left-most della stringa b011 S bb b0a b01b b011 not <F> Derivazione left-most della stringa b111 (non possibile) S bb b1 false e non è più possibile proseguire
22 Si consideri la grammatica G=(Vn,Vt,P,S), con Vn={U,Z,T, Vt={0,1,2,3, S=U e P={ U ::= 3T 1Z Z ::= 3T 0U T ::= 2 Si mostri (mediante derivazione left-most) che la stringa appartiene alla grammatica, mentre la stringa 130 no. Derivazione left-most della stringa U 1Z 10U 101Z 1013T Derivazione left-most della stringa 130 (non possibile) U 1Z 13T?? non esiste Un esempio di possibile compito intermedio Fondamenti di Informatica L-A (A.A. 2002/2003) - Ingegneria Informatica Prof.ssa Mello & Prof. Bellavista - Appello del 13/11/ durata 1h45m - COMPITO A 1 (punti 7) Dato il seguente programma C: int f1(int b, int y) { if (b%2) return b; else { b++; return y; main() { int a=-8, b=0; while (a++ < 0) { a+=2; b = f1(a,b); printf("%d\n", b++); Che cosa fa la funzione f1? Che cosa stampa il programma (motivare opportunamente la risposta)? 2 - Si definisca una funzione int sum (int i) (in maniera ricorsiva o iterativa) che, passato un valore intero i, calcoli la sommatoria dei numeri interi da 1 a i: (punti 3) i k= 1 k - Si scriva poi una funzione ricorsiva int prodsum(int k)che calcoli il seguente valore: m i i= 1 k= 1 k chiamando opportunamente al suo interno la funzione sum(), precedentemente definita (punti 3). - Si scriva poi il programma main e si stampi il risultato per un valore N introdotto a terminale dall utente (punti 3). 3 (punti 8) Si consideri la seguente funzione F: int F(double x){ if (x<2) return 1; else return F(x-2); x++; Si scriva il risultato della funzione quando invocata come F(7) e si mostrino i record di attivazione. La funzione è tailricorsiva? 4 (punti 3) Si consideri la grammatica G con scopo S e simboli terminali {a,z,0,1 S::= C B C C C::= B A A B::= a z A::= 0 1 Si dica se la stringa a1z0 è sintatticamente corretta rispetto a tale grammatica e se ne mostri la derivazione left most. 5 (punti 2) Dato il seguente programma quale sarà il risultato stampato? Si motivi bene la risposta data. int piu(int *n) {return *n=*n + *n; main () { int n=12; printf( %d, piu(&n)); printf( %d, n); 6 (punti 3) 43 44
23 Un elaboratore rappresenta i numeri interi su 8 bit dei quali 7 sono dedicati alla rappresentazione del modulo del numero e uno al suo segno. Indicare come viene svolta la seguente operazione aritmetica e determinarne il risultato traslandolo poi in decimale per la verifica: Viene stampato a video 1. Soluzione Compito A 1 1 Il programma stampa a video la sequenza di interi, ciascuno su una linea diversa: Infatti, la prima esecuzione del ciclo avviene con a inizialmente uguale a -7 e poi immediatamente incrementato di 2 (prima istruzione del ciclo). La funzione f1() viene quindi invocata con parametri attuali -5, 0. f1() non fa altro che restituire il primo parametro in caso di primo parametro dispari, il secondo parametro altrimenti (l'incremento di b prima di return y non può influire in alcun modo sul parametro b del chiamante). printf() stampa il valore di b nel main() e quindi -5, e l'incremento di b avviene solo dopo la stampa. La seconda esecuzione del ciclo comincia dunque con a=-4 e b=-4; a viene subito incrementato di 2 e f1() viene invocata con parametri attuali -2 e -4. Poiché il primo parametro di invocazione è pari, f1() restituisce -4; tale valore viene assegnato a b nel main() e stampato a video. La terza esecuzione del ciclo comincia dunque con a=-1 e b=-4; a viene subito incrementato di 2 e f1() viene invocata con parametri attuali 1 e -4. Poiché il primo parametro di invocazione è dispari, questa volta f1() restituisce 1; tale valore viene assegnato a b nel main() e stampato a video. La variabile a ha ora valore +1, la condizione del ciclo while non è più verificata, quindi il corpo del ciclo non è eseguito e il programma termina. La funzione è tail ricorsiva. x = 7.0 x = 5.0 x = 3.0 x = double sum(int i) { if (i==0) return 0; else return i + sum(i-1); double prodsum(int k) { if (k==1) return sum(1); else return sum(k)* prodsum(k-1); main() { int n; printf("inserisci il numero "); scanf("%d", &n); printf("risultato: %d\n",prodsum(n)); 4 La stringa è sintatticamente corretta. Derivazione left most: S C B C B A B C B A B A a A B A a 1 B A a 1 z A a 1 z Tutto avviene come se il passaggio fosse per indirizzo, la variabile n del programma chiamante viene modificata > > Tra i moduli dei numeri si esegue una somma: che vale 97 in base dieci
24 DOMANDE (teoria) Qual è la differenza tra un processo computazionale ricorsivo e uno ricorsivo tail? A. Il primo può essere molto più efficiente del secondo perché nel secondo caso vengono allocati tanti record di attivazione quante sono le chiamate, nel primo uno solo. B. Il secondo può essere molto più efficiente del primo perché nel secondo caso si può effettuare un'ottimizzazione che limita il numero di record di attivazione allocati sullo stack. C. Nessuna differenza. Soluzione La risposta corretta è la B. Che cosa accade se all'interno di una funzione/procedura si modifica un parametro passato per riferimento? A. Si agisce su una copia e quindi il parametro attuale del chiamante non viene modificato. B. Si ottiene un errore di compilazione. C. Viene modificato il valore della variabile passata come parametro attuale dal chiamante. La risposta corretta è la C. Qual è la differenza tra un parametro formale passato per indirizzo/riferimento e uno passato per valore ad una procedura? A. Se modificato all interno della procedura, il parametro passato per indirizzo non comporta modifica sul parametro attuale. Viceversa avviene per il parametro passato per valore. B. Se modificato all interno della procedura, il parametro passato per valore non comporta modifica sul parametro attuale. Viceversa avviene per il parametro passato per indirizzo/riferimento. C. I parametri passati per indirizzo sono solo vettori, mentre tutti gli altri non possono essere passati che per valore. La risposta corretta è la B. Identificare e correggere gli errori in ognuna delle seguenti istruzioni: - while (c<=5) {p *= c; ++c; (errore sintattico manca una parentesi graffa alla fine del while) - while (c<=5) {p = p * c; ++c; (errore logico, c non è modificata all interno del ciclo, loop infinito) 47 48
25 Effettuare la seguente operazione aritmetica tra numeri binari naturali, ipotizzando di rappresentare i numeri interi tramite un byte: A-B, dove A=(35)10, B=(22)10 (35)10 = (23)16= ( )2 (22)10 = (16)16= ( ) = Prestito: 0 Risultato: A - B = ( )2 = (0D)16= (13)10 Effettuare la seguente operazione aritmetica tra numeri binari naturali, ipotizzando di rappresentare i numeri interi tramite un byte (si scriva, per ogni numero, anche la corrispondente rappresentazione in base 16): A+B, dove A=(42)10, B=(31)10 (42)10 = (2A)16 = ( )2 (31)10 = (1F)16 = ( ) = Risultato: A + B = ( )2 = (49)16= (73)
26 Dire se le seguenti affermazioni sono vere o false: a) Il caso default è sempre obbligatorio nell istruzione switch. b) L istruzione break e sempre obbligatoria nel caso default di una istruzione switch c) L espressione (x > y && a < b) è vera se x>y è vera oppure se a<b è vera. d) Un espressione contenente l operatore è vera se entrambi o uno solo dei suoi operandi sono veri. a) falso. Il caso di default è optional. b) falso. Il break è utilizzato per uscire da una struttura switch. Nel caso di default non è richiesto (il caso di default è l ultimo) c) falso. Entrambe le espressioni devono essere vere, non una sola. d) vero. Dato il programma seguente: int cube( int y ); int main() { int x; for (x=1; x<=10; x++) printf( %d\n, cube(x) ); return 0; int cube( int y) { return y * y * y; Indicare lo scope delle seguenti variabili: a) La variabile x nel main b) La variabile y nella funzione cube c) La funzione cube d) La funzione main e) Il prototipo della funzione cube f) L identificatore y nel prototipo della funzione cube Soluzioni: a) Il blocco b) Il blocco c) Tutto il file d) Tutto il file e) Tutto il file f) Il solo prototipo della funzione 51 52
Esercizio 2 (punti 7) Dato il seguente programma C: #include <stdio.h> int swap(int * nome, int length);
Fondamenti di Informatica L-A (A.A. 004/005) - Ingegneria Informatica Prof.ssa Mello & Prof. Bellavista I Prova Intermedia del 11/11/004 - durata h - COMPITO B Esercizio 1 (punti 1) Una associazione di
DettagliRealizzare un programma che legga da input tre numeri interi e stampi a video la loro somma e la media.
Esercizio 1 Realizzare un programma che legga da input tre numeri interi e stampi a video la loro somma e la media. #include Esercizio 1 - Soluzione int main() int num1, num2, num3, somma; float
DettagliARRAY E STRINGHE. ESERCIZIO 2 Scrivere un programma che calcola il numero di doppie e di dittonghi (2 vocali vicine) presenti in una stringa.
3 ITI - a.s. 2007-2008 Compiti di Informatica ESTATE 2008 ARRAY E STRINGHE Scrivere una funzione che carica da tastiera un array di n elementi e lo stampa invertendo il primo elemento con l'ultimo, il
DettagliESAME DI FONDAMENTI DI INFORMATICA I ESAME DI ELEMENTI DI INFORMATICA. 28 Gennaio 1999 PROVA SCRITTA
28 Gennaio 1999 PROVA SCRITTA Esercizio 1 Un elaboratore rappresenta numeri interi in complemento a due su 8 bit e numeri reali in utilizzando un byte per la mantissa normalizzata e un byte per l esponente
DettagliUnità Didattica 2 Linguaggio C. Espressioni, Operatori e Strutture linguistiche per il controllo del flusso
Unità Didattica 2 Linguaggio C Espressioni, Operatori e Strutture linguistiche per il controllo del flusso 1 Espressioni e assegnazioni Le espressioni sono definite dalla grammatica: espressione = variabile
DettagliCompitino di Laboratorio di Informatica CdL in Matematica 13/11/2007 Teoria Compito A
Matematica 13/11/2007 Teoria Compito A Domanda 1 Descrivere, eventualmente utilizzando uno schema, gli elementi funzionali di una CPU. Domanda 2 Java è un linguaggio compilato o interpretato? Motivare
DettagliUn esempio per iniziare. Il controllo del programma in C. Altri cenni su printf() Esercizi (printf) printf( 8!=%d, fatt);
Un esempio per iniziare Il controllo del programma in C DD Cap.3 pp.91-130 /* calcolo di 8!*/ #include #define C 8 int main() int i=1; int fatt=1; while (i
DettagliCorso di Fondamenti di Informatica
Corso di Fondamenti di Informatica Le classi di istruzioni in C++ 1 Le classi di istruzioni in C++ SEQUENZIALI Statement semplice Statement composto CONDIZIONALI if < expr.> else switch case
DettagliIstruzioni iterative. Istruzioni iterative
Istruzioni iterative Esempio: Leggere 5 interi, calcolarne la somma e stamparli. Variante non accettabile: 5 variabili, 5 istruzioni di lettura, 5... int i1, i2, i3, i4, i5; scanf("%d", &i1):... scanf("%d",
DettagliLinguaggio C. strutture di controllo: strutture iterative. Università degli Studi di Brescia. Docente: Massimiliano Giacomin
Linguaggio C strutture di controllo: strutture iterative Università degli Studi di Brescia Docente: Massimiliano Giacomin Elementi di Informatica e Programmazione Università di Brescia 1 Strutture iterative
Dettagli7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari
7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa
DettagliInformatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica
Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica Dipartimento di Elettronica, Informazione e Bioingegneria Informatica B Sezione D Franchi Alessio Mauro,
DettagliAlgebra di Boole: Concetti di base. E un algebra basata su tre operazioni logiche
Fondamenti di Informatica Algebra di Boole: Concetti di base Fondamenti di Informatica - D. Talia - UNICAL Algebra di Boole E un algebra basata su tre operazioni logiche OR AND NOT Ed operandi che possono
Dettagligiapresente( ) leggi( ) char * strstr(char * cs, char * ct) NULL
Materiale di ausilio utilizzabile durante l appello: tutto il materiale è a disposizione, inclusi libri, lucidi, appunti, esercizi svolti e siti Web ad accesso consentito in Lab06. L utilizzo di meorie
DettagliESAME DI FONDAMENTI DI INFORMATICA I ESAME DI ELEMENTI DI INFORMATICA. 21 Gennaio 1998
21 Gennaio 1998 PROVA PRATICA Si scriva un programma C (BASIC per gli studenti di Elementi di Informatica) che: a) Legga da terminale una sequenza di caratteri terminati dal carattere '*' (un carattere
DettagliEsempio di Prova Scritta
Esempio di Prova Scritta La prova scritta è composta da alcuni esercizi per un totale di 10 punti (durata:circa 1h15 ). Le tipologie di esercizi possibili comprendono:! sintesi di una funzione ricorsiva/iterativa,
DettagliEsercizi di preparazione alla prova scritta
Esercizi di preparazione alla prova scritta ARGOMENTI: Istruzione dominante, complessità ESERCIZIO n 1 Si analizzi il seguente frammento di codice C: #define N 10 int V[N]={1,2,3,4,5,6,7,8,9,10;... main()
DettagliElementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I
Lezione 4 Elementi lessicali e espressioni logiche Matricole 2-3 Elementi lessicali il linguaggio C ha un suo vocabolario di base i cui elementi sono detti token esistono 6 tipi di token: parole chiave
DettagliSi possono applicare solo a variabili (di tipi interi, floating o puntatori), ma non a espressioni generiche (anche se di questi tipi).
Operatori di incremento e decremento: ++ e -- ++ e -- sono operatori unari con la stessa priorità del meno unario e associatività da destra a sinistra. Si possono applicare solo a variabili (di tipi interi,
DettagliIstruzioni iterative (o cicliche)
Dipartimento di Informatica e Sistemistica Antonio Ruberti Sapienza Università di Roma Istruzioni iterative (o cicliche) Corso di Fondamenti di Informatica Laurea in Ingegneria Informatica (Canale di Ingegneria
DettagliEsercitazione 4. Comandi iterativi for, while, do-while
Esercitazione 4 Comandi iterativi for, while, do-while Comando for for (istr1; cond; istr2) istr3; Le istruzioni vengono eseguite nel seguente ordine: 1) esegui istr1 2) se cond è vera vai al passo 3 altrimenti
DettagliInput/Output di numeri
Input/Output di numeri I/O di numeri Per utilizzare le funzioni di I/O occorre include il file di intestazione (o file header) stdio.h utilizzando all inizio del sorgente la direttiva #include
DettagliErrori frequenti Cicli iterativi Array. Cicli e array. Laboratorio di Programmazione I. Corso di Laurea in Informatica A.A.
Cicli e array Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2016/2017 Calendario delle lezioni Lez. 1 Lez. 2 Lez. 3 Lez. 4 Lez. 5 Lez. 6 Lez. 7 Lez. 8 - Introduzione all ambiente
DettagliEsercizi Programmazione I
Esercizi Programmazione I 9 Novembre 201 Esercizio 1 Valutare e dare il tipo delle seguenti espressioni condizionali. 1 char a= a, b= b ; // a ha v a l o r e decimale 97 2 i n t i= 1, j= 2 ; 3 double x=
DettagliLinguaggio C - le strutture di controllo: sequenza, selezione, iterazione
Dipartimento di Elettronica ed Informazione Politecnico di Milano Informatica e CAD (c.i.) - ICA Prof. Pierluigi Plebani A.A. 2008/2009 Linguaggio C - le strutture di controllo: sequenza, selezione, iterazione
DettagliJavaScript Core Language. Prof. Francesco Accarino IIS Atiero Spinelli Sesto San Giovanni via leopardi 132
JavaScript Core Language Prof. Francesco Accarino IIS Atiero Spinelli Sesto San Giovanni via leopardi 132 Condizioni L utilizzo di operatori relazionali e logici consente di formulare delle condizioni
DettagliEsercizio 1 - cicli. Esercizio 1 cicli - Soluzione
Sequenze di cifre Esercizio 1 - cicli Realizzare un programma che prende in input una sequenza di cifre (tra 1 e 9) e calcola la somma massima fra le sotto- sequenze di cifre non decrescente Il programma
DettagliLe Strutture di controllo Del Linguaggio C. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni
Le Strutture di controllo Del Linguaggio C Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni STRUTTURE DI CONTROLLO PRIMITIVE SEQUENZA SELEZIONE (o scelta logica) ITERAZIONE NON PRIMITIVE
DettagliArray. Maurizio Palesi Salvatore Serrano. In C si possono definire tipi strutturati Vi sono due costruttori fondamentali
MASTER Information Technology Excellence Road (I.T.E.R.) Array Maurizio Palesi Salvatore Serrano Master ITER Informatica di Base Maurizio Palesi, Salvatore Serrano 1 Tipi di dato stutturati In C si possono
DettagliERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }
ERRATA CORRIGE Pulizia del buffer di input: come fare? (1) Dopo aver richiamato getchar() per prelevare un carattere dal buffer di input, inseriamo una seconda chiamata a getchar(), senza assegnare il
Dettagli5 - Istruzioni condizionali
5 - Istruzioni condizionali Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo di.unipi.it
DettagliEsercizio 1: funzione con valore di ritorno di tipo puntatore
Esercitazione Fondamenti di Informatica B Corso di Laurea in Ingegneria Meccanica 7 Esercitazione: 14 dicembre 2005 Esercizi su ricorsione, manipolazione stringhe, strutture dinamiche Problema: Esercizio
DettagliLezione 9: Puntatori a funzioni. Tipi enumerativi e orientati ai bit
Lezione 9: Puntatori a funzioni. Tipi enumerativi e orientati ai bit Vittorio Scarano Laboratorio di Informatica I Corso di Laurea in Informatica Università degli Studi di Salerno Struttura della lezione
DettagliStruttura dei programmi C
Programmi C Struttura dei Programmi C Dichiarazione delle variabili Operazioni di Ingresso/Uscita Fondamenti di Informatica 1 Struttura dei programmi C Un programma C deve contenere, nell'ordine: una parte
DettagliELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli
ELEMENTI DI INFORMATICA L-B Ing. Claudia Chiusoli Materiale Lucidi delle lezioni Date degli appelli Testi di esami precedenti Informazioni e contatti http://www.lia.deis.unibo.it/courses/ Programma del
DettagliLinguaggio C - sezione dichiarativa: costanti e variabili
Dipartimento di Elettronica ed Informazione Politecnico di Milano Informatica e CAD (c.i.) - ICA Prof. Pierluigi Plebani A.A. 2008/2009 Linguaggio C - sezione dichiarativa: costanti e variabili La presente
DettagliTipi di dato. Il concetto di tipo di dato viene introdotto per raggiungere due obiettivi:
Tipi di dato Il concetto di tipo di dato viene introdotto per raggiungere due obiettivi: esprimere in modo sintetico la loro rappresentazione in memoria, e un insieme di operazioni ammissibili permettere
DettagliArray Tipi di dato semplici e strutturati strutturati array elementi omogenei numero d ordine indice lunghezza dimensione
Array Tipi di dato semplici e strutturati i tipi di dato visti finora erano tutti semplici: int, char, float,... i dati manipolati sono spesso complessi (o strutturati) con componenti elementari o strutturate
DettagliLe Funzioni e la Ricorsione
Aula V Dip. di Matematica G. Castelnuovo Univ. di Roma La Sapienza Le Funzioni e la Ricorsione Igor Melatti Slides disponibili (assieme ad altro materiale) in: http://www.dsi.uniroma1.it/ melatti/programmazione1.2007.2008.html
DettagliPolitecnico di Torino Sede di Alessandria Corso di informatica Programmazione in c: introduzione. e mail: sito: users.iol.
Politecnico di Torino Sede di Alessandria Corso di informatica Programmazione in c: introduzione prof. Lorenzo Porcelli e mail: genna18@iol.it sito: users.iol.it/genna18 Risoluzione di un problema Dato
Dettagli6 - Blocchi e cicli. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo
6 - Blocchi e cicli Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://pages.di.unipi.it/milazzo milazzo di.unipi.it
DettagliAlgoritmi e basi del C Struttura di un programma
Algoritmi e basi del C Struttura di un programma Marco D. Santambrogio marco.santambrogio@polimi.it Ver. aggiornata al 17 Marzo 2015 Compitini Compitini di INFO: 24 Aprile 2015 4.15pm @ C.G.1 (Ed. 9) 21
Dettagliacquisizione numero elementi del primo insieme e del secondo insieme, finché elprimoinsieme oppure elsecondoinsieme > EL_INS
Esercitazione Fondamenti di Informatica B Corso di Laurea in Ingegneria Meccanica 3 Esercitazione: 20 ottobre 2004 Esercizi su array e applicazione delle regole di conversione di tipo Esercizi presenti:
DettagliEsercitazione 3. Oggi sono stati effettuati semplici esercizi in C utilizzando le seguenti istruzioni: if...else, while, printf, scanf
Riassunto Esercitazione 3 Oggi sono stati effettuati semplici esercizi in C utilizzando le seguenti istruzioni: if...else, while, printf, scanf Sono state introdotte anche le seguenti relazioni: uguaglianza:
DettagliEsercitazione 5. Procedure e Funzioni Il comando condizionale: switch
Esercitazione 5 Procedure e Funzioni Il comando condizionale: switch Comando: switch-case switch (espressione) { /* espressione deve essere case costante1: istruzione1 di tipo int o char */ [break]; case
DettagliEsercizio 1. Esercizio 1 Soluzione
Esercizio 1 I numeri complessi Data la notazione cartesiana di un numero complesso (in parte reale ed immaginaria), Realizzare una procedura che ne restituisca la notazione polare (tramite parametri passati
DettagliLIA. LIA - DEIS - Facoltà di Ingegneria - Università di Bologna Elementi di informatica L
LIA - DEIS - Facoltà di Ingegneria - Università di Bologna Elementi di informatica L Corso di laurea in Ingegneria Chimica - Anno Accademico 2007-2008 Funzioni Esercizio 3.3 Si scriva un programma in linguaggio
DettagliEsercizio 1: calcolo del massimo di una sequenza (versione 1)
Esercitazione Fondamenti di Informatica B Corso di Laurea in Ingegneria Meccanica 2 Esercitazione: 12 ottobre 2005 Primi esercizi in C Esercizio 1: calcolo del massimo di una sequenza (versione 1) Si legga
DettagliScope delle variabili e passaggio parametri. Danilo Ardagna Politecnico di Milano
Scope delle variabili e passaggio parametri Danilo Ardagna Politecnico di Milano 1-4-2014 Introduzione! Con le funzioni è stato introdotto un meccanismo per definire dei piccoli programmi all interno di
DettagliIl linguaggio C. Notate che...
Il linguaggio C Notate che... 1 Il C è un linguaggio a blocchi int main (void) { blocco } 2 Il C è un linguaggio a blocchi (2) Non è possibile mischiare dichiarazioni e comandi! int main (void) { } Dichiarazione
DettagliFUNZIONI RICORSIVE PROGRAMMAZIONE RICORSIVA: Esempi di problemi ricorsivi:
FUNZIONI RICORSIVE Una funzione matematica è definita ricorsivamente quando nella sua definizione compare un riferimento (chiamata) a se stessa. Esempio: Esempi di problemi ricorsivi: 1) Somma dei primi
DettagliFunzioni, Stack e Visibilità delle Variabili in C
Funzioni, Stack e Visibilità delle Variabili in C Programmazione I e Laboratorio Corso di Laurea in Informatica A.A. 2016/2017 Calendario delle lezioni Lez. 1 Lez. 2 Lez. 3 Lez. 4 Lez. 5 Lez. 6 Lez. 7
DettagliElementi di C++ di base
Elementi di C++ di base Corso di Programmazione 3 - Ingegneria dell Informazione e dell Organizzazione 10 ottobre, 2001 Gino Perna Esempi di semplici programmi in C++ Il programma più semplice consiste
DettagliLinguaggio C: le funzioni. Visibilità variabili e passaggio parametri
Dipartimento di Elettronica ed Informazione Politecnico di Milano Informatica e CAD (c.i.) - ICA Prof. Pierluigi Plebani A.A. 2008/2009 Linguaggio C: le funzioni. Visibilità variabili e passaggio parametri
DettagliIL PRIMO PROGRAMMA IN C
IL PRIMO PROGRAMMA IN C LO SCOPO Si vuole scrivere un programma in linguaggio C che chieda all utente di introdurre da tastiera due numeri interi e visualizzi il valore della loro somma sul video SOLUZIONE
DettagliDefinizione di metodi in Java
Definizione di metodi in Java Un metodo in Java definisce un operazione ad alto livello (sottoprogramma) che consente di manipolare dati e oggetti. Durante la computazione effettuata da un programma, un
DettagliFondamenti di Informatica T-1 Modulo 2
Fondamenti di Informatica T-1 Modulo 2 1 Obiettivi di questa esercitazione 1. Array 2 Esercizio 1 Creare un programma che legga da input un numero non noto a priori di interi (al più 10) terminati da 0.
DettagliLe strutture di controllo in C++
Le strutture di controllo in C++ Docente: Ing. Edoardo Fusella Dipartimento di Ingegneria Elettrica e Tecnologie dell Informazione Via Claudio 21, 4 piano laboratorio SECLAB Università degli Studi di Napoli
DettagliIstruzioni Condizionali in C
Concetti chiave Istruzioni Condizionali in C Tipi di Istruzioni Condizionali Espressioni Blocchi d istruzioni Istruzioni Condizionali: if-else Istruzioni Condizionali: switch-case Istruzione break Istruzioni
Dettagli$QDOLVLGHOSURJUDPPDTXDGUDWR
$QDOLVLGHOSURJUDPPDTXDGUDWR /* */ calcolare l area del quadrato #include main(){ int lato, area; printf("lato "); scanf("%d", &lato); if(lato < 0) printf("errore nei dati \n"); else { area =
DettagliLinguaggio C. Tipi predefiniti e operatori. Università degli Studi di Brescia. Docente: Massimiliano Giacomin
Linguaggio C Tipi predefiniti e operatori Università degli Studi di Brescia Docente: Massimiliano Giacomin Elementi di Informatica e Programmazione Università di Brescia 1 RICHIAMI char 8 bit Valori interi
DettagliInformatica 1. Prova di recupero 21 Settembre 2001
Informatica 1 Prova di recupero 21 Settembre 2001 Si risolvano i seguenti esercizi. Ai fini della determinazione del voto finale il loro punteggio andrà sommato al punteggio del laboratorio. Il tempo complessivo
DettagliTipi di dato primitivi
Tipi di dato primitivi (oltre int) Tipi di dato primitivi int (già trattati) Valori logici (ricordati) Valori reali Valori carattere Informatica - A.A. 2009/2010 - Tipi di dato 2 1 Valori logici (il caso
DettagliLinguaggio C: le funzioni. Introduzione e sintassi
ISIS "Guido Tassinari" di Pozzuoli Indirizzo Informatico - Articolazione Informatica Informatica Prof. A.S. 2012/2013 Linguaggio C: le funzioni. Introduzione e sintassi 21/10/2012 Introduzione Spesso alcuni
DettagliInformatica/ Ing. Meccanica/ Edile/ Prof. Verdicchio/ 17/01/2014/ Foglio delle domande / VERSIONE 1
Informatica/ Ing. Meccanica/ Edile/ Prof. Verdicchio/ 17/01/2014/ Foglio delle domande/ VERSIONE 1 1) L approccio con cui si studia un sistema focalizzandosi solo sul rapporto tra input e output si chiama
DettagliIntroduzione ai puntatori in C Definizione
Introduzione ai puntatori in C Definizione Un puntatore è una variabile che contiene l indirizzo di un altra variabile Tramite i puntatori si può quindi accedere a un oggetto indirettamente (si usa il
DettagliIstruzioni di ciclo. Unità 4. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi
Corso di Ingegneria Clinica BCLR Domenico Daniele Bloisi Docente Ing. Domenico Daniele Bloisi, PhD Ricercatore Dipartimento di Ingegneria Informatica, Automatica e Gestionale Antonio Ruberti Via Ariosto
DettagliESERCIZI DI PROGRAMMAZIONE. - condizionali e cicli -
ESERCIZI DI PROGRAMMAZIONE - condizionali e cicli - Elementi di Informatica e Programmazione Università di Brescia 1 Esercizio 1: dal tema d esame ING-INF del 28 gennaio 2009 Si sviluppi un programma in
DettagliESAME DI FONDAMENTI DI INFORMATICA I ESAME DI ELEMENTI DI INFORMATICA. 28 Gennaio 1999 PROVA SCRITTA
28 Gennaio 1999 PROVA SCRITTA Esercizio 1 Un elaboratore rappresenta numeri interi in complemento a due su 8 bit e numeri reali in utilizzando un byte per la mantissa normalizzata e un byte per l esponente
DettagliStringhe. In C le stringhe ben formate sono in realtà array di caratteri terminati sempre da un carattere speciale, \0, detto anche
Fondamenti di Informatica T-1 modulo 2 Laboratorio 04: stringhe 1 Stringhe In C le stringhe ben formate sono in realtà array di caratteri terminati sempre da un carattere speciale, \0, detto anche terminatore
DettagliINFORMATICA DI BASE Linguaggio C Prof. Andrea Borghesan
INFORMATICA DI BASE Linguaggio C Prof. Andrea Borghesan venus.unive.it/borg borg@unive.it Ricevimento lunedì, prima o dopo lezione 1 Le funzioni in C Le funzioni vengono utilizzate per 3 motivi: Riusabilità
DettagliPROGRAMMAZIONE: Le strutture di controllo
PROGRAMMAZIONE: Le strutture di controllo Prof. Enrico Terrone A. S: 2008/09 Le tre modalità La modalità basilare di esecuzione di un programma è la sequenza: le istruzioni vengono eseguite una dopo l
DettagliLinguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.
Linguaggio C Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore. 1 Funzioni Generalizzazione del concetto di funzione algebrica: legge che associa a valori delle variabili
DettagliEsercizi di programmazione in linguaggio C - Costrutto iterazione
Esercizi di programmazione in linguaggio C - Costrutto iterazione prof. Roberto uligni 1. [potenze1] Scrivere un programma che visualizzi il valore di tutte le prime n potenze di 2 con n richiesto all'utente
DettagliLinguaggio C: introduzione
Dipartimento di Elettronica ed Informazione Politecnico di Milano Informatica e CAD (c.i.) - ICA Prof. Pierluigi Plebani A.A. 2008/2009 Linguaggio C: introduzione La presente dispensa e da utilizzarsi
DettagliLinguaggio C: le funzioni. Introduzione e sintassi
Dipartimento di Elettronica ed Informazione Politecnico di Milano Informatica e CAD (c.i.) - ICA Prof. Pierluigi Plebani A.A. 2008/2009 Linguaggio C: le funzioni. Introduzione e sintassi La presente dispensa
DettagliEspressione di chiamata di funzione
Avvertenza Quanto segue NON è un libro, ma è una copia dei lucidi usati a lezione che NON sostituisce i libri di testo adottati e consigliati per l insegnamento di Informatica Generale. Questa copia è
DettagliISTRUZIONI ISTRUZIONI
ISTRUZIONI Le istruzioni esprimono azioni che, una volta eseguite, comportano una modifica permanente dello stato interno del programma o del mondo circostante. Le strutture di controllo permettono di
DettagliParte 2. Ricorsione. [M.C.Escher Drawing hands, 1948] - AA. 2012/13 2.1
Parte 2 Ricorsione - AA. 2012/13 [M.C.Escher Drawing hands, 1948] 2.1 Funzioni ricorsive Una funzione si dice ricorsiva se richiama se stessa, direttamente o indirettamente La ricorsione si dice diretta
DettagliCorso: Fondamenti di Informatica 1 (gruppo 8-9) Corsi di laurea: Area dell'informazione Questionario di autovalutazione 4
Corso: Fondamenti di Informatica 1 (gruppo 8-9) Corsi di laurea: Area dell'informazione Questionario di autovalutazione 4 Domanda n. 1 Argomento: Rappresentazione dell'informazione Domanda: Il numero binario
DettagliTipi di dati fondamentali. Tipi di dati fondamentali. Utilità dei tipi di dati nelle dichiarazioni. Il tipo di dati char. Codice ASCII.
Tipi di dati fondamentali Tipi di dati fondamentali Linguaggi di Programmazione I Ferdinando Cicalese caratteri: char signed char unsigned char interi short int long interi unsigned short unsigned unsigned
DettagliFondamenti di Informatica 1 Ing.Gestionale (A.A ) - docente Sandro Moriggi RECUPERO. cognome nome
Compito 1 Segnare una sola delle risposte indicate; una risposta errata ha un punteggio = 0; una risposta mancante ha un punteggio = 0; più di 1 risposta (incluso modifica della risposta segnata): annullata
DettagliProgrammazione II Compitino (Vers. A)
Programmazione II Compitino (Vers. A) 16 gennaio 2009 Cognome Jekyll Nome Doctor Matricola 112233 Nei seguenti quesiti, quando vi è richiesto di scrivere un programma, potete limitarvi al corpo del metodo
DettagliLaboratorio di programmazione
Laboratorio di programmazione Lezione VIII Tatiana Zolo tatiana.zolo@libero.it 1 PROGRAMMAZIONE A OGGETTI Quando si programma a oggetti si scompone il problema in sottogruppi di parti collegate che tengono
DettagliProblema. Vettori e matrici. Vettori. Vettori
e matrici Ver. 2.4 2010 - Claudio Fornaro - Corso di programmazione in C Problema Si vuole un programma che chieda 10 numeri dalla tastiera e li visualizzi dall ultimo al primo Soluzione attuale (con le
DettagliLaboratorio di programmazione
Laboratorio di programmazione Lezione II Tatiana Zolo zolo@cs.unipr.it 1 IL PROGRAMMA C++ Istruzioni (espressioni terminate da ; ) istruzioni di dichiarazione (es. int x = 0;); istruzioni di assegnamento
DettagliAlcuni esercizi. 1. Valutazione in cortocircuito 2. If e if innestati 3. Switch 4. Cicli
Alcuni esercizi 1. Valutazione in cortocircuito 2. If e if innestati 3. Switch 4. Cicli Esercizio 1 (valutazione in cortocircuito) int main() int a=5, b=5, c=5; if (a>0 (a=a+1) ) printf( %d, a); if (b>0
DettagliComplementi. - Ridefinizione di tipo - - Costrutto switch - - Programmazione su più file - - Parametri della funzione main - Funzione system -
Complementi - Ridefinizione di tipo - - Costrutto switch - - Programmazione su più file - - Parametri della funzione main - Funzione system - Università degli Studi di Brescia Prof. Massimiliano Giacomin
DettagliStrutture di Controllo
Strutture di Controllo Informatica B Istruzioni condizionali #include int main() char c; printf("inserire il carattere maiuscolo: "); scanf("%c", &c); printf("la traduzione e' %c\n",c+32); return
DettagliESAME DI FONDAMENTI DI INFORMATICA I ESAME DI ELEMENTI DI INFORMATICA 17/1/1997 PROVA SCRITTA
ESAME DI FONDAMENTI DI INFORMATICA I ESAME DI ELEMENTI DI INFORMATICA 17/1/1997 PROVA SCRITTA 1. Mostrare come viene svolto il calcolo: 9.8-2.6 + (10 * 2 2 ) qualora l' elaboratore adotti per i numeri
DettagliProgrammazione a moduli in C
Funzioni Programmazione a moduli in C Politecnico di Milano Motivazioni Alcuni programmi possono essere molto, molto complessi E utile poter partizionare il lavoro di progettazione in sottolavori più semplici
DettagliNon ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di
ARRAY DI PUNTATORI Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di puntatori Ad esempio: char * stringhe[4]; definisce un vettore di 4 puntatori a carattere
DettagliLaboratorio 1. 2) All interno della directory c:\temp\cognome\codici creare il file sorgente hello.c contenente il seguente codice:
Corso di Ingegneria Biomedica Corso di Ingegneria Elettronica Insegnamento di Informatica I a.a. 2007-08 Laboratorio 1 Durante le esercitazioni verra utilizzato il compilatore a riga di comando DJGPP,,
DettagliProgrammazione in Java (I modulo)
Programmazione in Java (I modulo) Lezione 4 Variabili di tipo primitivo. Dichiarazione di costanti Conversioni di tipo: operatore cast Altri operatori di assegnamento Operazioni aritmetiche e di confronto
DettagliOttenere una modifica del parametro attuale
Ottenere una modifica del parametro attuale Le variabili passate come parametri a una funzione, se alterate durante l esecuzione, non cambiano valore all uscita dalla funzione (parametri passati per valore)
DettagliLaboratorio di Informatica Ingegneria Clinica Lezione 14-16/11/2011
Laboratorio di Informatica Ingegneria Clinica Lezione 14-16/11/2011 Raffaele Nicolussi FUB - Fondazione Ugo Bordoni Via del Policlinico, 147 00161 Roma I puntatori Variabili e parametri Parametri formali
DettagliArgomenti Avanzati.! I puntatori! Stack! Visibilità delle Variabili
Linguaggio C Argomenti Avanzati! I puntatori! Stack! Visibilità delle Variabili 2 ! Il C consente di associare ai tipi di dati nomi definiti dal programmatore, mediante la parola chiave typedef! Dal punto
DettagliCorso di Fondamenti di Informatica Il sistema dei tipi in C++
Corso di Fondamenti di Informatica Il sistema dei tipi in C++ Anno Accademico Francesco Tortorella Struttura di un programma C++ // Programma semplice in C++ #include int main() { cout
DettagliESEMPIO: le variabili LETTURA/SCRITTURA DI VARIABILI. Specifica Leggere da tastiera un intero, un carattere, un float e un double. Stamparli a video.
ESEMPIO: le variabili LETTURA/SCRITTURA DI VARIABILI Specifica Leggere da tastiera un intero, un carattere, un float e un double. Stamparli a video. LETTURA/SCRITTURA DI VARIABILI Codice #include
DettagliEsercitazione 6. Array
Esercitazione 6 Array Arrays Array (o tabella o vettore): è una variabile strutturata in cui è possibile memorizzare un numero fissato di valori tutti dello stesso tipo. Esempio int a[6]; /* dichiarazione
Dettagli