Esercizio su array bidimensionali

di il
10 risposte

Esercizio su array bidimensionali

L'esercizio dice:
Scrivere una funzione C++ che, dato un array a due dimensioni N x N di interi a ed un intero positivo k>=2, restituisce true se esiste un numero intero n che occorre almeno k volte in esattamente k righe di a, e false altrimenti.

ecco il mio programma, non dà errori ma all'esecuzione qualsiasi k metto mi dice sempre che la condizione è verificata
io praticamente ho creato due funzioni, di cui una mi calcola le occorrenze in una singola riga e vede se sono almeno k, la seconda mi va a vedere se le occorrenze si ripetono in esattamente k righe di a.

#include<iostream>
#include<string>
using namespace std;
const int N=7;
bool condizione(int [N][N],int ,int ,int );
bool occorrenze(int [N][N],int ,int );
int main()
{
    int n;
    int a[N][N]={{1,2,3,1,1,5},{4,1,1,2,1,8,8},{4,3,1,9,7,6,1},{7,1,1,1,1,8,8},{3,4,5,6,2,1,8},{2,1,1,9,1,1,7},{1,1,1,1,2,2,3}};
    int k;
    cout<<"Inserire un numero "<<endl;
    cin>>k;
    for(int r=0;r<N;r++)
    {
        for(int j=0;j<N;j++)
        {
            a[r][j]=n;
        }
    }
    if(occorrenze(a,k,n))
    cout<<"non  ";

    cout<<" è verificata la condizione dell'esercizio"<<endl;

return 0;
}

bool condizione(int a[N][N],int k,int n,int r)
{
    int j;
    int count=0;
    bool trovato=false;
    j=0;
    while(j<N && !trovato)
    {
        if(a[r][j]==n)
        {
            count++;
            trovato=count>=k;
        }
    j++;
    }
return trovato;
}

bool occorrenze(int a[N][N],int k,int n)
{
    int contatore=0;
    bool cond=false;
    for(int i=0;i<N && cond;i++)
    {
        if(condizione(a,k,n,i))
        contatore++;
        if(contatore==k)
        cond=true;
    }
return cond;
}

