Università degli Studi di Udine
Corsi di laurea in Ing. Elettronica / Gestionale Fondamenti di programmazione / Inform. 1 22 novembre 2013 - Prova intermedia
Matricola ____________________________
Nome ____________________________
Cognome ____________________________
Aula ____ Fila (dalla cattedra) ____ Posto (dalla porta) _____
Esercizio 1 (4 punti)
La seguente funzione modifica una stringa compattando gli spazi tra le parole (se tra due parole ci sono due o più spazi, essi vengono ridotti a uno solo). Esempio:
"testo di prova" → "testo di prova"
La si completi.
void elimina_doppi_spazi (char t[]) {
int i, j = 0;
int trovato_spazio = 0;
for ( __________________________) {
if (t[i] == ' ') {
if (trovato_spazio == 0) {
_____________________
_____________________
j++;
} } else {
_____________________
_____________________
j++;
} }
t[j] = _________;
return;
}
void elimina_doppi_spazi (char t[]) {
int i, j = 0;
int trovato_spazio = 0;
for ( i = 0; t[i] != '\0'; i++) {
if (t[i] == ' ') {
if (trovato_spazio == 0) {
t[j] = t[i];
trovato_spazio = 1;
j++;
} } else {
trovato_spazio = 0;
t[j] = t[i];
j++;
} }
t[j] = '\0';
return;
}
Esercizio 2 (3 punti)
Cosa stampa la seguente funzione ricorsiva se chiamata con argomento n = 3?
void f (int n) {
printf ("%d ", n);
if (n > 0) f (n-1);
printf ("%d ", n);
return;
}
3 2 1 0 0 1 2 3
Esercizio 3 (3 punti)
La funzione leggi_persona legge da tastiera i dati di una persona nel formato deducibile dal seguente esempio:
Pier Paolo
Fante Della Polvere 1 7 2001
M
Quale o quali delle versioni della funzione è corretta?
(Indicarla/le con una croce nei riquadri a sinistra)
void leggi_persona
(char nome[], char cognome[],
int *p_g_nascita, int *p_m_nascita, int *p_a_nascita, char *p_sesso)
{
scanf ("%s %s", nome, cognome);
scanf ("%d %d %d %c",
p_g_nascita, p_m_nascita, p_a_nascita, p_sesso);
return;
}
{
gets (nome);
gets (cognome);
scanf ("%d %d %d",
&p_g_nascita, &p_m_nascita, &p_a_nascita);
while (getchar() != '\n');
scanf ("%c", &p_sesso);
return;
}
{
gets (nome);
gets (cognome);
scanf ("%d %d %d",
p_g_nascita, p_m_nascita, p_a_nascita);
while (getchar() != '\n');
*p_sesso = getchar();
return;
}
Esercizio 4 (5 punti)
La funzione righe_uguali_in_matrice restituisce 1 se la matrice passata come argomento contiene almeno due righe uguali e -1 altrimenti. La si completi.
int righe_uguali_in_matrice (int m[5][7]) {
int i, j;
/* per ogni riga della matrice */
for (_________________________) {
/* per ogni riga successiva a quella in esame */
for (____________________________)
/* se le due righe sono uguali */
if (confronta_vettori
(________________________))
return 1;
}
/* se nessuna riga era uguale a un'altra */
return -1;
}
int confronta_vettori
(int v1[], int v2[], int dim) {
int i;
for (_______________________) {
if (_____________________) return 0;
}
return 1;
}
int righe_uguali_in_matrice (int m[5][7]) {
int i, j;
/* per ogni riga della matrice */
for (i = 0; i < 5; i++) {
/* per ogni riga successiva a quella in esame */
for (j = i + 1; j < 5; j++)
/* se le due righe sono uguali */
if (confronta_vettori (m[i], m[j], 7)) return 1;
}
/* se nessuna riga era uguale a un'altra */
return -1;
}
int confronta_vettori
(int v1[], int v2[], int dim) {
int i;
for (i = 0; i < dim; i++) {
if (v1[i] != v2[i]) return 0;
}
return 1;
}
Esercizio 5 (6 punti)
Si scriva la funzione
void somma_uno_bin (char nb[])
che incrementa di uno il numero binario rappresentato, con codici ASCII '0' e '1', dalla stringa passata come argomento. Il numero di bit rappresentati dalla stringa è fisso (l’eventuale riporto a sinistra della prima cifra va ignorato).
Esempi: "11111111" → "00000000"
"00001" → "00010"
"1101011" → "1101100"
void somma_uno_bin (char nb[]) {
int i, somma, riporto;
riporto = 1;
i = strlen (nb) - 1;
while (i >= 0) {
somma = riporto + nb[i] - '0';
nb[i] = somma % 2 +'0';
riporto = somma / 2;
i--;
}
return;
}
Esercizio 6 (2 punti)
Cosa stampa il seguente frammento di programma?
int y = 15 / 2;
double z = 15 /2;
printf ("%d %1.0lf\n", y, z);
7 7
Esercizio 7 (3 punti)
Cosa stampa il seguente programma?
int g (int *q, int z) {
z += ++(*q);
return z;
}
int main() {
int a = 9, b;
b = g (&a, a);
printf ("%d %d\n", a, b);
return EXIT_SUCCESS;
}
10 19
Esercizio 8 (2 punti)
Prendendo come riferimento un elaboratore a 32 bit, scrivere le dimensioni in byte delle seguenti variabili e costanti:
7 ____________________
double v[4]; ____________________
char ch; ____________________
"vacanza" ____________________
7 4 double v[4]; 32 char ch; 1
"vacanza" 8
Esercizio 9 (2 punti)
Quale/i dei seguenti frammenti di codice stampa(no) il codice ASCII della lettera 'H' (maiuscola)?
[X] char ch = 'h';
printf ("%d", ch + 'A' – 'a');
[ ] char ch = 'H';
printf ("%c", char (ch));
[ ] char ch = 'H';
printf ("%d", ch – '0');
[X] char ch = toupper ('h');
printf ("%d", ch);
[X] char ch = 'H';
printf ("%d", ch – '\0');