+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 10 su 10

[C++]Problema con vettori/array/matrici

  1. #1
    ValerioHD non è in linea Novello
    Salve,
    sto provando a fare un esercizio il quale testo chiede di realizzare un programma che chiede all'utente di inserire dei valori, tali valori devono essere memorizzati in un vettore e successivamente stampati..
    ho fatto il programma ma non funziona come dovrebbe! mi stampa la penultima cifra al posto della seconda (nel caso 1 1)
    vi posto il codice ed uno screenshot

    #include <stdio.h>
    #include <iostream>
    using namespace std;
    
    int main()
    {
    
        int d1, d2;
        int contatore = 0;
    
        cout << "Inserisci la dimensione del vettore: ";
        cin >> d1 >> d2;
        
        int vettore[d1][d2];
    
         //Inizializza il vettore a 0 in tutte le posizioni
         for(int j=0; j<=d1; j++)
        {
            for(int i=0; i<=d2; i++)
            {
    
    
                vettore[j][i] = 0;
    
            }
        }
    
        //Assegna le variabili al vettore
        for(int j=0; j<=d1; j++)
        {
            for(int i=0; i<=d2; i++)
            {
                contatore++;
                cout << "\nInserisci il valore del vettore " << j << "." << i << ": ";
                cin >> vettore[j][i];
               
            }
        }
    
        
        //Stampa le variabili contenute nel vettore
        for(int j=0; j<=d1; j++)
        {
            for(int i=0; i<=d2; i++)
            {
                    cout << vettore[j][i] << endl; 
            }
        }
     
    }
    


    Come potrete notare l'utente inserisce in input 1,2,3,4 e il programma stampa 1,3,3,4!!
    non riesco a capire dove sbaglio.. spero voi possiate aiutarmi..
    P.S. BUON NATALE!!!

  2. #2
    La tua soluzione perplime alquanto. Il testo dell'esercizio parla di vettore, una struttura unidimensionale, ma il codice implementa (peraltro erroneamente) la gestione di una matrice bidimensionale. Dunque é opportuno chiarire meglio questo aspetto.

    Vi è inoltre un macroscopico errore nelle condizioni di terminazione di tutti i cicli: gli indici, in linguaggio C, partono da zero. Si deve sempre ricordare che l'intervallo chiuso di naturali [0, n] (con n ovviamente intero positivo) consta di esattamente n +1 elementi. Pertanto, col codice così scritto, vi è un off-by-one certamente indesiderato.
    In generale, la comparsa di un >= o <= nel proprio codice C indica quasi sicuramente un errore: la necessità di utilizzare tali operatori compositi è rarissima nella maggior parte degli algoritmi e degli idiomi.

    Ciò è palesemente confermato dal fatto che una ipotetica (e assai poco utile) matrice 1x1 come da esempio dovrebbe contenere un solo elemento, fornendo un risultato ben diverso da quello mostrato nello screenshot.


    PS: Buon Natale !
    Ultima modifica di M.A.W. 1968; 25-12-2010 18:22 
    ℹ️ Leggi di più su M.A.W. 1968 ...

  3. #3
    ValerioHD non è in linea Novello
    Gentile M.A.W 1968, inizio con il ringraziarti per la tua risposta e mi scuso per la poca chiarezza e confusione menzionando array,matrici,vettori ecc.
    Penso di aver più o meno capito cio che intendi.. ma non ne sono del tutto certo.. potresti gentilmente postare il mio codice corretto?
    Grazie in anticipo!

  4. #4
    L'avatar di bottomap
    bottomap non è in linea Amanuense
    Ciao,

    In genere non siamo abituati, perché alla lunga si rivela solo controproducente, fornire codice pret-a-compiler... le indicazioni del buon MAW sono, come sempre, piuttosto precise e mi paiono più che intellegibili...
    Quali sono le tue perplessità riguardo a quanto ti è stato indicato? I due problemi principali (il fatto di usare una matrice quando il testo ti chiede un vettore ed l'impostazione errata dei cicli) dovrebbero essere di semplicissima risoluzione se hai chiaro il funzionamento dei costrutti in questione.

    Inoltre non hai indicato quello che stai cercando di realizzare. MAW ti ha fatto notare che c'è una discrepanza notevole tra il testo (che parla di array) e quello che hai scritto (che cerca di implementare l'algoritmo con una matrice). Quale delle due strade devi percorrere? Le eventuali indicazioni che possiamo darti non possono prescindere da questo.

    Ciaociao
    ℹ️ Leggi di più su bottomap ...

  5. #5
    ValerioHD non è in linea Novello
    Ciao bottomap, hai perfettamente ragione.. solo che vedendo del codice avrei sicuramente capito di piu.. comunque devo usare una matrice quadrata.. ma ancora non capisco dove sbaglio

  6. #6
    ValerioHD non è in linea Novello
    Quote Originariamente inviato da M.A.W. 1968 Visualizza il messaggio
    una ipotetica (e assai poco utile) matrice 1x1 come da esempio dovrebbe contenere un solo elemento, fornendo un risultato ben diverso da quello mostrato nello screenshot.
    una matrice 1x1 dovrebbe contenerne 4, non 1 se non sbaglio
    come hai detto tu gli indici in c partono da 0.. quindi 1x1 sarebbe come 2x2 (se gli indici partissero da 1)

    0 0 <- da 0x0
    0 1
    1 0
    1 1 <- a 1x1

    di conseguenza una matrice 1x1 dovrebbe poter contener ben 4 elementi!
    sicuramente sei più esperto di me e sai quel che dici quindi correggimi se sbaglio..

    (forse c'è stato un errore di comprensione.. hai capito che per 1x1 intendessi una matrice effettivamente 1x1, in realta volevo dire 2x2.. ho detto 1x1 tenendo conto dello 0.. errore mio scusami.. la definizione giusta è 2x2)
    Ultima modifica di ValerioHD; 26-12-2010 17:01 

  7. #7
    ValerioHD non è in linea Novello
    le variabili 1.0 e 0.1 del vettore hanno lo stesso indirizzo di memoria!! com'è possibile??
    provate a compilarlo

    #include <stdio.h>
    #include <iostream>
    using namespace std;
    
    int main()
    {
    
        int d1, d2;
       
    
       // cout << "Inserisci la dimensione del vettore: ";
       // cin >> d1 >> d2;
        
        int vettore[1][1];
        int numero = 1;
      
        //Assegna le variabili al vettore
        for(int j=0; j<2; j++)
        {
            for(int i=0; i<2; i++)
            {
               
               // cout << "\nInserisci il valore del vettore " << j << "." << i << ": ";
              //  cin >> vettore[j][i];
                vettore[j][i] = numero++;
                cout << numero-1 << endl;
            }
        }
    
        cout << endl << endl;
        //Stampa le variabili contenute nel vettore
        for(int j=0; j<2; j++)
        {
            for(int i=0; i<2; i++)
            {
                    cout << vettore[j][i] << " : " << &vettore[j][i] << " : " << j << "." << i << endl;
            }
    
        }
     
    }
    
    Ultima modifica di ValerioHD; 26-12-2010 17:02 

  8. #8
    L'avatar di bottomap
    bottomap non è in linea Amanuense
    Ciao,

    Cercare di interpretare e mettere in atto quanto ti viene suggerito è un esercizio che solitamente ripaga molto di più che vedere semplicemente il codice... ti costringe a sperimentare e ad approfondire dei concetti specifici che probabilmente non sono ancora ben saldi, il ché si rivela un vantaggio. Oltre a risolvere il problema, con le debite indicazioni, riesci a chiarirti le idee più velocemente e più facilmente... è chiaro che possiamo certamente fornirti qualche spezzone di codice esemplificativo qua e la, ma in questo caso particolare le cose da fare sono talmente basilari che è molto meglio se ti descriviamo cosa fare e tu provi a mettere in pratica quanto detto. Tanto siamo sempre qui e man mano che incontri una difficoltà specifica non hai che da chiedere indicazioni e delucidazioni.

    Riguardo a quanto hai scritto, quando si parla di dimensioni una matrice 1x1 è una matrice di 1 riga per 1 colonna, che conterrà quindi un unico valore. Gli indici, come già ti ha indicato MAW, vanno da 0 a Dimensione-1.
    Se dichiari vettore[1][1], l'unico indice valido è <i,j>=<0,0>. Non esiste né <0,1>, né <1,0> né <1,1>. I tuoi cicli accedono a memoria fuori dalla matrice visto che cicli da 0 ad 1 ogni elemento. Visto che fuori dalla matrice c'è con ottima probabilità memoria sporca o porzioni di stack o comunque qualcosa a cui non dovresti accedere, è facile che tu osservi comportamenti inconsueti. In questo caso particolare, il comportamento che descrivi dovrebbe essere proprio colpa dello stack, visto che la matrice è dichiarata internamente alla funzione.

    Il problema iniziale rimane in sospeso... hai davvero bisogno di una matrice bidimensionale? Per quello che posso vedere finora no, basterebbe un array monodimensionale... hai delle necessità specifiche per utilizzare una matrice?

    Ciaociao
    ℹ️ Leggi di più su bottomap ...

  9. #9
    ValerioHD non è in linea Novello
    Grazie bottomap, hai ragione ci devo arrivare da solo.. il problema è che proprio non riesco a capire..
    ti sarei veramente molto grato se potresti postare solo un ciclo for corretto.. perchè veramente sto impazzendo per una cosa sicuramente stupida..
    spero tu decida di aiutarmi grazie in anticipo e scusa l'insistenza nel chiedere codice.. ma con quello sono sicuro di riuscir a capire..

  10. #10
    ValerioHD non è in linea Novello
    Quote Originariamente inviato da bottomap Visualizza il messaggio
    Se dichiari vettore[1][1], l'unico indice valido è <i,j>=<0,0>. Non esiste né <0,1>, né <1,0> né <1,1>. I tuoi cicli accedono a memoria fuori dalla matrice visto che cicli da 0 ad 1 ogni
    ORA HO CAPITO! hai ragione!! che errore... mi vergogno quasi di aver iniziato questa discussione!

    questo è il codice corretto

    #include <stdio.h>
    #include <iostream>
    using namespace std;
    
    int main()
    {
    
        int d1, d2;
       
    
       // cout << "Inserisci la dimensione del vettore: ";
       // cin >> d1 >> d2;
        int a=2;
        int b=2;
        int vettore[a][b];
        int numero = 1;
      
        //Assegna le variabili al vettore
        for(int j=0; j<2; j++)
        {
            for(int i=0; i<2; i++)
            {
               
               // cout << "\nInserisci il valore del vettore " << j << "." << i << ": ";
              //  cin >> vettore[j][i];
                vettore[j][i] = numero++;
                cout << numero-1 << endl;
            }
        }
    
        cout << endl << endl;
        //Stampa le variabili contenute nel vettore
        for(int j=0; j<2; j++)
        {
            for(int i=0; i<2; i++)
            {
                    cout << vettore[j][i] << " : " << &vettore[j][i] << " : " << j << "." << i << endl;
            }
    
        }
     
    }
    
    Grazie bottomap! quest'ultimo esempio è stato fondamentale!

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. problema con i vettori
    Da alessandrof nel forum Visual Basic .Net
    Risposte: 16
    Ultimo Post: 05-03-2014, 23:37
  2. Problema min con i vettori
    Da alessandrof nel forum Visual Basic .Net
    Risposte: 4
    Ultimo Post: 26-02-2014, 16:39
  3. [C++] matrici e vettori
    Da Mephysto92 nel forum C/C++
    Risposte: 1
    Ultimo Post: 21-02-2012, 16:29
  4. Risposte: 3
    Ultimo Post: 12-05-2008, 20:47
  5. problema con matrici
    Da Diabolik nel forum Visual Basic 6
    Risposte: 3
    Ultimo Post: 16-11-2005, 21:31