Esempi domande di esame 1 Dato il seguente programma #include <stdio.h> int main(){ int *p,j=9,i=5; p=&j; *p=i; printf("%d %d %d\n", i,j,*p); scanf("%d",p);/* da tastiera:88\n*/ printf("%d %d %d\n", i,j,*p); return 0;} 2 Quali affermazioni sono vere? • • • • • • • • 1) Durante la compilazione vengono segnalati dei warning 2) la prima printf stampa 5 5 5 3) la prima printf stampa 5 9 5 4) p contiene l'indirizzo di j 5) p contiene l'indirizzo di i 6) l'indirizzo di p coincide con l'indirizzo di j 7) la seconda printf stampa 5 88 88 8) la seconda printf stampa 5 9 88 3 Esercizi da svolgere 1 • Scrivere una funzione C che riceve il nome di un file contenente parole lunghe al massimo 30 caratteri e restituisce una NUOVA stringa contenente la parola più lunga trovata. Se due o più parole condividono la stessa lunghezza massima la funzione restituisce la prima parola • soluzione: ex31_stringa.c / ex31.txt 4 Esercizi da svolgere 2 • Scrivere una funzione che riceve in ingresso due stringhe e le scambia tra di loro. • soluzione ex32_scambia.c 5 Esercizi da svolgere 3 • Scrivere una funzione che riceve in ingresso una stringa e la modifica nella stringa permutata (casa diventa asac) • soluzione: ex34_inverti.c 6 Esercizi da svolgere 4 • Scrivere una funzione c che riceve un vettore di interi in ingresso con la sua lunghezza e restituisce un nuovo vettore che contiene gli stessi interi aumentati di uno (1 7 9 diventa 2 8 10). • soluzione ex37_add1.c 7 Esercizi da svolgere 5 • Scrivere una funzione c che riceve il nome di un file contenente interi separati/terminati da uno spazio bianco o da un ritorno a capo e restituisce un vettore che contiene tutti gli interi del file maggiori di 10. NON è noto il numero di interi nel file. • soluzione ex35_creavettore.c 8 Dato il seguente programma #include <stdio.h> int main(){ int i,*p, v[]={1,2,3,4,5}; p=&v[3]; printf("%d\n",*p); scanf("%d",p);/* da tastiera:88\n*/ for(i=0;i<5;i++) printf("%d ", v[i]); return 0;} 9 Quali affermazioni sono vere? • • • • • • • • 1) Durante la compilazione vengono segnalati dei warning 2) la prima printf stampa un valore casuale 3) la prima printf stampa 3 4) la prima printf stampa 4 5) p contiene l'indirizzo di v 6) la scanf non legge correttamente 7) la seconda printf stampa 1 2 3 4 5 8) la seconda printf stampa 1 2 3 88 5 10 Dato il seguente programma #include <stdio.h> int main(){ char c, s[10]; int i; scanf("%c",&c);/*da tastiera:88casa pippo\n*/ scanf("%d",&i); scanf("%s",s); printf("%s %d %c\n",s,i,c); return 0;} 11 Quali affermazioni sono vere? • • • • • • • • 1) Durante la compilazione vengono segnalati dei warning 2) i contiene 88 3) i contiene 8 4) alla fine del programma la stringa puntata da s contiene casa 5) alla fine del programma la stringa puntata s contiene casa pippo 6) la prima scanf non legge correttamente 7) la seconda scanf non legge correttamente 8) l'ingresso viene tutto consumato 12 Dato il seguente programma #include <stdio.h> #include <string.h> void cambia(char *s, int k, int *l){ k=*l=strlen(s); strcpy(s, "due");} int main(){ int i,j; i=j=3; char *v="casale"; cambia(v,i,&j); printf("%s %d %d\n",v,i,j); return 0;} 13 Quali affermazioni sono vere? • • • • • • • • 1) la seconda istruzione della funzione è sbagliata 2) l è un intero 3) alla fine del programma i e j hanno lo stesso valore 4) prima di chiamare la funzione v punta all'inizio di una zona di memoria di 7 byte contigui a disposizione del programma 5) dopo la chiamata della funzione v punta all'inizio di una zona di memoria di 4 byte contigui a disposizione del programma 6) v contiene un indirizzo 7) v[6] non viene modificato dalla funzione 8) dopo la chiamata della funzione v[2] è uguale a v[5] 14 Dato il seguente programma #include <stdio.h> #include <string.h> #include <malloc.h> char *cambia(char *s){ int i=strlen(s); s=(char *)malloc(i+1); strcpy(s, "due"); return s;} int main(){ char *v="tre"; cambia(v); printf("%s\n",v); return 0;} 15 Quali affermazioni sono vere? • 1) il contenuto della stringa puntata da v viene cambiato dalla funzione • 3) la memoria allocata dalla funzione (malloc) viene persa • 4) per evitare perdite di memoria la funzione doveva essere chiamata così: v=cambia(v); • 5) alla fine del programma la stringa puntata da v non è più raggiungibile • 6) v contiene un indirizzo 16 Prototipi di funzione #include <stdio.h> int somma (int,int ); int main (){ int a,b; a=5; b=7; c=somma(a,b); printf("c vale: %d\n",c); } int somma (int i, int j){ return i+j;} 17 Un ultimo programma C main(t,_,a) char *a; { return!0<t?t<3?main(-79,-13,a+main(-87,1-_,main(86,0,a+1)+a)):1,t<_?main(t+1,_, a):3,main(-94,27+t,a)&&t==2?_<13?main(2,_+1,"%s %d %d\n"):9:16:t<0?t<72?main(_,t,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/ #{l+,/n{n+,/+#n+,/#\;# q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l \q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw'i ;# \){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' \iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb! /*de}'c \;;{nl'{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# \}'+}##(!!/"):t<50?_==*a?putchar(31[a]):main(65,_,a+1):main((*a=='/') +t,_, a+1):0<t?main(2,2,"%s"):*a=='/'||main(0,main(-61,*a,"!ek;dc i@bK'(q)-[w]*%n+r3#l ,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1); } 18 ... On the fourth day of Christmas my true love gave to me four calling birds, three french hens, two turtle doves and a partridge in pear tree. On the fifth day of Christmas my true love gave to me five gold rings; four calling birds, three french hens, two turtle doves and a partridge in pear tree. On the sixth day of Christmas my true love gave to me six geese a-laying, five gold rings; four calling birds, three french hens, two turtle doves and a partridge in pear tree. On the seventh day of Christmas my true love gave to me .... 19