Aiuto su un problema riguardante il linguaggio C++.

Collapse
X
 
  • Ora
  • Show
Clear All
new posts
  • Niotan
    Opinionista
    • 12/01/14
    • 7

    #1

    Aiuto su un problema riguardante il linguaggio C++.

    Salve a tutti,
    non so se sia la sezione adatta -e per questo già mi scusa in partenza- ma avrei bisogno di un aiuto con un programma in C++ che mi ha un po spiazzato, essendo diverso da quelli precedentemente affrontati.
    La traccia è questa: "Si progetti ed implementi in C++ un algoritmo che, presi in input 2 numeri interi, n>=2 ed m>=2:

    -Acquisisca da standard input gli elementi di vettore bidimensionale A di dimensione n*m e di un vettore bidimensionale B
    di dimensione m*n.

    -Invochi una procedura che verifichi se A è la matrice trasposta di B.
    In caso affermativo la procedura deve fornire su standard output il messaggio "true"; altrimenti su standard output, la procedura
    deve fornire la lista degli elementi differenti e dei rispettivi indici di posizione delle matrici A e B."

    Il mio svolgimento è questo:
    "
    #include <iostream>

    using namespace std;
    int acquisisci (){
    int num;
    cout<<"inserisci un intero maggiore di 2"<<endl;
    do{
    cin>> num;
    if(num<2)
    cout<<"Errore. Riprova."<<endl;
    }while (num<2);
    }

    void trasposta (int A[][m], int B[][n], int n, int m){
    for( int i=0; i<n; i++)
    for( int j=0; j<m; j++){
    if(A[i][j] == B[j][i])
    cout<<"true"<<endl;
    else
    if(A[i][j]!= B[j][i]){
    cout<<"l'elemento"<<A[i][j]<<"posizionato in"<<i+1<<j+1<<endl;
    cout<<"e' diverso da "<<B[j][i]<<"posizionato in"<< j+1<<i+1<<endl;
    }
    }



    int main()
    {
    int n=acquisisci;
    int m=acquisisci;
    int A[n][m];
    int B[m][n];

    for( int i=0; i<n;i++)
    for( int j=0; j<m; j++){
    cout<<"inserisci elemento riga"<<i+1<<"colonna"<< j+1<<"della prima matrice"<<endl;
    cin>> A[i][j];
    }
    for( int i=0; i<m;i++)
    for( int j=0; j<n; j++){
    cout<<"inserisci elemento riga"<<i+1<<"colonna"<< j+1<<"della prima matrice"<<endl;
    cin>>B[i][j];
    }

    trasposta (A, B, n, m);


    system("PAUSE");
    return 0;
    }
    "
    Tralasciando il fatto che ora l'ho scritto velocemnte e con qualche imprecisione, mi sono reso conto già durante l'esame che nella procedura "trasposta" la seconda dimensione di entrambi gli array non è corretta perchè non rispetta le regole di scope, essendo dichiarata solo nel main. Come si risolve questo problema, non volendo usare i puntatori?
  • giusepebottazzi
    random
    • 18/02/12
    • 1559

    #2

    Caro amico
    Ti sia di conforto il vecchio adagio:
    se fai parte del problema sei anche parte della soluzione!
    Scusate ma ho scritto col riconoscimento vocale e non ho riletto prima di pubblicare!!!

    Comment

    • BiO-dEiStA
      Eufonista
      • 22/02/10
      • 5403

      #3
      Premetto che col C++ ho chiuso da secoli, perché la vita offre un sacco di perversioni mille volte più interessanti. Ma giusto per curiosità ho sbattuto il tuo listato in faccia a un compilatore online, e sono giunto alle seguenti conclusioni:

      1) La funzione acquisisci non è void, bensì restituisce un intero, quindi prima della graffa di chiusura va inserito un return num;

      2) Soprattutto, se non vuoi usare puntatori vuol dire che le tue matrici devono essere statiche, con tutti gli svantaggi che ne conseguono. Fuori dal main devi dichiarare qualcosa del tipo const int dimmerda = 100, e allora la procedura trasposta avrà come argomenti (int A[dimmerda][dimmerda], int B[dimmerda][dimmerda], int n, int m), con n ed m minori o uguali a dimmerda.

      Avrai già capito che a ogni invocazione della procedura la verifica interesserà solo gli elementi inizializzati di volta in volta, mentre gli altri saranno totalmente ininfluenti, stanno lì solo per occupare spazio in memoria. Non è mica colpa mia se con gli oggetti statici il compilatore vuol sapere in anticipo quanto spazio allocare.
      Originariamente Scritto da Careful with that
      i miei post in media sono di una dozzina di righe, al più;
      Originariamente Scritto da Ned Flanders
      Sono stato tanto...ma tanto Laurina, lontano dal Signore: Ne ho combinate di cotte e di crude. Ti basti sapere soltanto questo....

      Comment

      • Niotan
        Opinionista
        • 12/01/14
        • 7

        #4
        Originariamente Scritto da BiO-dEiStA Visualizza Messaggio
        Premetto che col C++ ho chiuso da secoli, perché la vita offre un sacco di perversioni mille volte più interessanti. Ma giusto per curiosità ho sbattuto il tuo listato in faccia a un compilatore online, e sono giunto alle seguenti conclusioni:

        1) La funzione acquisisci non è void, bensì restituisce un intero, quindi prima della graffa di chiusura va inserito un return num;

        2) Soprattutto, se non vuoi usare puntatori vuol dire che le tue matrici devono essere statiche, con tutti gli svantaggi che ne conseguono. Fuori dal main devi dichiarare qualcosa del tipo const int dimmerda = 100, e allora la procedura trasposta avrà come argomenti (int A[dimmerda][dimmerda], int B[dimmerda][dimmerda], int n, int m), con n ed m minori o uguali a dimmerda.

        Avrai già capito che a ogni invocazione della procedura la verifica interesserà solo gli elementi inizializzati di volta in volta, mentre gli altri saranno totalmente ininfluenti, stanno lì solo per occupare spazio in memoria. Non è mica colpa mia se con gli oggetti statici il compilatore vuol sapere in anticipo quanto spazio allocare.
        Innanzi tutto, grazie per aver perso la testa dietro a questo esercizio . Il mancato return nella prima funzione è stato un errore di distrazione che fortunatamente non ho fatto all' esame. Meno male.
        Per quanto riguarda il problema della procedura "trasposta", sapevo sin da subito che senza un #define o, comunque, dichiarare come una costante le dimensioni degli array, era un errore. Mi sono sempre trovato davanti esercizi in cui sapevo già la dimensione massima dell' array e quindi non avevo di questi problemi. Sfortunatamente non conoscendo bene i puntatori -anche sapendo fosse la procedura corretta per questo genere di esercizio- l' ho scritto in questo modo, sperando in una botta di... fortuna. Per caso sapresti indicarmi la soluzione attraverso i puntatori?

        Ringrazio anche te, "giusepebottazzi", per la massima di conforto

        Comment

        • giusepebottazzi
          random
          • 18/02/12
          • 1559

          #5

          no problem,caro amico,mi è servita più volte!
          Scusate ma ho scritto col riconoscimento vocale e non ho riletto prima di pubblicare!!!

          Comment

          • BiO-dEiStA
            Eufonista
            • 22/02/10
            • 5403

            #6
            Originariamente Scritto da Niotan Visualizza Messaggio
            Per caso sapresti indicarmi la soluzione attraverso i puntatori?
            Non c'è la soluzione, ce ne sono una moltitudine.
            Fra le tante, guarda ad esempio questa pagina, un modo per creare e inizializzare la matrice. Puoi usare int al posto di float e unsigned, nel tuo caso.
            All'interno del main dichiarerai matrix A,B, e nel secondo caso scambierai il numero di riga con quello di colonna, eventualmente usando qualche variabile di appoggio. Manca il distruttore, perciò usa delete alla fine.
            Altri più masochisti creano un oggetto (es. class matrix) con costruttore, distruttore e proprietà. Ma volendo ci si può arrangiare anche con un array monodimensionale, usando una formula del tipo: elemento(i,j) = array[numcolonne*(i-1)+j]. Nota che in questo caso non sei obbligato a dichiarare l'indice, ovvero l'ultima dimensione, lo stesso motivo per cui nel tuo codice avevi potuto scrivere int A[][m], int B[][n].
            Originariamente Scritto da Careful with that
            i miei post in media sono di una dozzina di righe, al più;
            Originariamente Scritto da Ned Flanders
            Sono stato tanto...ma tanto Laurina, lontano dal Signore: Ne ho combinate di cotte e di crude. Ti basti sapere soltanto questo....

            Comment

            Working...