Fluttuazioni Finanziarie 90/100


#1

Ciao a tutti,
ho sviluppato il seguente codice per il problema fluttuazioni finanziarie. Questo codice non risolve uno dei testcase proposti dal sistema di correzione, quale potrebbe essere l’errore?
Allego il sorgente sviluppato:

#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int main ()
{
	ifstream in ("input.txt");
	ofstream out ("output.txt");
	int N,Q,temp,temp1,max1=0,max=0;
	in>>N;
	vector <int> numeri;
	for (int i=0;i<N;i++)
	{
		in>>Q;
		numeri.push_back(Q);
	}
	for (int i=0;i<N;i++)
	{
		if (numeri[i]>numeri[i+1])
		{
			temp=numeri[i]-numeri[i+1];
			if (temp>max)
				max=temp;
		}
		else 
			if (numeri[i]<numeri[i+1])
			{
				temp1=numeri[i+1]-numeri[i];
				if (temp1>max1)
					max1=temp1;
			}
	}
	if (max1<max)
		out<<max;
	else
		out<<max1;
}

#2

Allego anche il codice con il valore assoluto:

#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
int main ()
{
	ifstream in ("input.txt");
	ofstream out ("output.txt");
	int N,Q,temp,temp1,max1=0,max=0;
	in>>N;
	vector <int> numeri;
	for (int i=0;i<N;i++)
	{
		in>>Q;
		numeri.push_back(Q);
	}
	for (int i=0;i<N;i++)
	{
		temp=abs(numeri[i]-numeri[i+1]);
		if (temp>max)
			max=temp;
	}
		out<<max;
}

#3

In realtà mi stupisco che faccia 90, il vector non ha il template e tecnicamente dovresti accedere a aree di memoria non allocate.
Nel tuo codice non si vede l uso di una libreria ma solo degli include.
Per le librerie basta che importi vector per il vector, cmath per il valore assoluto e fstream per usare i file.
Per il template al vector basta che scrivi: vector <tipo di dato> nome variabile. Esempio :
vecotr <int> numeri;
Per l’ accesso a aree di memoria non allocate basta che confronti il secondo con il primo, il terzo con il secondo e cosi via.
Utilizzando il ciclo scitto da te tecnicamente fai accesso alla posizone N che non esiste essendo numerato da 0 a N - 1.


#4

Lo so, purtroppo quando copio e incollo il codice non so perchè ma non fa vedere le librerie, comunque ho importato la vector, la cmath e la fstream per l’input output.
Cosa intendi per accesso alla posizione N che non esiste?


#5

L’ho messo su pastebin, ecco il link: https://pastebin.com/ynDQrf1r


#6

I vettori in c++ sono numerati da 0 a N - 1.
Inizialmente il tuo vecotr è vuoto, e utilizzando la funzione push_back aggiungi elementi alla fine.
Utilizzando N volte la funzione push_back avrai N elementi.
Prendiamo in considerazione il primo caso d’ esempio del problema :

10
9 1 6 6 3 9 3 7 9 4 

Il tuo vector dopo aver caricato tutti gli elementi gli avrà disposti cosi

index 0 1 2 3 4 5 6 7 8 9
  val 9 1 6 6 3 9 3 7 9 4

Come vedi la posizone 10 non esiste e nel tuo ciclo all’ ulitma iterazione facendo i + 1 farai accesso alla cella con indice 10 che non c’ è causando un accesso a memoria non allocata.
Per convincerti di ciò provo a stampare i valori di i e i + 1 mentre esegui il caso d’ esempio in locale.


#7

Anche effettuando la correzione nel secondo for e facendolo partire da i=1 e effettuando il confronto al contrario per evitare di andare nella posizione N mi restituisce sempre 90/100 sempre per lo stesso output sbagliato.


#8

Posta il codice, io correggendo l’ accesso a memoria non allocata del vector con il tuo codice ottengo 100 :slight_smile:
Per postare il codice basta che fai copia e incolla, dopo evidenzia il codice e premi sul tasto “testo preformattato” sali di una riga e premi invio.


#9

Ok risolto. Avevo aggiunto un uguale di troppo. La condizione esatta del secondo for è (int i=1;i<N;i++) per l’esecuzione 100/100.


#10

Grazie mille per l’aiuto :smiley: