Problem dotyczący wykresu

0

Mam do zrobienia program "Statystyczna analiza danych finansowych". Program już prawie zrobiłam zostało mi tylko narysowanie wykresów dla poszczególnych firm. Jednak nie mam pojęcia jak to zrobić, dlatego proszę o pomoc. Tu jest kod który posiadam

#include <iostream> 
#include <string> 
#include <math.h> 
#include <stdlib.h> 
#include <fstream> 

using namespace std; 

//procedura wyswietlania menu wyboru obliczen 
void show_choice_menu(void) { 

cout << "Co chcialbys obliczyc?" << endl << \ 
"1) srednia" << endl << \ 
"2) odchylenie standardowe" << endl << \ 
"3) mediane" << endl << \ 
"4) dominante" << endl << \ 
"5) kurtoze" << endl << \ 
"6) wszystko" << endl; 

} 

//Funkcja sortujaca tablice przez sortowanie babelkowe 
void bubblesort(float *table, int size) 
{ 
int i, j; 
float temp; 
for (i = 0; i<size; i++) 
for (j=0; j<size-1; j++) 
{ 
if (table[j] > table[j+1]) 
{ 
temp = table[j+1]; 
table[j+1] = table[j]; 
table[j] = temp; 
} 
} 
} 

//funkcja oblicza mediane jako element srodkowy 
float mediana(double* tab[] , long start_date, long end_date) { 

int ile = 0; 
int liczba = 0; 

//zliczanie na ilu elementach bedziemy operowac 
for(int i=0;i<53;i++) { 
if(long(tab[i][0]) >= start_date && long(tab[i][0]) <= end_date) 
{ 
liczba++; 
} 
} 

//tworzymy tablice o takim rozmiarze 
float *tablica = new float[liczba]; 

//wrzucamy do tej tablicy tylko wartosci elementow z zakresow dat 
//ktore nas interesuja 
for(int i=0;i<53;i++) { 
if(long(tab[i][0]) >= start_date && long(tab[i][0]) <= end_date) 
{ 
tablica[ile] = tab[i][1]; 
ile++; 
} 
} 

//sortujemy ta tablice babelkowo 
bubblesort(tablica,liczba); 

//jesli liczba elementow jest nieparzysta to bierzemy element srodkowy 
//jesli parzysta to srednia dwoch srodkowych elementow 
if(liczba%2 != 0) 
return tablica[int(liczba/2)]; 
else 
return (tablica[int(liczba/2)]+tablica[int(liczba/2)-1])/2; 
} 

//funkcja oblicza dominante jako element wystepujacy najczesciej w probce 
float dominanta(double* tab[] , long start_date, long end_date) { 

int ile = 0; 
int liczba = 0; 
int licz = 0; 
int max = 0; 
int index = 0; 

//zliczanie na ilu elementach bedziemy operowac 
for(int i=0;i<53;i++) { 
if(long(tab[i][0]) >= start_date && long(tab[i][0]) <= end_date) 
{ 
liczba++; 
} 
} 

//tworzymy tablice o takim rozmiarze 
float *tablica = new float[liczba]; 

//wrzucamy do tej tablicy tylko wartosci elementow z zakresow dat 
//ktore nas interesuja 
for(int i=0;i<53;i++) { 
if(long(tab[i][0]) >= start_date && long(tab[i][0]) <= end_date) 
{ 
tablica[ile] = tab[i][1]; 
ile++; 
} 
} 

//sortujemy ta tablice babelkowo 
bubblesort(tablica,liczba); 

//poniwaz mamy posortowana tablice to sprawdzamy ktora wartosc wystepuje 
//pod rzad najwiecej razy i mamy nasza dominante 
for(int i=0;i<liczba;i++) 
{ 
if(tablica[i]==tablica[i+1]) 
licz++; 
if(licz>max) 
{ 
max=licz; 
index=i; 
} 
} 

return tablica[index];	
} 

//funkcja obliczajaca srednia 
float srednia(double* tab[] , long start_date, long end_date) { 
double sum = 0; 
int ile = 0; 
for(int i=0;i<53;i++) { 
if(long(tab[i][0]) >= start_date && long(tab[i][0]) <= end_date) 
{ 
sum += tab[i][1]; 
ile++; 
} 
} 
return sum/ile; 
} 

//funkcja obliczajaca odchylenie standardowe 
float odchylenie_std(double* tab[] , long start_date, long end_date) { 
float sr = srednia(tab,start_date,end_date); 
double sum = 0; 
int ile = 0; 
double wariancja; 

//najpierw musimy obliczyc wariancje 
for(int i=0;i<53;i++) { 
if(long(tab[i][0]) >= start_date && long(tab[i][0]) <= end_date) 
{ 
sum += pow(tab[i][1]-sr,2); 
ile++; 
} 
} 
wariancja = sum/ile; 

//zwracamy odchylenie standardowe jako pierwiastek kwiadratowy wariancji 
return sqrt(wariancja); 
} 


float kurtoza(double* tab[] , long start_date, long end_date) { 
float sr = srednia(tab,start_date,end_date); 
float od = odchylenie_std(tab, start_date, end_date); 
double sum = 0; 
int ile = 0; 
for(int i=0;i<53;i++) { 
if(long(tab[i][0]) >= start_date && long(tab[i][0]) <= end_date) 
{ 
sum += pow(tab[i][1]-sr,4); 
ile++; 
} 
} 
return sum/pow(od,4); 
} 



int main(){ 
int company_choice, calculation_choice; 
long start_date, end_date; 
string plik; 
string company[21] = {"","ASSECOPOL","BOGDANKA","BRE","CEZ","GETIN","HANDLOWY","KERNEL","KGHM", \ 
"LOTOS","PBG","PGE","PGNIG","PKNORLEN","PZU","PKOBP","GTC","TAURON","TPSA","TVN","PEKAO"}; 


do { 
cout << " \n\n STATYSTYCZNA ANALIZA DANYCH FINANSOWYCH" << endl<<endl << \ 
"*******************************************************************************"<< endl <<endl<< \ 
"Notowania ciagle dla firm z WIG20 w okresie od 09-03-2011r. do 23-05-2011r."<< endl << \ 
"Wybierz firme dla ktorej chcesz wykonac statystyczna analize danych"<< endl<<endl; 

for(int i=1;i<21;i++) { 
cout << i << " - " << company[i] << endl; 
} 

cout << endl << "Podaj nr: " << endl ; 
cin >> company_choice; 
if (company_choice < 1 || company_choice > 20 ) 
cout << endl << "Niepoprawny numer firmy, podaj jeszcze raz: "; 
} while(company_choice < 1 || company_choice > 20); 

//nazwa pliku to nazwa indeksu (firmy) plus rozszerzenie .txt 
plik = company[company_choice] + ".txt"; 

//otwieramy plik, jesli wystapi blad (nie mozna otworzyc pliku, plik nie istnieje) 
//to przerywamy program 
ifstream F(plik.c_str()); 
if (!F) 
{ 
cout << endl << endl << "BLAD OTWARCIA PLIKU" << endl ; 
system("PAUSE"); 
return 0; 
} 

//wrzucamy elementy z pliku do tablicy 
double **tab; 
tab=new double *[53]; 
for (int i=0;i<53;i++) 
{ 
tab[i]=new double[2]; 
F >> tab[i][0]; 
F >> tab[i][1]; 
} 

//wybieramy co chcemy obliczyc 
do { 
show_choice_menu(); 

cout << "Podaj liczbe: "; 
cin >> calculation_choice; 

if(calculation_choice < 1 || calculation_choice > 6) 
cout << endl << "Niepoprawny wybor, sprobuj"; 

} while(calculation_choice < 1 || calculation_choice > 6); 

//wybieramy zakres dat w jakich chcemy liczyc 
do { 
cout << endl << "Podaj date poczatkowa w formacie YYYYMMDD z zakresu od 09-03-2011r. do 23-05-2011r.: " << endl ; 
cin >> start_date; 
cout << endl << "Podaj date koncowa w formacie YYYYMMDD z zakresu od 09-03-2011r. do 23-05-2011r.: " << endl ; 
cin >> end_date; 
if (start_date < 20110309 || start_date > 20110523 || end_date < 20110309 || \ 
end_date > 20110523 || end_date - start_date < 0) 
cout << endl << "Niepoprawna data!!!" << endl << endl; 
} while(start_date < 20110309 || start_date > 20110523 || end_date < 20110309 || \ 
end_date > 20110523 || end_date - start_date < 0); 

cout << endl << endl << "Wybrales firme " << company[company_choice] << " oraz okres od " << \ 
start_date << " do " << end_date << endl; 

switch( calculation_choice ) 
{ 
case 1: 
cout << endl << "Srednia arytmetyczna: " << srednia(tab,start_date,end_date) << endl; 
cout << endl ; 
break; 
case 2: 
cout << endl << "Odchylenie standardowe: " << odchylenie_std(tab,start_date,end_date) << endl; 
cout << endl ; 
break; 
case 3: 
cout << endl << "Mediana: " << mediana(tab,start_date,end_date) << endl; 
cout << endl ; 
break; 
case 4: 
cout << endl << "Dominanta: " << dominanta(tab,start_date,end_date) << endl; 
cout << endl ; 
break; 
case 5: 
cout << endl << "Kurtoza: " << kurtoza(tab,start_date,end_date) << endl; 
cout << endl ; 
break; 
case 6: 
cout << endl << "Srednia arytmetyczna: " << srednia(tab,start_date,end_date) << endl; 
cout << "Odchylenie standardowe: " << odchylenie_std(tab,start_date,end_date) << endl; 
cout << "Mediana: " << mediana(tab,start_date,end_date) << endl; 
cout << "Dominanta: " << dominanta(tab,start_date,end_date) << endl; 
cout << "Kurtoza: " << kurtoza(tab,start_date,end_date) << endl; 
cout << endl ; 
break; 
} 

//czekamy na nacisniecie dowolnego klawisza od uzytkownika 
system("PAUSE"); 
return 0; 

}
0

