Trovare array nella matrice

di il
35 risposte

35 Risposte - Pagina 2

  • Re: Trovare array nella matrice

    E che dobbiamo studiare noi per te? Davvero non riesci a fare una ricerchina da 30 secondi per vedere come si chiama una matrice? Usa le variabili globali allora
  • Re: Trovare array nella matrice

    Ma infatti non ho detto che dovete studiare voi per me, vorrei solo sapere cosa sto sbagliando nella funzione.
    Le matrici durante il corso le abbiamo sempre dichiarate così e i programmi funzionano, ho solo problemi con la funzione del trovare l'array nella matrice!
  • Re: Trovare array nella matrice

    #include <iostream>
    using namespace std;
    
    void initMat(int** M, int righe, int colonne)
    {
     for (int i=0; i<righe;i++)
        for (int j=0; j<colonne;j++)
        {
            cout << "M[" << i << "][" << j << "] = ";
            cin >> M[i][j];
        }
    }
    
    void stampaM(int** M, const int righe, const int colonne)
    {
        for (int i=0; i<righe;i++)
        {
            for (int j=0; j<colonne;j++)
            cout << M[i][j] << " ";
            cout << endl;
        }
    }
    
    bool trova_array(int * v, int dim_v, int ** M, int righe,int colonne)
    {
    if (dim_v>colonne)
    return false;
    
    int cont;
    for (int i=0; i<(righe*colonne)-dim_v;i++)
    {
     cont = 0;
     for (int j=0; j<=righe;j++)
     for (int p=0; p<=colonne;p++)
     for (int k=0; k<=dim_v;k++)
     if (v[0+k]==M[i+j][i+p])
     cont++;
     else 
     break;
     if (cont==dim_v)
     return true;
    }
    return false;
    }
    
    int main()
    {
    const int dim_v=3;
    int v[]={5,4,2};
    
    int righe;
    int colonne;
    
    // allocazione matrice M
    int** M = 0;
    M = new (nothrow) int*[righe];
    for (int i=0; i < righe; i++)
    M[i] = new (nothrow) int [colonne];
    
    cout << "inserisci il numero di righe e di colonne: ";
    cin >> righe >> colonne;
    
    initMat(M, righe, colonne);
    cout << "la matrice è: " << endl;
    stampaM(M,righe,colonne);
    
    bool trovato = trova_array(v,dim_v,M,righe,colonne);
    if (trovato)
    cout << "l'array è nella matrice" << endl;
    else 
    cout <<"l'array non è nella matrice" << endl;
    
    
    for(int i=0; i<righe;i++)
    delete[] M[i];
    delete[] M;
    
        return 0;
    }
    ecco il programma modificato . la funzione è il mio unico problema.
  • Re: Trovare array nella matrice

    No il tuo unico problema è che non hai voglia di studiare. Righe e colonne le chiedi all'utente dopo aver allocato? E secondo te il povero programma quanti byte dovrebbe allocare per la tua matrice?
  • Re: Trovare array nella matrice

    Chiedendole prima dell'allocazione mi porta un "Segmentation fault".
    Ma comunque, non c'è bisogno di rispondere con arroganza dicendo che non ho voglia di studiare, altrimenti non mi sarei nemmeno iscritto al forum per cercare di capire cosa sbaglio. Bastava semplicemente dire che sto sbagliando.
  • Re: Trovare array nella matrice

    Prima si chiede quante righe e colonne si vogliono e poi si usano per l'allocazione. Questo è ovvio.

    Se hai ALTRI errori questi non saranno determinati dall'allocazione ma da ALTRO codice seguente.
  • Re: Trovare array nella matrice

    Nippolo ha scritto:


    oregon ha scritto:


    Non è meglio correggere l'errore e usare il doppio puntatore?
    Scusa ma come fai a passare una matrice (nel senso di array bidimensionale statico) ad una funzione attraverso un argomento di tipo puntatore doppio?
    Ho mai detto di fare questa cosa?
  • Re: Trovare array nella matrice

    oregon ha scritto:


    Prima si chiede quante righe e colonne si vogliono e poi si usano per l'allocazione. Questo è ovvio.

    Se hai ALTRI errori questi non saranno determinati dall'allocazione ma da ALTRO codice seguente.
    OK ho corretto questo errore. Potreste aiutarmi sulla funzione adesso? Grazie
  • Re: Trovare array nella matrice

    Invito tutti a dialogare con più "morbidezza" .... non vorrei arrivare tra alcuni post a chiudere il thread, grazie.
  • Re: Trovare array nella matrice

    cavamr ha scritto:


    OK ho corretto questo errore. Potreste aiutarmi sulla funzione adesso? Grazie
    Adesso il codice attuale qual è? E quale problema riscontri?

    In ogni caso nella funzione vedo che i arriva a

    i<(righe*colonne)-dim_v

    e poi i lo usi come indice di riga.

    Evidentemente il valore (righe*colonne)-dim_v va oltre il consentito, non ti pare?
  • Re: Trovare array nella matrice

    oregon ha scritto:


    cavamr ha scritto:


    OK ho corretto questo errore. Potreste aiutarmi sulla funzione adesso? Grazie
    Adesso il codice attuale qual è? E quale problema riscontri?

    In ogni caso nella funzione vedo che i arriva a

    i<(righe*colonne)-dim_v

    e poi i lo usi come indice di riga.

    Evidentemente il valore (righe*colonne)-dim_v va oltre il consentito, non ti pare?

    Ho di nuovo modificato la funzione.. scusate se sto creando solo confusione
    #include <iostream>
    using namespace std;
    
    void initMat(int** M, int righe, int colonne)
    {
     for (int i=0; i<righe;i++)
        for (int j=0; j<colonne;j++)
        {
            cout << "M[" << i << "][" << j << "] = ";
            cin >> M[i][j];
        }
    }
    
    void stampaM(int** M, const int righe, const int colonne)
    {
        for (int i=0; i<righe;i++)
        {
            for (int j=0; j<colonne;j++)
            cout << M[i][j] << " ";
            cout << endl;
        }
    }
    
    bool trova_array(int * v, int dim_v, int ** M, int righe,int colonne)
    {
    if (dim_v>colonne)
    return false;
    int cont;
    for(int r=0;r<=righe-dim_v;r++) //indice righe matrice 
        for(int c=0;c<=colonne-dim_v;c++) //indice colonne matrice
    {
        cont = 0;
        for (int j=0; j<dim_v;j++) //indice dim array
        if (v[0+j]==M[r+j][c+j])
        cont++;
        else
        break;
    
        if (cont==dim_v)
        return true;
     }
    return false;
    }
    
    int main()
    {
    const int dim_v=3;
    int v[]={5,4,2};
    
    int righe;
    int colonne;
    cout << "inserisci il numero di righe e di colonne: ";
    cin >> righe >> colonne;
    // allocazione matrice M
    int** M = 0;
    M = new (nothrow) int*[righe];
    for (int i=0; i < righe; i++)
    M[i] = new (nothrow) int [colonne];
    
    initMat(M, righe, colonne);
    cout << "la matrice è: " << endl;
    stampaM(M,righe,colonne);
    
    bool trovato = trova_array(v,dim_v,M,righe,colonne);
    if (trovato)
    cout << "l'array è nella matrice" << endl;
    else 
    cout <<"l'array non è nella matrice" << endl;
    
    
    for(int i=0; i<righe;i++)
    delete[] M[i];
    delete[] M;
    
        return 0;
    }
    se inserisco una matrice 3x3 e metto in successione i valori 5 - 4 - 2 - 5 - 4 - 2 - 5 - 4 - 2 mi dice che l'array è nella matrice..
    se invece, inserendo sempre una matrice 3x3, inserisco i valori 5 - 4 - 2 - 1 - 7 - 8 - 9 - 4 - 5 mi dice che l'array non è contenuto quando in realtà è nella prima riga della matrice
  • Re: Trovare array nella matrice

    oregon ha scritto:


    Nippolo ha scritto:


    oregon ha scritto:


    Non è meglio correggere l'errore e usare il doppio puntatore?
    Scusa ma come fai a passare una matrice (nel senso di array bidimensionale statico) ad una funzione attraverso un argomento di tipo puntatore doppio?
    Ho mai detto di fare questa cosa?
    I presupposti erano i seguenti:

    Weierstrass ha scritto:


    Sicuro che il puntatore a matrice si dichiara con int* M?

    cavamr ha scritto:


    Si si dichiara con due puntatori ma facendolo mi porta un errore .. stavo provando a considerare la matrice come array unidimensionale, non so

    oregon ha scritto:


    Non è meglio correggere l'errore e usare il doppio puntatore?
    Se ho capito male, sarei lieto di ascoltare (leggere) la corretta interpretazione.
  • Re: Trovare array nella matrice

    Nippolo smetti di provocare flame inutili
  • Re: Trovare array nella matrice

    oregon ha scritto:


    Nippolo smetti di provocare flame inutili
    Ne sai una più del diavolo!

    @cavamr
    - innanzitutto al fine di rendere il codice più chiaro e leggibile ti consiglio di rispettare la spaziatura e l'indentazione e di racchiudere il corpo delle istruzioni di controllo (if, for, ...) tra parentesi graffe anche quando costituito da una sola riga di codice;
    - almeno in questa fase iniziale, dove lo scopo è implementare la funzione trova_array(), perché perdere tempo con l'inserimento da tastiera? Meglio inserire i valori direttamente nel codice.

    Sulla scorta di quanto appena detto, e volendo mostrarti come passare un array bidimensionale statico ad una funzione (non entro nei dettagli in quanto mi sembra di capire che tu non sia molto interessato all'argomento), si ottiene qualcosa del genere:
    #include <iostream>
    
    using namespace std;
    
    const int RIG= 3;
    const int COL= 4;
    const int DIM= 3;
    
    bool trova_array(int *v, int dim, int m[][COL], int rig, int col)
    {
        if(dim > col)
        {
            return false;
        }
        int cont;
        for(int r = 0; r <= rig - dim; r++)
        {
            for(int c = 0; c <= col - dim; c++)
            {
                cont = 0;
                for(int j = 0; j < dim; j++)
                {
                    if(v[0 + j] == m[r + j][c + j])
                    {
                        cont++;
                    }
                    else
                    {
                        break;
                    }
                }
                if(cont == dim)
                {
                    return true;
                }
            }
        }
        return false;
    }
    
    int main()
    {
        int m[RIG][COL] = {{1, 2, 3, 4},
                           {5, 6, 7, 8},
                           {5, 5, 4, 2}};
        int v[DIM] = {5, 4, 2};
        cout << trova_array(v, DIM, m, RIG, COL) << endl;
    }
    
    Relativamente alla funzione ti chiedo:
    - ipotizziamo di avere una matrice m 4x7 e un vettore v di 2 elementi, quante righe devo controllare prima di poter affermare che v non è contenuto nelle righe di m?
    - tutta la parte racchiusa nel terzo for cosa dovrebbe fare secondo te? Perché sommi j anche all'indice r?
  • Re: Trovare array nella matrice

    @cavamr

    Dato che l'esercizio parla di input da tastiera e quindi non indica un numero preciso di colonne e righe, continua a gestire l'allocazione dinamica della matrice come hai fatto (evitando peraltro i VLA)

    Magari per una questione di velocità nello sviluppo puoi leggere i dati da un file se sai farlo.
Devi accedere o registrarti per scrivere nel forum
35 risposte