Programma con array bidimensionali!!!!
salve a tutti gente, avrei bisogno di sapere come si risolve questo esercizio
è un esercizio d'esame
ecco il testo:
Scrivere una funzione C++ che dato un array a due dimensioni N x N di interi a, un intero n>=1 ed un intero k, restituisce TRUE se e solo se in ogni colonna esistono n coppie distinte di elementi la cui somma sia pari a k.
è un esercizio d'esame
ecco il testo:
Scrivere una funzione C++ che dato un array a due dimensioni N x N di interi a, un intero n>=1 ed un intero k, restituisce TRUE se e solo se in ogni colonna esistono n coppie distinte di elementi la cui somma sia pari a k.
Risposte
Allora devi verificare il numero di coppie solo dopo il ciclo più esterno, quando hai quindi contato tutte le coppie distinte.
"apatriarca":
O almeno è come ho interpretato il testo dell'esercizio
Nella sezione "statistica" impattiamo spesso in discussioni simili.
Io sono abbastanza "rigido". Se leggo "se e solo se in ogni colonna esistono n coppie distinte di elementi", per me 5 è 5 e 6 è 6 (non 5+1), anche se la frase "esattamente" non sia stata scritta.
Questione di interpretazione...

Io preferisco normalmente considerare l'esistenza “priva di unicità”. Se insomma mi viene richiesta la presenza di 5 coppie, mi basta trovarne 5 e non mi preoccupo della presenza di ulteriori coppie. Ma quando c'è il rischio di confusione preferisco comunque scrivere “esistono almeno 5 coppie” oppure “esistono esattamente 5 coppie”.
scusate ma a me il programma non funziona
l'ho scritto con il main
ma mi dice il contrario di quello che dovrebbe fare
eccolo qui
l'ho scritto con il main
ma mi dice il contrario di quello che dovrebbe fare
eccolo qui
#include<iostream> using namespace std; const int N=5; bool verifica_coppia(int [N][N], int , int, int); bool condizione(int [N][N], int, int); int main() { int k,n; int a[N][N]={{3,1,2,2,3},{3,1,2,2,3},{3,1,2,2,3},{3,1,2,2,3},{3,1,2,2,3}}; cout<<"Inserisci un numero(somma degli elementi della coppia "; cin>>k; cout<<"Inserisci un numero(numero di elementi della coppia) "; cin>>n; cout<<condizione(a,k,n); return 0; } bool verifica_coppia(int y[N][N], int b,int numero,int c) { int i,j; bool trovata=false; int cont=0; bool visitato[N]; for(i=0;i<N;i++){ visitato[i]=false; } i=0; while(i<N && !trovata) { if(!visitato[i]) j=i+1; int b=0; while(j<N) { if(y[i][c]==y[j][c]) { visitato[j]=true; } if((y[i][c]+y[j][c])==b) { visitato[j]=true; b=1; } j++; } cont+=b; i++; if(cont==numero) trovata=true; } return trovata; } bool condizione(int x[N][N],int r,int val) { int s=0; bool condition=true; while(s<N && condition) { condition=verifica_coppia(x,r,val,s); if(condition) { s++; cout<<"La condizione è verificata"<<endl; } else { cout<<"La condizione NON è verificata"<<endl; } } return condition; }
Che significa che non funziona? Non riesci a compilarlo? Quali sono in questo caso gli errori di compilazione? E che compilatore utilizzi? Oppure non restituisce il risultato corretto? Con quale input hai testato il programma e quale output ha restituito? Oppure va in crash durante l'esecuzione?
il fatto è che non restituisce il risultato corretto
e quindi non riesco a trovare l'errore nel codice dell'algoritmo
e quindi non riesco a trovare l'errore nel codice dell'algoritmo
Ma per quali valori di input hai provato il programma e non funziona?
k=5
n=2
dovrebbe restituire true
visto che esistono in tutte le colonne(che ho messo appunto uguali) due coppie (3,2) e (2,3)
la cui somma dà 5(k)
invece restituisce false
n=2
dovrebbe restituire true
visto che esistono in tutte le colonne(che ho messo appunto uguali) due coppie (3,2) e (2,3)
la cui somma dà 5(k)
invece restituisce false
Non funziona perché avevo scritto il programma pensando che l'ordine non contasse, cioè (2,3) era uguale a (3,2) per me...
e quindi come si può fare
mi servirebbe un aiuto
grazie
mi servirebbe un aiuto
grazie
if((y[i][c]+y[j][c])==b) { visitato[j]=true; b=1; }
probabilmente basta eliminare l'istruzione "visitato" sotto l'if,
cosi' facendo si considerano visitati solo i numeri uguali a quello che stiamo analizzando, e non piu' al suo "gemello".
Dovresti inoltre modificare anche l'istruzione
l'indice j, infatti dovrebbe ripartire da 1
..dovresti rivederlo un po tutto... in base alla nuova regola da te menzionata!!
j=i+1;
l'indice j, infatti dovrebbe ripartire da 1
..dovresti rivederlo un po tutto... in base alla nuova regola da te menzionata!!
@ Umby: non credo che si debba cambiare la partenza dell'indice j. Per tutti gli elementi precedenti hai già avuto modo di verificare la formazione di coppie. Se quindi trovassi un elemento della coppia prima di i sarebbe solo un doppione. La soluzione di segnare come visitati solo gli elementi uguali a quello corrente mi sembra quella corretta invece.
@ maschulillo: la versione che hai scritto nel tuo programma non è uguale a quella che avevo scritto io e hai introdotto dei nuovi errori:
Se l'elemento è già stato visitato devi uscire dal ciclo e non impostare j!!! Doveva essere
Inoltre è possibile che tu abbia inserito altri errori. Non ho controllato tutto il codice.
@ maschulillo: la versione che hai scritto nel tuo programma non è uguale a quella che avevo scritto io e hai introdotto dei nuovi errori:
if(!visitato[i]) j=i+1;
Se l'elemento è già stato visitato devi uscire dal ciclo e non impostare j!!! Doveva essere
if(!visitato[i]) continue;
Inoltre è possibile che tu abbia inserito altri errori. Non ho controllato tutto il codice.
ma scusa io continue non l'ho studiato
come si può scrivere questa parte di codice senza continue
e soprattutto a cosa serve continue?
e alla fine come viene il codice con la nuova modifica?
come si può scrivere questa parte di codice senza continue
e soprattutto a cosa serve continue?
e alla fine come viene il codice con la nuova modifica?
Il fatto che tu non l'abbia studiato non significa che è inutile e che può essere semplicemente ignorato. continue serve per passare alla successiva iterazione del ciclo saltando il resto del corpo del ciclo. Per cui quella riga serviva per evitare di prendere in considerazione gli elementi dell'array che erano già stati presi in considerazione. Il tuo ciclo ha un comportamento totalmente diverso.
ma non c'è un modo diverso per scrivere questa parte di funzione senza utilizzare continue?
e poi quali sono le ulteriori modifiche da apportare al programma affinchè funzioni?
pur utilizzando continue come si può allora aggiustare il codice
l'hai detto tu che nn va bene quello che hai scritto sopra e toccava apportare delle modifiche per prendere tutte le coppie
l'hai detto tu che nn va bene quello che hai scritto sopra e toccava apportare delle modifiche per prendere tutte le coppie
@apatriarca
scusa allora come si può risolvere il problema se il programma da te scritto non è corretto del tutto?
scusa allora come si può risolvere il problema se il programma da te scritto non è corretto del tutto?
Dovrebbe essere sufficiente sostituire
invece di
come già consigliato da Umby qualche post fa.
if ((y[i][c]+y[j][c])==b) { b=1; }
invece di
if ((y[i][c]+y[j][c])==b) { visitato[j]=true; b=1; }
come già consigliato da Umby qualche post fa.