Twój program jest nie działa w trybie graficznym, więc ciężko coś doradzić. Większość typowych rozwiązań wymuszałaby przebudowanie dość mocno programu. Nie wiem jakie masz możliwości, ale możesz np wykorzystać jakiś zewnętrzny program do wyświetlania wykresów. Ale to oczywiście pod warunkiem, że możesz skorzystać z takich rozwiązań. Masz jakieś wytyczne?

0

Nie nie mam żadnych wytycznych. Dlatego chętnie się dowiem jak mogę dodać te wykresy. Chodzi mi o to, żeby dodać "pokaż wykresy poszczególnych spółek" i po wybraniu tej opcji pokazywało wykres, wszystko jedno jak.

0

http://www.gnuplot.info/

Możesz się pobawić biblioteką, lub nakarmić binarkę danymi.

0

W C++ możesz wykonać wykresy korzystając z:
http://math.uni.lodz.pl/~polrola/strony/0607l-podyplom/o_grafice.html
lub uaktualniając Dev-Cpp o Allegro

0

Wiem że można użyć allegro na początku o tym myślałam, ale z czystego lenistwa, nie chce mi się przerabiać całego programu, więc to będzie ostateczność. Właśnie dlatego szukam innych opcji:)

0

no to zostaje gnuplot. ktoś wyżej podał link. można jeszcze ewentualnie generować obrazki do pliku.

0

właśnie ściągnęłam gnuplota, zrobiłam skrypty wykresów, wszystko działa. I teraz mam pytanie jak je dodać do kodu?

0

ja robię to tak:

gnuplot("plot 'determinant.dat'");

void gnuplot(const char *gnucommand)
{
  char syscommand[1024];
  sprintf(syscommand, "echo \"%s\" | gnuplot -persist", gnucommand);
  system(syscommand);
}
 
0
Anthus napisał(a)

ja robię to tak:

gnuplot("plot 'determinant.dat'");

void gnuplot(const char *gnucommand)
{
  char syscommand[1024];
  sprintf(syscommand, "echo \"%s\" | gnuplot -persist", gnucommand);
  system(syscommand);
}
 

Jeśli zestaw komend jest stały, można je wrzucić do pliku i przekazać jego nazwę gnuplotowi jako argument, lub pchnąć komendę 'load nazwa_pliku' przez stdin. Dzięki temu będzie można modyfikować parametry wykresu (kolorki, ośki, kółeczka, duperszmitki) bez konieczności rekompilacji programu. Nie zrobi się tym jednak persista.

1 użytkowników online, w tym zalogowanych: 0, gości: 1