Re: [C++] esercizio ok?

Messaggioda selfmademan » 26/06/2017, 17:48

Ho rifatto l'esercizio cercando di tenere conto dei vari consigli e usando le funzioni, però usando le funzioni mi sembra troppo complesso. Causa mancanza di voglia, manca la parte finale sulla memorizzazione e la visualizzazione di S1 e S2. Come giustamente mi avete detto io devo creare in memoria i vettori S1 e S2 e non mostrarli e scambiarli semplicemente a video.
Come nota positiva c'è che per rifare l'esercizio ci ho messo molto meno tempo rispetto a quello impiegato per scrivere la prima versione. Come nota negativa c'è che spendo ancora troppe energie per scrivere codici già scritti in passato, cioè ci devo ripensare e non mi vengono in mente subito. Questo all'esame sarà un problema.
Codice:
#include <iostream>

using namespace std;

void ivettore(int dim,int* V)
{
     for(int i=0;i<dim;i++)
     {
        cout<<"Inserisci l'elemento numero "<<i+1<<"\n";
        cin>>V[i];
     }
}
void ovettore(int dim,int* V)
{
    for(int i=0;i<dim;i++)
    {
        cout<<" "<<V[i];
    }
}
    //creo una funzione per azzerare un vettore
void azzeravettore(int dim,int* V)
{
    for(int i=0;i<dim;i++)
    {
        V[i]=0;
    }
}
int maxvettore(int dim,int* V)
{
   int max=V[0];
   for(int i=1;i<dim;i++)
   {
       if(max<V[i])
       {
           max=V[i];
       }
   }
return max;
}
int posmaxvettore(int dim,int* V)
{
   int max=V[0];
   int posmax=0;
   for(int i=1;i<dim;i++)
   {
       if(max<V[i])
       {
           posmax=i;
       }
   }
   return posmax;
}

int main()
{
    int dim1;
    cout<<"Scegli la dimensione di V1\n";
    cin>>dim1;
    int* V1=new int[dim1];
    ivettore(dim1,V1);
    int dim2;
    cout<<"Scegli la dimensione di V2\n";
    cin>>dim2;
    int* V2=new int[dim2];
    ivettore(dim2,V2);
    cout<<"V1 =";
    ovettore(dim1,V1);
    cout<<"\nV2 =";
    ovettore(dim2,V2);
   
    //introduco i vettori indpar1 e lung1 e le altre variabili necessarie
    int j1=0; int l1=1; int uno=1; int* indpar1=new int[dim1]; int* lung1=new int[dim1];
   
    //inizializzo a zero i vettori indpar1 e lung1
    azzeravettore(dim1-1,indpar1);
    azzeravettore(dim1-1,lung1);
   
    //memorizzo nelle componenti dei vettori indpar1 e lung1 rispettivamente l'indice di partenza e la lunghezza delle sequenze crescenti trovate a ogni passo in V1
    for(int i=1;i<dim1;i++)
    {
        if (V1[i-1]<V1[i])
        {indpar1[i-1]=j1; lung1[i-1]=++l1;}
        else
        {j1=i-1;j1++;l1=uno;}
    }
   
    //introduco i vettori indpar1 e lung1 e le altre variabili necessarie
    int j2=0; int l2=1; int UNO=1; int* indpar2=new int[dim2]; int* lung2=new int[dim2];
   
    //inizializzo a zero i vettori indpar1 e lung1
    azzeravettore(dim2-1,indpar2);
    azzeravettore(dim2-1,lung2);
   
    //memorizzo nelle componenti dei vettori indpar2 e lung2 rispettivamente l'indice di partenza e la lunghezza delle sequenze crescenti trovate a ogni passo in V2
    for(int i=1;i<dim2;i++)
    {
        if (V2[i-1]<V2[i])
        {indpar2[i-1]=j2; lung2[i-1]=++l2;}
        else
        {j2=i-1;j2++;l2=UNO;}
    }

    //richiamo le funzioni maxvettore e posmaxvettore
    cout<<"\nLa più lunga sequenza ordinata S1 contenuta in V1 ha lunghezza "<<maxvettore(dim1-1,lung1)<<" e parte dall'elemento "<<indpar1[posmaxvettore(dim1-1,lung1)]+1;
    cout<<"\nLa più lunga sequenza ordinata S2 contenuta in V2 ha lunghezza "<<maxvettore(dim2-1,lung2)<<" e parte dall'elemento "<<indpar2[posmaxvettore(dim2-1,lung2)]+1;
    cout<<"\nS1 = ";
    for(int i=indpar1[posmaxvettore(dim1-1,lung1)];i<indpar1[posmaxvettore(dim1-1,lung1)]+maxvettore(dim1-1,lung1);i++)
    {
        cout<<" "<<V1[i]<<" ";
    }
    cout<<"\nS2 = ";
    for(int i=indpar2[posmaxvettore(dim2-1,lung2)];i<indpar2[posmaxvettore(dim2-1,lung2)]+maxvettore(dim2-1,lung2);i++)
    {
        cout<<" "<<V2[i]<<" ";
    }
       
}



