WorksheetsInfo
Total questions: 38
Worksheet time: 37mins
In quale funzione viene utilizzato il concetto di sottomatrice?
massimo
determinante
mediaRigaB
calcolaC
Come viene passata la matrice M[MAX][MAX] alle funzioni:
Per valore (viene creata una copia completa).
Come stringa di testo.
Tramite puntatore al primo elemento, permettendo modifiche dirette alla matrice originale.
Vengono passate tutte le righe tranne l’ultima in quanto non serve il passaggio della matrice
Cosa sono i “parametri attuali”?
Sono le variabili o misure che descrivono lo stato presente di un sistema, processo o fenomeno.
Sono le matrici presenti nel programma che permettono la descrizione immediata del programma
Sono le funzioni di un programma
Sono dei parametri presenti nel programma che funzionano solo se si clicca un numero da 6 a 10
Cosa sono i parametri formali?
Variabili che memorizzano il risultato finale della funzione.
Regole sintattiche del linguaggio di programmazione.
Costanti generate automaticamente dal compilatore.
Variabili usate nella definizione di una funzione per ricevere dati.
In C++, una matrice è:
Una variabile che può contenere un solo valore alla volta
Un insieme di elementi dello stesso tipo organizzati in righe e colonne
Una funzione che restituisce più valori
Un puntatore che memorizza indirizzi di memoria casuali
Quale condizione deve essere soddisfatta affinché il programma calcoli il determinante della matrice A?
La matrice deve avere almeno 2 righe e 2 colonne.
La matrice deve essere quadrata (righe uguali a colonne).
La matrice deve contenere solo numeri interi.
La matrice deve essere stata generata casualmente.
for(int i=0; i<r; i++)
for(int j=0; j<c; j++)
if (B[i][j] > maxv) maxv = B[i][j];
Se volessimo trovare il massimo solo della prima riga della matrice, come dovrebbero cambiare i cicli?
Bisognerebbe eliminare il ciclo esterno (i) e usare solo il ciclo interno (j), fissando l'indice di riga a B[0][j].
Bisognerebbe invertire i cicli: prima quello con la j e poi quello con la i.
Bisognerebbe cambiare la condizione del if in if (B[i][j] < maxv).
Bisognerebbe sostituire MAX con r nella dichiarazione della funzione.
Quale delle seguenti righe di codice rappresenta il prototipo di una procedura (ovvero una funzione che esegue operazioni ma non restituisce alcun valore al chiamante)?
int menu();
int determinante(int A[MAX][MAX], int n);
void generaCasuali(int M[MAX][MAX], int r, int c);
float mediaRigaB(int B[MAX][MAX], int c, int rig);
void calcolaC(int A[MAX][MAX], int B[MAX][MAX], int C[MAX][MAX], int r, int c) {
for(int i=0; i<r; i++)
for(int j=0; j<c; j++)
C[i][j] = 3*A[i][j] - 2*B[i][j];
}
Analizzando la funzione calcolaC sopra riportata, quale operazione matematica viene eseguita per ottenere ogni singolo elemento della matrice C?
Viene calcolata la somma degli elementi corrispondenti di A e B moltiplicata per 5.
Viene calcolata la combinazione lineare 3A - 2B per ogni elemento in posizione (i, j).
Viene calcolato il prodotto scalare tra la riga di A e la colonna di B
Viene eseguita la sottrazione tra il triplo di un elemento di B e il doppio di un elemento di A
Analizza questo pezzo di codice del main (riga 89):
case 9: if (Ccalcolata) {
if (c == r) {
if (diagonaleNulla(C, r)) {
cout << "La diagonale e' nulla\n";
} else {
cout << "La diagonale NON e' nulla\n";
}
} else {
cout << "NON è possibile calcolare la diagonale perchè non è una matrice quadrata" << endl;
}
} else {
cout << "Prima devi calcolare la matrice C.\n";
}
break;
Il compilatore darebbe un errore di sintassi impedendo l'esecuzione del programma.
Il programma andrebbe in crash immediato perché la funzione diagonaleNulla non accetta matrici rettangolari.
Il programma funzionerebbe, ma il risultato sarebbe logicamente privo di senso (o incompleto) perché la diagonale principale è definita correttamente solo nelle matrici quadrate.
La funzione diagonaleNulla diventerebbe "intelligente" e calcolerebbe la diagonale della sottomatrice quadrata più piccola.
Nella funzione prodottoMatrici, per calcolare ogni singolo elemento P[i][j], viene utilizzato un terzo ciclo for con indice k. Qual è lo scopo di questo ciclo?
void prodottoMatrici(int A[MAX][MAX], int B[MAX][MAX], int P[MAX][MAX], int r, int c) {
for(int i=0;i<r;i++)
for(int j=0;j<c;j++){
P[i][j] = 0;
for(int k=0;k<c;k++)
P[i][j] = P[i][j] + A[i][k] * B[k][j];
}
}
Serve per azzerare la matrice P prima di iniziare i calcoli.
Serve per copiare i valori della matrice A nella matrice B.
Serve per verificare se le matrici sono quadrate.
Serve per scorrere contemporaneamente la riga di A e la colonna di B per eseguire il prodotto scalare.
Nel seguente segmento di codice, cosa viene chiesto all'utente nel case 12?
case 12: if (matInserite) {
int N;
cout << "Quale numero vuoi ricercare nella matrice? ";
cin >> N;
cout << "Nella matrice ci sono " << contaNA(A, r, c, N) << " numeri " << N << endl;
}
else { cout << "Prima inserisci o genera le matrici.\n"; }
break;
All'utente viene chiesto di inserire il numero di righe della matrice.
L'utente deve specificare il numero da cercare nella matrice.
Il programma chiede all'utente di scegliere una colonna per calcolare il massimo.
L'utente è invitato a generare una nuova matrice.
Data la matrice C, calcolata a partire dalle matrici A e B, quale delle seguenti operazioni è stata eseguita?
C = 2A + 3B
C = A - B
C = 3A - 2B
C = 3A + 2B
Cos’è una matrice identica?
Una matrice con una sola riga e una sola colonna
Una matrice in cui tutti gli elementi sono nulli (pari a 0)
Una matrice in cui tutti gli elementi sono pari a n (si dice matrice identica di ordine n)
Una matrice quadrata in cui in cui tutti gli elementi della diagonale principale sono pari a 1 e tutti gli elementi sopra e sotto la diagonale sono nulli
All'interno della funzione generaCasuali(int M[MAX][MAX], int r, int c), viene utilizzata l'istruzione:
M[i][j] = rand() % 9 - 4;
Qual è l'intervallo di valori interi che possono essere assegnati a ogni elemento della matrice e come influisce sulla funzione calcolaC?
Gli elementi variano da 0 a 9; di conseguenza, la matrice C (calcolata come 3A - 2B) conterrà solo numeri positivi.
Gli elementi variano da -4 a 4; pertanto, la matrice C può contenere sia valori positivi che negativi o nulli.
Gli elementi variano da 1 a 9; la funzione calcolaC restituirà un errore se il risultato della sottrazione è negativo.
Gli elementi variano da -9 a 9; la matrice C rappresenterà sempre il determinante della matrice originale.
Nella funzione contaNA del seguente codice:
int contaNA(int A[MAX][MAX], int r, int c, int N) {
int count = 0;
for(int i=0;i<r;i++)
for(int j=0;j<c;j++)
if (A[i][j] == N) count++;
return count;
}
cosa succede esattamente alla variabile count ogni volta che l'istruzione if (A[i][j] == N) risulta vera?
Viene resettata a 0.
Viene incrementata di 1
Viene impostata uguale al valore di N
Viene incrementata del valore dell'indice i.
Quando la seguente funzione restituisce il valore “false” ?
bool diagonaleNulla(int C[MAX][MAX], int r) {
for(int i=0;i<r;i++)
if (C[i][i] != 0) return false;
return true;
}
Quando almeno un elemento sulla diagonale principale è diverso da zero.
Se tutti gli elementi sulla diagonale principale sono esattamente zero.
Quando tutti gli elementi della matrice, sia all'interno che all'esterno della diagonale, sono diversi da zero.
Quando la funzione ha terminato di scansionare l'intera matrice e non ha trovato alcun elemento uguale a zero.
Nella funzione prodottoMatrici, dove viene inizializzato a zero l'accumulatore del
prodotto scalare?
void prodottoMatrici(int A[MAX][MAX], int B[MAX][MAX], int P[MAX][MAX], int r, int c) {
for(int i=0;i<r;i++)
for(int j=0;j<c;j++){
P[i][j] = 0;
for(int k=0;k<c;k++)
P[i][j] = P[i][j] + A[i][k] * B[k][j];
}
}
All'inizio della funzione per tutta la matrice.
All'interno del secondo ciclo, prima di iniziare la sommatoria del terzo ciclo (P[i][j] = 0).
Non viene inizializzato, il C++ lo fa automaticamente.
Viene inizializzato nel main
Quale delle seguenti affermazioni è sbagliata riguardo al funzionamento della funzione?
void visualizzaRigaB(int B[MAX][MAX], int r, int c) {
int rig;
cout<<"Quale riga vuoi visualizzare? (1,"<<r<<")";
cin>>rig;
if (rig>0 && rig<=r){
for(int j=0;j<c;j++){
cout << B[rig-1][j] << " ";
}
cout << endl;
}
else
cout<<"Numero riga errato"<<endl;
}
La funzione chiede all’utente di scegliere una riga compresa tra 1 e il numero totale di righe della matrice.
L’indice rig-1 viene usato per adattare la numerazione dell’utente (che parte da 1) agli indici della matrice (che partono da 0).
Il ciclo for(int j=0; j<c; j++) serve a scorrere tutte le colonne della riga scelta.
Se l’utente inserisce un numero di riga non valido, la funzione stampa un messaggio di errore e non accede alla matrice.
La funzione utilizza il parametro r per scorrere le colonne della matrice B.
Cosa rappresenta la variabile booleana `dimScelta` nel programma?
Se l'utente ha scelto di generare le matrici casualmente
Se la dimensione della matrice è stata scelta dall'utente
Se la matrice A è stata inserita manualmente
Se la dimensione della matrice è stata validata
Se il programma è pronto per calcolare la matrice C
Cosa indica una matrice diagonale?
Solo gli elementi sulla diagonale principale sono diversi da zero
Tutti gli elementi sono diversi da zero
Solo gli elementi fuori dalla diagonale principale sono zero
È una matrice quadrata
Perché nel ciclo interno c’è l'istruzione if(j == x) continue?
int determinante(int A[MAX][MAX], int n) {
if(n == 1) return A[0][0];
int det = 0, sub[MAX][MAX];
for(int x=0; x<n; x++){
int subi=0;
for(int i=1;i<n;i++){
int subj = 0;
for(int j=0;j<n;j++){
if(j == x) continue;
sub[subi][subj++] = A[i][j];
}
subi++;
}
det += (x%2==0 ? 1 : -1) A[0][x] determinante(sub, n-1);
}
return det;
}
Per evitare un errore di compilazione
Per saltare la colonna usata nello sviluppo di Laplace
Per saltare la diagonale principale
Per migliorare le prestazioni
La funzione determinante calcola il determinante di una matrice quadrata A di dimensione n × n.
Quale delle seguenti affermazioni è corretta?
Il determinante viene calcolato usando l’eliminazione di Gauss e la matrice sub serve per salvare i pivot.
Il determinante viene calcolato tramite lo sviluppo di Laplace sulla prima riga; la matrice sub rappresenta il minore ottenuto eliminando la prima riga e la colonna x.
Il segno (+ / −) dipende dal valore degli elementi della matrice A.
La funzione ha complessità O(n3) ed è efficiente anche per matrici di grandi dimensioni.
Nel programma come viene definita una matrice che è composta da una sola riga e n colonne?
Matrice colonna
Matrice riga (o vettore riga)
Matrice identità
Matrice nulla
Cos'è una matrice triangolare?
una matrice quadrata con elementi pari a zero al di sopra o al di sotto della diagonale principale.
una matrice in cui la diagonale vale zero
È una matrice composta esclusivamente da tre elementi diversi da zero disposti ai vertici della matrice
è una matrice in cui gli elementi al di sotto della diagonale valgono zero
Cosa fa la funzione srand (time(NULL))?
Serve a ordinare in modo casuale i numeri generati dalla funzione rand() durante
l’esecuzione del programma.
Inizializza la generazione di numeri casuali che verrà usato dalla funzione rand() in
modo che a ogni esecuzione generi numeri diversi.
Imposta il limite massimo dei numeri casuali che possono essere generati da rand().
Attiva la funzione time() per misurare il tempo di esecuzione del programma e
migliorare le prestazioni.
Cosa fa la funzione void clearScreen?
B. organizza visivamente lo schermo separando le varie parti del programma
C. Resetta tutte le variabili globali e locali ogni volta che viene chiamata la funzione
A. ripulisce lo schermo ogni volta che viene chiamata la funzione
D. Termina l’esecuzione del programma
Dato il seguente codice
case 9: if (Ccalcolata) {
if (c == r) {
if (diagonaleNulla(C, r)) {
cout << "La diagonale e' nulla\n";
} else {
cout << "La diagonale NON e' nulla\n";
}
} else {
cout << "NON e' possibile calcolare la diagonale perche' non e' una matrice
quadrata\n";
}
} else {
cout << "Prima devi calcolare la matrice C.\n";
}
break;
Quando viene stampato il messaggio
"La diagonale e' nulla"?
A. Quando la funzione “diagonaleNulla” restituisce come valore true. ✅
Quando la funzione “diagonaleNulla” restituisce come valore false.
Quando la procedura“diagonaleNulla” restituisce come valore true.
Quando la procedura“diagonaleNulla” restituisce come valore false.
A cosa serve la variabile matInserita?
case 4: if (matInserite) {
calcolaC(A, B, C, r, c);
cout << "Matrice C:\n";
visualizzaMatrice(C, r, c);
Ccalcolata = true;
}
else { cout << "Prima inserisci o genera le matrici.\n"; }
break;
Serve ad indicare se la matrice A e B è stata generata o inserita
Serve per memorizzare il numero di righe e colonne della matrice A e della matrice
Serve per contenere il valore massimo presente nelle matrici A e B durante
l’elaborazione
Che tipo di passaggio é?
int contaNA(int A[MAX][MAX], int r, int c, int N);
per riferimento
per valore
la matrice per indirizzo il resto per valore
per indirizzo
la matrice per valore il resto per indirizzo
A cosa serve questa funzione?
int contaNA(int A[MAX][MAX], int r, int c, int N) {
int count = 0;
for(int i=0;i<r;i++)
for(int j=0;j<c;j++)
if (A[i][j] == N) count++;
return count;
}
serve a contare quanti elementi della matrice A sono uguali a un valore m
serve a sostituire tutti gli elementi della matrice A uguali a m con il valore zero
confrontare ogni elemento della matrice A con la matrice B, contando quelli che
assumono il valore m
La funzione serve a verificare se il valore m è maggiore o minore degli
elementi della matrice
A cosa serve l'istruzione "Case"?
Serve a ripetere un’istruzione finché una condizione è vera, come un ciclo
while.
È usata per dichiarare variabili globali all’interno di un programma.
Serve a proteggere il codice da virus e attacchi informatici grazie a un
controllo automatico.
Permette di eseguire istruzioni diverse a seconda del valore di una variabile.
cosa calcola il programma
int mB(int B[MAX][MAX], int r, int c) {
int mv = B[0][0];
for(int i=0;i<r;i++)
for(int j=0;j<c;j++)
if (B[i][j] > mv) mv = B[i][j];
return mv;
}
il massimo di A
il massimo di B
il minimo di A
il massimo di A e di B
Quale operazione viene eseguita in questa istruzione?
void calcolaC(int A[MAX][MAX], int B[MAX][MAX], int C[MAX][MAX], int r, int c) {
for(int i=0;i<r;i++)
for(int j=0;j<c;j++)
C[i][j] = 3*A[i][j] - 2*B[i][j];
}
La somma delle matrici A e B
Il prodotto tra A e B
Una combinazione lineare di A e B
Il determinante della matrice C
cosa svolge il seguente programma?
void ***(int B[MAX][MAX], int r ,int c)
{ int n;
cout<< “.....” ;
cin>> n;
if(n>r) { cout<<”....”; return;}
for(int j=0; j<c;j++)
cout<< B[n-1][j] <<”....” ;
cout <<endl ;
}
calcola la somma tra matrici
visualizza una riga
visualizza una colonna
termina l'esecuzione del programma
Cosa fa questa funzione?
void ______ Matrici(int A[MAX][MAX], int B[MAX][MAX], int P[MAX][MAX], int r, int c)
{
for(int i=0;i<r;i++)
for(int j=0;j<c;j++){
P[i][j] = 0;
for(int k=0;k<c;k++)
P[i][j] = P[i][j] + A[i][k] * B[k][j];
}
}
Sottrazione tra A e B
Divisione tra A e B
Somma tra A e B
Prodotto tra la matrice A e B
Nella funzione mediaRigaB, perché viene effettuata la divisione
float(somma)/c invece di somma/c?
Per evitare divisione per zero.
Per ottenere un risultato in virgola mobile invece di un intero.
Per arrotondare il risultato alla riga più vicina.
Non fa differenza, il risultato è sempre lo stesso.
Nel switch-case principale, cosa accade se l’utente seleziona
l’opzione 3 senza prima scegliere la dimensione delle matrici?
Le matrici vengono generate con dimensione MAX.
Viene mostrato il messaggio "Prima scegli la dimensione della matrice."
Il programma genera errore di compilazione
Le matrici vengono generate come matrici 2x2 di default.
