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 (3 punti)
Cosa stampa la seguente funzione ricorsiva se chiamata con argomento n = 1?
void f (int n) {
printf ("%d ", n);
if (n < 3) f (n+1);
printf ("%d ", n);
return;
}
1 2 3 3 2 1
Esercizio 2 (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 compatta_spazi (char s[]) {
int i, j = 0;
unsigned char dopo_spazio = 0;
for ( __________________________) {
if (s[i] == ' ') {
if (!dopo_spazio) {
_________________
_________________
j++;
} } else {
_________________
_________________
j++;
} }
s[j] = _________;
return;
}
void compatta_spazi (char s[]) {
int i, j = 0;
unsigned char dopo_spazio = 0;
for ( i = 0; s[i] != '\0'; i++) {
if (s[i] == ' ') {
if (!dopo_spazio) {
s[j] = s[i];
dopo_spazio = 1;
j++;
} } else {
dopo_spazio = 0;
s[j] = s[i];
j++;
} }
s[j] = '\0';
return;
}
Esercizio 3 (3 punti)
Cosa stampa il seguente programma?
int g (int *p, int m) {
m += ++(*p);
return m;
}
int main() {
int a = 6, b;
b = g (&a, a);
printf ("%d %d\n", a, b);
return EXIT_SUCCESS;
}
7 13
Esercizio 4 (2 punti)
Quale/i dei seguenti frammenti di codice stampa(no) il codice ASCII della lettera 'L' (maiuscola)?
[ ] char ch = 'L';
printf ("%c", char (ch));
[X] char ch = 'l';
printf ("%d", ch + 'A' – 'a');
[ ] char ch = 'L';
printf ("%d", ch – '0');
[X] char ch = toupper ('l');
printf ("%d", ch);
[X] char ch = 'L';
printf ("%d", ch – '\0');
Esercizio 5 (3 punti)
La funzione leggi_persona legge da tastiera i dati di una persona nel formato deducibile dal seguente esempio:
Gian Luigi De Bianchi 22 11 2013 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)
{
gets (nome);
gets (cognome);
scanf ("%d %d %d",
p_g_nascita, p_m_nascita, p_a_nascita);
while (getchar() != '\n');
*p_sesso = getchar();
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;
}
{
scanf ("%s %s", nome, cognome);
scanf ("%d %d %d %c",
p_g_nascita, p_m_nascita, p_a_nascita, p_sesso);
return;
}
Esercizio 6 (2 punti)
Prendendo come riferimento un elaboratore a 32 bit, scrivere le dimensioni in byte delle seguenti variabili e costanti:
"prova" ____________________
3 ____________________
char ch; ____________________
double v[4]; ____________________
"prova" 6 3 4 char ch; 1 double v[4]; 32
Esercizio 7 (5 punti)
La funzione righe_uguali_in_matrice restituisce uno se la matrice passata come argomento contiene almeno due righe uguali e zero altrimenti. La si completi.
int righe_uguali_in_matrice (int m[4][6]) {
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 0;
}
int confronta_vettori
(int v1[], int v2[], int dim) {
int i;
for (_______________________) {
if (_____________________) return 0;
}
return 1;
}
int righe_uguali_in_matrice (int m[4][6]) {
int i, j;
/* per ogni riga della matrice */
for (i = 0; i < 4; i++) {
/* per ogni riga successiva a quella in esame */
for (j = i + 1; j < 4; j++)
/* se le due righe sono uguali */
if (confronta_vettori (m[i], m[j], 6)) return 1;
}
/* se nessuna riga era uguale a un'altra */
return 0;
}
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 8 (2 punti)
Cosa stampa il seguente frammento di programma?
int y = 11 / 2;
double z = 11 /2;
printf ("%d %1.0lf\n", y, z);
5 5
Esercizio 9 (6 punti)
Si scriva la funzione void incr_bin (char num[]) 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"
"1110101" → "1110110"
void incr_bin (char num[]) {
int i, somma, riporto;
riporto = 1;
i = strlen (num) - 1;
while (i >= 0) {
somma = riporto + num[i] - '0';
num[i] = somma % 2 +'0';
riporto = somma / 2;
i--;
}
return;
}