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<stdio.h>
#include<conio.h>
#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<righe; i++)
for(j=0; j<colonne; j++) {
printf("Elemento [%d][%d] : ", i, j);
scanf("%d",&mat[i][j]);
}
for(i=0; i<righe; i++) {
pos=0;
for(j=0; j<colonne; j++)
if(mat[i][j] != 0) {
mat[i][pos] = mat[i][j];
pos++;
}
while(pos<colonne)
mat[i][pos++] = 0;
}
clrscr();
for(i=0; i<righe; i++) {
for(j=0; (j<colonne) && mat[i][j]!=0); j++)
printf("%5d", mat[i][j]);
printf("\n");
}
return 0;
}
Una
soluzione alternativa poteva essere un programma che utilizzasse su ciascuna
riga una procedura del tipo “bubble-sort”, che scambia due elementi di posto i
e i+1 solo se quello di posto i è 0 e quello di posto i+1 è diverso da 0.
2
Illustrare come si definisce e come si richiama una
funzione nel linguaggio C, descrivendo le modalità di passaggio dei parametri.
Soluzione:
Vedi testo di Bellini, Guidi, Guida al linguaggio C,
capitolo 6 (in particolare 6.8) e paragrafo 8.6
3
Descrivere l'architettura della Unita Centrale di
Elaborazione (CPU), con particolare riferimento ai registri interni ed al loro
utilizzo durante l'esecuzione di un programma.
Soluzione:
Vedi testo di Ceri, Mandrioli, Sbattella, Informatica:
arte e mestiere, paragrafi 2.3.3 e 2.4
4
Illustrare i metodi conosciuti per la soluzione di
equazioni di ricorrenza.
Soluzione:
Vedi testo di Cormen, Leicerson, Rivest, Introduzione
agli algoritmi, paragrafo 4.3