Programma con array bidimensionali!!!!

giuliomontenero
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.

Risposte
apatriarca
Allora devi verificare il numero di coppie solo dopo il ciclo più esterno, quando hai quindi contato tutte le coppie distinte.

Umby2
"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... :wink:

apatriarca
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”.

giuliomontenero
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
#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;
}


apatriarca
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?

giuliomontenero
il fatto è che non restituisce il risultato corretto
e quindi non riesco a trovare l'errore nel codice dell'algoritmo

apatriarca
Ma per quali valori di input hai provato il programma e non funziona?

giuliomontenero
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

apatriarca
Non funziona perché avevo scritto il programma pensando che l'ordine non contasse, cioè (2,3) era uguale a (3,2) per me...

giuliomontenero
e quindi come si può fare
mi servirebbe un aiuto
grazie

Umby2
 
           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".

Umby2
Dovresti inoltre modificare anche l'istruzione

j=i+1;


l'indice j, infatti dovrebbe ripartire da 1

..dovresti rivederlo un po tutto... in base alla nuova regola da te menzionata!!

apatriarca
@ 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:
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.

giuliomontenero
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?

apatriarca
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.

giuliomontenero
ma non c'è un modo diverso per scrivere questa parte di funzione senza utilizzare continue?

giuliomontenero
e poi quali sono le ulteriori modifiche da apportare al programma affinchè funzioni?

giuliomontenero
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

giuliomontenero
@apatriarca
scusa allora come si può risolvere il problema se il programma da te scritto non è corretto del tutto?

apatriarca
Dovrebbe essere sufficiente sostituire
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.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.