Fondamenti di Informatica (SSE) soluzioni della prova scritta del 28 giugno 2000 1 Scrivere un programma C per "pulire" una matrice di interi con R righe e R colonne. Il programma deve: - leggere da tastiera gli interi da memorizzare nella matrice (guidando l'utente con opportuni messaggi), - successivamente spostare verso le prime colonne tutti gli elementi diversi da 0, mantenendoli nello stesso ordine in cui compaiono all'interno di ciascuna riga (se si ritiene utile si può utilizzare una matrice di appoggio, ma si consiglia di evitarlo), - stampare, riga per riga, gli elementi diversi da 0. Esempio: se viene letta la seguente matrice 9 58 0 0 12 0 5 0 0 0 66 3 55 0 7 32 19 0 0 67 0 0 5 0 22 11 0 9 0 4 5 0 il programma deve modificare la matrice ottenendo 9 58 12 5 0 0 0 0 66 3 55 7 32 0 0 0 19 67 5 0 0 0 0 0 22 11 9 4 5 0 0 0 e poi stampare 9 58 12 5 66 3 55 7 32 19 67 5 22 11 9 4 5 Il codice C deve essere completato da una descrizione succinta dell'algoritmo utilizzato. Soluzione Il programma proposto di seguito utilizza una matrice sovradimensionata, quindi chiede all'utente il numero di righe e di colonne, che non devono essere maggiori delle dimensione della matrice. Una volta ottenute le dimensioni, legge da tastiera gli elementi della matrice e passa alla "pulizia" La matrice viene esaminata riga per riga: sulla riga i-esima, si scandiscono gli elementi, ed ogni volta che si incontra un elemento diverso da 0 lo si assegna all'elemento di posizione pos. All'inizio dell'esame di ciascuna riga il valore di pos viene inizializzato a 0, e poi incrementato ogni volta che si incontra un elemento diverso da 0. Alla fine della scansione della riga, si riempie di elementi 0 la parte rimanente della riga. #include #include #define R 10 #define C 10 main() { int mat[R][C]; int righe, colonne, i, j, pos; clrscr(); do { printf("Quante righe ? (max %d) ", R); scanf("%d", &righe); } while( (righe<1) || (righe>R) ); do { printf("Quante colonne ? (max %d) ", C); scanf("%d", &colonne); } while( (colonne<1) || (colonne>C) ); clrscr(); for(i=0; i