01: // bsearch()
02: #include<stdio.h>
03: #include<stdlib.h>
04: #include<time.h>
05: 
06: void stampaarray(int *, int);
07: int mycomp(const void*, const void*);
08: 
09: int main(int argc, char **argv){
10: 
11:   srand(time(0));
12: 
13:   int n;
14:   printf("Quanti elementi vuoi generare? ");
15:   scanf("%d", &n);
16: 
17:   int a[n]; // VLA e' comunque limitato come dimensioni massime
18: 
19:   // genera array ordinato, banalmente metto nel mio array numeri sempre crescenti sommando al precedente elemento uno step casuale
20:   a[0] = 1;
21:   for (int i=1; i<n; i++)
22:     a[i]=a[i-1] + rand()%10 + 1;
23: 
24:   // visualizza array mescolato
25:   printf("ARRAY GENERATO\n");
26:   stampaarray(a,n);
27: 
28:   int k;
29:   printf("Dimmi che numero vuoi ricercare: ");
30:   scanf("%d", &k);
31: 
32:   // invoco ordinamento
33:   int *risultato = bsearch(&k, a, n, sizeof(a[0]), mycomp); 
34: 
35:   if(risultato)
36:   {
37:     printf("Il numero ricercato si trova all'indice %ld\n", risultato - a);
38:   }
39:   else
40:   {
41:     printf("Numero non presente nell'array\n");
42:   }
43: 
44:   return 0;
45: }
46: 
47: void stampaarray(int *a, int n){
48:   int i;
49:   if(n<200)
50:   {
51:     for (i=0; i<n; i++){
52:       printf("%5d ",a[i]);
53:       printf((i+1)%15 ? "" : "\n");
54:     }
55:   }
56:   else
57:   {
58:     printf(" Array troppo grosso, mi limito a stampare i primi 30 e gli ultimi 30 elementi\n");
59: 
60:     for (i=0; i<30; i++){
61:       printf("%5d ",a[i]);
62:       printf((i+1)%15?"":"\n");
63:     }
64:     printf("  ...\n");
65:     for (i=n-30; i<n; i++){
66:       printf("%5d ",a[i]);
67:       printf((n-i-1)%15?"":"\n");
68:     }
69:   }
70: 
71:   printf("\n");
72: }
73: 
74: // deve restituire valore < = > 0 a seconda del confronto, occorre cast visto che obbligatorio usare void*
75: int mycomp(const void* a, const void* b){
76: 
77:   int ai = *((int*)a); // a e' puntatore a void (int*)a e' puntatore a int, *((int *)a) e' l'int contenuto all'indirizzo in a
78:   int bi = *((int*)b);
79: 
80:   return ai-bi;
81: }
82: 
83: 
84: 


Se avete commenti o osservaƶioni su questa pagina
mandate un messaggio di posta elettronica a bertoƶƶi@ce.unipr.it