#include #define MAXLN 5 /* max lunghezza del nome */ #define MAXIS 6 /* max numero di nomi in lista */ void in_lista (int *ptr, char ar [][MAXLN]); int primo_alfa (char *lista[], int da_ind, int a_ind); void select_sort (char *lista[], int n); int main () { char iscritti [MAXIS] [MAXLN]; /* array nomi in ordine di iscrizione */ char *alfa[MAXIS]; /* array di puntatori a stringhe (iscritti)*/ int num_iscr, /* numero degli iscritti effettivi*/ i; in_lista (&num_iscr, iscritti); /* inizializza array di pointer a iscritti e ordina alfabeticamente */ for (i = 0; i < num_iscr; ++i) alfa[i] = iscritti[i]; select_sort (alfa, num_iscr); /* stampa del risultato */ printf ("\n\n%-30s%5c%-30s\n\n", "ordine di iscrizione", ' ', "ordine alfabetico"); for (i = 0; i < num_iscr; ++i) printf ("%-30s%5c%-30s\n", iscritti[i], ' ', alfa[i]); return 0; } /* funzione in_lista: inizializza lista iscritti in ordine di iscrizione */ void in_lista (int *ptr, char ar [MAXIS][MAXLN]) { int i, j, c; do { printf ("numero di nominativi da iscrivere (MAX %d): ", MAXIS); scanf ("%d", ptr); } while (*ptr>MAXIS); while ( (c=getchar() )!='\n' ) ; /* scarica caratteri superflui sulla riga */ for ( i=0; i<*ptr; ++i) { printf ("> "); gets (ar[i]); /* legge riga, poss. overflow, scarica car \n */ printf ("%d %s*\n", i, ar[i]); ar[i][MAXLN-1]='\0'; /* in caso di overflow stringa termina con car \0 */ } /* alternativamente, senza sapere il numero di nominativi a priori */ /* printf ("input MAX %d nomi -riga vuota o EOF per finire-\n", MAXIS); printf ("nomi uno per riga e MAX %d caratteri:\n> ", MAXLN); *ptr=0; for ( i=0, c=getchar(); c !='\n' && c!= EOF && i < MAXIS; ++i, ++*ptr ) { for ( j=0; c !='\n' && c!= EOF && j < MAXLN-1; ++j, c=getchar () ) ar[i][j] = c; ar[i][j]='\0'; while (c != '\n' && c!= EOF) c=getchar(); printf ("> "); c=getchar(); } */ } /* trova la posizione della stringa minore in ordine alfabetico nella sotto-lista tra da_ind e a_ind. Precondizioni: lista [da_ind].. lista [a_ind] elementi omogenei da_ind <= a_ind */ int primo_alfa (char *lista[], /* input: array ptrs a stringhe*/ int da_ind, /* input: indice minimo e massimo*/ int a_ind ) /* sotto-lista da considerare*/ { int primo, i; primo = da_ind; for (i = da_ind + 1; i <= a_ind; ++i) if ( strcmp (lista [i], lista [primo]) < 0 ) primo = i; return (primo); } /* ordina array di puntatori in modo da accedere alle stringhe in ordine alfabetico. Precondizioni: n elementi dell'array omogenei con n >= 0 */ void select_sort (char *lista[], /* ipt/opt: arr di ptrs a stringhe */ int n ) /* input: num elementi da ordinare */ { int a_posto, /* ind elem che deve contenere pros str in ordine*/ ind_min; /* indice elemento prossima stringa in ordine */ char *temp; for (a_posto = 0; a_posto < n-1; ++a_posto) { ind_min = primo_alfa (lista, a_posto, n-1); if ( ind_min != a_posto ) { temp = lista [ind_min]; lista [ind_min] = lista [a_posto]; lista [a_posto] = temp; } } }