10 Risposte

  • Re: Esercizio su array bidimensionali

    C' erano delle cose che non avevano senso come:
    for(int r=0;r<N;r++)
        {
            for(int j=0;j<N;j++)
            {
                a[r][j]=n;
            }
        }
    dove l' array a è già inizializzato e non si capisce perchè lo inizializzi con n.
    Inoltre nella funzione occorrenze inserivi l' istruzione:
    if(contatore==k)
       cond=true;


    all' interno del ciclo for e ciò non è corretto, mentre la funzione condizione è fatta bene.
    Aggiungendo la funzione cin per inserire il valore n da tastiera, il programma corretto è il seguente:
    #include<iostream>
    using namespace std;
    const int N=7;
    bool condizione(int [N][N],int ,int, int);
    bool occorrenze(int [N][N], int, int);
    int main()
    {
        int k,n;
        int a[N][N]={{1,2,3,1,1,5,1},{4,1,1,2,1,8,8},{4,3,1,9,7,6,1},{7,1,1,1,1,8,8},{3,4,5,6,2,1,8},{2,1,1,9,1,1,7},{1,1,1,1,2,2,3}};
        cout<<"Inserire un numero k per le occorrenze:"<<endl;
        cin>>k;
        cout<<"Inserire il numero n da ricercare:"<<endl;
        cin>>n;
        if(occorrenze(a,k,n))
        cout<<"e' verificata la condizione dell'esercizio"<<endl;
        else
        cout<<"non e' verificata la condizione dell'esercizio"<<endl;
        return 0;
      }
    
    bool condizione(int a[N][N], int k, int n, int r)
    {
        int j,i;
        int count=0;
        bool trovato=false;
        j=0;
        while(j<N && !trovato)
        {
          if(a[r][j]==n)
           {
             count++;
             trovato=count>=k;
            }
         j++;
        }
      return trovato;
    }
    
    bool occorrenze(int a[N][N], int k, int n)
    {
        int contatore=0;
        bool cond=false;
        for(int i=0; i<N; i++)
        {
          if(condizione(a,k,n,i))
          contatore++;
         } 
          if(contatore==k)
          cond=true;
      return cond;
    }
    
  • Re: Esercizio su array bidimensionali

    Infatti volevo sapere ho capito che ho sbagliato a inizializzare gli elementi della matrice tutti a n, ma in realtà n non è un numero che devo inserire da tastiera, ma è un numero della matrice .
  • Re: Esercizio su array bidimensionali

    Quindi per cercare n interno alla matrice?
  • Re: Esercizio su array bidimensionali

    Basta allora modificare il main, in modo che n possa assumere tutti i valori della matrice e facendo in modo che ogni volta che assume uno di questi valori, venga chiamata la funzione occorrenze.
    Le funzioni occorrenze e condizione restano le stesse del programma con n inserito da tastiera.
    Il main devi modificarlo in questo modo:
    int main()
    {
        int k,n;
        int a[N][N]={{1,2,3,1,1,5,1},{4,1,1,2,1,8,8},{4,3,1,9,7,6,1},{7,1,1,1,1,8,8},{3,4,5,6,2,1,8},{2,1,1,9,1,1,7},{1,1,1,1,2,2,3}};
        cout<<"Inserire un numero k per le occorrenze:"<<endl;
        cin>>k;
        int i=0,j=0;
        bool verificata=false;
        while(i<N && !verificata)
        {
         j=0;
         while(j<N && !verificata)
         {
          n=a[i][j];
          if(occorrenze(a,k,n))
          verificata=true;
          j++;
         } 
        i++;
        }
        if(verificata)
        cout<<"e' verificata la condizione dell'esercizio"<<endl;
        else
        cout<<"non e' verificata la condizione dell'esercizio"<<endl;
        return 0;
      }
    Matteo
  • Re: Esercizio su array bidimensionali

    Ho fatto come dici te
    perchè non mi funziona?
    provo per n=1 e k=3
    
    #include<iostream>
    using namespace std;
    const int N=7;
    bool condizione(int [N][N],int ,int ,int );
    bool occorrenze(int [N][N],int ,int );
    int main()
    {
        int a[N][N]={{6,2,3,1,1,5,9},{1,1,1,2,1,8,8},{4,3,1,9,7,6,1},{7,1,1,1,1,8,8},{3,4,5,6,2,1,8},{2,1,1,9,1,1,7},{9,5,4,1,2,2,3}};
        int n;
        int k;
        cout<<"inserisci un numero(interno alla matrice)"<<endl;
        cin>>n;
        cout<<endl;
    
        cout<<"Inserire un numero maggiore o uguake a 2 "<<endl;
        cin>>k;
        cout<<endl;
    
        if(!occorrenze(a,n,k))
        cout<<"NON ";
    
        cout<<" E' VERIFICATA LA CONDIZIONE"<<endl;
    
    return 0;
    }
    
    bool condizione(int a[N][N],int n, int k,int row)
    {
        row=0;
        int cont=0;
        bool trovato=false;
        for(int j=0;j<N && !trovato;j++)
        {
            if(a[row][j]==n)
            {
                cont++;
                trovato=cont>=k;
            }
        }
        return trovato;
    }
    
    bool occorrenze(int a[N][N],int n,int k)
    {
        bool verifica=false;
        int contatore=0;
        for(int r=0;r<N && !verifica;r++)
        {
            if(condizione(a,n,k,r))
            contatore++;
        }
        if(contatore==k)
        verifica=true;
    
    return verifica;
    }
    
    
  • Re: Esercizio su array bidimensionali

    Stai facendo un errore all' interno della funzione condizione:
    Inizializzi row=0 quando non deve essere inizializzato visto che viene fornito come parametro della funzione.
    Inoltre nel ciclo for:
    for(int r=0; r<N && !verifica; r++)
    della funzione occorrenze utilizzi la condizione !verifica che non ti serve a niente, devi toglierla.

    Matteo
  • Re: Esercizio su array bidimensionali

    Toglila proprio la variabile row all' interno della funzione condizione, la funzione corretta è questa:
    bool condizione(int a[N][N],int n, int k,int row)
    {
        int cont=0;
        bool trovato=false;
        for(int j=0;j<N && !trovato;j++)
        {
            if(a[row][j]==n)
            {
                cont++;
                trovato=cont>=k;
            }
        }
        return trovato;
    }
    Matteo
  • Re: Esercizio su array bidimensionali

    Si ma allora come deve essere la funzione
    il codice che mi hai postato è identico alla mia funzione
    e io non cisto capendo molto
    al posto di row cosa metto?
  • Re: Esercizio su array bidimensionali

    Il codice della funzione condizione che ti ho postato è identico al tuo tranne che ho tolto:
    row=0;
    Al posto di row non devi mettere niente.
    Adesso il tuo programma funziona perchè ho provato a compilarlo anche io.

    Matteo
  • Re: Esercizio su array bidimensionali

    Ok
    grazie
    ho capito dove avevo sbagliato
    ogni volta che chiamavo la funzione avendo inizializzato a 0 la riga row
    non mi andava avanti e quindi non mi verificava le altre righe
    grazie comunque
Devi accedere o registrarti per scrivere nel forum
10 risposte