Esercizi sui cicli annidati e sulle funzioni di libreria

Ecco alcuni esercizi per allenarti!

1. Scrivere un programma in C++ che stampi tutti i divisori di ogni numero intero compreso tra due numeri scelti casualmente, estremi inclusi. Il primo numero estratto deve essere compreso tra 1 e 20, il secondo tra 30 e 50. Utilizza un doppio ciclo.

2. Creare un programma che calcoli i valori assoluti di numeri inseriti dall’utente in un array e li salvi in un altro array, che verrà infine stampato.

3. Scrivere un programma in C++ che crei la seguente figura, avente base=9:

    *
   ***
  *****
 *******
*********

4. Scrivere un programma in C++ che sposti gli elementi in un array, senza cancellarli, in modo rotatorio verso sinistra di 3 posizioni. Utilizza due cicli: quello più interno ruoterà verso sinistra il vettore di una posizione. Esempio:

Array: 2 4 6 1 3 3 2 7

Nuovo array: 1 3 3 2 7 2 4 6

Come vedi, il 7 è stato spostato di 3 posizioni verso sinistra. Il 2 dopo il primo spostamento finisce in coda all’array, dopo gli altri due si ritrova dopo il 7.

In questo esercizio ci dovranno essere due cicli: un ciclo while esterno che si eseguirà 3 volte, e un ciclo for interno che farà lo spostamento degli elementi di solamente una cella.

5. Scrivere un programma che dato un angolo in gradi come input, ne calcoli il seno, il coseno e la tangente. Dopo averli calcolati, trova il risultato della potenza seno^coseno^tangente (tripla potenza). Esempio:

Angolo inserito: 30 gradi.

Seno = 0.49977
Coseno = 0.866158
Tangente = 0.576996
Seno^coseno^tangente = 0.707057

Suggerimento: puoi inserire come parametro di una funzione… una funzione!


ESERCIZIO 1

Scrivere un programma in C++ che stampi tutti i divisori di ogni numero intero compreso tra due numeri scelti casualmente, estremi inclusi. Il primo numero estratto deve essere compreso tra 1 e 20, il secondo tra 30 e 50. Utilizza un doppio ciclo.

Innanzi tutto, bisogna trovare l’inizio e la fine della serie di numeri. In questo caso dobbiamo estrarre casualmente tra 2 numeri dati dal testo dell’esercizio.

Ricordo che per farlo occorre ricordare la “formula” rand()%a+b (dove l’inizio è la b e la fine è a+b1). Quindi, per ottenere l’inizio bisognerà utilizzare la funzione rand in questo modo: rand()%20+1, mentre per la fine: rand()%21+30.

Fatto questo bisogna passare ai due cicli: il primo (quello più esterno) scorrerà tutti i numeri dall’inizio alla fine, mentre il secondo (quello più interno) calcolerà i divisori, come già sai fare (controllare se ogni numero tra 1 e il numero è divisibile per il numero).

Ecco quindi la soluzione:

#include <iostream>
#include <stdlib.h>
#include <time.h>

using namespace std;

int main() {
	int inizio, fine;
	
	srand(time(NULL));
	
	inizio = rand()%20+1;
	fine = rand()%21+30;
	
	for (int i=inizio;i<=fine;i++) {
		cout<<"Divisori del numero "<<i<<": ";
		for (int j=1;j<=i;j++) {
			if (i%j == 0) {
				cout<<j<<" ";
			}
		}
		cout<<endl;
	}
	
	return 0;
}

Ricordati che anche 1 e il numero stesso sono divisori del numero in questione, quindi non scordarli!


ESERCIZIO 2

Creare un programma che calcoli i valori assoluti di numeri inseriti dall’utente in un array e li salvi in un altro array, che verrà infine stampato.

Leggere e scrivere su un array lo sappiamo già fare. In questo esercizio, dobbiamo prendere il contenuto di ogni singola cella dell’array e calcolarne il valore assoluto con la funzione abs().

Ecco la soluzione:

#include <iostream>
#include <math.h>

using namespace std;

int main() {
	int arr[] = {-2, 0, 4, 5, -13, 2, 0, 0, -7};
	int numElem = 9;
	
	int arrValAss[numElem];
	
	for (int i=0;i<numElem;i++) {
		arrValAss[i] = abs(arr[i]);
	}
	
	cout<<"Nuovo array: ";
	for (int i=0;i<numElem;i++) {
		cout<<arrValAss[i]<<" ";
	}
	
	return 0;
}

