Corso sul Linguaggio C++ Edizione 2010 6.Esercizi 84) Supponiamo che sia presente in memoria il seguente vettore creato con intA[5] 5 1 3 4 6 2 Viene anche creato un vettore B con int B[5]. Dopo l’esecuzione delle seguenti istruzioni cosa conterrà il vettore B[]? for (i = 1; i<5; i++) B[i]=A[i-1]+A[i]; B() = 85) Dire quale dei seguenti frammenti di programma calcola in j la media del vettore di interi positivi v contenente n elementi, posto che j sia inizializzato a zero: a) for(i=0; i<n; i++) j = v[i]; j = j/n; b) for(i=0; i<n; i++) j += v[i]; j = j/n; c) for(i=0; i<n; i++) j += v[i]; 86) Dire quale dei seguenti frammenti di programma calcola in j l'indice del primo elemento positivo del vettore di interi v contenente n elementi, posto che j sia inizializzato a zero (potete assumere che il vettore contenga sempre almeno un elemento positivo): a) for(i=0; i<n; i++) if (v[i] > 0) j=i; b) for(i=n-1; i>=0; i--) if (v[i] > 0) v[j]=v[i]; c) for(i=n-1; i>=0; i--) if (v[i] > 0) j=i; 87) Considerate il seguente frammento di programma: t=-1; for (i=1; i<=n; i++) if (f(i)) t=i; if (t>=0) cout << t; Quale delle seguenti affermazioni è corretta? a) Il programma cerca e stampa il più piccolo intero x fra 1 e n tale che f(x)!=0; se tale intero non esiste, il programma entra in un ciclo infinito. b) Il programma cerca e stampa il più grande intero x fra 1 e n tale che f(x)!=0; se tale intero non esiste, il programma entra in un ciclo infinito. c) Il programma cerca e stampa il più piccolo intero x fra 1 e n tale che f(x)!=0; se tale intero non esiste, il programma non stampa nulla. d) Il programma cerca e stampa il più grande x fra 1 e n tale che f(x)!=0; se tale intero non esiste, il programma non stampa nulla. 88) Dato il seguente frammento di programma: int a[5]={10, 7, 4, 2, 1}; int b[5]={3,2,5,6,4}; int i, j, k; for(i=0; i<5; i++){ k=1; for(j=4; j>=0; j--) if (a[i]<=b[j]) k=0; if (k) printf("%d ", a[i]); } Indicare i valori stampati in uscita: !98 Corso sul Linguaggio C++ Edizione 2010 a) b) c) d) e) f) g) 10 7 10 7 4 10 7 4 2 10 7 4 2 1 21 1 nessuna delle risposte precedenti è corretta 89) Qual è il ciclo corretto per trovare l'indice del primo elemento negativo in un vettore dichiarato come float v[MAX] ? a) while(i<MAX) if(v[i]>=0) i++; b) while(v[i]>=0 && i<MAX) i++; c) while(i<MAX || v[i]<0) i++; d) while(i<MAX && v[i]>=0.0) i++; 90) Dato il seguente pezzo di programma t=x[1]; for (i = 2 ; i <=n ; i++) t*=x[i]/i ; Quale dei seguenti calcoli viene effettuato? a) b) c) d) t= x(1) + x(2) + ..... + x(n) n t= x(1) * x(2) * ..... * x(n) n t= x(1) * x(2) * ..... * x(n) n! t = x(1) * x(2) x(3) x ( n) + x(1) * + ...... + x(1) * 2 3 n 91) Scrivere il pezzo di programma per calcolare la seguente somma supponendo presente in memoria e già valorizzato il vettore float X[…] con N elementi. 1+ 1 1 1 + + ...... + x(1) X (2) X (N ) 92) Sia dichiarato un array int a[10]. Cosa succede dopo l'esecuzione del seguente codice: for (i=0; i<=10; i++) a[i]=2; a) b) c) d) Tutto l'array viene inizializzato al valore 2; Si superano i limiti dell'array. L'errore viene segnalato in fase di compilazione; Si superano i limiti dell'array. L'errore viene segnalato all'esecuzione del codice; Si superano i limiti dell'array. L'errore non viene segnalato, ma si hanno conseguenze imprevedibili; e) Si superano i limiti dell'array. All'accesso all'undicesimo elemento, il sistema operativo assegna altro spazio all'array a e l'esecuzione prosegue. 93) Supponete che i e j siano variabili intere, e che s e t siano vettori di interi. Assumete che, in un dato istante, i=j=0 e che il contenuto dei due vettori sia il seguente: s = { 0, 1, 2, 3} !99 Corso sul Linguaggio C++ Edizione 2010 t = { 3, 2, 1, 0} Se viene eseguita la seguente istruzione: s[i++]=t[++j]+1; Quali valori avranno alla fine le variabili i e s? a) i= 0, s= [3,2,1,0] b) i = 1, s= [2,1,0,3] c) i= 1, s=[4,3,2,1] d) i=1, s=[3,1,2,3] e) i=0, s=[3,1,2,3] f) nessuno dei precedenti 94) Quale sarà il contenuto del vettore V al termine del ciclo se è V={1,21,31,4,51,6} e n=6? t=n/2; for (i=0; i<t ;i=i+1) { temp=V[i]; V[i]=V[n-i-1]; V[n-i-1]=temp; } Programmi con i vettori 95) Calcolare lo scarto quadratico medio di un vettore numerico. Se x(i), con i da 1 a n, sono gli elementi del vettore e se M è la media aritmetica degli stessi, per definizione lo scarto quadratico medio, normalmente indicato con σ, si ottiene con la seguente formula: n ∑ ( x(i) − M ) σ= 2 i =1 n 96) Moltiplicare 2 vettori (il risultato è la somma dei prodotti di tutti gli elementi con lo stesso indice nei due vettori). 97) Scrivere un programma per far leggere n numeri (n<=100) e visualizzarli al contrario. 98) Prendendo spunto dal programma descritto nel paragrafo 5.3 realizzare un programma per trasformare in lettere un qualsiasi numero intero fino a un miliardo. 99) Dato un vettore numerico (max 4 cifre ogni numero) contare quanti elementi sono compresi tra 0 e 99, quanti fra 100 e 199, quanti fra 200 e 299 ecc. fino a contare quanti sono compresi fra 9900 e 9999. 100)Dato un vettore qualsiasi individuare la moda ovvero l’elemento che si ripete più volte. 101)Far caricare da tastiera in un vettore gli n+1 coefficienti di un polinomio P(x) di grado n: P(x) = a0 + a1x + a2x2 + a3x3 + ....... + an-1xn-1 + anxn poi far calcolare e visualizzare il valore del polinomio per K valori di x a partire da un numero A con un incremento di S (K,A,S in input). 102)Far determinare i numeri primi da 1 a 1000 con il crivello di Eratostene (inserire i numeri da 1 a 1000 in un vettore poi partendo dal primo cancellare tutti i multipli, andare !100 Corso sul Linguaggio C++ Edizione 2010 avanti nel vettore considerando gli elementi non cancellati e per ognuno cancellarne i multipli, alla fine visualizzare i numeri non cancellati). 103)Far determinare i primi N numeri primi mettendoli in un vettore. (Mettere 2 nel primo elemento del vettore poi, considerando solo i numeri dispari da 3 in poi controllare che non siano multipli di nessun elemento presente nel vettore e inferiore alla radice quadrata del numero, se questa condizione si verifica si può inserire l'elemento nel vettore perché é primo). 104)Far visualizzare le prime n righe del triangolo di Tartaglia: 1 1 1 2 1 1 3 3 1 1 4 6 4 1 . . . . . . . (la prima riga è costituita da due uno, il primo e ultimo numero di ogni riga è sempre 1, ogni altro numero è uguale alla somma di due numeri della riga precedente: quello che si trova proprio sopra il numero da determinare e quello immediatamente a sinistra). 105)Fare un programma che assegnato una frase isoli e metta in un vettore tutte le parole in essa contenute. 106)Fare un programma per caricare un testo in un vettore di stringhe. 107)Fare un programma che assegnata in input una parola ne generi tutti gli anagrammi possibili (anche quelli senza significato). 108) Far leggere una serie di nomi con il relativo indirizzo e numero di telefono e far stampare la lista in ordine alfabetico. 109) Dato un vettore ordinare gli elementi di posto dispari in ordine crescente e quelli di posto pari in ordine decrescente. 110) Dati due vettori numerici ordinati, riunirli in un terzo sempre ordinato (fusione). 111) Dato un vettore far visualizzare l'elemento mediano (cioè quello che si trova al centro del vettore dopo l'ordinamento). 112) Far inserire in input le N squadre del campionato e i punti totalizzati dopo di che far visualizzare la classifica. 113) Assegnare ad un vettore di 40 elementi, ognuno di due caratteri, delle sigle per simulare un mazzo di carte napoletane, per esempio "1C","2C","3C" ecc. potrebbero indicare le carte asso di coppe, due di coppe, 3 di coppe ecc., "1S","2S" ...potrebbero indicare asso di spade, due di spade e analogamente per tutte le altre carte. Fare un programma per mischiare le carte usando la funzione rand. 114) Problema assegnato alla selezione regionale del 2001. È venerdì, e il cassiere Camillo ha davanti a sé una lunga fila di clienti della sua banca venuti a ritirare contante per il weekend. Per fare presto, Camillo decide di usare per ogni cliente il numero minimo possibile di banconote. Sapreste scrivere un programma per evitargli il mal di testa, conside!101 Corso sul Linguaggio C++ Edizione 2010 rato che ha a disposizione banconote da 100.000, 10.000, 5.000, 2.000 e 1.000 in quantità illimitata e che l'entità di ogni prelievo è un multiplo di 1.000 lire? Puntatori 115)Quale delle seguenti istruzioni non ha lo stesso effetto sulle due variabili a e b? a) int a,b; a=b; b) int a,b, *p,*c; p=&a; c=&b; *p=*c; c) int a,b, *p,*c; p=&a; c=&b; *p=b; d) int a,b, *p,*c; p=&b; c=&a; *c=b; e) int a,b, *p,*c; p=&a; c=&b; p=c; f) nt a,b, *p,*c; p=&a; c=p; *c=b; 116) Si consideri il seguente frammento di codice: void foo( int *a, int b) { int temp = *a; *a = b; b = temp; }; int main( ) { int a = 1, b = 5; foo( &a, b ); } Quanto valgono le variabili a e b alla fine dell'esecuzione? Risposte esercizi Esercizio 84) B() = 6 4 7 10 8 Esercizio 85) Risposta = b) Esercizio 86) Risposta = c) Esercizio 87) Risposta = d) Esercizio 88) Risposta = a) Esercizio 89) Risposta = d) Esercizio 90) Risposta = c); Esercizio 92) Risposta = d) Esercizio 93) Risposta =d) Esercizio 94) Risposta = 6, 51, 4, 31, 21, 1 Esercizio 114) Il cassiere Camillo – problema assegnto alla selezione regionale 2001 Si vuole realizzare un programma che data in input la somma da pagare calcoli quante banconote da 100000, quante da 10000, quante da 5000, quante da 2000 e quante da 1000 sono necessarie. In pratica un numero in input e 5 numeri in output. Per utilizzare il numero minimo di banconote basta utilizzare se possibile i tagli più grandi ovvero per pagare 100000 bisogna utilizzare una banconota da 100000 e non 10 da 10000. Si possono inserire i 5 tagli in un vettore numerico e poi in un ciclo clalcolare per ogni taglio quante banconote servono cominciando dal più grande. Per questo calcolo basta dividere la somma che resta da pagare per il taglio delle banconote il quoziente è il numero di banconote che bisogna utilizzare per quel taglio e il resto è la somma da pagare con i tagli più piccoli. Il programma è il seguente: #include <stdio.h> #include <stdlib.h> // programma cam.cpp - Cassiere Camillo- selezioni regionali 2001 int main(){ int tb[]={100000, 10000, 5000, 2000, 1000}; // i 5 tipi di banconote int somma, i; // somma = l'importo in input int nb[5]; // nb[] = numero banconote per ogni taglio (dati in output) printf("Inserisci la somma da pagare: "); scanf("%d", &somma); !102 Corso sul Linguaggio C++ Edizione 2010 } for (i= 0; i <5; i++) { nb[i] = somma / tb[i]; // numero banconote del taglio i somma %= tb[i];// quello che resta dopo aver dato il taglio i printf("Servono %d banconote da %d \n", nb[i], tb[i]); } system("PAUSE"); return 0; Esercizio 115) Risposta = e) Esercizio 116) a=5; b=5 !103