Vettori in C++

Vettori in C++

In questa lezione proponiamo un esercizio sui vettori in C++.

Dato in input un array non ordinato, per ogni elemento dell’array stampare in output il successivo numero più grande. Se il numero più grande non esiste stampare in output il valore -1.

Quindi ad esempio, avendo come input:

[4, 5, 2, 25, 10]

l’output sarà pertanto:

[5 25 25 -1 -1]

Per la risoluzione di questo algoritmo sui vettori in C++, presenteremo due possibili soluzioni. Chiaramente ce ne sono delle altre, se volete potete aggiungerle nei commenti sotto.

La prima soluzione, più ovvia, ha complessità O(n2), mentre la seconda più sofisticata, ha complessità O(n) ed utilizza anche lo stack.


Prima soluzione esercizio sui vettori in C++

Nella prima soluzione dunque inizializziamo un vettore di 5 elementi e utilizziamo due cicli for.

Il ciclo più esterno scorre il vettore con un indice i che va dalla posizione 0 fino ad N-1. Mentre, il ciclo più interno utilizza un indice j che parte dalla posizione 1 fino ad arrivare ad N-1.

La variabile m rappresenta invece il valore che, di volta in volta, viene sostituito al valore corrente ed è inizializzata a -1 all’interno del ciclo più esterno.

Questa variabile non cambia valore se la condizione richiesta nel ciclo più interno non è verificata, cioè se il valore contenuto in a[i] non è minore del valore contenuto in a[j], in quanto vuol dire che non ci sono elementi maggiori.

Se invece a[i] è minore di a[j], m diventa a[j].

Ecco dunque il listato completo:

#include<iostream>
using namespace std;

#define N 5

int main() {
    int a[] = {4, 5, 2, 25, 10}; // Array di input
    int m, i, j;
    
    // Iterazione attraverso gli elementi dell'array
    for (i = 0; i < N; i++) {
        m = -1; // Inizializzazione della variabile per il prossimo elemento maggiore
        // Iterazione attraverso gli elementi successivi nell'array
        for (j = i + 1; j < N; j++) {
            // Se l'elemento successivo è maggiore dell'elemento attuale
            if (a[i] < a[j]) {
                m = a[j]; // Assegna l'elemento successivo come prossimo elemento maggiore
                break; // Esci dal ciclo
            }
        }
        cout << m << "\t"; // Stampa il prossimo elemento maggiore
    }
    
    return 0;
}

Ecco la dimostrazione dell’algoritmo passo passo:

Partendo dall’array iniziale: [4, 5, 2, 25, 10] 