ESERCIZIO 3

Scrivere un programma in C++ che crei la seguente figura, avente base=9:

    *
   ***
  *****
 *******
*********

Questo esercizio è un po’ diverso dal solito. In questo caso per iniziare l’esercizio è necessario trovare l’altezza di questa figura sulla quale lavorare. L’altezza sarà per forza (base/2)+1.

Questi esercizi vanno pensati a come delle tabelle che devono essere riempite. Dove sarà necessario, stamperai uno spazio, mentre nei punti della piramide un asterisco.

Soluzione:

#include <iostream>
#include <math.h>

using namespace std;

#define BASE 9

int main() {
	int altezza;
	
	altezza = BASE/2+1;
	
	for(int i=0;i<altezza;i++) {
	
		for (int j=0;j<altezza+i;j++) {
			if (altezza-j-1>i) {
				cout<<" ";
			} else
 {
				cout<<"*";

                        }
		}
		
		cout<<endl;
	}
			
	return 0;
}

ESERCIZIO 4

Scrivere un programma in C++ che sposti gli elementi in un array, senza cancellarli, in modo rotatorio verso sinistra di 3 posizioni. Utilizza due cicli: quello più interno ruoterà verso sinistra il vettore di una posizione.

In questo esercizio ci dovranno essere due cicli: un ciclo while esterno che si eseguirà 3 volte, e un ciclo for interno che farà lo spostamento degli elementi di solamente una cella.

Ci possono essere diverse soluzioni per ruotare il vettore di una posizione verso sinistra. Una soluzione è quella di salvarsi il primo elemento dell’array, poi ad ogni elemento assegnarli il suo successivo. Una volta terminato il ciclo, assegnare all’ultimo elemento (che altrimenti conterrebbe spazzatura) il primo elemento salvato precedentemente.

Soluzione:

#include <iostream>
#include <math.h>

using namespace std;

#define MAX_ROTAZIONI 3

int main() {
	int arr[] = {2, 4, 6, 1, 3, 3, 2, 7};
	int numElem = 8;
	int temp;
	
	int i=0;
	while (i<MAX_ROTAZIONI) {
		
	    int primo = arr[0];
	    for (int j=0; j<numElem-1; j++) {
	        arr[j] = arr[j+1];
	    }
	    arr[numElem-1] = primo;
	    
	    i++;
	}
	
	cout<<"Nuovo array: ";
	for (i=0;i<numElem;i++) {
		cout<<arr[i]<<" ";
	}
}

ESERCIZIO 5

Scrivere un programma che dato un angolo in gradi come input, ne calcoli il seno, il coseno e la tangente. Dopo averli calcolati, trova il risultato della potenza seno^coseno^tangente (tripla potenza).

Per calcolare il seno, il coseno, e la tangente di un angolo basterà usare le funzioni della libreria math: sin, cos e tan. Siccome queste funzioni chiedono come parametro un numero in radianti, e l’esercizio lo richiede in gradi, passare come parametro l’espressione (angolo * 3.14 / 180).

Per calcolare invece la tripla potenza, bisognerà passare come base il seno, e come esponente la potenza tra coseno e tangente, in modo che prima calcoli la potenza tra il coseno e la tangente. Il risultato è stato ritornato e quindi può essere passato come argomento in una pow più esterna, che ha come base il seno.

Attenzione a non passare come base la potenza tra seno e coseno, e come esponente la tangente. Risulterebbe sbagliato!

Ecco la soluzione:

#include <iostream>
#include <math.h>

using namespace std;

#define PI 3.14F

int main() {
	int angolo;
	
	cout<<"Inserisci un angolo: ";
	cin>>angolo;
	
	double seno = sin(angolo * PI/180);
	double coseno = cos(angolo * PI/180);
	double tangente = tan(angolo * PI/180);
	
	double potenza = pow(seno, pow(coseno, tangente));
	
	cout<<"Seno = "<<seno<<endl;
	cout<<"Coseno = "<<coseno<<endl;
	cout<<"Tangente = "<<tangente<<endl;
	cout<<"Seno^coseno^tangente = "<<potenza;
}

Esistono solo variabili e array che contengono valori numerici? Lo scoprirai nel prossimo capitolo: i caratteri!