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 . . .