Capitolo 2 Fondamenti di Informatica - Esercizi Vengono proposti alcuni esercizi relativi al dato strutturato array e vengono presentate le relative soluzioni. 1
2 CAPITOLO 2. FONDAMENTI DI INFORMATICA - ESERCIZI 2.1 DATI STRUTTURATI Esercizio 1 Scrivere un programma che, acquisiti due vettori di interi da input, V1 e V2 stampi in output la differenza V1 - V2, cioè gli elementi di V1 che non sono in V2. Esercizio 2 Scrivere un programma che, dato un vettore V di LV1 elementi interi, calcoli gli indici P e Q dei due elementi V[P] e V[Q] la cui distanza D = jv [P ] V [Q]j è maggiore. Esercizio 3 Scrivere un programma che acquisisca da input un vettore di interi con elementi distinti. Esercizio 4 Dati due vettori V1 e V2 contenenti rispettivamente N1 e N2 valori interi già ordinati: int V1[N1] = {1,3,3,5,6,9,9; /* esempio con N1=7 */ int V2[N2] = {2,3,3,5,5; /* esempio con N2=5 */ scrivere un programma C che esegua le seguenti operazioni: 1. Costruire e stampare output il vettore V di N1+N2 valori interi ordinati, ottenuto tramite fusione dei due vettori V1 e V2: V1 1 3 3 5 6 9 9 V2 2 3 3 5 5 + V 1 2 3 3 3 3 5 5 5 6 9 9 2. Calcolare e stampare in output : (a) numero di valori in comune tra V1 e V2; (nellesempio precedentea=2) (b) B: numero di valori contenuti in V1 ma non in V2; (nellesempio precedenteb=3) Esercizio 5 Data una matrice di N*M interi, (N righe, M colonne): int MAT[N][M] = {3,5,7,9,0,7,2,2,8,9,3,2,8,2,2,2,4,5; scrivere un programma C che acquisisca da input due interi, RIGA e COLONNA, e calcoli la somma di tutti gli elementi della sottomatrice ottenuta da MAT eliminando la riga e la colonna indicate da RIGA e COLONNA rispettivamente (cioè la somma di tutti gli elementi di MAT ad eccezione di quelli appartenenti alla riga RIGA oppure alla colonna COLONNA).
2.2. ORDINAMENTO 3 Esercizio 6 Data una matrice di N*M interi, (N righe, M colonne): int MAT[N][M] = {3,5,7,9,0,7,2,2,8,9,3,2,8,2,2,2,4,5; scrivere un programma C che acquisisca da input quattro interi NS, MS, R e C in modo da individuare e stampare in output la sottomatrice NS*MS il cui elemento più alto a sinistra (cioè in posizione 0,0) è Mat[R][C]. Effettuare i controlli sui valori NS, MS, R e C acquisiti da input: NS» N, NS+R» N e cosi via. Esempio: Mat[3][6] 0 1 2 3 4 5 0 3 5 7 9 0 7 1 2 2 8 9 3 2 2 8 2 2 2 4 5 Con R=1, C=2, NS=2 e MS=3 si ottiene la sottomatrice evidenziata Mat[3][6] 0 1 2 3 4 5 0 3 5 7 9 0 7 1 2 2 8 9 3 2 2 8 2 2 2 4 5 Esercizio 7 Scrivere un programma per costruire la matrice A[M][N] di interi tale che A[I][J] = I + J, 0 <I<Me 0 <J<V. Costruire quindi la matrice B come matrice trasposta di A e stamparla. Esercizio 8 Date due stringhe S1 e S2 costruire una terza stringa S3, ottenuto mettendo alternativamente un carattere di S1 ed un carattere di S2; quando una delle due stringhe termina, mettere tutti i caratteri rimasti dellaltra. Ad esempio, con S1="prova" e S2="ora" si deve ottenere S3="porroava" 2.2 ORDINAMENTO In questa sezione vengono presentati alcuni problemi che possono essere risolti tramite l ordinamento dei dati. Esercizio 9 Scrivere un programma che acquisisca da input un vettore di N numeri interi, e riporti in uscita la frequenza di ciascun intero presente nel vettore. Esempio Vettore in input 1 9 3 4 1 4 1 9
4 CAPITOLO 2. FONDAMENTI DI INFORMATICA - ESERCIZI Output 1 e presente 3 volte 3 e presente 1 volte 4 e presente 2 volte 99 e presente 2 volte Metodo: Si ordina il vettore e quindi si scandiscono i suoi elementi: se l i-esimo elemento è uguale a quello successivo si incrementa una variabile di conteggio, altrimenti il valore della variabile di conteggio rappresenta il numero di volte che l i-esimo è presente nel vettore Vettore ordinato 1 1 1 3 4 4 9 9 I I+1 V[I]!=V[I+1] e count = 3, allora riporta che V[I] compare 3 volte Siccome considero V[I] e V[I+1], la scansione partirà da0earriverà a N-2. Fare attenzione all ultimo elemento! Esercizio 10 Scrivere un programma in C che acquisisca da input due stringhe S1 e S2 e controlli se una è l anagramma dellaltra. Metodo: si ordinano alfabeticamente le due stringhe e si confrontano: se il risultato del confronto è positivo allora una stringa è l anagramma dell altra. Esempio: S1="domenico" -- (ordinamento) --- > "cdeimnoo" S2="incomode" -- (ordinamento) --- > "cdeimnoo"
2.3. SOLUZIONI 5 2.3 SOLUZIONI Soluzione Esercizio 1 Per poter affermare che un elemento X del vettore V1 non è nel vettore V2, si deve confrontare X con tutti gli elementi di V2: Inizializza TROVATO a 0 Acquisizione vettore V2 Acquisizione vettore V2 Per ogni elemento X del vettore V1 Per ogni elemento Y del vettore V1 se X==Y TROVATO=1 Se TROVATO e 0 Stampa X Inizializza TROVATO a 0 #define LV1 10 #define LV2 5 int I,J; int V1[LV1]; int V2[LV2]; int trovato=0;/* indica che un elemento di V1 e uguale ad uno di V2 */ for (I=0;I<LV1;I++) /* acquisizione V1 */ scanf("%d",&v1[i]); for (J=0;J<LV2;J++) /* acquisizione V2 */ scanf("%d",&v2[j]); for (I=0;I<LunghezzaVettore1;I++){ /* V1 - V2 */ for (J=0;J<LunghezzaVettore2;J++) if (V1[I]==V2[J]) trovato=1; if (trovato == 0) printf("\n %d", V1[I]); trovato=0;
6 CAPITOLO 2. FONDAMENTI DI INFORMATICA - ESERCIZI 2 Scrivere un programma che, acquisiti due vettori di interi da input, V1 e V2 stampi in output l intersezione V1 V2, cioè gli elementi in comune tra V1 e V2. Soluzione Esercizio 2 #include <math.h> #define LV 10 int I,J; int P,Q; int V[LV1] = { 12,43,21,4,5,10,49,67,2,20; P=0; Q=0; for (I=0;I<LV;I++) for (J=0;J<LV;J++) if (abs(v[i]-v[j])> abs(v[p]-v[q]) { P=I; Q=J; printf("\n %d %d", P,Q); Soluzione Esercizio 3 Ad ogni acquisizione dell elemento I del vettore, si controlla se tale elemento non sia già presente nelle posizioni precedenti (dalla posizione 0 alla posizione I-1): in caso positivo viene richiesto di immettere di nuovo l elemento. #define LV 10 int I,J; int V[LV1]; int trovato;/* indica che un elemento e
2.3. SOLUZIONI 7 gia presente in V */ for (I=0;I<LV1;I++) /* acquisizione V */ do { trovato=0; printf("\n Inserire elemento %d",i); scanf("%d",&v1[i]); for (J=0;J<I;J++) if (V[J]==V[I]) trovato=1; while (trovato!=0); Soluzione Esercizio 4 #define N1 7 #define N2 5 int V1[N1] = {1,3,3,5,6,9,9; /* esempio con N1=7 */ int V2[N2] = {2,3,3,5,5; /* esempio con N2=5 */ int V[N1+N2]; int temp; int N=N1+N2; int trovato,count=0; int I,J; int K; /* domanda 1 : prima soluzione */ /* inserisco V1 e V2 in V e poi lo ordino */ for(i=0;i<n1;i++) V[I]=V1[I]; for(i=n1;i<n1+n2;i++) V[I]=V2[I]; /* ordinamento di V con Bubblesort */ for(i=0;i<n-1;i++) for(j=0;j<n-1-i;j++) if (V[J]>V[J+1]) { temp=v[j]; V[J]=V[J+1];
8 CAPITOLO 2. FONDAMENTI DI INFORMATICA - ESERCIZI V[J+1]=temp; /* stampo V */ for(i=0;i<n1+n2;i++) printf("%2d",v[i]); /* domanda 1 : seconda soluzione si esaminano gli elementi di V1 e V2 e si inserisce in V il minore */ I=0; J=0; K=0; while((i<n1)&&(j<n2)) { if (V1[I]<V2[J]) { V[K]=V1[I]; I++; else { V[K]=V2[J]; J++; K++; /* copia in V di tutti quelli eventualmente rimasti in V1 */ while(i<n1) { V[K]=V1[I]; I++; K++; /* copia in V di tutti quelli eventualmente rimasti in V2 */ while(j<n2) { V[K]=V2[J]; J++; K++; /* stampo V */ printf("\n");
2.3. SOLUZIONI 9 for(i=0;i<n1+n2;i++) printf("%2d",v[i]); /* domanda 2 - punto A */ for(i=0;i<n1-1;i++) if(v1[i]!=v1[i+1]) { trovato=0; for(j=0;j<n2;j++) if (V1[I]==V2[J]) trovato=1; if (trovato==1) count++; trovato=0; /* ultimo elemento di V1*/ for(j=0;j<n2;j++) if (V1[N1-1]==V2[J]) trovato=1; if (trovato==1) count++; printf("\n A = %d",count); /* domanda 2 - punto B */ count=0; for(i=0;i<n1-1;i++) if(v1[i]!=v1[i+1]) { trovato=0; for(j=0;j<n2;j++) if (V1[I]==V2[J]) trovato=1; if (trovato==0) count++; trovato=0; /* ultimo elemento di V1*/ for(j=0;j<n2;j++) if (V1[N1-1]==V2[J]) trovato=1; if (trovato==0) count++;
10 CAPITOLO 2. FONDAMENTI DI INFORMATICA - ESERCIZI printf("\n B = %d",count); /* Una soluzione piu semplice alla domanda 2 e quella di contare piu volte i valori di V1 ripetuti: in questo modo, A= 4 */ for(i=0;i<n1-1;i++) { trovato=0; for(j=0;j<n2;j++) if (V1[I]==V2[J]) trovato=1; if (trovato==1) count++; printf("\n %d",count); Soluzione Esercizio 5 #define N 3 #define M 6 int MAT[N][M] = {3,5,7,9,0,7,2,2,8,9,3,2,8,2,2,2,4,5; int i, j, Totale=0; int RIGA, COLONNA; do { printf("inserire RIGA e COLONNA da eliminare"); scanf("%d %d",&riga,&colonna); while(riga>n COLONNA>M); for(i=0;i<n;i++) if(i!=riga) for(j=0;j<m;j++) if(j!=colonna) Totale =Totale + MAT[i][j];
2.3. SOLUZIONI 11 printf("totale = %d",totale); {\soluzione{\ref{matrice:sotto \begin{verbatim #define N 3 #define M 6 int MAT[N][M] = {3,5,7,9,0,7,2,2,8,9,3,2,8,2,2,2,4,5; int R,C; int NS,MS; int max; int I,J; do { printf("inserire R e C dell elemento 0,0 della sottomatrice:"); scanf("%d %d",&r,&c); while(r>n C>M); do { printf("/n Inserire dimensioni della sottomatrice : "); scanf("%d %d",&ns,&ms); while(r+ns>n C+MS>M); for(i=r;i<r+ns;i++){ for(j=c;j<c+ms;j++) printf("%2d",mat[i][j]); printf(" RIGA %2d \n",i); Soluzione Esercizio 7 #define M 4 #define N 3 int I,J;
12 CAPITOLO 2. FONDAMENTI DI INFORMATICA - ESERCIZI int A[M][N],B[N][M]; for (I=0;I< M;I++) for (J=0;J< N;J++) A[I][J]=I+J; printf("\n"); /* trasposta */ for (I=0;I<M;I++) for (J=0;J<N;J++) B[J][I]=A[I][J]; printf("la matrice trasposta %dx%d e \n",n,m); for (J=0;J< N;J++) { for (I=0;I< M;I++) printf("%d ",B[J][I]); printf("\n"); 2 Stampare la matrice trasposta di A, senza costruire la matrice B. Soluzione Esercizio 8 #define M 6 char S1[M]="prova"; char S2[M]="ora"; char S3[M+M]; int I=0; /* indice per la stringa S1 */ int J=0; /* indice per la stringa S2 */ int K=0; /* indice per la stringa S3 */ /* finche ci sono caratteri in entrambe S1 e S2 si riporta in S3 prima un carattere di S1 e poi un carattere di S2 */ while(s1[i]!= \0 && S2[J]!= \0 ){ S3[K]=S1[I]; K++; I++;
2.3. SOLUZIONI 13 S3[K]=S2[J]; K++; J++; /* si riporta in S3 gli eventuali caratteri rimasti in S1 */ while(s1[i]!= \0 ){ S3[K]=S1[I]; K++; I++; /* si riporta in S3 gli eventuali caratteri rimasti in S2 */ while(s2[j]!= \0 ){ S3[K]=S2[J]; K++; J++; /* si riporta in S3 il carattere di terminazione */ S3[K]= \0 ; printf("stringa risultante = %s",s3); Soluzione Esercizio 9 In base al metodo descritto nel testo dell esercizio, si delinea il seguente algoritmo: Ordinamento del vettore Inizializza variabile di conteggio count= 1 per I da 0 a N-2 se V[I]==V[I+1] allora incrementa count di 1 altrimenti riporta che la frequenza di V[I] è count riparti con il conteggio: count =1 riporta che la frequenza di V[I+1] è count che viene tradotto nel seguente programma: #include <stdlib.h> #define LV 12
14 CAPITOLO 2. FONDAMENTI DI INFORMATICA - ESERCIZI typedef int Vettore[LV]; int I,J; int Tot; /* numero totale di elementi differenti */ Vettore V; int count; int temp; /* assegnamento casuale */ for (I=0;I<LV;I++) V[I]=rand()%10; /* stampa vettore non ordinato */ for (I=0;I<LV;I++) printf("%d ",V[I]); printf("array iniziale \n\n"); /* ordinamento con bubble sort */ for(i=0;i<lv-1;i++) for(j=0;j<lv-1-i;j++) if (V[J]>V[J+1]) { temp=v[j]; V[J]=V[J+1]; V[J+1]=temp; /* stampa vettore ordinato */ printf("vettore Ordinato\n\n"); for (I=0;I<LV;I++) printf("%d ",V[I]); printf("\n\n"); count=1; for (I=0;I<LV-1;I++) { if (V[I]==V[I+1]) count++; else { printf(" %d compare %d volte\n",v[i],count); count=1; /* end if */ /* end for */ printf("%d compare %d volte\n",v[lv-1],count); /* end main */ Soluzione Esercizio 10
2.3. SOLUZIONI 15 acquisizione delle stringhe S1 e S2 ordinamento delle stringhe S1 e S2 se le due stringhe ordinate sono uguali stampa OK altrimenti stampa NO #define MAXSTRINGA 20 /* massima lunghezza della stringa */ char S1[MAXSTRINGA+1],S2[MAXSTRINGA+1]; int LS1,LS2; /* lunghezza stringhe da confrontare */ int I,J; char temp; int uguali; /* controllo di uguaglianza delle stringhe */ char Ch; /* acquisizione e calcolo lunghezza stringa S1 */ printf("introdurre la stringa S1\n"); Ch=getchar(); I=0; while(ch!= \n ){ if (I<MAXSTRINGA){ S1[I]=Ch; I++; Ch=getchar(); S1[I]= \0 ; LS1=I; /* acquisizione e calcolo lunghezza stringa S2 */ printf("introdurre la stringa S2\n"); Ch=getchar(); I=0; while(ch!= \n ){ if (I<MAXSTRINGA){ S2[I]=Ch; I++; Ch=getchar(); S2[I]= \0 ; LS2=I;
16 CAPITOLO 2. FONDAMENTI DI INFORMATICA - ESERCIZI /* ordinamento delle stringa S1 con bubble sort */ for(i=0;i<ls1-1;i++) for(j=0;j<ls1-1-i;j++) if (S1[J]>S1[J+1]) { temp=s1[j]; S1[J]=S1[J+1]; S1[J+1]=temp; /* ordinamento delle stringa S2 con bubble sort */ for(i=0;i<ls2-1;i++) for(j=0;j<ls2-1-i;j++) if (S2[J]>S2[J+1]) { temp=s2[j]; S2[J]=S2[J+1]; S2[J+1]=temp; /* confronto delle due stringhe */ uguali = 1; I = 0; while (I < LS1 && uguali==1) if (S1[I]==S2[I]) I++; else uguali=0; /* output del risultato del confronto */ if (uguali==1) printf("ok"); else printf("no");