#include <iostream> #include <sstream> #include <fstream> #include <string> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <io.h> using namespace std; string removeSuffix(string fileName) //去除文件后缀 { const char* full_name = fileName.c_str(); const char* mn_first = full_name; int tmp = strlen(full_name);//长度不包含'/0' const char* mn_last = full_name /*+ strlen(full_name)*/; if (strrchr(full_name, '\') != NULL)//去除路径,只留文件名 mn_first = strrchr(full_name, '\') + 1; if (strrchr(full_name, '.') != NULL) mn_last = strrchr(full_name, '.');//获取.*后缀 fileName.assign(mn_first, mn_last); return fileName; } int main() { ifstream fin("D:\C++study\Scoringmodel\AF00348.txt", ios::in);//打开文件 FILE *filepath; filepath = fopen("D:\C++study\Scoringmodel\AF00348.txt", "a"); long Handle; string ss; string s; struct _finddata_t FileInfo; if ((Handle = _findfirst("D:\C++study\Scoringmodel\AF00348.txt", &FileInfo)) == -1L) printf("没有找到匹配的项目 "); else { ss=FileInfo.name;//文件名 //cout<<ss<<endl; } s=removeSuffix(ss);//去掉后缀 //cout<<s<<endl; char line[200001]={0};//按行读取数据 string date = "";//表示行车日期,格式为年/月/日 string time = "";//表示行车时间,格式为时/分/秒 int flag;//表示车的状态,1表示车在启动中,0表示熄火 int v;//表示车的速度 int a;//表示车的加速度 int angle;//方向角 int day0=0;//日 int hh0=0;//时 int mm0=0;//分 int ss0=0;//秒 int day1=0; int hh1=0; int mm1=0; int ss1=0; int t0=0;//记录一段时间驾驶的总时间 int num0=0;//记录疲劳驾驶0-1小时的次数 int t1=0;//属于疲劳驾驶的总时间 double grade=100.00;//每辆车的得分,初值为满分100 double k0 = 0.0005 ;//表示疲劳驾驶0-1小时扣分中的系数 double k13 = 0.0007;//疲劳驾驶1-2小时扣分系数 double k14 = 0.0008;//疲劳驾驶2小时以上扣分系数 double grade0=0;//疲劳驾驶0-1小时应扣的分值 int num3=0;//加速度达到三级急加/减速标准的次数 double k3 = 0.0004 ;//三级急加/减速扣分中的系数 double grade3=0;//三级急加/减速应扣的分数 int num2=0;//加速度达到二级急加/减速标准的次数 double k2 = 0.0003 ;//二级急加/减速扣分中的系数 double grade2=0;//二级急加/减速应扣的分数 int num1=0;//加速度达到一级急加/减速标准的次数 double k1 = 0.0002 ;//一级急加/减速扣分中的系数 double grade1=0;//一级急加/减速应扣的分数 int num4=0;//怠速预热的次数 int t2=0;//一段时间内超长怠速的时间 int mm2=0;//记录怠速开始的分 int ss2=0;//记录怠速开始的秒 int mm3=0;//记录怠速结束的分 int ss3=0;//记录怠速结束的秒 int t3=0;//总的超长怠速时间 double grade4=0;//怠速预热应扣的分数 double k4 = 0.0001 ;//怠速预热的系数 double grade5=0;//超长怠速应扣的分数 double k5 = 0.00002;//超长怠速的系数 int t4=0;//一段时间内的熄火滑行时间 int t5=0;//总的熄火滑行时间 int mm4=0;//记录熄火滑行开始的分 int mm5=0;//记录熄火滑行结束的分 int ss4=0;//记录熄火滑行开始的秒 int ss5=0;//记录熄火滑行结束的秒 double k6 = 0.0005 ;//熄火滑行的系数 double grade6=0;//熄火滑行应扣的分数 int num13=0;//熄火滑行的次数 int num5=0;//超速10%以内的次数 double k7 = 0.0004 ;//超速10%以内的系数 double grade7=0;//超速10%以内应扣的分数 int num6=0;//超速10%~20%的次数 double k8 = 0.0067 ;//超速10%~20%的系数 double grade8=0;//超速10%~20%应扣的分数 int num7=0;//超速20%~50%的次数 double k9 = 0.0500 ;//超速20%~50%的系数 double grade9=0;//超速20%~50%应扣的分数 int num8=0;//超速50%~70%的次数 double k10 = 0.0800 ;//超速50%~70%的系数 double grade10=0;//超速50%~70%应扣的分数 int num9=0;//超速70%以上的次数 double k11 = 0.1000 ;//超速70%以上的系数 double grade11=0;//超速70%以上应扣的分数 double k12 = 0.8000 ;//处于夜间的系数 int num10=0;//记录疲劳驾驶1-2小时的次数 int num11=0;//记录疲劳驾驶2小时以上的次数 double grade12=0;//疲劳驾驶1-2小时应扣的分数 double grade13=0;//疲劳驾驶2小时以上应扣的分数 int num12=0; //int hh; int startangle=0;//开始变道方向角 int stopangle=0;//变道结束方向角 int subangle=0;//角度差 int num14=0;//急变道次数 double k15 = 0.0003;//急变道系数 double grade14=0;//急变道扣分 while(fin.getline(line, sizeof(line))) { stringstream word(line);//定义字符串流 word >> date; word >> time; word >> flag; word >> v; word >> a; word >> angle; //word >> hh; /*cout << "date: " << date << endl; cout << "time: " << time << endl; cout << "flag: " << flag << endl; cout << "v: " << v << endl; cout << "a: " << a << endl; cout << "angle: "<<angle<<endl;*/ /*if(hh>2) num12++;*/ if(flag==1&&v>0) { day0=(int)date[4];//记录一段连续行驶开始时的日期,连续行驶没有超过一个月的,不必记录年/月 hh0=(int)time[0];//记录时 mm0=(int)time[2];//记录分 ss0=(int)time[4];//记录秒 } if(flag==0) { day1=(int)date[4];//记录一段连续行驶结束时的日期,连续行驶没有超过一个月的,不必记录年/月 hh1=(int)time[0];//记录时 mm1=(int)time[2];//记录分 ss1=(int)time[4];//记录秒 } t0=(day1-day0)*24*3600+(hh1-hh0)*3600+(mm1-mm0)*60+(ss1-ss0);//一段时间内的驾驶总时间,以秒为单位 if(t0>14400&t0<=18000) //即为疲劳驾驶:连续驾驶4小时以上,5小时以内 { t1+=t0; num0++;//疲劳驾驶0-1小时的次数 } else if(t0>18000&t0<=21600) { num10++; } else if(t0>21600) { num11++; } t0=0;//每段时间算完之后将t0置为0计算另一段 if(fabs(a)>1&&fabs(a)<=2) //加速度达到三级急加/减速标准 { num3++;//次数+1 } else if(fabs(a)>2&&fabs(a)<=3) //加速度达到二级急加/减速标准 { num2++; } else if(fabs(a)>3&&fabs(a)<=5) //加速度达到一级急加/减速标准 { num1++; } else ; if(flag==1&&v==0) //车辆处于怠速预热开始状态 { num4++;//怠速的次数 mm2=(int)time[2]; ss2=(int)time[4]; } if(flag==1&&v>0) //怠速结束 { mm3=(int)time[2]; ss3=(int)time[4]; } t2=(mm3-mm2)*60+(ss3-ss2);//一段时间内的怠速时间,以秒为单位 if(t2>180) //超长怠速 { t3+=t2; } t2=0; if(flag==0&&v>0) //熄火滑行开始状态 { num13++;//熄火滑行的次数 mm4=(int)time[2]; ss4=(int)time[4]; } if((flag==0&&v==0)||(flag==1&&v>0)) //熄火滑行已经结束 { mm5=(int)time[2]; ss5=(int)time[4]; } t4=(mm5-mm4)*60+(ss5-ss4);//一段时间的熄火滑行时间 t5+=t4;//总的熄火滑行时间 t4=0;//计算下一段前置0 if(v>90&&v<=99) //超速10%以内,90为基准 { num5++; } else if(v>99&&v<=108) //超速10%~20% { num6++; } else if(v>108&&v<=135) //超速20%~50% { num7++; } else if(v>135&&v<=153) //超速50%~70% { num8++; } else if(v>153) //超速70%以上 { num9++; } if(v>80) { startangle=angle; } if(v>80) { stopangle=angle; } subangle=stopangle-startangle; if(fabs(subangle)>5) { num14++; } if((int(time[0])>=0&&int(time[0])<=6)||int(time[0])>=22&&int(time[0])<=23) { k0*=k12; k1*=k12; k2*=k12; k3*=k12; k4*=k12; k5*=k12; k6*=k12; k7*=k12; k8*=k12; k9*=k12; k10*=k12; k11*=k12; k13*=k12; k14*=k12; } } t3/=3600;//超长怠速以小时为单位 grade12=num10*k13;//疲劳驾驶1-2小时应扣的分数 grade13=num11*k14;//疲劳驾驶2小时以上应扣的分数 grade14=num14*k15;//急变道应扣去的分数 grade0=num0*k0;//疲劳驾驶0-1小时的扣分值 grade3=k3*num3;//三级急加/减速应扣的分数 grade2=num2*k2;//二级急加/减速应扣的分数 grade1=num1*k1;//一级急加/减速应扣的分数 grade4=k4*num4;//怠速预热应扣的分数 grade5=k5*t3*t3;//超长怠速应扣的分数 grade6=k6*num13;//熄火滑行应扣的分数 grade7=k7*num5;//超速10%以内应扣的分数 grade8=k8*num6;//超速10%~20%应扣的分数 grade9=num7*k9;//超速20%~50%应扣的分数 grade10=num8*k10;//超速50%~70%应扣的分数 grade11=num9*k11;//超速70%以上应扣的分数 grade=grade-grade0-grade3-grade2-grade1-grade4 -grade5-grade6-grade7-grade8-grade9-grade10-grade11-grade12-grade13-grade14;//最终得分值 /*cout<<endl; cout<<endl; cout<<num3<<endl;//三级急加/减速次数 cout<<num2<<endl;//二级急加/减速次数 cout<<num1<<endl;//一级急加/减速次数 cout<<num4<<endl;//怠速预热次数 //cout<<num12<<endl; cout<<num0<<endl; cout<<num10<<endl; cout<<num11<<endl; cout<<num13<<endl; cout<<t3<<endl; cout<<num14<<endl; cout<<"疲劳驾驶0-1小时扣去的分数为:"<<grade0<<endl; cout<<"疲劳驾驶1-2小时扣去的分数为:"<<grade12<<endl; cout<<"疲劳驾驶2小时以上扣去的分数为:"<<grade13<<endl; cout<<"急变道扣去的分数为:"<<grade14<<endl; cout<<"三级急加/减速扣去的分数为:"<<grade3<<endl; cout<<"二级急加/减速扣去的分数为:"<<grade2<<endl; cout<<"一级急加/减速扣去的分数为:"<<grade1<<endl; cout<<"怠速预热扣去的分数为:"<<grade4<<endl; cout<<"超长怠速扣去的分数为:"<<grade5<<endl; cout<<"熄火滑行扣去的分数为:"<<grade6<<endl; cout<<"超速10%以内扣去的分数为:"<<grade7<<endl; cout<<"超速10%~20%扣去的分数为:"<<grade8<<endl; cout<<"超速20%~50%扣去的分数为:"<<grade9<<endl; cout<<"超速50%~70%扣去的分数为:"<<grade10<<endl; cout<<"超速70%以上扣去的分数为:"<<grade11<<endl; cout<<endl; cout<<endl;*/ cout<<"这辆车最终的总得分是:"<<grade<<endl; ofstream outfile("车辆综合得分.txt", ios::app); outfile<<s<<"车的综合得分为:"<<grade<<endl; fin.clear(); fin.close();//关闭文件,释放内存 outfile.close(); }
#include <iostream> #include <sstream> #include <fstream> #include <string> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <io.h> using namespace std; int main() { string sheng=""; string shi=""; string xian=""; string date=""; string fensu=""; double wendu=0.0; string tianqi=""; double jiangshui=0.0; double shidu=0.0; string csheng=""; string cshi=""; string cxian=""; string cdate=""; ifstream myfile("test.txt",ios::in); char line[88888]={0}; ofstream outfile("Score.txt", ios::app); if (!myfile.is_open()) { cout << "未成功打开文件" << endl; } while(myfile.getline(line, sizeof(line))) { int fsgrade=0; int wdgrade=0; int tqgrade=0; int jsgrade=0; int sdgrade=0; stringstream word(line);//定义字符串流 word >> sheng; word >> shi; word >> xian; word >> date; word >> fensu; word >> wendu; word >> tianqi; word >> jiangshui; word >> shidu; word >> csheng; word >> cshi; word >> cxian; word >> cdate; if(fensu=="<=3") fsgrade=5; else if(fensu[0]=='4') fsgrade=4; else if(fensu[0]=='7') fsgrade=3; else if(fensu[0]=='1'&&fensu[1]=='0') fsgrade=2; else fsgrade=1; if(wendu>=16.00&&wendu<22.00) wdgrade=5; else if(wendu>=8.00&&wendu<15.00) wdgrade=4; else if(wendu>=23.00&&wendu<29.00) wdgrade=3; else if(wendu>=0.00&&wendu<7.00) wdgrade=2; else wdgrade=1; if(tianqi[0]=='q') tqgrade=5; else if(tianqi[0]=='y') tqgrade=4; else if(tianqi[0]=='x'&&tianqi[1]=='i'&&tianqi[2]=='a'&&tianqi[3]=='o') tqgrade=3; else if(tianqi[0]=='b') tqgrade=2; else tqgrade=1; if(jiangshui>=0&&jiangshui<7) jsgrade=5; else if(jiangshui>=7&&jiangshui<15) jsgrade=4; else if(jiangshui>=15&&jiangshui<23) jsgrade=3; else if(jiangshui>=23&&jiangshui<29) jsgrade=2; else jsgrade=1; if(shidu>=0.2&&shidu<0.40) sdgrade=5; else if(shidu>=0.4&&shidu<0.60) sdgrade=4; else if(shidu>=0&&shidu<0.20) sdgrade=3; else if(shidu>=0.60&&shidu<0.80) sdgrade=2; else sdgrade=1; //cout<<fsgrade<<endl; outfile << fsgrade <<" "<<wdgrade<<" "<<tqgrade<<" "<<jsgrade<<" "<<sdgrade<<endl; } myfile.close(); outfile.close(); return 0; }
哈哈,其实这是当时参加第七届“泰迪杯”数据挖掘挑战赛的时候写的代码,和两位数学专业的同学参加的,我主要负责写代码。当时我们选的是C题:运输车辆安全驾驶行为的分析 ,大概意思就是在各种其他条件(如:天气、风速、温度、湿度、降水等)的变化之中,从批量数据中找出驾驶行为对行车安全、运输效率和节能情况的影响,最终,我们建立了一个得分制模型,用来描述在各种条件下,任何不当的驾驶行为会减扣相应的分数,最后根据总得分来体现不当的驾驶行为对行车安全、效率等的影响。虽然最终没能获奖,但竞赛的整个过程还是比较有意思的,值得记录一下。