for (i = 0; i < N; i++) {  // i=0

m = -1;  //m=-1
for (j = i + 1; j < N; j++) { //j=1

if (a[i] < a[j]) {  //a[0]<a[1] è vero in quanto 4 è minore di 5

m = a[j];  //quindi in m memorizzo 5
break; //esco fuori

}
cout<<m<<“\t”;  //stampo 5 (cioè il primo valore)

}

Secondo passo:

for (i = 0; i < N; i++) {  // i=1

m = -1;  //m=-1
for (j = i + 1; j < N; j++) { //j=1

if (a[i] < a[j]) { 

//a[1]<a[2] è falso in quanto 5 non è minore di 2

//a questo punto continuo con il ciclo interno:

for (j = i + 1; j < N; j++) { //incremento j=2

if (a[i] < a[j]) {  //a[1]<a[3] è vero in quanto 5 è minore di 25

m = a[j];  //sostituisco m con 25
break;   //esco fuori dal ciclo
}

}
cout << m << “\t”;  //stampo 25 (cioè il secondo valore)

}

e così via, alla fine avrò in output. [5 25 25 -1 -1].

Come dicevamo la complessità è O(n2) . Infatti, se tutti gli elementi sono ordinati in ordine decrescente si ha il caso peggiore.


Seconda soluzione ottimizzata con l’uso dello stack

Nella seconda soluzione utilizzeremo lo stack, includendo quindi per semplicità l’header opportuno.

Definiamo un vettore di 5 elementi e lo inizializziamo come abbiamo fatto anche nel primo metodo.

Utilizziamo un ciclo for per i che va da N-1 fino a 0, quindi partiamo da destra.

Dunque faremo l’operazione di estrazione, pop, finché l’elemento a[i] è maggiore dell’elemento in cima allo stack o se lo stack non è vuoto.

Se lo stack è vuoto, chiaramente vuol dire che non c’è alcun elemento a destra più grande, rispetto a quello attuale e quindi inserisco -1, altrimenti prelevo l’elemento in cima.

Ho inserito volutamente queste linee di codice:

cout << “passo: ” << i << “, dimensione pila:” << s.size() << endl;

e

cout << “passo: ” << i << “, dimensione pila: ” << s.size() << “, elemento top: ” << s.top() << endl;

Per spiegare il funzionamento dell’algoritmo, ma si potevano anche omettere.

#include <iostream>
#include <stack>
using namespace std;

#define N 5

int main() {
    int a[N] = {4, 5, 2, 25, 10}; // Array di input
    stack<int> s; // Stack per tracciare gli elementi successivi maggiori
    int v[N]; // Array per memorizzare i prossimi elementi maggiori
    int i;

    // Iterazione inversa attraverso gli elementi dell'array
    for (i = N - 1; i >= 0; i--) {
        // Finché lo stack non è vuoto e l'elemento in cima allo stack è minore dell'elemento attuale
        while (!s.empty() && (s.top() < a[i]))
            s.pop(); // Rimuovi gli elementi minori dall'alto dello stack

        // Se lo stack è vuoto, non ci sono elementi successivi maggiori
        if (s.empty()) {
            v[i] = -1;
            cout << "Passo: " << i << ", Dimensione stack: " << s.size() << endl;
        } else {
            // Altrimenti, l'elemento in cima allo stack è il prossimo elemento maggiore
            v[i] = s.top();
            cout << "Passo: " << i << ", Dimensione stack: " << s.size() << ", Elemento in cima allo stack: " << s.top() << endl;
        }
        
        // Aggiungi l'elemento attuale allo stack
        s.push(a[i]);
    }

    // Stampa l'array con i prossimi elementi maggiori
    for (i = 0; i < N; i++)
        cout << v[i] << endl;

    return 0;
}

Questi come vi dicevo sono due possibili soluzioni all’algoritmo sui vettori in C++, ma proponete pure la vostra nei commenti sotto.

Alcuni link utili

Indice argomenti sul linguaggio C++

Array in C++

Passaggio di parametri per valore o per riferimento

Equazioni di secondo grado in C++

Funzioni in C++

Libreria cmath

Come usare il for in C++

Iterazioni in C++

Operatori logici in C++

Esercizi con switch case in C++

If else in C++

Casting in C++

Successione di Fibonacci in C++

Gestione di una pila mediante un array

Gestione di una pila mediante un array

In questo articolo implementeremo la gestione di una pila mediante un array in C.

Nella lezione precedente abbiamo già visto un metodo per la gestione di una pila in C, utilizzando le variabili globali Pila[MAX] e testa di tipo intero. Nell’esempio queste variabili rappresentano l’array e l’indice testa che va da 0 a MAX. Dunque se MAX ad esempio vale 10, testa va da 0 a 10.

La lezione è consultabile al seguente link: pila in C.

In questa lezione impareremo invece a gestire la pila tramite l’uso di funzioni con passaggio di parametri.


Gestione di una pila mediante un array – procedimento

Utilizzeremo dunque queste funzioni di cui elenchiamo i prototipi e le definizioni.

Funzione Push

int Push(int Pila[], int *testa, int n);

Ho costruito questa funzione in modo da prevedere il passaggio dei seguenti parametri:

Pila il puntatore alla struttura dati (array) che contiene la pila fisicamente;

testa il puntatore alla testa della pila;

n l’elemento da inserire.

La funzione restituisce un intero *testa che rappresenta la posizione del puntatore dopo l’inserimento di ciascun valore.

Dunque costruiamo la nostra funzione in questo modo:

Inseriamo l’elemento nella posizione dell’array indicato da *testa. Dopo incrementiamo di uno il valore di *testa:

//inseriamo l’elemento nella posizione indicata da *testa
Pila[*testa]=n;
//incrementiamo di 1 *testa
++*testa;

int Push(int Pila[], int *testa, int n) {
		Pila[*testa]=n;
		++*testa;
		return (*testa);
}

Nel main invochiamo dunque la funzione Push in questo modo:

p=Push(Pila, &p, n);

Dunque in p memorizziamo l’indice ritornato dalla funzione Push.


Funzione Pop

int Pop(int Pila[], int *testa, int n);

La funzione Pop prevede il passaggio dei parametri, Pila, testa ed n. 

La funzione restituisce un intero *testa che rappresenta la posizione del puntatore dopo l’eliminazione del valore al top.

Dunque costruiamo la nostra funzione Pop in questo modo:

Decrementiamo di uno il valore di *testa (cioè il puntatore alla testa della pila). Dopo assegniamo il valore dell’elemento in testa alla pila ad n e restituiamo il nuovo puntatore alla pila.

int Pop(int Pila[], int *testa, int n) {
			--*testa;
			n=Pila[*testa];
			printf("\n -> Elemento rimosso %d" , Pila[*testa]);
			return (*testa);
}

Pertanto nel main invochiamo la funzione Pop in questo modo:

p=Pop(Pila, &p, n);

Quindi in p memorizziamo l’indice ritornato dalla funzione Pop.


Funzione Print

void Print(int Pila[], int testa);

I parametri passati sono quindi:

Pilail puntatore alla struttura dati;

testa l’indice della testa della pila.

La funzione non restituisce pertanto alcun valore.

Dunque costruiamo la nostra funzione Print in questo modo:

void Print(int Pila[], int testa) {
	while(testa>=1) 
		printf("indice %d elemento: %d\n", testa, Pila[--testa]);		
}

Con un ciclo while che continua finché l’indice testa è maggiore o uguale a 1, decrementiamo testa e stampiamo il valore corrispondente.

Infatti se ad esempio la pila fosse piena, l’indice testa partirebbe da MAX dove non c’è alcun valore.

Quindi se testa si trova ad esempio in posizione 3, dove non c’è nessun elemento, allora decrementiamo testa di 1 e stampiamo l’elemento corrispondente.

Invochiamo poi la funzione nel programma principale in questo modo:

Print(Pila, p);


Funzione Clear

int Clear(int testa);

Ho costruito questa funzione in modo da prevedere il passaggio come parametro solo dell’indice testa.

Dunque ecco la nostra funzione Clear:

int Clear(int testa) {
	printf("\n -> Pila svuotata");	
	return 0;		
}

Facciamo restituire alla funzione semplicemente 0 che rappresenta l’indice della Pila.

Nel main invochiamo dunque la funzione in questo modo:

p=Clear(p);

Ecco dunque il listato completo della gestione di una pila mediante un array:

#include <stdio.h>

#define MAX 10


int menu_scelta(void)
{
  int selezione = 0;
  do
    {
    printf("\n" );
    printf("\n1 -> Aggiungi un dato" );
    printf("\n2 -> Estrai un dato");
    printf("\n3 -> Svuota pila");
    printf("\n4 -> Stampa pila");
    printf("\n5 -> Esci");
    printf("\n" );
    printf("\nEffettua una scelta: " );
    scanf("%d", &selezione );
    } while (selezione<1 || selezione>5);
  return selezione;
}

int Push(int Pila[], int *testa, int n) {
	Pila[*testa]=n;
	++*testa;
	return (*testa);
}

int Pop(int Pila[], int *testa, int n) {
	--*testa;
	n=Pila[*testa];
	printf("\n -> Elemento rimosso %d" , Pila[*testa]);
	return (*testa);
}

int Clear(int testa) {
	printf("\n -> Pila svuotata" );	
	return 0;		
}

void Print(int Pila[], int testa) {
	while(testa>=1) 
		printf("indice %d elemento: %d\n", testa, Pila[--testa]);		
}

int main(){
	int scelta;
	int Pila[MAX];
	int n, p=0;
	
	while((scelta=menu_scelta())!=5){
           switch(scelta){
              case 1: 
        	     if(p==MAX)
        		  printf("\nPila piena! " );
        	     else {
        		  printf("\nInserisci un dato: " );
				scanf("%d", &n);
				p=Push(Pila, &p,n);
		     }
                     break;
             case 2:
		    p=Pop(Pila, &p, n);
                    break;
            case 3:
		    p=Clear(p);
                    break;
             case 4: 
		    if(p==0)
        		printf("\nPila vuota! " );
        	     else 
			Print(Pila, p);
			break;
	      case 5: 	
			break;
             }
    }             
    return 0;
}

Alcuni link utili

Indice argomenti linguaggio C

La funzione fopen

La funzione fclose

Funzione fprintf

Funzione fscanf

Allocazione dinamica della memoria con malloc

Typedef struct in C

Esercitazione sulle struct in C

Realizzare un menù di scelta in C

Strutture complesse in C

Come sommare gli elementi della cornice esterna

Come sommare due matrici

Matrice trasposta

Prodotto tra matrici

Ricerca elementi in una matrice

Tavola pitagorica in C

Array multidimensionali

Quick sort in C

Insertion Sort in C

Pila in C

Pila in C

In questa lezione svilupperemo un semplice esercizio sull’uso della pila in C.

Creiamo dunque un programma per la gestione di una pila che permette di inserire dei valori, eliminarli, stamparli e cancellarli tutti in una volta.

Serviranno dunque le funzioni:

Push per l’inseriemento dei dati;

Pop per l’estrazione dei dati;

Clear per cancellare tutti i dati della pila;

Print per stampare tutti i dati dall’elemento in alto a quello in basso.

Per la risoluzione del seguente problema, abbiamo assegnato all’indice testa il valore iniziale 0. Quindi nel caso in cui la testa sia uguale a zero vuol dire che la pila è vuota.

Nell’operazione Push la variabile testa viene incrementata di 1, invece nell’operazione Pop la variabile testa viene decrementata di 1.

Si poteva anche operare assegnando a testa il valore MAX anzichè zero e ragionare in maniera analoga.

Ecco dunque il semplice algoritmo che realizza le operazioni di inserimento ed estrazione di un elemento in un pila in c. Inoltre implementeremo le operazioni di stampa e svuotamento della pila.

Notate come in questa prima soluzione, sviluppata principalmente a scopo didattico, facciamo uso delle variabili globali.

#include <stdio.h>

#define MAX 3

int testa;
int Pila[MAX];

int menu_scelta(void)
{
  int selezione = 0;
  do
    {
    printf("\n" );
    printf("\n1 -> Aggiungi un dato" );
    printf("\n2 -> Estrai un dato");
    printf("\n3 -> Svuota pila");
    printf("\n4 -> Stampa pila");
    printf("\n5 -> Esci");
    printf("\n" );
    printf("\nEffettua una scelta: " );
    scanf("%d", &selezione );
    }
    while (selezione<1 || selezione>5);
  return selezione;
}

void Push() {
	int n;
	
	if(testa==MAX) 
	         printf("\n -> Pila piena" );
	else {
		 printf("\nInserisci un dato: " );
		 scanf("%d", &n);
		 Pila[testa++]=n;
	}		
}

void Pop() {
	if(testa==0) 
	     printf("\n - Pila vuota" );
	else 
	    printf("%d", Pila[--testa]);	
}

void Clear() {
	testa=0;
	printf("\n -> Pila svuotata" );			
}

void Print() {
	int i;
	if(testa==0) 
	       printf("\n -> Pila vuota" );
	else 
              for(i=testa-1;i>=0;i--)	
                  printf("indice i: %d elemento %d\n", i, Pila[i]);			

}

int main(){
	int scelta;
	
	while((scelta=menu_scelta())!=5){
             switch(scelta){
                   case 1: 
			Push();
                        break;
                   case 2:
			Pop();
               	        break;
                   case 3:
			Clear();
            	        break;
                   case 4: 
			Print();
			break;
	        case 5: 
		        break;
             }
    }             
    return 0;
}

N.B Avremmo anche potuto scrivere nel Push:

	....
        Pila[testa]=n;
        testa++;
        ....

E nel Pop:

         .....
         else {
            testa--;
	    printf("%d", Pila[testa]);
         }
        .....

Questa soluzione, come abbiamo già detto, fa uso delle variabili globali, ma come sappiamo non sempre è bene usarle. Nella prossima lezione implementeremo invece un metodo che non le utilizza. Quindi passeremo i parametri alle funzioni Push(), Pop(), Clear() e Print().

Alcuni link utili

Indice argomenti linguaggio C

La funzione fopen

La funzione fclose

Funzione fprintf

Funzione fscanf

Allocazione dinamica della memoria con malloc

Strutture in C

Typedef struct in C

Esercitazione sulle struct in C

Realizzare un menù di scelta in C

Strutture complesse in C

Come sommare gli elementi della cornice esterna

Come sommare due matrici

Matrice trasposta

Prodotto tra matrici

Ricerca elementi in una matrice

Tavola pitagorica in C

Array multidimensionali

Quick sort in C

Selection sort in C

Merge sort in C

Insertion Sort in C

Stack

Stack

In questa lezione studieremo lo stack (o pila), cioè un elenco di dati avente la caratteristica di permettere l’inserimento di nuovi elementi e l’estrazione degli elementi introdotti ma solo da un’unica estremità.

Un elemento nella pila è inserito con una funzione detta Push, mentre un elemento si estrae con la funzione Pop.

La regola è questa: l’ultimo elemento inserito con Push è il primo ad essere estratto con Pop.

Quindi per questo motivo si parla di struttura LIFO (Last in First Out) ovvero l’ultimo elemento ad entrare è anche il primo ad uscire.

La gestione dello stack si può realizzare o con le linked list o appoggiandosi ad un array visto in “verticale” dove l’inserimento e l’estrazione avvengono sempre dallo stesso lato.

La pila inoltre richiede un indice, che contrassegna la prima casella libera del vettore a partire dalla posizione iniziale.

Questo indice lo chiamiamo testa e quando la pila è vuota il suo valore è zero. Nella posizione indicata dall’indice testa dunque estrarremo o inseriremo i dati con le funzioni Pop e Push.

Rappresentazione in figura

Nella figura ecco un esempio di stack con l’indice testa che indica la prima casella libera e dopo l’inserimento, del numero 5, l’indice testa si sposta di 1.

pila
pila in c

Altre possibili operazioni sono:

Top che restituisce l’elemento superiore dello stack.

isEmpty che restituisce true se lo stack è vuoto, altrimenti false.

isFull che restituisce true se lo stack è pieno, altrimenti vero.

Le operazioni push(), pop(), isEmpty() e top() richiedono tutti tempo O(1), infatti non eseguiamo cicli in nessuna di queste operazioni.

Un tipico esempio di applicazione dello stack si ha nelle Torre di Hanoi, nell’attraversamento degli alberi e in tanti altri algoritmi.

Questa è solo una piccola introduzione sull’uso dello stack, nelle prossime lezioni faremo altri esempi.

Alcuni link utili

Indice argomenti linguaggio C

La funzione fopen

La funzione fclose

Funzione fprintf

Funzione fscanf

Allocazione dinamica della memoria con malloc

Realizzare un menù di scelta in C

Strutture complesse in C

Come sommare gli elementi della cornice esterna

Come sommare due matrici

Matrice trasposta

Prodotto tra matrici

Ricerca elementi in una matrice

Merge sort in C

Insertion Sort in C

Array e funzioni

Array e funzioni

Affronteremo oggi un esercizio su array e funzioni in C++, creando un menù di scelta che consente di scegliere quali operazioni eseguire sugli array.

In particolare il problema si occupa di generare un array di 50 numeri casuali compresi fra 1 e 100 e offrire a menu le seguenti scelte:
1. Calcolare la media
2. Visualizzare il massimo
3. Visualizzare il minimo
4. Rigenerare l’array
5. Visualizzare i valori che distano meno di 4 dalla media
6. Calcolare la moda
7. Uscire dal programma

Quindi definiamo i prototipi delle funzioni e procedure che useremo nel programma.

Creiamo innanzitutto la funzione per generare il menù di scelta, utilizzando il costrutto swith-case.

Poi creiamo la funzione genera che serve a generare un array casuale di numeri da 1 a 100 dove includiamo anche la stampa dell’array in modo da visualizzare a video gli elementi generati. La funzione non restituisce nulla.

Le funzioni per il calcolo del massimo e del minimo prendono come parametro l’array e ritornano un valore intero che corrisponde al massimo e al minimo.

La funzione per il calcolo della media prende come parametro l’array e ritorna un valore float.

Infine creiamo la funzione per il calcolo della moda che prende come parametro l’array e non restituisce nulla.

Ecco dunque l’algortimo completo per la risoluzione del problema che utilizza array e funzioni in C++.

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

#define N 50

void genera(int a[N]); //prototipo funzione che genera un array casuale
float media(int a[N]);  //prototipo funzione per il calcolo della media
int max(int a[N]);  //prototipo funzione per il calcolo del massimo
int min(int a[N]);  //prototipo funzione per il calcolo del minimo
void dist(int a[N]);  //prototipo funzione distanza dalla media
void moda(int a[N]);  //prototipo funzione per il calcolo della moda

int menu_scelta(void)
{
  int selezione = 0;
  do
    {
    cout<<endl<<"1 - Calcolare la media"<<endl;
    cout<<"2 - Massimo"<<endl;
    cout<<"3 - Minimo"<<endl;
    cout<<"4 - Rigenera array"<<endl;
    cout<<"5 - Visualizzare i valori che distano meno di 4 dalla media"<<endl;
    cout<<"6 - Calcolare la moda"<<endl;
    cout<<"7 - Esci"<<endl;
    cout<<"Effettua una scelta:"<<endl;
    cin>>selezione;
    }
    while (selezione< 1 || selezione>7);
  return selezione;
}

int main(void)
{
    int scelta;
    int massimo,minimo;
    float med;
    int v[N];
    genera(v);
    
    while((scelta=menu_scelta())!=7){
    switch(scelta){
        case 1: 
		med=media(v);
		cout<<"media: "<<med<<endl;
                break;
        case 2:
		massimo=max(v);
		cout<<"Il massimo e':"<<massimo<<endl;
               	break;
        case 3:
		minimo=min(v);
		cout<<"Il minimo e':"<<minimo<<endl;
               	break;
        case 4: 
		genera(v);
		break;
	case 5: 
		dist(v);
		break;
	case 6: 
		moda(v);
		break;
             }
    }             
    return 0;
}

void genera(int a[N]){
	int i;
	
	srand(time(NULL));
	for (i=0; i<N; i++)	
		a[i]=rand()%100+1;
	
	cout<<"Stampo l'array generato"<<endl;
	for (i=0; i<N; i++)	
		   cout<<a[i]<<"\t";
}

float media(int a[N]) {
	int m=0;
	int i;
	
	for (i=0; i<N; i++){	
		m+=a[i];
	}
	m=m/N;
	
	return m;
}

int max(int a[N]) {
	int massimo=a[0];
	int i;
	
	for (i=0; i<N; i++)
		if(a[i]>massimo)
			massimo=a[i];

	return massimo;
}

int min(int a[N]) {
	int minimo=a[0];
	int i;
	
	for (i=0; i<N; i++)
		if(a[i]<minimo)
			minimo=a[i];

	return minimo;
}

void dist(int a[N]) {
	float med=media(a);
	int i, dist1, dist2, trovato=0;
	
	dist1=med+4;
	dist2=med-4;
	
	cout<<"I valori sono che distano meno di 4 dalla media sono: "<<endl;
	for (i=0; i<N; i++){
		if(a[i]>dist2 && a[i]<dist1){
			cout<<a[i]<<" in posizione "<<i<<"\t";
			trovato=1;
		}				
	}
	
	if(trovato!=1)
		cout<<" nessun elemento "<<endl;
}

void moda(int a[N]) {
	int cont=0, i, pos, moda, max=1;

	for (int i=0; i<N; i++){
        cont=0;
     	for (int j=i+1; j<N; j++){
       		if (a[i]==a[j]){ 
//se trova un numero uguale incrementa il contatore
         		cont++; 
         		pos=i; //memoriazziamo l'indice dell'elemento
       		}
       		if (cont>max){  //se cont è maggiore del massimo 
         		max=cont; //in max mettiamo il valore di cont
         		moda=pos; //memorizziamo in moda l'indice dell'elemento con frequenza  più alta
       	        }
           }  
   	}
    cout<< "Il numero:  "<<a[moda]<< " compare "<<max<<" volte"<<endl;
}

Chiaramente questa è solo una possibile soluzione al problema proposto, proponete pure la vostra nei commenti sotto.

Alcuni link utili

Indice argomenti C++

Ciclo while in C++

Ciclo do while

Iterazioni con il ciclo for in C++

Operatori logici in C++

Esercizi con switch case in C++

Switch case in C++

If else in C++

Casting in C++

Variabili in C++

Tutorial C++

Successione di Fibonacci in C++

Array in C++

Esercitazione sugli array in C++

Esercizi con gli array

Ricerca sequenziale in C++

Ricerca in un array ordinato

Array con numeri random

Ricerca binaria