P.S: corretto un errore nella funzione posmaxvettore.
selfmademan
Junior Member
Junior Member
 
Messaggio: 12 di 152
Iscritto il: 30/03/2017, 09:15

Re: [C++] esercizio ok?

Messaggioda Super Squirrel » 26/06/2017, 20:17

In generale va molto meglio, ma ci sarebbero comunque alcune cose da aggiustare.

Innanzitutto conviene cambiare il nome alla variabile "max" in quanto rappresenta una funzione della libreria standard.

Ho dato un'occhiata veloce alla parte del main dedicata alla ricerca della sequenza più lunga e ho notato diversi problemi:
- ci sono più istruzioni per riga;
- visto che effettui le stesse operazioni su entrambi i vettori conviene ricorrere alle funzioni;
- se inserisci array con un solo elemento il programma non si comporta come dovrebbe;
- dal punto di vista logico credo di aver capito quello che cerchi di fare, ma se lo scopo è quello di identificare la lunghezza e l'origine della sequenza più lunga, ti stai complicando troppo la vita. A tal proposito dai un'occhiata al codice che ho postato in precedenza.

In ogni caso se proprio vuoi tener traccia di ogni sequenza (che se ho ben capito è lo scopo del tuo codice) e poi trovare quella più lunga, possiamo ragionare sul modo in cui rendere il codice più semplice e leggibile.
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 130 di 1486
Iscritto il: 16/05/2013, 22:05

Re: [C++] esercizio ok?

Messaggioda selfmademan » 27/06/2017, 07:16

Effettivamente è molto cervellotico l'algoritmo per trovare le sequenze crescenti. A ogni passo io registro nelle componenti del vettore indpar e lung rispettivamente indice di partenza e lunghezza dell'eventuale sequenza crescente trovata. Darò un'occhiata al tuo codice per vedere come semplificare.

Per quanto riguarda la definizione di una matrice variabile, va bene così?
Codice:
int nrighe;
int ncolonne;
cin>>nrighe;
cin>>ncolonne;
int* matriceprova=new int[nrighe][ncolonne];
selfmademan
Junior Member
Junior Member
 
Messaggio: 13 di 152
Iscritto il: 30/03/2017, 09:15

Re: [C++] esercizio ok?

Messaggioda Super Squirrel » 27/06/2017, 10:59

No, non va bene, infatti se provi non compila.

Una matrice non è altro che un array bidimensionale, ossia un array di array. Quindi, detti "rig" e "col" rispettivamente il numero di righe e colonne della matrice, bisogna prima allocare una array di "rig" puntatori ad int e poi tramite un ciclo for allocare "rig" array di "col" int. Ovviamente così come un array di int è definito da un puntatore, così un array di puntatori ad int è definito da un puntatore a puntatore, ossia da un puntatore doppio.

Non dimenticare che una volta allocata, la memoria va anche deallocata.

In pratica bisogna fare una cosa del genere:

Codice:
//ALLOCAZIONE
    int** matrice = new int*[rig];
    for(int i = 0; i < rig; i++)
    {
        matrice[i] = new int[col];
    }

//DEALLOCAZIONE
    for(int i = 0; i < rig; i++)
    {
        delete[] matrice[i];
    }
    delete[] matrice;
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 131 di 1486
Iscritto il: 16/05/2013, 22:05

Re: [C++] esercizio ok?

Messaggioda selfmademan » 27/06/2017, 19:05

Immagine
Click sull'immagine per visualizzare l'originale


Buonasera, non mi funziona neanche dichiarando rig e col come suggerito da netbeans. Dichiarando rig e col esce questo:


Immagine
Click sull'immagine per visualizzare l'originale



PS: Ho capito bisogna dare dei valori a rig e col altrimenti vengono assegnati valori casuali troppo grandi e la memoria si esaurisce.
selfmademan
Junior Member
Junior Member
 
Messaggio: 14 di 152
Iscritto il: 30/03/2017, 09:15

Re: [C++] esercizio ok?

Messaggioda selfmademan » 28/06/2017, 21:07

Oggi ho fatto lo scritto, di seguito la traccia.

"Siano dati i ingresso i riempimenti e gli elementi di due matrici di interi M1 e M2 ed un valore intero K. Si provveda a calcolare, per ogni riga di M1, il valore minimo MIN ed il valore massimo MAX e si verifichi se esiste almeno una riga di M2 contenente K elementi inclusi nell'intervallo [MIN,MAX]. Se tale condizione risulta verificata, si provveda a copiare i K elementi trovati in un nuovo vettore allocato in MODO DINAMICO. Si provveda a stampare il vettore V e l'indice della riga di M2 trovata. Si organizzi il programma in sottoprogrammi.

