Sei sulla pagina 1di 8

PRIMA PARTE: 20 MINUTI (punti 8)

[Es 1] Per ognuna delle seguenti espressioni indicare il tipo del risultato, nel caso di espressione sintatticamente
corretta, oppure scrivere NON CORRETTA:

char a; int k,s; double z;

a. (char)s||k + s++*z Tipo= ___________________________


b. a=(--k%a ) || z Tipo= ___________________________

[Es 2] Completare il seguente frammento di codice affinché dato un valore di N > 1 stampi i primi N numeri dispari e
a fianco il numero modulo 2 o alternativamente modulo 3
Esempio: N=5 int i = ______; int j = ______;
for (________________________________)
1 – 1 (nota: 1%2) if (_______________________) {
3 – 0 (nota: 3%3) printf("%d %d, i, ___%2);
5 – 1 (nota: 5%2) _______________________ ;}
7 – 1 (nota: 7%3) else {
9 – 1 (nota: 9%2) printf("%d %d, i, ___%3) ;
_____________________ ;}

[Es 3] Qual è l’output dei seguenti frammenti di codice? (ciclo infinito, valori...)
1. int a=10,b=20;
for( ; b+1>a; a--){
printf("%d ",a); a=a-b++; a=a<b?a:--b; }
2. int a=10,b=20;
do {printf("%d ",a++ + b); a++; --b; a+= a - b; } while( !(b >= --a) );

[Es. 4] Dire quanto valgono le variabili a,b,c alla fine di ogni istruzione (ogni riga è indipendente dalle altre)
int a=2, b=0, c=3 ;
istruzione a b c
1 3 == ++a && ++c || !b--%2 == 0;
2 a == !a-- && ++b || !--c%2 == 1;
NOME COGNOME MATRICOLA – nella mail come soggetto riportare almeno
la matricola e PRIMA PARTE
PRIMA PARTE: SOLUZIONE

Es 1)
a: Tipo = INT
b: Tipo = CHAR

Es2)
int i = 1; int j = 1;
for (i=1; i< N*2 ; i=i+2 )
if ( j==1) {
printf("%d %d, i, i%2);
j=2 ;}
else {
printf("%d %d, i, i%3) ;
j=1 ;}

Es3)
1: CICLO INFINITO
2: 30

Es4)

1: a=3 b=0 c=4


2: a=1 b=0 c=0

2
SECONDA PARTE: 20 MINUTI (punti 8)
[Es 5] Completare il seguente frammento di codice affinché stampi il triangolo isoscele di base b così formato (si
suppone b valore dispari maggiore di 3)
######### ###########
******@ ********@
****@ ******@
**@ ****@
# esempio b=9 **@
# esempio b=11
int b=9, i,j;
for ( i=1; ______________________ ){ /*un ciclo esterno equivale ad una riga*/
for ( j=1; ____________________________) /* stampa spazi bianchi */
printf(" ");
for ( j=1; ________________________________) /* stampa caratteri*/
if ( ______________________________________________ )
printf("#");
else
if( _______________________________________ )
printf("@");
else
printf("*");
printf("\n"); /* va a capo */
}
[Es. 6] Dato il seguente frammento di codice scrivere due frammenti di codice equivalenti che facciano uso
rispettivamente solo istruzioni FOR e DO WHILE
int i,j,k;
scanf("%d",&i);
while (i<=11){
for (j=1; j<=i-1; j++)
printf("%d\n",k++);
i++;
}

[Es. 7] Descrivere brevemente come è usato il registro Program Counter (PC) nel CICLO fetch / decode / execute.

3
SECONDA PARTE: SOLUZIONE

Es 5
int b = 11, i, j;
for (i = 1; i <= b / 2 + 1; i++) {
for (j = 1; j <= i - 1; j++)
printf(" ");
for (j = 1; j <= b - 2 * (i - 1); j++)
if (i == 1 || i == b / 2 + 1)
printf("#");
else
if (j == b - 2 * (i - 1))
printf("@");
else
printf("*");
printf("\n");
}

Es 6

CON FOR

int i, j, k;
scanf("%d", &i);

for (; i <= 11; i++)


for (j = 1; j <= i - 1; j++)
printf("%d\n", k++);

CON DO WHILE

int i, j, k;
scanf("%d", &i);
if (i <= 11)
do {
j = 1;
if (j <= i - 1)
do {
printf("%d\n", k++);
j++;
} while (j <= i - 1);)
i++;
} while (i <= 11);

Es 7

4
TERZA PARTE: 40 MINUTI (punti 16)
[Es 8] Scrivere il seguente programma. Dopo aver letto due numeri NA e NB (controllare che NA e NB siano interi
positivi, con NA > NB + 3), leggere NA – NB coppie di numeri pari A, B tali che il primo sia il doppio del secondo o
viceversa. Calcolare e stampare il massimo tra tutti i valori A e B inseriti
Esempio per NA=10 e NB=5 output Facoltativo:
A B Riportare in output, accanto al massimo valore
6 3 coppia non valida inserito, anche l'indicazione se è un valore A e/o un
12 4 coppia non valida valore B (nell'esempio, si deve ottenere
12 6 Max = 24
Max = 24, come valore A).
16 8
(se invece al posto dell'ultima coppia 4,8 venisse
12 24
inserita la coppia 12, 24, si dovrebbe ottenere
24 12 Max = 24,
4 8
sia come valore A che come valore B).

