Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    35

    [C++] Problema valore di ritorno funzione

    Ragazzi, ho provato a fare quest'esercizio:

    Scrivere una funzione

    vector<int> merge(vector<int> a, vector <int> b)

    che unisca due vettori, alternando elementi di entrambi. Se un vettore è di dimensioni minori, eseguire l'alternanza finché possibile e aggiungere gli elemtn restanti del vettore più lungo. Se per esempio, a é

    1 4 9 16

    e b é

    9 7 4 9 11

    merge restituirà il vettore

    1 9 4 7 9 4 16 9 11

    Io ho scritto la funzione così:

    codice:
    
    vector <int> merge (vector <int> a, vector <int> b)
    
    {
       vector <int> c (a.size()+ b.size());
       int j = 0;
       int i;
       int k = 1;
       int temp;
    
       if (a.size() < b.size())
    
    
    {
    
           c[0] = a[0];
           c.push_back (a[0]);
    
    
            for (i=1; k < c.size()-1;i=i++)
    
            {
            while (i<a.size()-1)
            {a[i] = temp;
            c[i+1] = temp;
            c.push_back(temp);}
            c[k] = b[j];
            c.push_back(b[j]);
            j++;
            k = k+2;} return c;
    }
    
    else
    
    if (b.size() < a.size())
    
    
    {
    
           c[0] = b[0];
           c.push_back (b[0]);
    
    
            for (i=1; k < c.size()-1;i=i++)
    
            {
            while (i<b.size()-1)
            {b[i] = temp;
            c[i+1] = temp;
            c.push_back(temp);}
            c[k] = a[j];
            c.push_back(a[j]);
            j++;
            k = k+2;} return c;
    }
    
    
    
    }
    Solo che non se se funziona, perchè il compilatore compila tutto correttamente, però poi quando lancio l'eseguibile, non mi dà nessun valore di ritorno... Come mai? Cosa ho sbagliato?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ma il main qual è?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    35
    Si, hai ragione, non ho copiato la parte restante del codice, quella di prima era solo la funzione dichiarata prima del main, ecco il codice completo:

    codice:
    #include<iostream>
    #include<vector>
    
    using namespace std;
    
    vector <int> merge (vector <int> a, vector <int> b)
    
    {
       vector <int> c (a.size()+ b.size());
       int j = 0;
       int i;
       int k = 1;
       int temp;
    
       if (a.size() < b.size())
    
    
    {
    
           c[0] = a[0];
           c.push_back (a[0]);
    
    
            for (i=1; k < c.size()-1;i=i++)
    
            {
            while (i<a.size()-1)
            {a[i] = temp;
            c[i+1] = temp;
            c.push_back(temp);}
            c[k] = b[j];
            c.push_back(b[j]);
            j++;
            k = k+2;} return c;
    }
    
    else
    
    if (b.size() < a.size())
    
    
    {
    
           c[0] = b[0];
           c.push_back (b[0]);
    
    
            for (i=1; k < c.size()-1;i=i++)
    
            {
            while (i<b.size()-1)
            {b[i] = temp;
            c[i+1] = temp;
            c.push_back(temp);}
            c[k] = a[j];
            c.push_back(a[j]);
            j++;
            k = k+2;} return c;
    }
    
    
    
    }
    
    
    
    void print (vector <int> s)
    
    { for (int i=0; i<s.size();i++)
    
      cout << s[i] << endl;
    
    }
    
    
    
    
    int main()
    
    {
    
        vector <int> a(4);
        vector <int> b(5);
        vector <int> c;
    
        a[0]=1;
        a[1]=4;
        a[2]=9;
        a[3]=16;
    
        b[0]=9;
        b[1]=7;
        b[2]=4;
        b[3]=9;
        b[4]=11;
    
     c = merge (a,b);
    
    print (c);
    return 0;
    
    }

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    codice:
    for (i=1; k < c.size()-1;i=i++)
    La sintassi di questo for è sbagliata (in tutti e due i for); il caso di b.size() == a.size() non è controllato; usi temp prima di assegnarle un valore.
    Non so a te, ma a me il compilatore s'inchioda con un assert su temp o va in loop (una volta sistemata temp).

    Poi: quando dichiari un vector fornendo le dimensioni, una push_back() accoda il valore passato come argomento a quelli già creati. Quindi se crei il vector per 9 elementi, una push_back() te ne aggiunge 1, portando size() da 9 a 10.
    Se usi size() all'interno di un ciclo, c'è il forte rischio che il ciclo stesso non finisca mai.
    Soluzione: non usare mai push_back() e size() in uno stesso ciclo. Puoi usare tranquillamente [] per accedere agli elementi del vector.

    (Comunque bastano due cicli for per fare il merge di due vector. La tua soluzione mi pare troppo macchinosa).
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    35
    Mi sono accorto che la funzione di prima era sbagliata, questa versione dovrebbe essere giusta e almeno in teoria dovrebbe fare esattamente quello che chiede il codice, utilizzando carta e penna e seguendo i passaggi, alla fine il vettore risultante dovrebbe essere alternato proprio come dice l'esercizio... Solo che nel programma l'eseguibile viene lanciato e rimane l'interfaccia testuale nera, senza che appaia nulla nello schermo... Come mai?

    codice:
    #include<iostream>
    #include<vector>
    
    using namespace std;
    
    vector <int> merge (vector <int> a, vector <int> b)
    
    {
       vector <int> c (a.size()+ b.size());
       int j = 0;
       int i = 0;
       int k = 1;
       int f = 0;
       int temp;
    
       if (a.size() < b.size())
    
    
    {
    
    
            for (i; k < c.size()-1;i++)
    
            {
            while (i<a.size())
            {temp = a[i];
            c[i+f] = temp;
            c.push_back(temp);}
            c[k] = b[j];
            c.push_back(b[j]);
            j++;
            f++;
            k = k+2;} return c;
    }
    
    else
    
    if (b.size() < a.size())
    
    
    {
    
    
    
            for (i; k < c.size()-1;i++)
    
            {
            while (i<b.size())
            {temp = b[i];
            c[i+f] = temp;
            c.push_back(temp);}
            c[k] = a[j];
            c.push_back(a[j]);
            j++;
            f++;
            k = k+2;} return c;
    }
    
    
    
    }
    
    
    
    void print (vector <int> s)
    
    { for (int i=0; i<s.size();i++)
    
      cout << s[i] << endl;
    
    }
    
    
    
    
    int main()
    
    {
        vector <int> a(4);
    
        a[0]=1;
        a[1]=4;
        a[2]=9;
        a[3]=16;
    
    
        vector <int> b(5);
    
        b[0]=9;
        b[1]=7;
        b[2]=4;
        b[3]=9;
        b[4]=11;
    
        cout << endl;
    
       vector <int> c;
    
        cout << endl;
    
        c = merge (a,b);
    
        print (c);
    
    return 0;
    
    }

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Hai letto il mio post?
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    35
    Hai letto il mio post?
    Si, ma abbiamo postato praticamente in contemporanea, quindi l'ho letto dopo aver postato...

  8. #8
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Ah, ecco.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2010
    Messaggi
    35
    Potresti spiegarmi il codice ottimizzato come dici tu, cioè basta solamente che mi fai capire come va scritta la funzione utilizzando solamente due cicli for...

  10. #10
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    In pratica puoi copiare in un colpo solo il numero di elementi dettati dal vettore più corto.

    Se a ha dimensione 4 e b dimensione 5, puoi copiare al massimo 4 elementi di entrambi i vettori nel vettore c senza superare la dimensione massima di nessuno dei tre ( il vettore c è dimensionato in base alla somma delle dimensioni dei due vettori, in questo caso 4+5=9).

    a lo copi negli indici pari di c, b lo copi negli indici dispari di c.
    Alla fine c conterrà 8 elementi alternati.

    Dopo di che si tratta di trovare il vettore più lungo e copiare il resto di quel vettore nel vettore c.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.