Esercitazione 3
Riassunto
Oggi sono stati effettuati semplici esercizi in C utilizzando le seguenti istruzioni: if...else,
while, printf, scanf
Sono state introdotte anche le seguenti relazioni:
•
•
•
•
•
•
uguaglianza: ==
minore: <
maggiore: >
minore o uguale: <=
maggiore o uguale: >=
non uguaglianza: !=
E i seguenti operatori:
•
•
•
•
•
•
•
•
addizione: +
sottrazione: moltiplicazione: *
divisione: /
resto della divisione intera: %
AND logico: &&
OR logico: ||
NOT logico: !
Nell'ambiente Dev-C++ come ultima istruzione del programma e' necessario inserire l'istruzione:
system("pause"). In questo modo il programma chiedera' di premere un tasto per continuare
prima di chiudersi.
Gli esercizi che sono stati svolti sono i seguenti:
1.
2.
3.
4.
5.
Calcolo della divisione e del resto
Calcolo del fattoriale
Calcolo del minimo comune multiplo (metodo "intuitivo")
Calcolo del massimo comun divisore (metodo di Euclide)
Test per verificare se un numero e' primo
Esercizio 1 (calcolo della divisione e del resto)
Scrivere un programma che chieda l'inserimento di due numeri e calcoli la divisione intera e il resto. Si
visualizzi un messaggio di errore se l'operazione non e' possibile.
Soluzione
Pseudocodice
1. Leggo due numeri a e b
2. Se b e' uguale a zero stampo un messaggio di errore e vado al punto 4
3. Stampo su schermo la divisione e il resto
4. Fine
Codice
#include <stdio.h>
void main() {
int x,y;
printf("Inserire due numeri: ");
scanf("%d %d",&x,&y);
if (y!=0)
printf("%d diviso %d fa %d col resto di %d\n",x,y,x/y,x%y);
else
printf("Errore: divisione per zero!\n");
system("pause");
}
Esecuzione
Inserire due numeri: 16 7
16 diviso 7 fa 2 col resto di 2
Press any key to continue . . .
Inserire due numeri: 8 0
Errore: divisione per zero!
Press any key to continue . . .
Esercizio 2 (calcolo del fattoriale)
Scrivere un programma che chieda l'inserimento di un numero e che ne calcoli il fattoriale. Si assuma
che l'utente non inserira' mai numeri negativi.
Soluzione
Pseudocodice
1.
2.
3.
4.
5.
6.
7.
8.
9.
Codice
Leggo un numero n
Assegno 1 al risultato che chiamo ris
Indico con i un altro numero che uso come contatore e gli assegno valore 2
Se i e' maggiore di n vado al punto 8
Assegno a ris il suo valore moltiplicato per i
Incremento i di un'unita'
Torno al punto 4
Stampo il valore di ris
Fine
#include <stdio.h>
void main() {
int n, i=2, ris=1;
printf("Inserire un numero non negativo: ");
scanf("%d",&n);
}
while (i<=n)
{
ris=ris*i;
i=i+1;
}
printf("Il fattoriale di %d e': %d\n",n,ris);
system("pause");
Esecuzione
Inserire un numero non negativo: 0
Il fattoriale di 0 e': 1
Press any key to continue . . .
Inserire un numero non negativo: 4
Il fattoriale di 4 e': 24
Press any key to continue . . .
Esercizio 3 (calcolo del minimo comune multiplo con metodo "intuitivo")
Scrivere un programma che chieda l'inserimento di due numeri e che calcoli il minimo comune
multiplo. Si assuma che l'utente inserira' sicuramente numeri positivi.
Soluzione
Nota: La soluzione proposta in questo esercizio non e' efficiente, ma dato che e' intuitiva e facilmente
ricavabile e' comunque utile a scopo didattico.
Pseudocodice
1. Leggo due numeri a e b
2. Indico con ma e mb i multipli di a e di b
3. Assegno a ma il valore di a
4. Assegno a mb il valore di b
5. Se ma e' uguale a mb vado al punto 9
6. Se ma e' maggiore di mb incremento mb di b unita'
7. Se ma e' minore di mb incremento ma di a unita'
8. Torno al punto 5
9. Stampo il valore di ma
10.Fine
Codice
#include <stdio.h>
void main() {
int a,b,ma,mb;
printf("Inserire due numeri positivi: ");
scanf("%d %d",&a,&b);
ma=a;
mb=b;
while (ma!=mb)
{
if (ma>mb)
mb=mb+b;
else
ma=ma+a;
}
printf("Il minimo comune multiplo tra %d e %d e': %d\n",a,b,ma);
system("pause");
}
Esecuzione
Inserire due numeri positivi: 12 16
Il minimo comune multiplo tra 12 e 16 e': 48
Press any key to continue . . .
Esercizio 4 (calcolo del massimo comun divisore con metodo di Euclide)
Scrivere un programma che chieda l'inserimento di due numeri e che calcoli il massimo comun divisore
utilizzando il metodo di Euclide, cioe' considerando che dati due numeri a e b, tali che a sia maggiore o
uguale a b, il MCD(a,b) e' uguale a b se a%b e' uguale a zero, altrimenti MCD(a,b)=MCD(b,a%b).
Si assuma che l'utente non inserira' mai valori nulli.
Soluzione
Pseudocodice
1. Leggo due numeri a e b
2. Se a e' minore di b scambio i loro valori
3. Calcolo il resto della divisione tra a e b e lo chiamo r
4. Se r e' uguale a zero vado al punto 9
5. Assegno ad a il valore di b
6. Assegno a b il valore di r
7. Ricalcolo r come resto della divisione tra a e b
8. Torno al punto 4
9. Stampo il valore di b
10.Fine
Codice
#include <stdio.h>
void main() {
int a0,b0,a,b,r;
printf("Inserire due numeri non nulli: ");
scanf("%d %d",&a0,&b0);
if (a0>b0)
{
a=a0;
b=b0;
}
else
{
a=b0;
b=a0;
}
r=a%b;
while (r!=0)
{
a=b;
b=r;
r=a%b;
}
}
printf("Il massimo comun divisore tra %d e %d e': %d\n",a0,b0,b);
system("pause");
Esecuzione
Inserire due numeri non nulli: 48 36
Il massimo comun divisore tra 48 e 36 e': 12
Press any key to continue . . .
Inserire due numeri non nulli: 14 49
Il massimo comun divisore tra 14 e 49 e': 7
Press any key to continue . . .
Esercizio 5 (Conversione di caratteri minuscoli in maiuscoli)
Data una sequenza di caratteri terminata dal carattere '0' convertire i caratteri minuscoli in maiuscoli
#include <stdio.h>
void main(){
char c;
printf("Inserisci il carattere: ");
scanf("%c*c",&c);
while(c!='0'){
if (c >='a' && c <= 'z' ){
c = c -('a' - 'A');
}
printf("\n %c \n",c);
printf("Inserisci il carattere: ");
scanf("%c*c",&c);
}
}
Esecuzione
Inserisci il carattere: a
A
Inserisci il carattere: B
B
Inserisci il carattere: <
<
Inserisci il carattere: 0
terminato
Esercizio 6 (test per verificare se un numero e' primo, non svolto in classe)
Scrivere un programma che chieda l'inserimento di un numero e dica se questo e' primo oppure no. Si
assuma che l'utente inserira' sicuramente un numero positivo diverso da 1.
Soluzione
Nota: la versione proposta in questa pagina non è efficiente poiche' tenta di dividere il numero inserito
per tutti i numeri compresi tra 2 e l'intero inferiore al numero stesso, quando invece basterebbe tentare
di dividere tra 2 e la radice quadrata del numero stesso.
Pseudocodice
1.
2.
3.
4.
5.
6.
7.
8.
9.
Leggo il numero da testare n
Creo una variabile di test p a cui assegno il valore vero
Creo una variabile i come contatore a cui assegno il valore 2
Se i e' maggiore o uguale a n, oppure se p e' falso vado al punto 8
Se il resto della divisione tra n e i vale zero assegno a p il valore falso
Incremento i di un'unita'
Torno al punto 4
Stampo il valore di p
Fine
Codice
#include <stdio.h>
void main() {
int n,i=2,p=1;
printf("Inserire un numero positivo diverso da uno: ");
scanf("%d",&n);
while (i<n)
{
if (n%i == 0)
p=0;
i=i+1;
}
if (p==1)
printf("%d e' un numero primo\n",n);
else
printf("%d non e' un numero primo\n",n);
}
system("pause");
Esecuzione
Inserire un numero positivo diverso da uno: 2
2 e' un numero primo
Press any key to continue . . .
Inserire un numero positivo diverso da uno: 51
51 non e' un numero primo
Press any key to continue . . .
Inserire un numero positivo diverso da uno: 101
101 e' un numero primo
Press any key to continue . . .