[Es 9 ] Dato un vettore V[N] di interi ed una costante K positiva, scrivere un programma che stampi i primi K elementi
di V tali che l`elemento sia dispari e sia differente dall’elemento immediatamente precedente, e la sua posizione.
Il primo elemento se dispari si deve comunque stampare e contare

Ad Esempio con N=9 e int V[N] = { 11, 11, 41, 11, 70, 11, 11, 11 , 21 };

con K =5 si deve ottenere con K =3 si deve ottenere con K =7 si deve ottenere


11 in posizione 0 11 in posizione 0 11 in posizione 0
41 in posizione 2 41 in posizione 2 41 in posizione 2
11 in posizione 3 11 in posizione 3 11 in posizione 3
11 in posizione 5 11 in posizione 5
21 in posizione 8 21 in posizione 8

STAMPATI K ELEMENTI, STAMPATI K ELEMENTI, NON STAMPATI K ELEMENTI


TRA CUI L'ULTIMO MA NON L'ULTIMO
Nota: i valori 11 in posizione 1, 6 e 7 non vengono stampati in quanto uguali all’elemento immediatamente precedente.

Facoltativo: Al termine stampare una delle seguenti frasi


"SONO STAMPATI K ELEMENTI, TRA CUI L'ULTIMO DEL VETTORE"
"SONO STAMPATI K ELEMENTI MA NON L'ULTIMO DEL VETTORE"
"NON SONO STATI STAMPATI K ELEMENTI "

5
TERZA PARTE: SOLUZIONE

[Es 8]

#include <stdio.h>

main(){
int N1, N2, i, j;
int A, B;
int MaxA,MaxB;

do
scanf("%d %d", &N1, &N2);
while (!(N1 > 0 && N2 > 0 && N1 > N2 + 3));

for (i = 1; i <= N1 - N2; i++) {

do
{
scanf("%d %d", &A, &B);
} while (!(A == 2 * B || B == 2 * A));

if (i == 1 || A > MaxA)
MaxA = A;

if (i == 1 || B > MaxB)
MaxB = B;

if (MaxA > MaxB)


printf("Max=%d come valore A", MaxA);
else
if (MaxB > MaxA)
printf("Max=%d come valore B", MaxB);
else
printf("Max=%d sia come valore B che come valore A", MaxB);

6
[Es 9]

#include <stdio.h>
#define K 7
#define N 9

int main(void) {

int V[N] = { 11, 11, 41, 11, 70, 11, 11, 11 , 21 };

int i;
int conta = 0; /* conta i consecutivi stampati */

for (i = 0; i < N; i++)


if (i == 0 || V[i] != V[i - 1])
if (V[i]%2==1)
if (conta < K) {
conta++;
printf("%d : %d in posizione %d\n", conta, V[i], i);
}

CON ANCHE IL FACOLTATIVO

#include <stdio.h>
#define K 7
#define N 9

int main(void) {

int V[N] = { 11, 11, 41, 11, 70, 11, 11, 11 , 21 };

int i;
int conta = 0; /* conta i consecutivi stampati */
int StampaUltimo = 0; /* se stampato ultimo */

for (i = 0; i < N; i++)


if (i > 0 && V[i] != V[i - 1])
if (conta < K) {
conta++;
printf("%d : %d in posizione %d\n", conta, V[i], i);
if (i == N - 1)
StampaUltimo = 1;
}

if (conta == K)
if (StampaUltimo)
printf("STAMPATI K ELEMENTI, TRA CUI L'ULTIMO");
else
printf("STAMPATI K ELEMENTI MA NON L'ULTIMO");
else
printf("NON STAMPATI K ELEMENTI");
}

7
Date due stringhe SA e SE (con soli caratteri alfabetici maiuscoli e senza caratteri ripetuti) scrivere un programma che
per ogni vocale SA[i] di SA, stampi tale vocale SA[i] e una delle seguenti frasi
1. "TROVATA IN ULTIMA POSIZIONE!" se tale vocale è presente come ultimo carattere di SE
2. "TROVATA!" se tale consonate è presente in SE, ma non come ultimo carattere
3. "NON TROVATA!" se tale consonate non è presente in SE

Esempio (si noti che questo è solo un esempio, le stringhe SA e SB sono generiche e possono variare)
char SA[] = "PIEOU"; /* solo caratteri distinti maiuscoli */
char SE[] = "KZIPMO"; /* solo caratteri distinti maiuscoli */

In output si deve ottenere


I : TROVATA!
E : NON TROVATA!
O : TROVATA IN ULTIMA POSIZIONE!
U : NON TROVATA!

SOLUZIONE (SA è indicata come S e SB come S2)

#include <stdio.h>

main() {
char S[] = "PIEOU";
char S2[] = "KZIPMO";
int i, j;

int trovato;

for (i = 0; S[i] != '\0'; i++)


if (S[i]=='A' || S[i]=='E' || S[i]=='I' || S[i]=='O' || S[i]=='U') {
/* si effettua ricerca lineare di S[i] in S2 */
trovato = 0;
for (j = 0; S2[j] != '\0'; j++)
if (S[i] == S2[j])
trovato = 1;
/* fine ricerca lineare */

if (trovato)
if (S[i] == S2[j - 1])
printf("%c TROVATA in ultima posizione!\n", S[i]);
else
printf("%c TROVATA!\n", S[i]);
else
printf("%c NON TROVATA!\n", S[i]);
}
}

Potrebbero piacerti anche