Esercizio banale ma non per me

di il
57 risposte

Esercizio banale ma non per me

Buongiorno, devo fare l'esame di informatica per ingegneria meccanica e sto cercando di risolvere alcuni esercizi.
"Siano dati in ingresso due vettori V1 e V2 di numeri interi. Si supponga che entrambi i vettori siano disordinati. Scrivere un programma (in C++) che identifichi la più lunga sequenza di elementi ordinati del vettore V1 (denominata S1) e la più lunga sequenza di elementi ordinati del vettore V2 (denominata S2). Si provveda poi a scambiare tali sequenze: la sequenza S1 trovata nel vettore V1 deve essere inserita nel vettore V2 al posto della sequenza S2 e viceversa. Stampare infine i vettori V1 e V2."

Ci sono alcune cose che non mi sono chiare dal testo.
1) Devo inserire un controllo degli input?
2) I vettori devono avere la stessa dimensione?
3) La sequenza di elementi la devo prendere in modo crescente o decrescente?

Esempio: V1=1 2 3 4 5 6 e V2=2 3 7 4

S1=1 2 3 4 5 6 e S2=2 3 7 quindi scambiando ottengo V1=2 3 7 e V2=1 2 3 4 5 6 4.....è così?

57 Risposte

  • Re: Esercizio banale ma non per me

    1) dipende da come siete abituati
    2) nel testo non c'è questa limitazione
    3) normalmente si ritiene crescenti
  • Re: Esercizio banale ma non per me

    Ok. Io so scrivere la prima parte che richiede le dimensioni dei vettori e i vettori e che mostra quello che è stato inserito, poi però non riesco ad andare oltre. Qualcuno sarebbe disposto ad aiutarmi? Grazie.
  • Re: Esercizio banale ma non per me

    Bhè hai vari approcci.
    "professionali" e "didattici".
    quello "professionale" implica il NON usare strutture dati di supporto (altri vettori, per capirci), quello "didattico" dipende invece da cosa si presume che impari.

    Per capirci meglio se stessi utilizzando un linguaggio che prevede il tipo "stringa" potresti allocarle banalmente (siamo nell'ipotesi secondo la quale le prestazioni e l'occupazione di memoria sono irrilevanti, come ad esempio in un programma GUI) e facilitarti la vita.

    Se invece vuoi/devi fare esercizio coi puntatori C la questione si complica.
    Siccome hai indicato C++ non è chiarissimo se puoi usare le strutture "furbe" (cioè quella della libreria C++), e scrivere un programma C++ a tutti gli effetti, oppure se in realtà (come potrebbe essere) devi scrivere un programma C con qualche "inutile condimento" C++

    Chiaro?

    (spero).

    Quindi nei tuoi esercizi precedenti hai mai visto cose tipo std::array, iteratori e "roba varia", oppure semplici vettory "C" del genere int vettore[100] ?
  • Re: Esercizio banale ma non per me

    Ciao allora io devo programmare in C++ a tutti gli effetti. Nelle dispense fornite dal prof non si parla del C, però non ho seguito il corso quindi non so di preciso cosa ha spiegato il prof. Questo è il primo pezzo, l'IDE è Netbeans.
    
    #include <iostream>
    #include <string>
    #include <sstream>
    
    using namespace std;
    
    int main() {
        int dim1;
        cout<<"Scegliere la dimensione del primo vettore:\n";
        cin>>dim1;
        int V1[dim1];
        int i;
        for(i=0; i<dim1; i++)
        {cout<<"Inserire l'elemento numero "<<i+1<<" del primo vettore:\n";
        cin>>V1[i];
        }
        cout<<"Il vettore che hai inserito è:\n";
        for(i=0; i<dim1; i++)
        {cout<<V1[i]<<" ";}
        cout<<"\nScegliere la dimensione del secondo vettore:\n";
        int dim2;
        cin>>dim2;
        int V2[dim2];
        for(i=0; i<dim2; i++)
        {cout<<"Inserire l'elemento numero "<<i+1<<" del secondo vettore:\n";
        cin>>V2[i];
        }
        cout<<"Il vettore che hai inserito è:\n";
        for(i=0; i<dim2; i++)
        {cout<<V2[i]<<" ";}
    }
    
  • Re: Esercizio banale ma non per me

    selfmademan ha scritto:


    Ciao allora io devo programmare in C++ a tutti gli effetti. Nelle dispense fornite dal prof non si parla del C, però non ho seguito il corso quindi non so di preciso cosa ha spiegato il prof. Questo è il primo pezzo, l'IDE è Netbeans.

    Così a occhio e croce direi C++ no OOP
  • Re: Esercizio banale ma non per me

    LPs ha scritto:


    selfmademan ha scritto:


    Ciao allora io devo programmare in C++ a tutti gli effetti. Nelle dispense fornite dal prof non si parla del C, però non ho seguito il corso quindi non so di preciso cosa ha spiegato il prof. Questo è il primo pezzo, l'IDE è Netbeans.

    Così a occhio e croce direi C++ no OOP
    Bene Che si fa quindi?
  • Re: Esercizio banale ma non per me

    ... diciamo che è C "schietto" con praticamente nulla di C++.
    Allora partiamo dall'inizio: crea una funzione che, passato un vettore di interi in ingresso, ritorni il puntatore al primo carattere della sequenza ordinata più lunga, e magari pure la relativa dimensione (cioè lunghezza)
    in questo caso puoi banalmente ritornare la lunghezza come risultato della funzione, magari mettendoci un qualcosa tipo -1 nel caso di errore (in realtà dato il tuo problema va bene anche zero).

    Riassumendo il tuo problema è (per ora)
    
    int tornalunghezzamassima( qualcosa i_vettoreingresso, qualcosa i_lunghezzavettoreingresso, qualcosa o_iniziosequenzamassima)
    
    se i parametri non vanno bene puoi far ritornare 0 (e magari setti o_iniziosequenzamassima a zero a sua volta)
    grosso modo avrai qualcosa del tipo
    
     risultato = 0
     o_iniziosequenzamassima=0
      se i_vettoreingresso non buono, esci
      se i_lunghezzavettoreingresso non buono, esci
      
      lunghezzamassimacandidata=0
      posizionelunghezzamassimacandidata=0
      for i=qualcosa to qualcos'altro (-1? attenzione ai cicli C col <, <= eccetera, solo un consiglio)
        se vettore[i+1]<=vettore[i] allora fai qualcosa
        ...
      
    sostanzialmente dovrai verificare se, partendo dalla posizione i-esima, gli elementi i+1 sono crescenti.
    quando lo sono aggiorna la massimalunghezza che hai trovato (potresti avere più sequenze ordinate) e il relativo inizio.

    esempio:
    7 5 1 2 3 0 5 6 7 8 9 3
    avrai DUE sequenze crescenti, 1-2-3 e 5-6-7-8-9.
    Inizialmente il tuo codice prenderà come sequenza candidata 1-2-3 (di lunghezza 3), tenendo come inizio 2.
    continuando poi troverai un'altra sequenza 5-6-7-8-9, di lunghezza 5, che essendo maggiore di 3 (quella di prima) causerà l'aggiornamento
    della "massima lunghezza trovata finora".

    Al fine del ciclo ritornerai i dati dalla funzione.

    Nota: è la versione per niubbi, ovviamente, ma inizia così, poi la "ottimizzerai" man mano.
    In realtà ci sarebbe da fare un algoritmo coi controcazzi sfruttando la sequenza che hai già trovato, ma lasciamo stare, non penso proprio sia qualcosa che si faccia a ingegneria.




    Forza e coraggio
  • Re: Esercizio banale ma non per me

    Allora, sono riuscito per il momento a creare un programma che dato un vettore mi fornisce l'elemento minimo o massimo e la sua posizione. C'è tanta differenza (lavoro) tra questo programma e quello che devo creare? O mi manca poco?
    I puntatori però ancora non li ho visti.
    La forza c'è e il coraggio pure:)!
  • Re: Esercizio banale ma non per me

    Bhe è un inizio ma la strada non è compiuta
  • Re: Esercizio banale ma non per me

    Sto facendo delle cose basilari per esercitarmi. Cosa ne pensate di questo codice per la ricerca dell'elemento minimo in un vettore e la sua posizione?
    
    #include <iostream>
    using namespace std;
    int main() {
        cout<<"Scegliere la dimensione del vettore:\n";
        int dim;
        cin>>dim;
        int vett[dim];
        int i;
        for (i=0;i<dim;i++)
        {cout<<"Inserisci l'elemento numero "<<i+1<<" del vettore:\n";
        cin>>vett[i];
        }
        cout<<"Il vettore che hai inserito è:\n";
        for(i=0;i<dim;i++)
        {cout<<" "<<vett[i]<<" ";}
        cout<<"\nL'elemento minimo presente nel vettore è:\n";
        int min;
        min=vett[0];
        int posmin;
        for(i=1;i<dim;i++)
        {if(min>vett[i])
        {min=vett[i]; posmin=i;}
        else{if(min==vett[0]){posmin=0;}}
        }
        cout<<min<<"\nLa posizione del minimo è:\n"<<posmin+1;
    }
    
  • Re: Esercizio banale ma non per me

    selfmademan ha scritto:


    Sto facendo delle cose basilari per esercitarmi. Cosa ne pensate di questo codice per la ricerca dell'elemento minimo in un vettore e la sua posizione?
    
    #include <iostream>
    using namespace std;
    int main() {
        cout<<"Scegliere la dimensione del vettore:\n";
        int dim;
        cin>>dim;
        int vett[dim];
        int i;
        for (i=0;i<dim;i++)
        {cout<<"Inserisci l'elemento numero "<<i+1<<" del vettore:\n";
        cin>>vett[i];
        }
        cout<<"Il vettore che hai inserito è:\n";
        for(i=0;i<dim;i++)
        {cout<<" "<<vett[i]<<" ";}
        cout<<"\nL'elemento minimo presente nel vettore è:\n";
        int min;
        min=vett[0];
        int posmin;
        for(i=1;i<dim;i++)
        {if(min>vett[i])
        {min=vett[i]; posmin=i;}
        else{if(min==vett[0]){posmin=0;}}
        }
        cout<<min<<"\nLa posizione del minimo è:\n"<<posmin+1;
    }
    
    l'else all'interno del for di ricerca non ha alcun senso....basta cambiare la dichiarazione delle variabili in
    
    	int posmin = 0;
    	min = vett[0];
    
  • Re: Esercizio banale ma non per me


    l'else all'interno del for di ricerca non ha alcun senso....basta cambiare la dichiarazione delle variabili in
    Giusto, grazie!

    E' giusto quest'altro pezzo per ordinare il vettore in modo crescente?
    
    int j;
        for(j=0;j<dim;j++)
            {
            posmin=j;
            min=vett[j];
            for(i=j+1;i<dim;i++)
            {
                if(min>vett[i])
                {min=vett[i]; posmin=i;}
               
            }
            vett[posmin]=vett[j];
            vett[j]=min;
        }
        cout<<"Il vettore ordinato in modo crescente è:\n";
        for(i=0;i<dim;i++)
        {cout<<" "<<vett[i]<<" ";}
            
            
  • Re: Esercizio banale ma non per me

    ... che non serve a nulla per il tuo esercizio...
  • Re: Esercizio banale ma non per me

    Vabbè però sento di aver imparato un sacco di roba quindi è stato senz'altro utile! Ora mi sento più pronto per ragionare sulle indicazioni che mi hai dato.
Devi accedere o registrarti per scrivere nel forum
57 risposte