· Andrea Pollini · programmazione · 28 min read
Esercizi sulle matrici in C++ assegnati al polimi
Una raccolta di esercizi sulle matrici in C++ assegnati al polimi per aiutarti a consolidare le tue conoscenze e a prepararti per gli esami di informatica.
In questo articolo troverai una serie di esercizi sulle matrici in C++ assegnati al Politecnico di Milano per aiutarti a consolidare le tue conoscenze e a prepararti per gli esami di informatica.
Reference:
Esercizio 1
Scrivere un programma che chiede all’utente di riempire una matrice, la stampa, cerca, se esiste, la prima occorrenza dello 0 e dice in che posizione è stata trovata
Soluzione (con std::vector)
Prima di tutto, per risolvere questo esercizio, dobbiamo capire alcuni concetti di base.
Una matrice è essenzialmente un array bidimensionale di elementi. In C++, possiamo rappresentare una matrice utilizzando un array bidimensionale o un vettore di vettori.
Per riempire una matrice, chiederemo all’utente di inserire i valori degli elementi uno per uno.
Successivamente, dovremo scorrere la matrice per cercare la prima occorrenza dello 0 e memorizzare la sua posizione.
Una volta trovato lo 0, stampiamo la sua posizione.
Ora passiamo al codice:
Nel codice sopra:
- Abbiamo dichiarato tre funzioni:
riempiMatrice
per riempire la matrice,stampaMatrice
per stampare la matrice etrovaPrimoZero
per cercare la prima occorrenza dello 0. - Nella funzione
main
, chiediamo all’utente il numero di righe e colonne della matrice, quindi allochiamo spazio per la matrice. - Chiamiamo le funzioni per riempire, stampare la matrice e trovare la posizione del primo zero.
- Infine, stampiamo la posizione del primo zero se viene trovato, altrimenti segnaliamo che non è stato trovato alcuno zero.
Soluzione (con array bidimensionale)
Possiamo risolvere l’esercizio senza utilizzare std::vector
, utilizzando invece gli array bidimensionali tradizionali in C++.
Ecco il codice modificato:
In questo codice:
- Utilizziamo array bidimensionali
int matrice[MAX_RIGHE][MAX_COLONNE]
per rappresentare la matrice. - Le funzioni
riempiMatrice
,stampaMatrice
etrovaPrimoZero
sono modificate di conseguenza per accettare e manipolare array bidimensionali. - Le costanti
MAX_RIGHE
eMAX_COLONNE
sono definite per limitare le dimensioni massime della matrice.
Esercizio 2
Scrivere un programma che chiede all’utente di riempire una matrice, la stampa, cerca, se esiste, la prima occorrenza dello 0, l’ultima occorrenza dello 0 e l’occorrenza dello 0 in posizione mediana e dice in che posizione sono state trovate .
Soluzione
Prima di tutto, per risolvere questo esercizio, dobbiamo comprendere alcuni concetti di base.
Teoria
- Matrice: Una matrice è una struttura dati bidimensionale composta da righe e colonne. Ogni elemento della matrice è accessibile tramite le sue coordinate di riga e colonna.
- Riempimento della Matrice: Chiederemo all’utente di inserire i valori nella matrice. Utilizzeremo un doppio ciclo
for
per scorrere ogni elemento della matrice e chiedere all’utente di inserire il valore. - Stampa della Matrice: Dovremo stampare la matrice dopo che l’utente l’ha riempita. Ancora una volta, useremo un doppio ciclo
for
per attraversare ogni elemento della matrice e stamparlo. - Ricerca delle occorrenze dello 0:
- Prima occorrenza dello 0: Scorreremo la matrice finché non troviamo il primo 0 e memorizzeremo le sue coordinate.
- Ultima occorrenza dello 0: Scorreremo la matrice all’indietro partendo dall’ultimo elemento e troveremo l’ultima occorrenza dello 0.
- Occorrenza dello 0 in posizione mediana: Per trovare la posizione mediana dello 0, divideremo la matrice in due parti uguali e cercheremo la prima occorrenza dello 0 nella parte centrale della matrice.
Codice in C++
Questo programma chiede all’utente di inserire il numero di righe e colonne per la matrice, quindi chiede di riempire la matrice con valori interi. Dopo aver stampato la matrice, trova e stampa la posizione della prima occorrenza dello 0, dell’ultima occorrenza dello 0 e dell’occorren
Esercizio 3
Scrivere un programma che riempia una matrice 20x30 chiedendo all’utente di inserire gli elementi, ma inserendo nella matrice solo gli elementi pari.
Il programma termina quando la matrice è piena.
Soluzione
Il programma richiede di riempire una matrice 20x30 con elementi pari inseriti dall’utente, e termina quando la matrice è piena.
Per farlo, possiamo utilizzare un array bidimensionale (matrice) per memorizzare gli elementi, un ciclo per chiedere all’utente di inserire i valori e un’altra struttura di controllo per verificare se il valore inserito è pari o meno.
In C++, possiamo rappresentare una matrice utilizzando un array bidimensionale. La struttura di controllo più semplice per determinare se un numero è pari è l’operatore modulo (%), che restituisce il resto della divisione. Se il resto è zero, allora il numero è pari.
Ecco un esempio di codice che implementa questa logica:
Spieghiamo il codice:
- Definiamo una matrice 20x30
matrix
. - Utilizziamo due cicli annidati per scorrere attraverso ogni elemento della matrice.
- All’interno del ciclo, chiediamo all’utente di inserire un numero.
- Verifichiamo se il numero inserito è pari utilizzando l’operatore modulo (%).
- Se è pari, lo inseriamo nella matrice e incrementiamo il contatore
count
. - Controlliamo se la matrice è piena. Se lo è, terminiamo il programma.
- Se il numero inserito non è pari, avvisiamo l’utente e chiediamo di inserirne un altro nella stessa posizione.
Con questo codice, l’utente può riempire una matrice 20x30 inserendo solo numeri pari, e il programma terminerà quando la matrice sarà piena.
Esercizio 4
Scrivere un programma C++ che legge una sequenza di numeri interi e li mette nella prima riga della matrice M. La lettura della sequenza termina quando alla prima riga della matrice M sono stati assegnati 50 interi oppure quando viene letto il secondo numero intero negativo.
Soluzione
Per risolvere questo esercizio, dovremo scrivere un programma in C++ che legga una sequenza di numeri interi e li inserisca nella prima riga di una matrice M. La lettura della sequenza si interromperà quando alla prima riga della matrice M saranno stati assegnati 50 interi oppure quando viene letto il secondo numero intero negativo.
Teoria
Input dei numeri: Utilizzeremo un loop per leggere i numeri interi uno alla volta dall’input dell’utente.
Inserimento nella matrice: Man mano che leggiamo i numeri, li inseriremo nella prima riga della matrice.
Condizioni di terminazione: Il programma terminerà quando alla prima riga della matrice sono stati assegnati 50 interi oppure quando viene letto il secondo numero intero negativo.
Codice C++
Spiegazione del Codice
Dichiarazione della matrice: Viene creata una matrice M con una sola riga (ROW = 1) e massimo 50 colonne (COL = 50).
Lettura e inserimento dei numeri: Utilizzando un loop, leggiamo i numeri interi uno alla volta e li inseriamo nella prima riga della matrice.
Condizioni di terminazione: Il loop termina quando abbiamo letto 50 numeri oppure quando troviamo il secondo numero intero negativo.
Stampa della matrice: Alla fine, stampiamo la matrice M per visualizzare i numeri inseriti.
Esercizio 5
Scrivere un programma che chiede all’utente di inserire una matrice 20x30, poi (dopo aver terminato la fase di inserimento) copia gli elementi dispari in una seconda matrice 20x30 senza lasciare buchi, se non in fondo.
Gli elementi in fondo (i “buchi”) siano messi a zero.
Soluzione
Teoria:
Matrici: Una matrice è una collezione di elementi disposti in righe e colonne. In questo caso, abbiamo una matrice 20x30, il che significa che ha 20 righe e 30 colonne.
Numeri dispari: Gli elementi dispari sono quelli che non sono divisibili per 2. Ad esempio, 1, 3, 5, ecc.
Copia degli elementi dispari: Dobbiamo iterare attraverso ogni elemento della matrice inserita dall’utente e copiare gli elementi dispari in una nuova matrice, assicurandoci che non ci siano buchi nella nuova matrice, ovvero che gli elementi dispari siano inseriti consecutivamente senza spazi vuoti.
Gestione dei buchi: Gli “buchi” corrispondono agli elementi della nuova matrice che non sono stati riempiti con numeri dispari. Questi buchi devono essere impostati a zero.
Codice in C++:
In questo programma, abbiamo una funzione copyOddNumbers
che prende la matrice originale e la matrice di destinazione come argomenti e copia gli elementi dispari dalla matrice originale alla matrice di destinazione, garantendo che non ci siano buchi. Infine, nella funzione main
, chiediamo all’utente di inserire gli elementi della matrice originale, quindi chiamiamo la funzione copyOddNumbers
per ottenere la nuova matrice con solo numeri dispari, che stampiamo a schermo.
Esercizio 6
Scrivere un programma che chiede all’utente di inserire una matrice NxN con elementi tutti diversi. Se l’utente inserisce un numero già inserito il programma lo avvisa dell’errore e chiede nuovamente di inserire l’elemento.
Soluzione
Teoria:
Questo esercizio richiede di scrivere un programma C++ che permetta all’utente di inserire una matrice quadrata con elementi tutti diversi. Se l’utente inserisce un numero già presente nella matrice, il programma deve segnalare l’errore e chiedere nuovamente di inserire l’elemento.
Per risolvere questo problema, possiamo utilizzare un array bidimensionale per rappresentare la matrice e un insieme (o array) per tenere traccia dei numeri già inseriti. Quando l’utente inserisce un nuovo elemento, verifichiamo se è già presente nell’insieme dei numeri inseriti. Se lo è, segnaliamo l’errore e chiediamo nuovamente l’input. Altrimenti, inseriamo il numero nella matrice e nell’insieme dei numeri inseriti.
Codice in C++:
In questo codice, inizializziamo una matrice bidimensionale matrix
per contenere gli elementi della matrice e un set numbers
per tenere traccia dei numeri già inseriti. Utilizziamo un doppio ciclo for
per permettere all’utente di inserire gli elementi della matrice uno alla volta. Ogni volta che l’utente inserisce un numero, verifichiamo se è già presente nell’insieme numbers
. Se lo è, stampiamo un messaggio di errore e chiediamo nuovamente all’utente di inserire un numero diverso. Una volta che tutti gli elementi sono stati inseriti correttamente, stampiamo la matrice risultante.
Esercizio 7
Una matrice quadrata Mat di dimensioni NxN (con N costante predefinita) è diagonalmente dominante se la somma dei valori assoluti degli elementi su ciascuna riga, escluso l’elemento sulla diagonale principale, è minore del valore assoluto dell’elemento corrispondente sulla diagonale principale.
Scrivere un programma che chiede all’utente di inserire i valori di una matrice e stampa «Dominante» se la matrice è diagonalmente dominante, «Non dominante» altrimenti.
Si ricorda che la funzione int abs(int n) restituisce il valore assoluto dell’intero n ricevuto come parametro.
Soluzione
Per risolvere questo esercizio, prima di tutto dobbiamo capire cosa significa che una matrice è diagonalmente dominante. Una matrice quadrata , rappresentata come , è definita diagonalmente dominante se per ogni riga della matrice, la somma dei valori assoluti di tutti gli elementi nella riga, escluso l’elemento sulla diagonale principale, è minore del valore assoluto dell’elemento sulla diagonale principale.
In altre parole, data una matrice di dimensioni , dobbiamo verificare se per ogni riga , la seguente condizione è soddisfatta:
Dove è l’elemento della riga e colonna della matrice .
Ora passiamo alla scrittura del codice in C++.
In questo codice, abbiamo una funzione isDiagonallyDominant
che prende la matrice come argomento e verifica se è diagonalmente dominante secondo la definizione data sopra. Iteriamo attraverso ogni riga della matrice, calcoliamo la somma degli elementi assoluti nella riga escludendo l’elemento sulla diagonale principale e confrontiamo questa somma con l’elemento sulla diagonale principale. Se la condizione è verificata per ogni riga, allora la matrice è diagonalmente dominante e restituiamo true
, altrimenti restituiamo false
.
Nel main
, chiediamo all’utente di inserire i valori della matrice e poi chiamiamo la funzione isDiagonallyDominant
per verificare se la matrice è diagonalmente dominante e stampiamo il risultato appropriato.
Esercizio 8
Considerata una matrice A di N x M interi, definiamo claque una sottomatrice 2 x 2 in cui la somma algebrica dei valori di una diagonale sia pari a quella dell’altra diagonale. In figura sono evidenziate le claque.
Si scriva un programma che acquisisce una matrice N x M stampa il numero di claque della matrice.
Soluzione
Per risolvere questo problema, è necessario contare quante sottomatrici 2x2 della matrice soddisfano la condizione di essere una “claque”. Una sottomatrice 2x2 è una claque se la somma degli elementi sulla diagonale principale è uguale alla somma degli elementi sulla diagonale secondaria.
Teoria
Per contare le claque, dobbiamo scorrere la matrice e per ogni possibile sottomatrice 2x2, verificare se soddisfa la condizione. La somma degli elementi di una diagonale è data dalla somma degli elementi negli angoli opposti. Quindi, per una sottomatrice 2x2 con elementi A, B, C, D, la somma degli elementi sulla diagonale principale è A + D e la somma degli elementi sulla diagonale secondaria è B + C. Quindi, una claque soddisfa la condizione se A + D = B + C.
Codice in C++
Spiegazione del Codice
- La funzione
countClaques
prende in input una matrice di interi e restituisce il numero di claque nella matrice. - Scandisce la matrice escludendo l’ultima riga e l’ultima colonna perché non si possono formare claque con esse.
- Per ogni sottomatrice 2x2, calcola le somme degli elementi delle due diagonali e le confronta. Se le somme sono uguali, incrementa il conteggio delle claque.
- La funzione restituisce il conteggio finale delle claque.
- Nel
main
, l’utente inserisce le dimensioni e gli elementi della matrice, quindi viene chiamata la funzionecountClaques
per calcolare il numero di claque nella matrice e stamparlo a schermo.
Esercizio 9
Si scriva un programma che chiede all’utente di riempire una matrice NxN (con N costante globale predefinita) di interi e stampa la lunghezza della sequenza più lunga orizzontale, verticale o diagonale di numeri uguali consecutivi.
Soluzione
Teoria
Matrice NxN: Una matrice NxN è una struttura dati bidimensionale che ha N righe e N colonne, dove ogni elemento è identificato da una coppia di indici (riga, colonna).
Sequenza consecutiva: Una sequenza di numeri consecutivi è una serie di numeri che seguono uno dopo l’altro senza interruzioni. Ad esempio, 3 è una sequenza consecutiva di lunghezza 3.
Lunghezza della sequenza più lunga: In una matrice, dobbiamo trovare la lunghezza massima di una sequenza consecutiva di numeri uguali in qualsiasi direzione: orizzontale, verticale o diagonale.
Codice in C++
Esercizio 10
Si realizzi un programma in linguaggio C++ che, data una matrice NxM di interi, trovi l’elemento per cui la media degli elementi ad esso adiacenti sia massima. Si stampino le coordinate di tale elemento ed il suo valore.
Si considerino come adiacenti a ciascun elemento i quattro elementi nelle quattro direzioni cardinali. Si tratti inoltre l’ultima colonna come adiacente alla prima, e l’ultima riga come adiacente alla prima. Si supponga che N ed M possano variare tra 1 e 100. I valori di N ed M, così come i valori degli elementi della matrice, vengono acquisiti da tastiera.
Soluzione
Teoria:
Per risolvere questo problema, possiamo iterare attraverso ogni elemento della matrice e calcolare la media degli elementi adiacenti a esso. Le quattro direzioni cardinali sono nord, sud, est e ovest. Tuttavia, dobbiamo gestire il caso in cui l’elemento si trova sul bordo della matrice, dove non ci sono quattro elementi adiacenti in tutte le direzioni.
Per risolvere questo problema, possiamo:
- Iterare attraverso ogni elemento della matrice.
- Calcolare la media degli elementi adiacenti all’elemento corrente.
- Tenere traccia dell’elemento con la media massima.
- Stampare le coordinate di tale elemento insieme al suo valore.
Per calcolare la media degli elementi adiacenti, dobbiamo controllare se gli elementi adiacenti esistono nella matrice e, se sì, sommarli e dividere per il numero di elementi considerati.
Codice in C++: