Member 13803911 Ответов: 1

Нужна помощь с проектом C++!


Мы хотим написать два контейнера. Один из них заключается в хранении ежедневных данных, а другой-в хранении данных первого типа контейнера-индекса (тикеров).

Это означает, что весь файл будет сохранен строка за строкой в первом контейнере-каждая строка представляет элемент в первом контейнере. Например, если файл содержит 10 строк, то первый контейнер будет содержать 10 элементов. Второй контейнер будет использоваться для хранения контейнеров первого типа контейнеров. Например, если у меня есть 4 индексные строки, мой второй контейнер будет содержать 4 элемента. Это означает, что второй контейнер-это контейнер контейнеров.
Двойная вершина-это паттерн формирования цены. Он появляется как два последовательных пика приблизительно одной и той же цены на графике цена-время рынка. Эти две вершины разделены минимумом в цене, Долиной. Ценовой уровень этого минимума называется линией шеи формации. Формирование завершается и подтверждается, когда цена опускается ниже линии шеи.

Мы должны сделать следующее:
Вы должны открыть файл names.csv, прочитать строку и добавить файл .csv, чтобы создать имя файла. Например, qqq будет считываться из одной из строк в файле names.csv. пример данных для names.csv приведен ниже:

за третий квартал российский рынок акций AAPL событиями недели

Как только qqq.csv-строка имени файла будет создана, вы попытаетесь найти файл qqq.csv в .../Projects/final_project/data_files и прочитать данные. Пример данных из одного csv-файла приводится следующим образом:

Дата,Adj Close,Объем
3/20/2017,129.719299,118404300
3/27/2017,131.457108,91838100
4/3/2017,131.049942,104686800
4/10/2017,129.490891,89035900
4/17/2017,131.635834,88364200
4/24/2017,135.041916,103641400
5/1/2017,136.5811,100949000
5/8/2017,137.633743,109176100
5/15/2017,136.879028,175959500
5/22/2017,140.235474,92869300
5/29/2017,142.459854,110879400

Нужно читать данные в контейнер STL построчно. Каждая строка представляет каждый элемент в вашем первом контейнере. При создании своего собственного типа, скажем Data, со строкой, double и long для хранения ежедневных данных. Таким образом, вам нужно определить контейнер STL как, скажем, вектор v. Вам нужно перегрузить заданные операторы для данных типа. Операторы а
-- запись во всей строке в файл - чтение во всей строке из файла >, < - операторы сравнения на основе даты = = - оператор равенства для проверки того, одинаковы ли цены для двух объектов данных [ ] оператор доступа к вашему контейнеру и конструктор копирования для этого вышеприведенного типа.
Теперь создайте контейнер, в котором есть вектор данных типа. Затем вычислите, произошла ли двойная вершина на основе столбца adj close. Запишите это в новый файл с вызовом qqq-final.csv, включая место, где именно произошел top double. Следите за именами файлов, где произошел двойной топ. После обработки всех файлов, напишите ваши результаты в статус.CSV в "символ", "ДА/НЕТ" -- 1. Да, представляющий двойную вершину, созданную в этом файле. 2. Не иначе. Мы должны убедиться, что ежедневные данные хранятся в контейнере данных и все файлы хранятся в DataContainer.

Ниже приведено то, что я сделал до сих пор, может быть, вам понадобится некоторая помощь.

Что я уже пробовал:

using namespace std;

