Risultati da 1 a 6 di 6

Discussione: Aiuto su un problema riguardante il linguaggio C++.

  1. #1
    Opinionista
    Data Registrazione
    12/01/14
    Messaggi
    7

    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?

  2. #2
    random L'avatar di giusepebottazzi
    Data Registrazione
    18/02/12
    Località
    zagarolo
    Messaggi
    1,559

    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!!!

  3. #3
    Eufonista L'avatar di BiO-dEiStA
    Data Registrazione
    22/02/10
    Località
    La terra delle tre stirpi
    Messaggi
    5,403
    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.
    Citazione Originariamente Scritto da Careful with that Visualizza Messaggio
    i miei post in media sono di una dozzina di righe, al più;
    Citazione Originariamente Scritto da Ned Flanders Visualizza Messaggio
    Sono stato tanto...ma tanto Laurina, lontano dal Signore: Ne ho combinate di cotte e di crude. Ti basti sapere soltanto questo....

  4. #4
    Opinionista
    Data Registrazione
    12/01/14
    Messaggi
    7
    Citazione 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

  5. #5
    random L'avatar di giusepebottazzi
    Data Registrazione
    18/02/12
    Località
    zagarolo
    Messaggi
    1,559

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

  6. #6
    Eufonista L'avatar di BiO-dEiStA
    Data Registrazione
    22/02/10
    Località
    La terra delle tre stirpi
    Messaggi
    5,403
    Citazione 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].
    Citazione Originariamente Scritto da Careful with that Visualizza Messaggio
    i miei post in media sono di una dozzina di righe, al più;
    Citazione Originariamente Scritto da Ned Flanders Visualizza Messaggio
    Sono stato tanto...ma tanto Laurina, lontano dal Signore: Ne ho combinate di cotte e di crude. Ti basti sapere soltanto questo....

Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •  
  • Il codice BBAttivato
  • Le faccine sono Attivato
  • Il codice [IMG]Attivato
  • Il codice [VIDEO]Attivato
  • Il codice HTML � Disattivato