Non ho fatto in tempo a finire tutto, comunque ho definito una matrice imatrice per l'input e una matrice omatrice per l'output allocandole come mostrato nel post precedente quindi in modo dinamico anche se il fatto che nella traccia è precisata l'allocazione dinamica per il vettore mi fa pensare che non fosse obbligatoria per le matrici. Poi ho richiesto il valore K e ho creato due vettori MIN e MAX nelle cui componenti sono contenuti i valori dei minimi e dei massimi per ogni riga, e quindi li ho mostrati a video. Basta, poi è scaduto il tempo. Non ho organizzato il programma in sottoprogrammi e non so neanche che significa. Il codice funzionava, secondo voi c'è la sufficienza? Mi interessa molto questo esame però ho anche altra roba da fare e sono indietrissimo, so che ho ampissimi margini di miglioramento ma un bel 18 lo accetterei volentieri XD. E comunque ci sarà anche una prova orale.
selfmademan
Junior Member
Junior Member
 
Messaggio: 15 di 152
Iscritto il: 30/03/2017, 09:15

Re: [C++] esercizio ok?

Messaggioda apatriarca » 29/06/2017, 00:33

Ci sono diversi punti dell'esercizio che non sono specificati, come la modalità in cui tali matrici siano passare in input al programma o come debbano essere allocate. Non posso affermare se questi punti siano effettivamente liberi all'interpretazione dello studente o se l'insegnante si aspetti qualcosa di particolare che non ha però specificato chiaramente. Queste sono cose che si possono conoscere solo entrando in contatto con il professore o dalle esercitazioni. L'allocazione della matrice come nel post precedente (nella seconda immagine) mi sembra corretta. Non vedo ragioni per non accettare tale soluzione.

Dividere il programma in sottoprogramma significa semplicemente che devi suddividere il programma in diverse funzioni, ognuna che risolve parti diverse del tuo problema. Se hai messo tutto nel main allora non hai rispettato tale richiesta.

Non esistono parametri oggettivi per valutare un codice per un esame di informatica, dipende dall'insegnante. Non mi è del tutto chiaro il punto in cui ti sei fermato. Hai stampato il contenuto di V senza allocarlo? Hai stampato solo MIN e MAX per ogni riga? Se devo dare una opinione dal poco che ho capito del tuo esame, suppongo tu possa arrivare alla sufficienza, eventualmente attraverso l'orale.
apatriarca
Moderatore
Moderatore
 
Messaggio: 4705 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [C++] esercizio ok?

Messaggioda selfmademan » 29/06/2017, 07:43

Per un mio modo di fare non frequento le lezioni e mi capita di conoscere i professori solo all'esame.
Ho definito una funzione imatrice per l'input della matrice, e una omatrice per l'output. Poi ho richiesto l'inserimento di K e ho definito due vettori MIN e MAX aventi come dimensione le righe della matrice M1 e in ogni componente ho memorizzato il valore del minimo e del massimo per ogni riga e ho mostrato sullo schermo i vettori MIN e MAX.
Il mio programma chiede di inserire numero di righe e colonne delle due matrici, poi di inserire i vari elementi e mostra sullo schermo le matrici formattate. Poi ti chiede di inserire un valore K e infine mostra i vettori MIN e MAX.
selfmademan
Junior Member
Junior Member
 
Messaggio: 16 di 152
Iscritto il: 30/03/2017, 09:15

Re: [C++] esercizio ok?

Messaggioda Super Squirrel » 29/06/2017, 13:42

Il codice funzionava, secondo voi c'è la sufficienza?


Oltre alla variabile professore dipende anche da quale esame hai sostenuto e da quale facoltà frequenti.
Quanto tempo avevi a disposizione?

Per quanto riguarda la traccia, oltre ad essere molto vaga, mi sembra anche abbastanza stupida. Purtroppo come spesso accade la difficoltà degli esercizi sta più nell'interpretazione che nell'effettiva risoluzione del problema presentato.

Alcune osservazioni:
- bisognerebbe imporre che K sia minore o uguale del numero di colonne di M2, altrimenti il vettore V sarà sicuramente vuoto;
- se il vettore V contiene tutti gli "n x K" elementi (dove n è il numero di righe di M1 che rispettano la condizione), non ci sarebbe bisogno anche di un altro vettore per tenere traccia degli indici delle righe di M2 di provenienza?
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 132 di 1486
Iscritto il: 16/05/2013, 22:05

Re: [C++] esercizio ok?

Messaggioda apatriarca » 29/06/2017, 14:43

Non è chiaro se il vettore V deve contenere i valori per tutte le righe o solo per quella attualmente presa in considerazione.
apatriarca
Moderatore
Moderatore
 
Messaggio: 4706 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

PrecedenteProssimo

Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite