机器学习实验《多源数据集成、清洗和统计》 C++ 实现

题目: 某班有同学100人,现要从两个数据源汇总学生数据。第一个数据源在数据库中,第二个数据源在txt文件中,两个数据源课程存在缺失、冗余和不一致性,请用C/C++/Java程序实现对两个数据源的一致性合并以及每个学生样本的数值量化。

· 数据库表:ID (int), 姓名(string), 家乡(string:限定为Beijing / Guangzhou / Shenzhen / Shanghai), 性别(string:boy/girl)、身高(float:单位是cm))、课程1成绩(float)、课程2成绩(float)、…、课程10成绩(float)、体能测试成绩(string:bad/general/good/excellent);其中课程1-课程5为百分制,课程6-课程10为十分制。

· txt文件:ID(string:6位学号),性别(string:male/female)、身高(string:单位是m))、课程1成绩(string)、课程2成绩(string)、…、课程10成绩(string)、体能测试成绩(string:差/一般/良好/优秀);其中课程1-课程5为百分制,课程6-课程10为十分制。

参考:
数据库中Stu表数据
ID Name City Gender Height C1 … C10 Constitution
1 Sun Beijing boy 160 87 9 good
2 Zhu Shenzhen girl 177 66 8 excellent
… … … … … … … … …

student.txt中
ID Name City Gender Height C1 。。。 C10 Constitution
202001 Sun Beijing male 1.80 87 。。。 9 good
202003 Tang Hanghai male 1.56 91 。。。 10 general
… … … … … … … … …

两个数据源合并后读入内存,并统计:

1.学生中家乡在Beijing的所有课程的平均成绩。
2.学生中家乡在广州,课程1在80分以上,且课程10在9分以上的男同学的数量。
3.比较广州和上海两地女生的平均体能测试成绩,哪个地区的更强些?
4.学习成绩和体能测试成绩,两者的相关性是多少?

提示:
参考数据结构:

Student{
int id;
string name;
vector<float> data;
}

可能用到的公式:

均值公式
在这里插入图片描述
协方差公式
在这里插入图片描述
z-score规范化
在这里插入图片描述
相关性
在这里插入图片描述
思路: 用C++简单实现读入,然后计算一下就行了
相关公式:
mean(A):数组A的平均值,std(A):标准差(协方差开方)

//(暂时未完成,有空补充)
暂存代码:

/*
                        ------- From IsOreo

2XSXXSSSSS220  7        rZZW@BSXXrr;:..,i7XSSS22a2a2SSZ8Zr    ,   X02MS:i:::::X,
r;rX7X7X7XXZr  MM2         iZBXr;;;rirS2XXXS22SSXSXSaa;    .SMM.   22Zi...   .i
77SXXXSXSXS8  2MMMMMa   .,.         .,;XaX7rS2880Z0Zr   :ZMMMMMZ   .Bari;i:,::7,
8Za2S2SSXSa2  @MMMMMMMBi:.                      ,2;   XMMMMM@MM@    Xai7ri,:::7i
8ZZZZZZ2SS8r .MM@@MMM0,                             SMMMM@@@@@MM    ,S;Xr,,,,:7:
8ZZZZZZZ228: XMM@MMMi                              MMMMM@@@@W@MM.    BM@7...,i7:
0Z8ZZZZ2SS0  8MMMMM                        ,.       i8MMMMM@@@MMi    2MW7.:X22ZX
ZZZZa2SSSaZ  @MMMM,                        ,.          SMMMM@MMM7    rM0XX2Z222S
ZaZZa2aaaaZ  MMMX:                         ,.            rMMMMMMX    .M8Z22222aS
0808ZZZ8ZZ8  MS                           .i               ;@MMMX     0ZS222222S
@WWZZ88ZZa0::   :                         :                  rMM2     Za2S2S222X
WB0ZZ0ZZZZWX    i                       ,:   .                 87     ZZS2S2S22S
02aaZZ880Bi     ;                 ....::.                             ZBaS2S222S
Z2aZZ8Z0B:   ,  i.           ..i:ii:..                                 SW8aaS222
0ZZaa2ZB:  .r;Z. :          ,:.ii                                       SMB82Sa2
B8ZZSaB;  :X  ;M:r;            i.           ,:.:                         8@ZaZaa
Z2ZaZ@Z  :MX  BM; 2i,         :,   ..:,:XSi,...                           02ZZa2
Z228@M   0MMBMMMi , ii,:...,:i:i,rr,.7MMMM0aX, ,:                         70Za2S
aX0@MX  X@@W@@WBi i   ,,i:,,.   X;    X@BBWZZ0X .:                         0aS2S
88WMM  :aWWWWWZ0. :           , M8    0W80BBS2B7 ,,                        2Z222
B0WM0  :ZZZZZa82  i          : XMM@Z0M@000B022Z0. ;                        ;822S
i7Z@X  :r2aZ2XZ: i.          ; 2WWW@WW0B0BB8Sa2B: ;.                       ,ZSSS
X.r8;  :7X7XX7, ::           ; 70BWBWBBBWB822riZ, ;                        ,WZaX
WMZ.,   i7rri  i,            :. 8aZBBB00ZZSa7iiX  :                        ,MMW0
X8r :    ,,. .,               ; i8a7S2a222S;i;X  :.                        :MM@0
i;i :      . ,,               .; .2ri;;r;;ir7r  :,                         XMMWZ
Xra ,        .i                 i. .ii;;;;;:   :.                          2MW@B
7r2Sr                            ,:,.       .:,                            00BB0
27SSB:                              ,,:::::,.                   ;,        XB088Z
X7XX2a                                                           ;i       0ZZ888
7i7r7ai                                                           ;:     XaXXXXr
S7XS7SZ                                                            7    r02aS22X
ZX0aSX2X                                                           r   :Ba2S2SaX
X7XS22r2r                                              .:         i:  :ZXXrX77X7
7ir;;;;rar                                             :.       :i,  ia77XS208B2
7r7X7XXXXZX                                            i     .rr.   ;ZX72Za2a80B
XrXXXXXXXXZai                                          ;,     ii  .7S77r7rr;r;ri
XrXXXX7XXXX2ZS.                                         ii.. .:  rSXrr;;;rrrrXX7
XrX7XXXXSSSSSaZ7,                                         ... ,:XXX7X7XXX7S2ZZa2
X7XSXXXX7r;r;7XXSX:                                         ,;7i.,,....:rXr77i:,
rirr;i;:i:;;rrXX7S2X7i, .                               ,,7XSXr;;;;;;;r;ri,
;:;7X2S2SSX7ii,:ir7X2S7X;i,. . . . .               ..:i7rii;irXXSXr;;rrr;r7X7X7;
aXaa2Xrii:ii;7X0M87,. ,:;rXrr;;:,....       ..,,:i;;7;i,.       ,iX7r;, ..,:iiri
7;r7;ii7SZZ0BW@Z:  ..,,,...,:i;Xrr;;i: .;r. .,:ii:,,   . ...       ;27ii:,.,,:ii
X;7;;;2Z08ZZ0BX      .,,:,,..         ;WMMMZ7:.                  ,r2a2aSSr;;77X;
SXXSXa0B88ZZaB,                  :7Z@MMMMMMMMMMM0aSX7Xrrrrr7XS22Z8ZS77r777XSXSS:
r.;i;ii;rrXXX2Z7:..      ..:r7a80BB08SX;rrri;;rr7XSXX2aX777rrrr;i,:,:,:,,..  .:
*/

#pragma GCC optimize(3)
#pragma comment(linker,"/STACK:1024000000,1024000000")
#include <bits/stdc++.h>

#define ull unsigned long long
#define ll long long
#define inf 2100000000
#define endl '\n'
#define pii pair<int,int>
#define pll pair<long long,long long>
#define MP make_pair
#define eps 1e-6

const double pi=3.14159265358;
const int maxn=3e5+10;
const int mod=1e4+7;

using namespace std;

struct student {
    int id;
    string name;
    string sex;
    string hometown;
    double height;
    string stamina; //体侧成绩
    vector<double>data; // 课程1-10的成绩
}database[maxn],datatxt[maxn],dataall[maxn];
int databasecnt=0,datatxtcnt=0;
int allcnt=0;

//读取数据库
void readdatabase(string path) {
    ifstream infile;
    path+=".data;"
    infile.open(path);
    assert(infile.is_open());
    string s;
    string tmp;
    getline(infile,s);
    int len=s.length();
    int cnt=0;
    for(int i=0;i<len;i++) {
        if(s[i]==' ') {
            tmp="";
            if(cnt==0) {
                database[cnt].id=cnt+1;
            }
            else if(cnt==1) {
                database[cnt].name=tmp;
            }
            else if(cnt==2) {
                database[cnt].sex=tmp;
            }
            else if(cnt==3) {
                database[cnt].hometown=tmp;
            }
            else if(cnt==4) {
                database[cnt].height=stringturn(tmp);
            }
            else if(cnt>=5&&cnt<=16) {
                database[cnt].data.push_back(stringturn(tmp));
            }
        }
        else if(i==len-1) {
            tmp+=s[i];
            database[cnt++].stamina=tmp;
            break;
        }
        else {
            tmp+=s[i];
        }
    }
    databasecnt=cnt;
    infile.close();
}

int pw(int x) {
    int ans=1,t=10;
    while(x) {
        if(x&1) ans*=t;
        t*=t;
        x>>=1;
    }
    return ans;
}

//string转int
int stringturn(string s) {
    int ans=0;
    for(int i=s.length();i>=0;i--) {
        ans+=(s[i]-'0')*pw(s.length()-i-1);
    }
    return ans;
}

//读取txt
void readtxt(string path) {
    ifstream infile;
    path+=".data";
    infile.open(path);
    assert(infile.is_open());
    string s;
    string tmp;
    getline(infile,s);
    int len=s.length();
    int cnt=0;
    for(int i=0;i<len;i++) {
        if(s[i]==',') {
            tmp="";
            if(cnt==0) {
                datatxt[cnt].id=cnt+1;
            }
            else if(cnt==1) {
                datatxt[cnt].name=tmp;
            }
            else if(cnt==2) {
                datatxt[cnt].sex=tmp;
            }
            else if(cnt==3) {
                datatxt[cnt].hometown=tmp;
            }
            else if(cnt==4) {
                datatxt[cnt].height=stringturn(tmp);
            }
            else if(cnt>=5&&cnt<=16) {
                datatxt[cnt].data.push_back(stringturn(tmp));
            }
        }
        else if(i==len-1) {
            tmp+=s[i];
            datatxt[cnt++].stamina=tmp;
            break;
        }
        else {
            tmp+=s[i];
        }
    }
    datatxtcnt=cnt;
    infile.close();
    return;
}

//合成数据库与txt
void compose() {
    allcnt=0;
    for(int i=0;i<databasecnt;i++) {
        dataall[allcnt++]=database[i];
    }
    for(int i=0;i<datatxtcnt;i++) {
        dataall[allcnt++]=datatxt[i];
    }
}

//输出家乡在北京的学生所有课程平均成绩
void Print1() {
    vector<double>coursesum;
    double numofbeijing=0;
    for(int i=0;i<10;i++) {
        coursesum.push_back(0);
    }
    for(int i=0;i<allcnt;i++) {
        if(dataall[i].hometown=="Beijing") {
            numofbeijing++;
            for(int j=0;j<10;j++) {
                coursesum[i]+=dataall[i].data[j];
            }
        }
    }
    cout<<"The students's average grades(10 courses) who live in Beijing : "<<endl;
    for(int i=0;i<coursesum.size();i++) {
        cout<<coursesum[i]/numofbeijing<<" ";
    }
    cout<<endl;
}

//输出家乡在广州,课程1在80分以上,且课程10在9分以上的男同学数量
void Print2() {
    int ans=0;
    for(int i=0;i<allcnt;i++) {
        if(dataall[i].hometown=="Guangzhou"&&dataall[i].data[0]>=80&&dataall[i].data[9]>=9) {
            ans++;
        }
    }
    cout<<"The numbers of male students who live in Guangzhou and course1's grades greater than 80 and course10's grades greater than 9 is : ";
    cout<<ans<<endl;
}

int turn(string s) {
    if(s=="bad") return 60;
    if(s=="normal") return 70;
    if(s=="great") return 80;
    if(s=="excellent") return 90;
    return 0;
}

//比较广州与上海两地女生的平均体能成绩,这里假设"bad"=60,"normal"=70,"great"=80,"excellent"=90;
//如果广州强返回0,如果上海强返回1
bool cmp1() {
    double GZgrades=0,SHgrades=0;
    double gznum=0,shnum=0;
    for(int i=0;i<allcnt;i++) {
        if(dataall[i].hometown=="Guangzhou"&&dataall[i].sex=="female") {
            gznum++;
            GZgrades+=turn(dataall[i].stamina);
        }
        if(dataall[i].hometown=="Shanghai"&&dataall[i].sex=="female") {
            shnum++;
            SHgrades+=turn(dataall[i].stamina);
        }
    }
    return SHgrades>GZgrades;
}

void Print3() {
    if(cmp1()) {
        cout<<"Shanghai's female student's grades of physical fitness test is greater than Guangzhou";
    }
    else {
        cout<<"Guangzhou's female student's grades of physical fitness test is greater than Shanghai";
    }
    cout<<endl;
}

//求学习成绩和体测成绩的相关性



int main() {
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    string txtpath,databasepath;
    cout<<"输入txt路径:";
    cin>>path;
    cout<<"输入数据库路径:";
    cin>>databasepath;
    readdatabase(databasepath);
    readtxt(path);
    compose();
    Print1();
    Print2();
    Print3();
    return 0;
}


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值