Trovare il maggiore e il secondo maggiore

Trovare il maggiore e il secondo maggiore

Dato un vettore numerico di N posizioni caricato in memoria trovare il maggiore e il secondo maggiore, cioè determinare il valore più grande e quello immediatamente inferiore (il secondo), indicandone l’indice.

Per realizzare questo algoritmo occorre come al solito chiedere N e fare un controllo dell’input in modo da accettare solo valori maggiori o uguali a zero.

Dopo dichiariamo il vettore e con un ciclo for inseriamo tutti gli elementi.

Creiamo una variabile max per contenere il valore massimo dell’array e una variabile max2 per l’elemento immediatamente inferiore.

Dopo creiamo anche le variabili p e p2 che tengono traccia delle posizioni dei due valori che vogliamo trovare.

Inizializziamo poi che sia max che max2 al primo elemento dell’array e le due variabili p e p2 a 0, cioè all’indice del primo elemento dell’array.

Poi con un ciclo for scorriamo l’array e controlliamo se il valore contenuto nell’elemento a[i] è maggiore del massimo. Se è vero prima di scambiare il valore massimo assegniamo a max2 il valore di max e all’indice p2 il valore di p.

Questo perché qualunque valore contenesse max2 era comunque inferiore al max. Infatti se si trova un nuovo massimo comunque il vecchio massimo sarà maggiore del valore contenuto in max2.

Se invece a[i] non è maggiore del massimo, occorre con un altro if controllare se questo valore è maggiore di max2.


Funzionamento algoritmo per trovare il maggiore e il secondo maggiore

Dunque ipotizziamo di avere questo array:

massimo e precedente

max=a[0]=6 e max2=a[0]=6

p=0 e p2=0 cioè sono entrambi inizializzati al primo indice.

Prima iterazione: a[1]=6

si valuta la condizione dell’if: a[1] > max cioè 12>6

L’espressione risulta vera allora possiamo eseguire le operazioni specificate all’interno dell’if e cioè:

max2=max=6 e p2=0  (in questo caso non cambia il valore precedentemente assegnato a max2).

Poi si avrà max=a[1]=12

e si aggiorna anche p: p=1

L’else if quindi non viene eseguita

Seconda iterazione: a[2]=10

si valuta la condizione dell’if: a[2] > max cioè 10>12

L’espressione risulta falsa allora si valuta l’istruzione else if.

L’espressione else if risulta vera quindi:

max2=a[2]=10 e p2=2

Terza iterazione: a[3]=23

si valuta la condizione dell’if: a[3] > max cioè 23>12

L’espressione risulta vera allora possiamo eseguire le operazioni specificate all’interno dell’if e cioè:

max2=max=12 e p2=p=1

Poi si avrà max=a[3]=23

e si aggiorna anche p: p=3

L’else if quindi non viene eseguita.

Abbiamo terminato ottenendo:

max=23 e p=3

max2=12 e p2=1

Ecco quindi l’algoritmo per trovare il maggiore e il secondo maggiore in C++

#include<iostream>
using namespace std;

int main() {
	int N,max,max2,p,p2;
	
	do {
		cout<<"Inserisci N: ";
		cin>>N;
	}while (N<=0);
	
	int a[N];
	
	for (int i=0;i<N;i++) {
		cout<<"Inserisci un numero: ";
		cin>>a[i];
	}
	
	max=a[0];
	max2=a[0];
	p=0;
	p2=0;
	
	for (int i=1;i<N;i++) {
		if (a[i]>max) {
			max2=max;
			p2=p;
			max=a[i];
			p=i;
		}
		else if (a[i]>max2) {
			max2=a[i];
			p2=i;

		}
				
		cout<<max;
	}
	
	
	cout<<"\nIndice: "<<p<<"\tvalore: "<<max;
	cout<<"\nIndice: "<<p2<<"\tvalore: "<<max2;

	return 0;
	
}

Si può anche ottimizzare in questo modo:

for (int i=1;i<N;i++) {
	if (a[i]>max2) {
		if (a[i]>max) {
		max2=max;
		p2=p;
		max=a[i];
		p=i;
	}
	else {
		max2=a[i];
		p2=i;
	   }
	}

Difatti se il primo test è falso possiamo proseguire senza fare altro.

Alcuni link utili

Indice argomenti linguaggio C++

Array o vettori in C++

Approfondimento vettori in C++

Esercitazione sugli array in C++

Massimo elemento di un vettore

Esercizi con gli array

Ricerca sequenziale in C++

Ricerca in un array ordinato

Array con numeri random

Ricerca binaria

Morra cinese con Scratch 3

Morra cinese con Scratch 3

In questa lezione proponiamo il gioco della morra cinese con Scratch 3.


Come si gioca a morra cinese?

Gli strumenti utilizzati sono le mani dei giocatori e ciascun giocatore può scegliere un oggetto: forbice (f), sasso (s) o carta (c).

– Il Sasso, si rappresenta con la mano a pugno;

– La Carta, si rappresenta con la mano aperta;

– Le Forbici, si rappresentano con soli indice e medio distesi.


Se si gioca lo stesso simbolo si è in parità, altrimenti:

Il sasso batte la forbice, cioè la rompe;

La forbice batte la carta, cioè la taglia;

La carta batte il sasso, cioè lo avvolge.


Esempio del gioco della morra cinese con Scratch 3

Procedimento del gioco della Morra Cinese

Innanzitutto scegliamo uno sfondo ed uno sprite a piacere.

Dopo creiamo le variabili necessarie, in questo caso i due giocatori: computer e utente.

variabili morra cinese

Quindi generiamo un numero a caso e lo memorizziamo nella variabile computer.

random morra

Dopo chiediamo all’utente per semplicità di inserire una lettera: s per sasso, f per forbice e c per carta. Quindi salviamo il carattere immesso da tastiera nella variabile utente.

gioco scratch

Dopo con l’istruzione se allora altrimenti verifichiamo queste condizioni:

Se il computer ha generato 1 allora alla variabile computer assegniamo la lettera s.

Altrimenti se il computer ha generato 2 allora alla variabile computer assegniamo la lettera c.

Altrimenti alla variabile computer assegniamo la lettera f.

Questo passaggio è fondamentale per semplificare poi i confronti che faremo più avanti.

morra cinese

Adesso non ci resta che impostare le regole del gioco.

Quindi se computer = utente allora si ha la parità in quanto entrambi hanno giocato la stessa cosa.

L’utente vince in questi casi:

se utente= s e computer = f oppure

invece se utente= f e computer = c oppure

infine se utente= c e computer = s

Altrimenti vince il computer.

 

Ecco dunque il codice completo:

script completo

Provate a giocare più partite creando un ciclo che si ripete tante volte quante le partite desiderate. Per chi non sa usare anche i cicli si rimanda alla lezione successiva sui cicli.

Alcuni link utili

Indice tutorial Scratch 3.0

Indice argomenti Scratch 2.0

Numeri primi in Scratch

Massimo fra tre numeri in Scratch

Minimo tra 3 numeri in Scratch

Numeri perfetti con algobuild

Numeri amicabili

Selecion sort in Scratch

Esempio di successione di Fibonacci con Algobuild

La successione di Fibonacci in C++

Esercizi vettori C++

Esercizi vettori C++

Esercizi vettori C++. In questa lezione lezione affronteremo alcuni esercizi sui vettori al fine di consolidare l’argomento.

Esercizi vettori C++ – Primo esercizio

Inseriamo in un vettore di N elementi il valore del suo indice. Stampiamo poi il vettore e le sue posizioni.

Innanzitutto chiediamo all’utente di inserire N e facciamo un controllo dell’input per accettare solo valori maggiori o uguali a 0. Utilizziamo quindi per questo scopo un ciclo do-while.

Dopo con un indice i scorriamo il vettore e inseriamo il valore del suo indice. Per realizzare ciò basterà inserire all’interno del ciclo:

v[i]=i;

Quindi si avrà che v[0]=0, v[1]=1 e così via.

vettori indice

Dopo visualizziamo il vettore in ordine crescente e decrescente, stampando anche il valore dell’indice.

Ecco dunque il codice completo:

#include<iostream>
using namespace std;

int main() {
	int N,s;
	
	do {
		cout<<"Inserisci N: ";
		cin>>N;
	}while (N<=0);
	
	int v[N];
	
	for (int i=0;i<N;i++) {
		v[i]=i;
	}
	
	cout<<"Ordine crescente!\n";
	for (int i=0;i<N;i++) {
		cout<<"Elemento in posizione: "<<i<<" valore: "<<v[i]<<endl;
	}
	
	cout<<"\nOrdine decrescente!\n";
	for (int i=N-1;i>=0;i--) {
		cout<<"Elemento in posizione: "<<i<<" valore: "<<v[i]<<endl;
	}

	return 0;
	
}

Secondo esercizio

Inseriamo in un vettore di N elementi il valore da 0 ad N, ma partendo da destra. Stampiamo poi il vettore e le sue posizioni.

Quindi se N è uguale a 5 allora si avrà:

esercizi sui vettori in C++

L’esercizio è una variazione di quello precedente, basta infatti sostituire il ciclo for:

for (int i=0;i<N;i++) {
	v[i]=i;
}

Con questo:

for (int i=0;i<N;i++) {
	v[i]=N-1-i;
}

Cioè basta assegnare all’elemento v[i] il valore di N-1 meno l’indice i.

Terzo esercizio sui vettori C++

Inseriamo da tastiera in un vettore di N elementi i multipli di 3. Stampiamo poi il vettore in ordine crescente e decrescente.

Considerando che l’indice i si incrementa di volta in volta, basta inserire nell’elemento v[i] il valore dell’indice i più 1 e poi moltiplicarlo per 3.

L’unica cosa che cambia sarà dunque questo ciclo:

for (int i=0;i<N;i++) {
	v[i]=(i+1)*3;
}

Ecco dunque il codice completo:

#include<iostream>
using namespace std;

int main() {
	int N,s;
	
	do {
		cout<<"Inserisci N: ";
		cin>>N;
	}while (N<=0);
	
	int v[N];
	
	for (int i=0;i<N;i++) {
		v[i]=(i+1)*3;
	}
	
	cout<<"Ordine crescente!\n";
	for (int i=0;i<N;i++) {
		cout<<"Elemento in posizione: "<<i<<" valore: "<<v[i]<<endl;
	}
	
	cout<<"\nOrdine decrescente!\n";
	for (int i=N-1;i>=0;i--) {
		cout<<"Elemento in posizione: "<<i<<" valore: "<<v[i]<<endl;
	}

	return 0;
}

Questi sono solo alcuni esercizi sui vettori in C++, nelle prossime lezioni ne proporrò degli altri.

Alcuni link utili

Indice argomenti linguaggio C++

Array o vettori in C++

Approfondimento vettori in C++

Esercitazione sugli array in C++

Massimo elemento di un vettore

Esercizi con gli array

Ricerca sequenziale in C++

Ricerca in un array ordinato

Array con numeri random

Ricerca binaria

I vettori in C++

I vettori in C++

Abbiamo già visto come utilizzare i vettori in C++, in questa lezione faremo un riepilogo di quanto appreso.


I Vettori in C++ – Primo esercizio

Caricare un vettore di N elementi con numeri interi inseriti da tastiera.

Si dichiara un intero N e si chiede all’utente di inserire il valore da tastiera. Con un ciclo do-while controlliamo questo valore e se è minore o uguale a 0, richiediamo l’inserimento.

Dopo dichiariamo un vettore di N elementi int v[N].

Poi con un ciclo for, con un indice i che scorre il vettore dalla prima posizione, inseriamo gli elementi.

Supponendo che N è 5, inseriamo i seguenti valori da tastiera: 3, 5, 12, -2, 9.

Partendo da sinistra si avrà dunque:

v[0]=3, v[1]=5, v[2]=12, v[3]=-2, v[4]=9.

L’indice varia da 0 a 4 (cioè N-1).

Ecco dunque cosa otterremo:

vettori inserimento

Scriviamo quindi l’algoritmo in C++:

#include<iostream>
using namespace std;

int main() {
	int N;
	
	do {
		cout<<"Inserisci N: ";
		cin>>N;
	}while (N<=0);
	
	int v[N];
	
	for (int i=0;i<N;i++) {
		cout<<"Inserisci un numero: ";
		cin>>v[i]; 
	}

	return 0;
}

Notate questa istruzione

cin>>v[i]; 

Molte volte vedo fare:

cin>>n;
v[i]=n

Non è necessario utilizzare una variabile n per inserire elementi nel vettore, basta scrivere il dato inserito da tastiera direttamente nel vettore.

Secondo esempio sui vettori in C++

Visualizzare il vettore precedentemente caricato dalla prima all’ultima posizione.

Per visualizzare il vettore basta realizzare un ciclo for che parte dalla prima posizione fino all’ultima e per ogni iterazione si stampa l’i-esimo elemento.

Quindi aggiungete il codice che segue all’algoritmo precedente poco prima del return 0.

cout<<"Visualizzo gli elementi!\n";
	for (int i=0;i<N;i++) {
		cout<<v[i]<<'\t';
	}

N.B. Se invece volessimo visualizzare gli elementi dall’ultima posizione del vettore alla prima, potremmo far partire l’indice da N-1 e a mano a mano decrementarlo fino ad arrivare a 0.

Ecco dunque la soluzione. Inserite il codice anche sotto il precedente per vedere la differenza.

cout<<"Visualizzo gli elementi a partire dall'ultimo numero'!\n";
	for (int i=N-1;i>=0;i--) {
		cout<<v[i]<<'\t';
	}

Terzo esempio – Modificare elementi di un vettore

Utilizziamo i vettori in C++ per modificare gli elementi in esso presenti.

Inserire N elementi in un vettore, visualizzarli in ordine crescente. Dopo modificare solo gli elementi pari moltiplicandoli per 3 e visualizzare gli elementi in ordine decrescente.

Quindi ripetiamo i passaggi fatti nel primo esercizio per inserire gli elementi nel vettore.

Dopo visualizziamo il vettore così come spiegato nell’esempio 2.

Poi modifichiamo solo gli elementi pari del vettore e li moltiplichiamo per 3. Attenzione non gli elementi con indice pari!

Infine visualizziamo il vettore in ordine inverso così come spiegato nell’esempio 2.

Ecco il codice completo:

#include<iostream>
using namespace std;

int main() {
	int N;
	
	do {
		cout<<"Inserisci N: ";
		cin>>N;
	}while (N<=0);
	
	int v[N];
	
	for (int i=0;i<N;i++) {
		cout<<"Inserisci un numero: ";
		cin>>v[i];
	}
	
	cout<<"Visualizzo gli elementi!\n";
	for (int i=0;i<N;i++) {
		cout<<v[i]<<'\t';
	}
	
	for (int i=0;i<N;i++) {
		if (v[i]%2==0)
			v[i]*=3;
	}
	
	cout<<"\nVisualizzo gli elementi modificati!\n";
	for (int i=N-1;i>=0;i--) {
		cout<<v[i]<<'\t';
	}

	return 0;
	
}

Quarto esempio

In questo esempio modifichiamo gli elementi con indice dispari aggiungendo il valore 100. Visualizzarli poi in ordine decrescente.

L’esercizio è molto simile al precedente, basta cambiare questo punto:

for (int i=0;i<N;i++) {
	if (v[i]%2==0)
		v[i]*=3;
}

Con questo:

for (int i=0;i<N;i++) {
	if (i%2!=0)
		v[i]+=100;
}

Cioè non devo guardare l’elemento ma l’indice dispari. Basta controllare dunque che il resto della divisione di i diviso 2 sia diverso da zero. Se tale condizione è vera aggiungiamo all’elemento il valore 100.

Ecco il codice completo:

#include<iostream>
using namespace std;

int main() {
	int N;
	
	do {
		cout<<"Inserisci N: ";
		cin>>N;
	}while (N<=0);
	
	int v[N];
	
	for (int i=0;i<N;i++) {
		cout<<"Inserisci un numero: ";
		cin>>v[i];
	}
	
	cout<<"Visualizzo gli elementi!\n";
	for (int i=0;i<N;i++) {
		cout<<v[i]<<'\t';
	}
	
	for (int i=0;i<N;i++) {
		if (i%2!=0)
			v[i]+=100;
	}
	
	cout<<"\nVisualizzo gli elementi modificati!\n";
	for (int i=N-1;i>=0;i--) {
		cout<<v[i]<<'\t';
	}

	return 0;
	
}

Sommare gli elementi di un vettore

Utilizziamo i vettori in C++ per effettuare la somma degli elementi.

Inseriamo N elementi in un vettore. Li sommiamo e visualizziamo poi il vettore in ordine crescente e la somma.

Quindi in definitiva ripetiamo alcuni passaggi già visti per l’inserimento degli elementi nel vettore.

Poi con un ciclo for sommiamo gli elementi in una variabile s, precedentemente inizializzata a 0, e li visualizziamo.

Infine visualizziamo la somma.

Ecco dunque il codice completo:

#include<iostream>
using namespace std;

int main() {
	int N,s=0;
	
	do {
		cout<<"Inserisci N: ";
		cin>>N;
	}while (N<=0);
	
	int v[N];
	
	for (int i=0;i<N;i++) {
		cout<<"Inserisci un numero: ";
		cin>>v[i];
	}
	
	cout<<"Visualizzo gli elementi!\n";
	for (int i=0;i<N;i++) {
		cout<<v[i]<<'\t';
		s+=v[i];
	}

	cout<<"\nLa somma e': !\t"<<s;


	return 0;
	
}

Nella prossima lezione proporrò ancora alcuni esercizi su come utilizzare i vettori in C++.

Alcuni link utili

Indice argomenti linguaggio C++

Alcuni link utili

Indice argomenti linguaggio C++

Array o vettori in C++

Esercitazione sugli array in C++

Massimo elemento di un vettore

Esercizi con gli array

Ricerca sequenziale in C++

Ricerca in un array ordinato

Array con numeri random

Ricerca binaria

Esercizi svolti diagrammi di flusso

Esercizi svolti diagrammi di flusso

Proponiamo due semplici esercizi svolti con i diagrammi di flusso.

Primo esercizio svolto diagrammi di flusso

Proponiamo un primo esercizio con i diagrammi di flusso.

Dati due numeri A e B verificare se A è il quadrato di B.

Prendiamo in input A e B utilizzando il parallelogramma.

Dopo utilizzare il rombo per verificare se A è uguale al quadrato di B. Cioè poniamo come test: A==B*B.

Se la condizione è vera visualizziamo semplicemente in output, utilizzando il parallelogramma, il messaggio ‘A è il quadrato di B‘.

Altrimenti se la condizione è falsa visualizziamo in output il messaggio: ‘A non è il quadrato di B‘.

Ecco dunque il diagramma a blocchi:

esercizio svolto diagrammi di flusso

Secondo esercizio

Date le dimensioni di due rettangoli calcolarne l’area e determinare quale dei due ha la superficie maggiore.

Per risolvere questo algoritmo dobbiamo prendere in input i dati necessari per calcolare l’area dei due rettangoli.

Quindi prendiamo in input:

b1 – indica la base del primo rettangolo

h1 – indica l’altezza del primo rettangolo

b2 – indica la base del secondo rettangolo

h2 – indica l’altezza del secondo rettangolo

Dopo calcoliamo l’area dei due rettangoli utilizzando due variabili A1 e A2.

Infine confrontiamo le due aree così ottenute per vedere quale delle due è maggiore. Quindi se A1 è maggiore di A2 scriviamo che A1 è maggiore. Altrimenti non possiamo ancora dire che A2 è maggiore di A1 in quanto dobbiamo verificare se sono uguali.

Ecco quindi il diagramma di flusso che rappresenta l’algoritmo proposto.

Notate che abbiamo messo le 4 variabili b1, h1, b2 e h2 per comodità nello stesso input.

esercizio diagramma di flusso

Ho presentato alcuni esercizi svolti sui diagrammi di flusso, nelle prossime lezioni ne presenterò degli altri.

Alcuni link utili

Indice tutorial diagrammi a blocchi

1 – Diagramma a blocchi

2 – Primi esercizi con i diagrammi di flusso (perimetro triangolo; area di un trapezio)

3 – Altro semplice esercizio sui flow chart (calcolare uno sconto)

4 – Area del cerchio

5 – Precedente e successivo di un numero

6 – Introduzione agli algoritmi di selezione

7 – Minore tra due numeri

8 – Maggiore fra tre numeri

9 – Algoritmo di selezione sugli angoli