Class Data {

private:
string date;
long long volume;
double close;
public:

virtual Data::~Data() {};
Data() {};
Data(string stockInfo);


void setDate(const string dates);

void setVolume(const long vol);

void setClose(const double _close);

string getDate() const;

long getVolume() const;

double getClose() const;

bool operator <(const Data& d2);
bool operator >(const Data& d2);
bool operator ==(const Data& d2);
Data operator =(Data& right);

friend ostream& operator << (ostream&, const Data&);
friend istream& operator >> (istream&, Data&);


};
Data::Data(string filePath) {
ifstream fileNames(filePath);

//make vector
vector<data> dataList;
string line;
char *token = nullptr;
int index;

//inputing file into vector
while (!fileNames.eof()) {

    getline(fileNames, line);
    stringstream dataStream(line);
    string cell;

    while (getline(dataStream, cell, ',')) {
        Data d(line);
        dataList.push_back(d);
    }

    dataStream >> date >> close >> volume;

    cout << dataList.size() << " elements in container" << endl;
 }
  fileNames.close();

 //Sort data from lowest close to hightest
 sort(dataList.begin(), dataList.end(), [](Data &d1, Data &d2) {
    return d1.getClose() > d2.getClose();
 });

 };


 void Data::setDate(const string dates) {
 date = dates;
 }

 void Data::setVolume(const long vol) {
 volume = vol;
 }

 void Data::setClose(const double _close) {
 close = _close;
 }

 string Data::getDate() const {
 return(date);
 }

 long Data::getVolume() const {
 return(volume);
 }

 double Data::getClose() const {
 return (close);
 }

 bool Data::operator <(const Data& d2) {
 if (date < d2.date)
    return true;
 return false;
}

 bool Data::operator >(const Data& d2) {
 if (date > d2.date)
    return true;
 return false;
 }

 bool Data::operator ==(const Data& d2) {
   if (close == d2.close)
    return true;
 return false;
 }

 Data Data::operator =(Data& right) {
 if (this != &right) {
    date = right.date;
 }
 return *this;
 }

 ostream& operator << (ostream& stream, const Data& obj) {
 stream << "Date: " << obj.date << " Closing Cost: " << obj.close << " 
 Volume: " << obj.volume << endl;
 return stream;
 }

 istream& operator >> (istream& strm, Data& obj)
 {
 cout << "Enter date: " << " ";
 strm >> obj.date;
 cout << endl;

 cout << "Enter closeing cost: " << " ";
 strm >> obj.close;
 cout << endl;

 cout << "Enter volume: " << " ";
 strm >> obj.volume;
 cout << endl;

 return strm;}

 class dataContainer : Data {
 public:

 virtual ~dataContainer() {};
 dataContainer() {};
 dataContainer(vector<data>);
 Data getDoubleTop();



 private:
 vector<data>vData;

 }; 

 string getFilename(string);

 int main() {

 string filename = "names.csv";
 Data data1(filename);
 vector<data> vd1;
 dataContainer dC1(vd1);
 //cout << "\n" << dC1.getDoubleTop();
 cout << vd1.size();




 system("Pause");
 return 0;}

string getFilename(string fileName) {

ofstream namesFile; 

namesFile.open(fileName);

namesFile << "QQQ\n";

namesFile << "MSFT\n";

namesFile << "APPL\n";

namesFile << "AMZN\n";

 namesFile.close();

 string dat;
 return dat;
 }</data></data></data></data>

Richard MacCutchan

- мне бы не помешала помощь."

Затем, пожалуйста, отредактируйте свой вопрос и объясните, какая именно помощь вам нужна. Мы не можем догадаться, с чем у вас возникли проблемы.

1 Ответов

Рейтинг:
2

KarstenK

Вы должны лучше понимать функции используемых классов. С Гэтлином Вы читаете на свой формат данных разделитель. Поэтому повторите вызов 3 раза, но последний с новой строкой.

getline(dataStream, date, ',');
getline(dataStream, close, ',');
getline(dataStream, volume, '\n');
//Than you have the parts to construct your object. 
Data d(data,close,volume);
Было бы разумно сохранить некоторый индекс для синхронизации данных между файлами. Обычно это не очень хорошая идея, чтобы разделить данные, которые принадлежит вместе.

Научитесь использовать отладчик и шагните в свой код, чтобы изучить кодирование. Хороший учебник-это Изучайте C++ а в главе 1.11 объясняется процесс отладки.