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.