...

Esercizi linguaggio C in PP

by user

on
Category: Documents
12

views

Report

Comments

Transcript

Esercizi linguaggio C in PP
Esercitazioni su:
- Algoritmi
- Diagrammi di flusso
- Notazione lineare strutturata
(pseudo-codice)
- Codifica in C (di problemi semplici)
Ing.Tomarchio,Ing.Testa
Fondamenti di Informatica
1
Esercizio 1: Dati due numeri interi non negativi,
calcolarne il prodotto (supponendo che l’esecutore non
abbia a disposizione l’operatore di moltiplicazione)
Dati di Input: M, N con M, N >= 0
Dati di Output: P (il prodotto tra M ed N)
• Note: bisogna effettuare delle somme successive,
cioè sommare M a se stesso per N volte.
Ing.Tomarchio,Ing.Testa
Fondamenti di Informatica
2
START
Esempio 1
leggi M, N
P=0
V
N=0?
F
P=P+M
scriv i P
N =N -1
END
Ing.Tomarchio,Ing.Testa
Fondamenti di Informatica
3
Esempio 1: pseudocodice
leggi M, N
P=0
WHILE (N <> 0) {
P=P+M
N=N–1
}
scrivi P
Ing.Tomarchio,Ing.Testa
Fondamenti di Informatica
4
Esempio 1: codifica in C
#include <stdio.h>
main () {
int M, N, P;
printf(“Inserisci due valori interi positivi:
scanf(“%d%d”, &M,&N);
”);
P = 0;
while (N != 0) {
P = P + M;
N = N – 1;
}
printf(“\n Il prodotto vale %d\n”,P);
}
Ing.Tomarchio,Ing.Testa
Fondamenti di Informatica
5
Esercizio 2: Trovare quoziente e resto di una divisione
intera per differenze successive (supponendo cioè di
non disporre dell’operatore di divisione)
Dati di Input: D, D1 (supponiamo D1>0)
Dati di Output: Q, R (quoziente e resto)
Ing.Tomarchio,Ing.Testa
Fondamenti di Informatica
6
START
Esempio 2
leggi D, D1
R=D
Q=0
V
R >= D1
F
R = R - D1
scriv i Q, R
Q=Q+1
END
Ing.Tomarchio,Ing.Testa
Fondamenti di Informatica
7
Esempio 2: pseudocodice
leggi D, D1
R=D
Q=0
WHILE (R >= D1) {
R = R – D1
Q=Q+1
}
scrivi Q, R
Ing.Tomarchio,Ing.Testa
Fondamenti di Informatica
8
Esempio 2: codifica in C
#include <stdio.h>
main () {
int D, D1, R, Q;
printf(“Inserisci due valori interi positivi: ”);
scanf(“%d%d”, &D, &D1);
R = D;
Q = 0;
while (R >= D1) {
R = R – D1;
Q = Q + 1;
}
printf(“Quoziente = %d, Resto = %d \n”, Q, R);
}
Ing.Tomarchio,Ing.Testa
Fondamenti di Informatica
9
Esercizio 3: Sommare i primi N numeri interi positivi e
scrivere il risultato
Dati di Input: N
Dati di Output: S
Ing.Tomarchio,Ing.Testa
(con N >= 0)
(somma dei primi N numeri)
Fondamenti di Informatica
10
START
leggi N
Esempio 3
I=0
S=0
S=S+I
I= I+ 1
V
I <= N
F
scrivi S
END
Ing.Tomarchio,Ing.Testa
Fondamenti di Informatica
11
Esempio 3: pseudocodice
leggi N
I=0
S=0
DO {
S=S+I
I=I+1
} WHILE (I <= N)
scrivi S
Ing.Tomarchio,Ing.Testa
Fondamenti di Informatica
12
Esempio 3: codifica in C
#include <stdio.h>
main () {
int N, S, i;
printf(“Somma dei primi N interi positivi\n\n”);
printf(“Inserisci N: “);
scanf(“%d”, &N);
i = 0;
S = 0;
do {
S = S + i;
i++;
} while (i <= N)
printf(“La somma dei primi %d numeri e’ %d\n”, N, S);
}
Ing.Tomarchio,Ing.Testa
Fondamenti di Informatica
13
Esempio 3: codifica in C (uso di for)
#include <stdio.h>
main () {
int N, S, i;
printf(“Somma dei primi N interi positivi\n\n”);
printf(“Inserisci N: “);
scanf(“%d”, &N);
for(i = 1, S = 0; i <= N; i++)
S = S + i;
printf(“La somma dei primi %d numeri e’ %d\n”, N, S);
}
Ing.Tomarchio,Ing.Testa
Fondamenti di Informatica
14
Esercizio 4: Leggere N numeri e scrivere la loro somma
Dati di Input: N, ed N numeri
Dati di Output: S (somma di questi N numeri)
Ing.Tomarchio,Ing.Testa
Fondamenti di Informatica
15
START
Esempio 4
leggi N
I=1
S=0
I <= N
F
V
scriv i S
leggi NUM
S = S + NUM
END
I =I+ 1
Ing.Tomarchio,Ing.Testa
Fondamenti di Informatica
16
Esempio 4: pseudocodice
leggi N
I=1
S=0
WHILE (I <= N) {
leggi NUM
S = S + NUM
I=I+1
}
scrivi S
Ing.Tomarchio,Ing.Testa
Fondamenti di Informatica
17
Esempio 4: codifica in C
(uso del while)
#include <stdio.h>
main () {
int N, S, i, num;
printf(“Somma di N numeri interi\n\n”);
printf(“Inserisci N: “);
scanf(“%d”, &N);
i = 1;
S = 0;
while (i <= N) {
printf(“Inserisci il numero %d : “,i);
scanf(“%d”, &num);
S = S + num;
i++;
}
printf(“La somma vale: %d”, S);
}
Ing.Tomarchio,Ing.Testa
Fondamenti di Informatica
18
Esempio 4: codifica in C
(uso del for)
#include <stdio.h>
main () {
int N, S, i, num;
printf(“Somma di N numeri interi\n\n”);
printf(“Inserisci N: “);
scanf(“%d”, &N);
for(i=1, S=0; i <= N; i++) {
printf(“Inserisci il numero %d : “,i);
scanf(“%d”, &num);
S = S + num;
}
printf(“La somma vale: %d”, S);
}
Ing.Tomarchio,Ing.Testa
Fondamenti di Informatica
19
Esercizio 5: Scrivere il valore massimo di una sequenza
illimitata di interi positivi chiusa da uno zero
Dati di Input: N1, N2, N3, ….., 0
Dati di Output: MAX (valore massimo dei
precedenti numeri letti da input)
Ing.Tomarchio,Ing.Testa
Fondamenti di Informatica
20
START
MAX = 0
Esempio 5
leggi N
V
N > MAX ?
F
F
MAX = N
N <> 0 ?
V
F
scrivi MAX
END
Ing.Tomarchio,Ing.Testa
Fondamenti di Informatica
21
Esempio 5: pseudocodice
MAX = 0
DO {
leggi N
IF (N > MAX) MAX = N
} WHILE (N <> 0)
scrivi MAX
Ing.Tomarchio,Ing.Testa
Fondamenti di Informatica
22
Esempio 5: codifica in C
#include <stdio.h>
main () {
int N, MAX;
MAX = 0;
do {
printf(“Inserisci un valore intero positivo
(0 per finire)\n”);
scanf(“%d”, &N);
if (N > MAX) MAX = N;
} while (N != 0);
printf(“Il massimo dei valori inseriti e’: %d \n”,MAX);
}
Ing.Tomarchio,Ing.Testa
Fondamenti di Informatica
23
Esercizio 6: Dato un intero N>1, scrivere una sola volta
tutti i suoi fattori primi (supponendo di avere a
disposizione l’operatore di divisione intera)
Dati di Input: N
Dati di Output: elenco dei fattori primi di N
• Note: l’espressione Q = (Q / D) * D se verificata mi
indica che D è un divisore di Q
Ing.Tomarchio,Ing.Testa
Fondamenti di Informatica
24
START
leggi N
Esempio 6
Q =N
GIA_SCRITTO = 0
D=2
F
Q <> 1
V
F
Q <>(Q/D)*D
V
F
GIA_SCRITTO <>1
V
D=D+1
scrivi D
GIA_SCRITTO = 0
GIA_SCRITTO = 1
Q = Q/D
END
Ing.Tomarchio,Ing.Testa
Fondamenti di Informatica
25
Esempio 6: pseudocodice
leggi N
Q=N
GIA_SCRITTO = 0
D=2
WHILE (Q <> 1) {
WHILE (Q <> (Q/D) * D ) {
D=D+1
GIA_SCRITTO = 0
}
IF (GIA_SCRITTO <> 1) {
scrivi D
GIA_SCRITTO = 1
}
Q = Q/D
}
Ing.Tomarchio,Ing.Testa
Fondamenti di Informatica
26
Esempio 6: codifica in C
#include <stdio.h>
main () {
int N, Q, D, GIA_SCRITTO;
printf(“Inserisci un numero intero positivo \n”);
do
scanf(“%d”, &N);
while (N<=0);
Q = N;
GIA_SCRITTO = 0;
D = 2;
while (Q > 1) {
while (Q != (Q/D) * D ) {
D = D + 1;
GIA_SCRITTO = 0;
}
if (GIA_SCRITTO == 0) {
printf(“divisore trovato %d \n”, D);
GIA_SCRITTO = 1;
}
Q = Q/D;
}
}
Ing.Tomarchio,Ing.Testa
Fondamenti di Informatica
27
Esercizio 7: Gioco dei fiammiferi: Da un insieme di N
fiammiferi, ciascun giocatore ne toglie a turno un
numero qualunque che vada da 1 a K; perde chi toglie
l’ultimo fiammifero
Spieghiamo la strategia e risolviamo il problema per
N=21 e K=5.
Ipotesi di base:
– vi sono due giocatori, A e B;
– il giocatore che effettua la prima mossa è sempre il calcolatore (A).
Strategia:
– Isolo 1 fiammifero, e divido i rimanenti in gruppi da 6;
– Prima mossa: tolgo i 2 fiammiferi rimasti;
– Mosse successive:tolgo un numero di fiammiferi pari al
complemento a 6 di quelli tolti dall’avversario (sempre
possibile per le ipotesi fatte)
Ing.Tomarchio,Ing.Testa
Fondamenti di Informatica
28
STA RT
Esempio 7
scrivi le regole del gioco
DFD di alto livello
scrivi "Comincio io!"
A toglie 2 f iammiferi
Ci sono ancora
fiammiferi?
F
V
scrivi "Quanti fiammiferi
vuoi togliere?"
scrivi "Ho vinto.
Vuoi giovare ancora
leggi NB
F
leggi RISP
B toglie NB fiammiferi
RISP = "sì" ?
V
A toglie (6 - NB) f iammiferi
F
Ing.Tomarchio,Ing.Testa
Fondamenti di Informatica END
29
Esempio 7: pseudocodice
(di alto livello)
scrivi le regole del gioco
DO {
scrivi “Comincio io!”
A toglie due fiammiferi
WHILE (ci sono ancora fiammiferi?) {
scrivi “Quanti fiammiferi vuoi togliere?”
leggi NB;
B toglie NB fiammiferi
A toglie (6-NB) fiammiferi
}
scrivi “Ho vinto! Vuoi giocare ancora?”
leggi RISP
} WHILE (RISP = “sì”)
Ing.Tomarchio,Ing.Testa
Fondamenti di Informatica
30
Fly UP