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 (2 punti)
Quale/i dei seguenti frammenti di codice stampa(no) il codice ASCII della lettera 'F' (maiuscola)?
[ ] char ch = 'F';
printf ("%d", ch – '0');
[ ] char ch = toupper ('f');
printf ("%d", ch);
[ ] char ch = 'f';
printf ("%d", ch + 'A' – 'a');
[ ] char ch = 'F';
printf ("%c", char (ch));
[ ] char ch = 'F';
printf ("%d", ch – '\0');
Esercizio 2 (3 punti)
Cosa stampa la seguente funzione ricorsiva se chiamata con argomento
n = 4?
void f (int n) {
printf ("%d ", n);
if (n > 0) f (n-1);
printf ("%d ", n);
return;
}
____________________________
Esercizio 3 (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;
}
Esercizio 4 (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"(svolgere sul retro del foglio) Esercizio 5 (3 punti)
La funzione
leggi_personalegge 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 6 (2 punti)
Cosa stampa il seguente frammento di programma?
int y = 13 / 2;
double z = 13 /2;
printf ("%d %1.0lf\n", y, z);
__________________________
Esercizio 7 (5 punti)
La funzione
righe_uguali_in_matricerestituisce 1 se la matrice passata come argomento contiene almeno due righe uguali e -1 altrimenti. La si completi.
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 (_________________________) {
/* 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;
}
Esercizio 8 (2 punti)
Prendendo come riferimento un elaboratore a 32 bit, scrivere le dimensioni in byte delle seguenti variabili e costanti:
double v[3]; ____________________
1 ____________________
char ch; ____________________
"ciao" ____________________
Esercizio 9 (3 punti)
Cosa stampa il seguente programma?
int g (int *q, int z) {
z += ++(*q);
return z;
}
int main() {
int a = 7, b;
b = g (&a, a);
printf ("%d %d\n", a, b);
return EXIT_SUCCESS;
}