这边实际上有点偏了,是c++实现具体的数据分析,但是标题连贯性就不改了~
注意点:
1.c++的 string字符串,c风格字符串,char *等连接方式
2.sprintf函数使用(记得补齐日期前面的0)
3.mysql_store_result函数,只要sql语句执行成功即返回结果集不为空,需要mysql_affected_rows判断是否有有效函数
补充源码:
#include <iostream> #include <string> #include <Windows.h> #include <WinSock.h> #include <mysql.h> #include <time.h> #pragma comment(lib,"wsock32.lib") using namespace std; const int stockFields = 15; MYSQL mysql; char field[32][32]; //存字段名二维数组 MYSQL_RES *res; //行的一个查询结果集 MYSQL_ROW column; //数据行的列 char query[150]; //查询语句 //函数声明 bool ConnectDatabase(); void FreeConnect(); //查询历史最高价 float queryHighestPrice(); //查询最新成交日日期价格,即跳过停盘或者非交易日,离今天最近的一天的成交价 float newDayPrice(string dayTime); //查询当天日期 string queryToday(); //查询某个月的天数 int queryMonthTotalDays(int year,int month); //查询昨天的日期 string queryYesterday(string dateTime); int main(int argc, char **argv) { float highestPrice = 0.0; float nNewDayPrice = 0.0; string strTodayDate = ""; ConnectDatabase(); //QueryDatabase(); highestPrice = queryHighestPrice(); strTodayDate = queryToday(); nNewDayPrice = newDayPrice(strTodayDate); FreeConnect(); cout << "highestPrice:" << highestPrice << endl; cout << "strTodayDate:" << strTodayDate << endl; cout << "nNewDayPrice:" << nNewDayPrice << endl; system("pause"); return 0; } //连接数据库 bool ConnectDatabase(){ //Gets or initializes a MYSQL structure mysql_init(&mysql); // Connects to a MySQL server const char host[] = "localhost"; const char user[] = "root"; const char passwd[] = "Test_123"; const char db[] = "stockDataBase"; unsigned int port = 3306; const char *unix_socket = NULL; unsigned long client_flag = 0; if (mysql_real_connect(&mysql, host, user, passwd, db, port, unix_socket, client_flag)) { printf("The connection was successful.\n"); return true; } else { printf("Error connecting to database:%s\n", mysql_error(&mysql)); return false; } } //释放资源 void FreeConnect() { mysql_free_result(res); mysql_close(&mysql); } //查询历史最高价 float queryHighestPrice() { float highestPrice; sprintf_s(query, "select * from stock_600000 order by closePrice desc limit 1 "); mysql_query(&mysql, "set names gbk"); if (mysql_query(&mysql, query)) { printf("Query failed (%s)\n", mysql_error(&mysql)); return false; } else{ printf("query success\n"); } res = mysql_store_result(&mysql); if (!res){ printf("Couldn't get result from %s\n", mysql_error(&mysql)); return false; } while (column = mysql_fetch_row(res)){ string tempHighPri = column[3]; highestPrice = atof(tempHighPri.c_str()); } return highestPrice; } //查询最新成交日日期价格 float newDayPrice(string dayTime) { float nNewDayPrice = 0.0; string tempQuery = "select * from stock_600000 where dateTime = '" + dayTime + "'" ; sprintf_s(query, tempQuery.c_str()); mysql_query(&mysql, "set names gbk"); if (mysql_query(&mysql, query)) { printf("Query failed (%s)\n", mysql_error(&mysql)); return false; } else { printf("query success\n"); } res = mysql_store_result(&mysql); if (!res) //这边理论上需要优化,万一优质股票一直没有价格,就陷入死循环了 { cout << "can not get result" << endl; } else { if(0 == mysql_affected_rows(&mysql)) { cout << "can not get " + dayTime + " price." << endl; string tempDay = queryYesterday(dayTime); nNewDayPrice = newDayPrice(tempDay); } else { while (column = mysql_fetch_row(res)) { string todayPrice = column[3]; nNewDayPrice = atof(todayPrice.c_str()); } } } return nNewDayPrice; } //查询当天日期 string queryToday() { //query today date strToday time_t nowtime; tm * pt; char strTime[20]; time(&nowtime); pt = localtime(&nowtime); strftime(strTime,20,"%Y-%m-%d",pt); string strToday = strTime; return strToday; } //查询某个月的天数 int queryMonthTotalDays(int year,int month) { if(2 == month && 0 == year%4) { return 29; } switch(month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31; case 2: return 28; case 4: case 6: case 9: case 11: return 30; default: return 0; } } //查询昨天的日期 string queryYesterday(string dateTime) { string strYear = dateTime.substr(0,4); string strMonth = dateTime.substr(5,2); string strDay = dateTime.substr(8,2); int nYear = atoi(strYear.c_str()); int nMonth = atoi(strMonth.c_str()); int nDay = atoi(strDay.c_str()); int tempDay = 0; int tempMonth = nMonth; int tempYear = nYear; if(nDay > 1) { tempDay = nDay - 1; } else { if(nMonth > 1) { tempMonth = tempMonth -1; tempDay = queryMonthTotalDays(tempYear,tempMonth); } else { tempYear = tempYear -1; tempMonth = 12; tempDay = 31; } } string lianjiefu = "-"; //string tempDateTime = tempYear + lianjiefu + tempMonth + lianjiefu + tempDay; //c++不能像java直接+数字和字符串 char str1[10]; sprintf(str1,"%04d",tempYear); char str2[10]; sprintf(str2,"%02d",tempMonth); char str3[10]; sprintf(str3,"%02d",tempDay); string tempDateTime = str1 + lianjiefu + str2 + lianjiefu + str3; //error C2110: “+”: 不能添加两个指针,即 str1 + "-" + str2 也不行 return tempDateTime; }
缺点:
1.命名规范
2.魔鬼数字
3.安全函数使用
4.功能目前只实现了 查询出某只股票的最高价,以及离今天最近的一天的成交日的价格,大概执行效果
下一步是实现:能查询所有 上海股票的最近价格与历史最高价比,并筛选出比值少于1/3的
生命在于运动,知识在于积累
写代码的小熊猫~ :)