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;
}
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;
}
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.
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?
L’ho messo su pastebin, ecco il link: https://pastebin.com/ynDQrf1r
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.
1 Mi Piace
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.
Posta il codice, io correggendo l’ accesso a memoria non allocata del vector con il tuo codice ottengo 100 
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.
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.