ESERCIZI ARRAY 1. Scrivere un programma che inizializza un vettore monodimensionale di interi e poi copia il vettore in un altro vettore della stessa dimensione. 2. In una gara il punteggio di ciascun atleta è dato dal pubblico. I voti possono andare da 1 a 10. Scrivere un programma che per ogni atleta rilevi il numero di occorrenze dei vari voti. a. con switch…case; b. con i vettori 3. Scrivere un programma che stampa i numeri primi minori di 100 (Crivello di Eratostene) 4. Scrivere un programma che calcola il MCD di due numeri positivi (Euclide) 5. Scrivere un programma che ordina n numeri casuali con il metodo bubblesort Esercizio 1 /* array2.c definisce 2 array, ne inizializza uno e compia un array nell'altro */ #include <stdio.h> main() { int i; int a[10]={1,2,3,4,5,6,7,8,9,10}; /* inizializzazione in fase di definizione */ int b[10]; /* stampa a[] */ printf("a[]= "); for(i=0;i<10;i++) { printf(" %d", a[i]); } /* copio a[] in b[] */ printf("\ncopio a[] in b[]\n"); for(i=0;i<10;i++) b[i]=a[i]; /* stampa b[] */ printf("b[]= "); for(i=0;i<10;i++) { printf(" %d,", b[i]); } } Esercizio 2a /*voti della gara con switch …case....*/ #include<stdio.h> main() { int voto1=0, voto2=0, voto3=0, voto4=0, voto5=0; int voto=0; /* printf("Inserisci un voto (da 1 a 4)"); scanf(); */ while(voto!=-1) { printf("Inserisci un voto (da 1 a 4)"); scanf("%d",&voto); switch(voto) { case 1: voto1++; break; case 2: voto2++; break; case 3: voto3++; break; case 4: voto4++; break; case 5: voto5++; break; default: printf("Inserimento errato!!!!"); break; } } printf("%d %d %d %d %d", voto1,voto2, voto3, voto4, voto5); return 0; } ____________________________________________________________________ Esercizio 2b /*voti della gara con vettore....*/ #include<stdio.h> main() { int voto[11]={0}, i=0,j=0; for(j=1;j<=4;j++) { printf("Inserisci un voto per la mensa (tra 1 e 10):"); scanf("%d",&i); voto[i]++; } for(i=1;i<=10;i++) printf("%d", voto[i]); return 0; } Esercizio 3 /*stampa i numeri primi tra i primi 100 numeri con il metodo di Eratostene*/ #include<stdio.h> main() { int i,j; int array[100]; for (i=0;i<100;i++) array[i]=1; for (i=2;i<=100;i++) { if(array[i]==1) { for (j=2;j<(100/i);j++) array[i*j]=0; } } printf("\nnumeri primi <100"); for (i=1;i<100;i++){ if(array[i]==1) printf("\t%d", i); } } Esercizio 5 (prima versione) /* lehmer1.C -- Genera una sequenza casuale usando il metodo di lehmer */ #include <stdio.h> /* direttive al preprocessore */ #include <stdio.h> #include <math.h> #include <time.h> #define NMAX 1000 #define m 100000000 #define b 31415821 #define m1 10000 long mult(long p, long q); long lehmer(long a); int main(void) /* definizione della funzione principale MAIN */ { int max, r; long f[NMAX]={0}, i, n, a; double s; time_t t; printf("\n \nGenerazione di una sequenza di numeri interi pseudocasuale."); printf("\nI numeri della sequenza sono compresi fra 0 e N-1."); printf("\n \nInserisci N:"); if (scanf("%d", &max) != 1) { printf("Errore !\a\n"); exit(1); } else if (max <=0) { printf("Errore ! Il numero deve essere >0 ! \a\n"); exit(1); } printf("\nInserisci il numero di elementi della sequenza:"); if (scanf("%ld", &n) != 1) { printf("Errore !\a\n"); exit(1); } else if (n <=0) { printf("Errore ! Il numero deve essere >0 ! \a\n"); exit(1); } printf("Generazione casuale di %ld numeri compresi fra 0 e %d\n\n",n,max); srand((unsigned) time(&t)); a=t % m; for(i=0; i<n; i++) { a = lehmer(a); r = a % max; /* <- sbagliato ! */ f[r]++; } for (i=0; i < max; ++i) printf("Il numero di %ld Š %ld e la freq. rel. %f\n",i,f[i],(float) f[i]/n); /* statistica del chi quadro */ for (i=0, s=0; i < max; ++i) s += f[i]*f[i]; s = s*max/n-n; printf("chi-quadro=%lf \n", s); if ( fabs(s-max)< 2*sqrt(max) ) printf("\n Test del chi-quadro superato !\a\n"); else printf("\n Test del chi-quadro NON superato !\a\n"); system("pause"); return 0; } long lehmer(long a) { a = (mult(a,b) +1) % m; return a; } long mult(long p, long q) { long p1, p0, q1, q0, ab; p1 = p/m1; p0 = p%m1; q1 = q/m1; q0 = q%m1; ab = (((p1*q0+p0*q1) % m1) * m1 + p0*q0) % m; return ab; } Esercizio 5 (seconda versione) /* lehmer2.C -- Genera una sequenza di n numeri casuali tra 0 e N(=max)-1 usando il metodo di lehmer e calcola la statistica del Chi-quadro (per verificare la casualita': se prossima a N, allora ok)*/ /*1.generare un numero casuale tra 0 e 1. 2.moltiplicare ciasun numero per N*/ #include <stdio.h> /* direttive al preprocessore */ #include<stdlib.h> #include <math.h> #include <time.h> #define NMAX 1000 #define m 100000000 #define b 31415821 #define m1 10000 long mult(long p, long q); long lehmer(long a); main() /* definizione della funzione principale MAIN */ { int max, r; float c; long f[NMAX]={0}, i, n, a; double s; time_t t; printf("\n \nGenerazione di una sequenza di numeri interi pesudo casuale."); printf("\nI numeri della sequenza sono compresi fra 0 e N-1."); printf("\n \nInserisci N:"); if (scanf("%d", &max) != 1) { printf("Errore !\a\n"); exit(1); } else if (max <=0) { printf("Errore ! Il numero deve essere >0 ! \a\n"); exit(1); } printf("\nInserisci il numero di elementi della sequenza:"); if (scanf("%ld", &n) != 1) { printf("Errore !\a\n"); exit(1); } else if (n <=0) { printf("Errore ! Il numero deve essere >0 ! \a\n"); exit(1); } printf("Generazione casuale di %ld numeri compresi fra 0 e %d\n\n",n,max); srand((unsigned) time(&t)); a=t % m; /*generazione di una sequenza di numeri casuali tra 0 e 1: //1. generare un numero casuale tra 0 e m-1 //2. dividere ciascun numero per m */ for(i=0; i<n; i++) { a = lehmer(a); /*a e' un numero casuale tale che 0< a < m */ c = (float) a/m; /* c e' un numero casuale tale che 0 < c < 1 */ r = (int) (c * max); /* r e' un numero casuale tale che 0 < r < max */ f[r]++; } for (i=0; i < max; ++i) printf("Il numero di %ld e' %ld e la freq. rel. %f\n",i,f[i],(float) f[i]/n); /* statistica del chi quadro: implementa (\sum_{0<=i<max}(f[i]-n/max)^2 ) / (n/max) nota che \sum f[i]= n ; n/max e' il valore atteso*/ for (i=0, s=0; i < max; ++i) s += f[i]*f[i]; s = s*max/n-n; printf("chi-quadro=%lf \n", s); if ( fabs(s-max)< 2*sqrt(max) ) printf("\n Test del chi-quadro superato !\a\n"); else printf("\n Test del chi-quadro NON superato !\a\n"); system("pause"); } long lehmer(long a) { a = (mult(a,b) +1) % m; return a; } long mult(long p, long q) { long p1, p0, q1, q0, ab; p1 = p/m1; p0 = p%m1; q1 = q/m1; q0 = q%m1; ab = (((p1*q0+p0*q1) % m1) * m1 + p0*q0) % m; return ab; } /* lehmer.C -- Genera una sequenza casuale usando il metodo di lehmer */ #include <stdio.h> /* direttive al preprocessore */ #include <math.h> #include <time.h> #define NMAX 1000 #define m 381 #define b 19 long lehmer(long a); int main(void) /* definizione della funzione principale MAIN */ { int max, r; long f[NMAX]={0}, i, n, a; double s; time_t t; printf("\n \nGenerazione di una sequenza di numeri interi pesudo casuale."); printf("\nI numeri della sequenza sono compresi fra 0 e N-1 con N<=1000."); printf("\n \nInserisci N:"); if (scanf("%d", &max) != 1) { printf("Errore !\a\n"); exit(1); } else if (max <=0 || max >1000) { printf("Errore ! Il numero deve essere >0 e <=1000! \a\n"); exit(1); } printf("\nInserisci il numero di elementi della sequenza:"); if (scanf("%ld", &n) != 1) { printf("Errore !\a\n"); exit(1); } else if (n <=0) { printf("Errore ! Il numero deve essere >0 ! \a\n"); exit(1); } printf("Generazione casuale di %ld numeri compresi fra 0 e %d\n\n",n,max); srand((unsigned) time(&t)); a=t % m; for(i=0; i<n; i++) { a = lehmer(a); r = a % max; /* 0 <= rand() < max */ f[r]++; } for (i=0; i < max; ++i) printf("Il numero di %ld Š %ld e la freq. rel. %f\n",i,f[i],(float) f[i]/n); /* statistica del chi quadro */ printf("\nStatistica del chi-quadro \n"); for (i=0, s=0; i < max; ++i) s += f[i]*f[i]; s = s*max/n-n; printf("chi-quadro=%lf \n", s); if ( fabs(s-max)< 2*sqrt(max) ) printf("\n Test del chi-quadro superato !\a\n"); else printf("\n Test del chi-quadro NON superato !\a\n"); system("Pause"); return 0; } long lehmer(long a) { a = (a * b +1) % m; return a; }