Procediamo adesso con lo sviluppo dell’algoritmo in C++.
Innanzitutto chiediamo quanti numeri vogliamo inserire, cioè il nostro N, e facciamo un controllo dell’input.
Quindi chiediamo di inserire un numero e lo assegniamo alla variabile max.
Perciò inizializziamo la variabile conta_max a 1.
Dopo utilizziamo il ciclo while, impostando la condizione i<N e all’interno implementiamo le istruzioni che servono per la ricerca del valore massimo.
Poi si inserisce un altro numero e lo si confronta col max. Se questo valore è maggiore allora si trova un nuovo max e dunque alla variabile conta_max assegno nuovamente il valore 1. Altrimenti se si trova un valore uguale al max, la variabile conta_max viene incrementata di 1.
Ecco dunque il codice completo:
#include <iostream>
using namespace std;
int main() {
int i, N, max, n, conta_max;
do {
cout << "Quanti numeri vuoi inserire? : ";
cin >> N;
} while (N <= 0);
i = 0;
cout << "Inserisci il primo numero: ";
cin >> max;
conta_max = 1;
while (i < N - 1) {
cout << "Inserisci il numero: ";
cin >> n;
if (n > max) {
max = n;
// se trova un nuovo max riporta la variabile a 1
conta_max = 1;
} else if (n == max) {
conta_max++;
}
i++;
}
cout << "Il massimo è " << max << " ed è stato inserito " << conta_max << " volte." << endl;
return 0;
}
Possiamo anche evitare la variabile contatore i se usiamo la condizione while(N>1) e decrementiamo di volta in volta N di 1.
#include <iostream>
using namespace std;
int main() {
int N, max, n, conta_max = 1;
do {
cout << "Quanti numeri vuoi inserire? : ";
cin >> N;
} while (N <= 0);
cout << "Inserisci il primo numero: ";
cin >> max;
while (N > 1) {
cout << "Inserisci il numero: ";
cin >> n;
if (n > max) {
max = n;
conta_max = 1;
// se trova un nuovo max riporta la variabile a 1
} else if (n == max) {
conta_max++;
}
N--;
}
cout << "Il massimo è " << max << " ed è stato inserito " << conta_max << " volte." << endl;
return 0;
}
Questo era solo un esempio di possibile implementazione dell’algoritmo per trovare il maggiore e quante volte ricorre in C++.
In questa lezione propongo un’esercitazione sul while e do-while in C++, in modo da imparare meglio ad utilizzare entrambi i cicli.
Primo esercizio – Esercitazione sul while e do-while in C++
Leggere una sequenza di numeri reali, determinare quanti valori sono interi, cioè senza la parte decimale ed effettuarne il conteggio di entrambi. Terminare la lettura quando si incontra un valore uguale a 9999.
Per risolvere questo algoritmo innanzitutto dichiariamo le variabili che ci servono:
float n – Rappresentano i numeri che di volta in volta inserirò.
int interi = 0 – Il contatore dei numeri interi.
int decimali = 0 – Il contatore dei numeri decimali.
Dopo aver fatto ciò, diamo un messaggio in output che spiega come terminare il programma.
Dunque realizziamo un ciclo do while, che termina quando la condizione n!=9999 diventa falsa. All’interno del ciclo inserisco un numero e controllo se corrisponde al numero intero n con l’operatore di casting. Se tale condizione è vera allora incremento il contatore degli interi, altrimenti incremento il contatore dei decimali.
Al termine visualizzo quanti numeri decimali e quanti interi sono stati inseriti.
#include <iostream>
using namespace std;
int main() {
float n;
int interi = 0, decimali = 0;
cout << "Inserisci dei numeri, digita 9999 per terminare l'immissione!" << endl;
while (true) {
cout << "Inserisci un numero: ";
cin >> n;
if (n == 9999) {
break;
}
if (n == int(n)) {
interi++;
} else {
decimali++;
}
}
cout << "Interi: " << interi << endl;
cout << "Decimali: " << decimali << endl;
return 0;
}
Adesso provate voi a risolvere lo stesso esercizio con il while e provate a comparare i due metodi.
Secondo esercizio
Continuiamo la nostra esercitazione sul while e do-while in C++, proponendo un altro esercizio.
Leggere da tastiera un numero imprecisato di coppie di numeri interi. Terminare la lettura quando almeno uno dei due termini risulta uguale a zero. Contare le coppie che hanno il prodotto multiplo di un numero intero K.
Realizziamo questo algoritmo con il while e lascio a voi la realizzazione con il do while per comparare i due metodi.
Abbiamo bisogno delle seguenti variabili:
int a, b – Rappresentano le coppie di numeri che di volta in volta inserirò.
int k– Rappresenta l’intero per cui occorre calcolare se il prodotto della coppia è un suo multiplo.
int count = 0 – Il contatore dei numeri multipli dell’intero k.
int p – La variabile che contiene il prodotto delle coppie.
Dopo aver dichiarato le variabili, procediamo a prendere in input i dati necessari. Dunque, visto che utilizziamo il while, occorre prendere in input una coppia di numeri. Poi impostiamo la seguente condizione: while (a != 0 && b != 0) cioè finché a e b sono diversi da 0, continuo ad inserire i numeri, faccio il prodotto e controllo se questo è multiplo di k. Se è multiplo allora incremento la variabile i.
Infine visualizzo in output il risultato ottenuto.
#include <iostream>
using namespace std;
int main() {
int k;
int count = 0;
cout << "Inserisci il multiplo: ";
cin >> k;
int a, b;
cout << "Inserisci il primo numero: ";
while (cin >> a) {
cout << "Inserisci il secondo numero: ";
if (!(cin >> b)) {
break; // Se l'input non è un numero, esci dal ciclo
}
if (a == 0 || b == 0) {
break; // Se uno dei numeri è zero, esci dal ciclo
}
int p = a * b;
if (p % k == 0) {
count++;
}
cout << "Inserisci il primo numero: ";
}
cout << "Multipli di " << k << " sono " << count << endl;
return 0;
}
Come vi dicevo sviluppate adesso voi lo stesso algoritmo con il ciclo do-while. Quale secondo voi è la soluzione migliore?
Questa è solo una semplice esercitazione sul while e do-while in C++, nelle prossime lezioni faremo altri esempi.
In questa lezione risolveremo alcuni esercizi sul ciclo do-while in C++, al fine di comprendere meglio come poterlo utilizzare nei nostri algoritmi.
Primo esercizio sul ciclo do-while in C++
Scrivere un programma che mostra a video i numeri pari compresi tra 0 e 100 in ordine decrescente, cioè da 100 a 0.
Per la realizzazione del seguente algoritmo inizializziamo una variabile n a 100. Dopo, con un ciclo do-while che itera finché n è maggiore o uguale a zero, stampiamo n e dopo lo decrementiamo di 2.
#include <iostream>
using namespace std;
main() {
int n=100;
do {
cout<<n<<"\t";
n-=2;
} while (n>=0);
return 0;
}
Lo stesso esercizio sviluppato con il ciclo while:
#include <iostream>
using namespace std;
main() {
int n=100;
while (n>=0){
cout<<n<<"\t";
n-=2;
}
return 0;
}
Secondo esercizio
Leggere e sommare una quantità indefinita di numeri reali finché‚ la loro somma diventa uguale a zero.
Innanzitutto dichiariamo una variabile float per i numeri reali e inizializziamo la somma a zero. Dopo, con un ciclo do-while, inseriamo i numeri e li sommiamo. Appena la somma diventa zero usciamo fuori dal ciclo.
Inserire una serie di numeri interi e sommarli. Interrompere l’immissione al sesto valore pari e visualizzare quindi in output la somma ottenuta.
Per realizzare questo algoritmo innanzitutto utilizziamo una variabile intera n, che rappresenta i numeri in input, una variabile p che serve a contare i numeri pari inseriti e una variabile s per sommare tutti i valori inseriti.
Quindi impostiamo la condizione, finché n è diverso da 6, e all’interno del ciclo do-while chiediamo di inserire un numero in input e se pari incrementiamo il contatore dei pari.
#include <iostream>
using namespace std;
main() {
int n, p=0, s=0;
do {
cout<<"Inserisci un numero: ";
cin>>n;
s+=n;
if(n%2==0)
p++;
} while(p!=6);
cout<<"Somma: "<<s;
return 0;
}
Lo stesso algoritmo si poteva risolvere con un ciclo while.
Ecco quindi, di seguito, una possibile soluzione con il while:
#include <iostream>
using namespace std;
main() {
int n, p=0, s=0;
while(p!=6){
cout<<"Inserisci un numero: ";
cin>>n;
s+=n;
if(n%2==0)
p++;
}
cout<<"Somma: "<<s;
return 0;
}
Questi sono solo alcuni semplici esercizi sul ciclo do-while in C++, nelle prossime lezioni, approfondiremo ancora l’argomento.
In questa lezione svilupperemo alcuni esempi di algoritmi proposti alle olimpiadi di problem solving per la scuola superiore di primo grado in linguaggio C++.
Problem solving – primo esempio
Consideriamo dunque questo programma scritto in pseudolinguaggio:
procedure ALFA;
variables A, B, K, K1, H integer;
A ← 2;
K ← 7;
input B;
H ← A + K + B;
K1 ← A + B;
B ← A + H + K1;
output H, B, K1;
endprocedure;
Il valore di input per B è 10, determinare dunque i valori di output per H, B e K1.
Risoluzione del problema
Calcoliamo i vari passaggi:
A ← 2; A=2
K ← 7; K=7
input B; B=10 //inseriamo il valore richiesto dal problema
H ← A + K + B; H=2+7+10=19
K1 ← A + B; K1=2+10=12
B ← A + H + K1; B=2+19+12=33
Quindi i valori visualizzati in output sono:
H=19; K1=12; B=33
Adesso risolviamo questo algoritmo in C++.
L’algoritmo è molto semplice da realizzare, infatti si tratta di una struttura sequenziale che non ricorre a nessuna istruzione condizionale o iterativa.
#include <iostream>
using namespace std;
int main() {
int A, K, K1, B, H;
A = 2;
K = 7;
cout << "Inserisci B, metti 10 per provare l'esempio specifico: ";
cin >> B;
H = A + K + B;
K1 = A + B;
B = A + H + K1;
cout << "H vale: " << H << endl;
cout << "B vale: " << B << endl;
cout << "K1 vale: " << K1 << endl;
return 0;
}
Quindi compilate ed eseguite, l’output sarà proprio quello che abbiamo specificato nell’esempio sopra.
Problem solving – Secondo esempio
Consideriamo adesso questo programma scritto in pseudolinguaggio:
procedure BETA;
variables A, B, C, M, N integer;
input A, B, C;
M ← A;
N ← A;
if B > M
then M ← B;
else N ← B;
endif;
if C > M
then M ← C;
else N ← C;
endif;
output M, N;
endprocedure;
I valori di input per A, B e C sono rispettivamente 15, 21, 19. Determinare dunque i valori di output per M e N.
Risoluzione
input A, B, C; Inseriamo A=15, B=21, C=19
M ← A; M=15;
N ← A; N=15;
if B > M si ha quindi 21>15vero
then M ← B; allora M=21;
else N ← B; //chiaramente non viene eseguita questa istruzione
endif;
if C > M si ha quindi 19>21falso
then M ← C; //questa istruzione non viene eseguita
else N ← C; N=19
endif;
output M, N; visualizza in output 21,19
Adesso implementiamo l’algoritmo in C++. Stavolta occorrono le istruzioni condizionali, ma la struttura è molto semplice.
#include <iostream>
using namespace std;
void beta() {
int A, B, C, M, N;
cout << "Inserisci A: ";
cin >> A;
cout << "Inserisci B: ";
cin >> B;
cout << "Inserisci C: ";
cin >> C;
M = A;
N = A;
if (B > M)
M = B;
else
N = B;
if (C > M)
M = C;
else
N = C;
cout << "M: " << M << endl;
cout << "N: " << N << endl;
}
int main() {
beta(); // Chiamata alla procedura beta
return 0;
}
Questi sono solo alcuni esempi di problem solving proposti alle olimpiadi nella scuola secondaria di primo grado.
Oltre all’operatore di assegnazione semplice esistono anche gli operatori di assegnazione composti, che consentono di modificare il valore di una variabile con una sola operazione.
+=//aggiunge e assegna
a = a + b si può scrivere a += b
-=//sottrae e assegna
a = a – b si può scrivere a -= b
*=//moltiplica e assegna
a = a * b si può scrivere a *= b
/=//divide e assegna
a = a / b si può scrivere a /= b
%=//calcola il resto della divisione e assegna
a=a % b si può scrivere a%=b
<<= //sposta a sinistra e assegna
Sposta a sinistra il primo operando di tanti bit quanti specificati nel secondo operando. Assegna al primo operando il risulto ottenuto.
>=//sposta a destra e assegna
Sposta a destra il primo operando di tanti bit quanti specificati nel secondo operando. Assegna al primo operando il risulto ottenuto.
&=//assegnazione AND bit per bit
Realizza l’AND bit per bit del primo e del secondo operando. Assegna al primo operando il risultato ottenuto.
^=//assegnazione OR bit per bit
Ottiene l’OR bit per bit del primo e del secondo operando. Assegna al primo operando il risultato ottenuto.
|=//assegnazione OR inclusivo bit per bit
Ottiene l’OR inclusivo bit per bit del primo e del secondo operando. Assegna al primo operando il risultato ottenuto.
In questa lezione sugli operatori di assegnazione in C++, abbiamo introdotto i concetti di base di questi operatori. Nelle prossime lezioni vedremo come applicarli in esempi pratici.
Chiediamo l’inserimento dei tre numeri e poi valutiamo:
a > b se è veroinseriamo un if annidato dove ci chiediamo se a è anche maggiore di c:
a > c se è vero dunque a è il maggiore;
altrimenti il maggiore chiaramente è c.
Se invece b > a è vero, inseriamo un if annidato dove controlliamo se anche b è maggiore di c.
b > c se è verodunque b è il maggiore;
altrimenti il maggiore ovviamente sarà c.
Ecco dunque l’algoritmo in C++:
#include<iostream>
using namespace std;
int main() {
int a, b, c;
cout << "Inserisci il primo numero: ";
cin >> a;
cout << "Inserisci il secondo numero: ";
cin >> b;
cout << "Inserisci il terzo numero: ";
cin >> c;
if (a > b) {
if (a > c) {
cout << "Il numero maggiore è: " << a;
} else {
cout << "Il numero maggiore è: " << c;
}
} else {
if (b > c) {
cout << "Il numero maggiore è: " << b;
} else {
cout << "Il numero maggiore è: " << c;
}
}
return 0;
}
Seconda soluzione – maggiore fra tre numeri in C++
La seconda soluzione implementa il secondo algoritmo presentato sempre in questa lezione: massimo fra tre numeri.
Questa soluzione è più snella della seconda e fa uso di una variabile max dove memorizzare il valore.
#include<iostream>
using namespace std;
int main() {
int a, b, c, max;
cout << "Inserisci il primo numero: ";
cin >> a;
cout << "Inserisci il secondo numero: ";
cin >> b;
cout << "Inserisci il terzo numero: ";
cin >> c;
max = a;
if (b > max) {
max = b;
}
if (c > max) {
max = c;
}
cout << "Il numero maggiore è: " << max;
return 0;
}
Nella terza soluzione si fa uso degli operatori logici ed in particolare dell’and.
Aggiungiamo anche il caso in cui i tre numeri siano uguali e quindi visualizziamo un messaggio opportuno in ouput.
#include<iostream>
using namespace std;
int main() {
int a, b, c;
cout << "Inserisci il primo numero: ";
cin >> a;
cout << "Inserisci il secondo numero: ";
cin >> b;
cout << "Inserisci il terzo numero: ";
cin >> c;
if (a == b && a == c) {
cout << "I tre numeri sono uguali ";
} else if (a > b && a > c) {
cout << "Il numero maggiore è: " << a;
} else if (b > c) {
cout << "Il numero maggiore è: " << b;
} else {
cout << "Il numero maggiore è: " << c;
}
return 0;
}
Ecco alcune possibili risoluzioni dell’algoritmo per la ricerca del valore massimo fra tre inseriti in C++.
Commenti recenti