我是靠谱客的博主 满意黑裤,这篇文章主要介绍C++之学生考勤系统,现在分享给大家,希望可以做个参考。

  1. 问题描述
    学生信息包括:学号、姓名、性别、年龄、班级等信息
    考勤信息包括:缺课日期、第几节课、课程名称、学生姓名、缺课类型(迟
    到、早退、请假和旷课)。
  2. 功能要求
    基本功能
    (1)添加功能:程序能够添加学生的记录和缺课记录,课提供选择界面供
    用户选择所要添加的类别,添加学生记录时,要求学号要唯一,如果添加了重复
    学号的记录时,则提示数据添加重复并取消添加。
    (2)显示功能:可显示当前系统中所有学生的记录和缺课,每条记录占据
    一行。
    (3)统计功能:能根据学号进行统计,能统计本次输入记录中的信息,也能够统计已存在的文件中的信息
    (4)保存功能:可将当前系统中各类记录存入文件中,存入方式.txt文件。
    (5)退出系统。
    复制代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    540
    541
    542
    543
    544
    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    556
    557
    558
    559
    560
    561
    #include<iostream> #include<cstring> #include<string> #include<ctime> #include<fstream> #include<istream> #include<ostream> #include<stdio.h> #include<stdlib.h> #define MAX 1000//该系统的容量 可更改 #pragma warning(disable:4996); using namespace std; struct student { char S_ID[24]; char S_name[24]; char S_sex[24]; char S_age[24]; char S_class[24]; }; struct Queke { char Q_data[24]; char Q_diclass[24]; char Q_project[24]; char Q_sort[24]; }; struct Kaoqin { Queke que[MAX]; student stu[MAX]; int K_size = 0; }; //定义一个三维数组 这里本来只需要使用一个结构体就可以 但是本人局限于不知道怎么使用结构体数组做函数实参 故此增加了下面一个结构体 struct shuzu { char AA1[9][24]; }; struct Shuzu { shuzu AA[MAX]; }; int M;//存储在统计时文件的行数 void menu(); void addstudent(struct Kaoqin* K); void AddStu(struct Kaoqin* K, char ID[24]); void showkaoqin(struct Kaoqin* K); int LookID(struct Kaoqin* K, char ID[24]); void Addque(struct Kaoqin* K, int i); void preserve(struct Kaoqin* K); void readfile(char* filename, struct Shuzu *A1); void tongji(struct Kaoqin* K, char ID[24]); int Readfile(char *filename); char filename[1000]; int main() { Kaoqin K1; int Number; K1.K_size = 0; C2: menu(); cout << "请输入您想要的功能代号:"; cin >> Number; switch (Number) { case 1: { C1: addstudent(&K1); string t; cout << "是否继续添加学生:1 :是; 任意键:否" << endl; cout << "请输入您的选择:"; cin >> t; if (t == "1") { goto C1;//该循环用于重复添加多个学生的记录 } break; } case 2: { string H_K; showkaoqin(&K1); cout << "输入 1 保留显示,输入任意键退出该显示界面:"; cin >> H_K; if (H_K == "1") { break; } else { system("cls"); break; } } case 3: { char ID[24]; cout << "请输入您想要统计学生缺课信息的学号:"; cin >> ID; tongji(&K1,ID); break; } case 4: { preserve(&K1); break; } case 5: system("cls"); system("pause"); break; } //system("cls"); cout << "是否需要执行其他操作:1 是;其他任意键 否" << endl; string R; cin >> R; if (R == "1") { system("cls");//请屏的指令 类比于MATLAB 中的cls goto C2;//这个循环是用于循环操作 } else { system("cls"); system("pause"); } return 0; } //菜单函数 即界面显示的函数 void menu() { cout << "******************************************" << endl; cout << "** 功能代号t" << "具体功能t**" << endl; cout << "** **" << endl; cout << "**t " << 1 << "tt" << "添加功能t**" << endl; cout << "**t " << 2 << "tt" << "显示功能t**" << endl; cout << "**t " << 3 << "tt" << "统计功能t**" << endl; cout << "**t " << 4 << "tt" << "保存功能t**" << endl; cout << "**t " << 5 << "tt" << "退出 t**" << endl; cout << "******************************************" << endl << endl; } //总的添加函数 可以选择添加学生基础信息还是已有的学生的考勤信息或者未存在的学生的基础信息加上考勤信息 void addstudent(struct Kaoqin* K) { int i; cout << "******************************************" << endl; cout << "** 功能代号t" << "具体功能t**" << endl; cout << "** **" << endl; cout << "**t " << 1 << "tt" << "添加学生记录t**" << endl; cout << "**t " << 2 << "tt" << "添加缺课记录t**" << endl; cout << "******************************************" << endl << endl; cout << "请输入您想要添加的类别:"; cin >> i; switch (i) { case 1: { int l; char ID[24]; cout << "请输入您所要添加的学生的学号:"; cin >> ID; if (K->K_size == 0) { AddStu(K, ID); } else { l = LookID(K, ID); if (l != 10000) { cout << "该学号信息已经存在,请勿重复添加该学生的基础信息!!!!!" << endl; cout << "请按下任意键实现取消添加!!" << endl; } else { AddStu(K, ID); } } break; } case 2: { int l; char ID[24]; cout << "请输入您想添加缺课记录的学生的学号:"; cin >> ID; //判断结构体是否为空 若为空就不存在寻找是否会出现去寻找是否重复出现学生记录的操作 if (K->K_size == 0) { AddStu(K, ID); Addque(K, K->K_size); } else { l = LookID(K, ID);//判断是否学号是否已经存在 若存在就直接跳输入基础信息,只输入考勤信息;否则就需要先输入基本信息 再输入考勤信息 if (l == 10000) { AddStu(K, ID); Addque(K, K->K_size - 1);//这里减 1 的原因是 在每一次添加学生的基础信息后就自动给 K->K_size 加了1,以达到假扩容的目的, } //以便于在此添加学生信息有空间,然而在这里我们输入的考勤信息是本次添加的学生的,若不减去 1 就会把这个 else //考勤信息给到下一个学生 { Addque(K, l); } } break; } } } //添加学生基础信息的函数 即添加学生结构体中的信息 void AddStu(struct Kaoqin* K, char ID[24]) { int t; if (K->K_size != 0) { t = LookID(K, ID); if (t == 10000) { strcpy(K->stu[K->K_size].S_ID, ID); cout << "请输入您所要新添加的学生的姓名:"; cin >> K->stu[K->K_size].S_name; cout << "请输入您所要新添加的学生的性别:"; cin >> K->stu[K->K_size].S_sex; cout << "请输入您所要新添加的学生的年龄:"; cin >> K->stu[K->K_size].S_age; cout << "请输入您所要新添加的学生的班级信息:"; cin >> K->stu[K->K_size].S_class; K->K_size = K->K_size + 1; } else { cout << "该学号信息已经存在,请勿重复添加该学生的基础信息!!!!!" << endl; cout << "是否想要添加该学号学生的缺课信息:1 是 任意键 否"; string i; cin >> i; if (i == "1") { Addque(K, t); } else { cout << "请按下任意键实现取消添加!!" << endl; system("pause"); } } } else { strcpy(K->stu[K->K_size].S_ID, ID); cout << "请输入您所要新添加的学生的姓名:"; cin >> K->stu[K->K_size].S_name; cout << "请输入您所要新添加的学生的性别:"; cin >> K->stu[K->K_size].S_sex; cout << "请输入您所要新添加的学生的年龄:"; cin >> K->stu[K->K_size].S_age; cout << "请输入您所要新添加的学生的班级信息:"; cin >> K->stu[K->K_size].S_class; K->K_size = K->K_size + 1; } } //添加缺课记录函数 void Addque(struct Kaoqin* K, int i) { cout << "请输入您所要新添加的学号的同学所缺课的日期:"; cin >> K->que[i].Q_data; cout << "请输入您所要新添加的学号的同学所缺的课是第几节课:"; cin >> K->que[i].Q_diclass; cout << "请输入您所要新添加的学号的同学所缺课的课程名称:"; cin >> K->que[i].Q_project; cout << "请输入您所要新添加的学号的同学缺课的类型:(迟到、早退、请假、旷课 ) "; cin >> K->que[i].Q_sort; } //显示函数 void showkaoqin(struct Kaoqin* K) { int i; cout << "t学号t姓名t性别t年龄t班级t缺课日期t第几节课t课程名称t缺课类型t" << endl; for (i = 0; i < K->K_size; i++) { cout << "t" << K->stu[i].S_ID << "t" << K->stu[i].S_name << "t" << K->stu[i].S_sex << "t" << K->stu[i].S_age << "t" << K->stu[i].S_class << "t" << K->que[i].Q_data << "t" << K->que[i].Q_diclass << "t" << K->que[i].Q_project << "t" << K->que[i].Q_sort << "t" << endl; } } //查找函数 int LookID(struct Kaoqin* K, char ID[24]) { int i; int t = 10000; for (i = 0; i <= K->K_size; i++) { if (K->stu[i].S_ID == ID) { t = i; break; } } return t; } //保存函数 保存到kaoqin 文件 void preserve(struct Kaoqin* K) { int i; for (i = 0; i < K->K_size; i++) { if (K->que[i].Q_data == "") { strcpy(K->que[i].Q_data, "无"); strcpy(K->que[i].Q_diclass, "无"); strcpy(K->que[i].Q_project, "无"); strcpy(K->que[i].Q_sort, "无"); } } ofstream ofs; string number; cout << "请输入您想要保存的文件名(请以 .txt 结尾) " << endl; cin >> filename; ofs.open(filename, ios::out | ios::in | ios::app); cout << "您输入的文件名是否在此之前您是否用过: 0 不是 其余键 是" << endl; cin >> number; //判断文件是否使用过,如果没有使用过就输出表头,没有就不输出,避免重复输出表头 if (number == "0") { ofs << "学号t姓名t性别t年龄t班级t缺课日期t第几节课t课程名称t缺课类型t" << endl; } for (i = 0; i < K->K_size; i++) { ofs << K->stu[i].S_ID << "t" << K->stu[i].S_name << "t" << K->stu[i].S_sex << "t" << K->stu[i].S_age << "t" << K->stu[i].S_class << "t" << K->que[i].Q_data << "t" << K->que[i].Q_diclass << "t" << K->que[i].Q_project << "t" << K->que[i].Q_sort << "t" << endl; } ofs.close(); } //统计函数 只能根据学号进行统计 因为学号是唯一可以独立代表学生的信息 void tongji(struct Kaoqin* K, char ID[24]) { int i; int tong[MAX][4]; int chidao = 0; int zaotui = 0; int qingjia = 0; int kuangke = 0; int m[MAX]; ofstream ofs; string file; cout << "请输入您想将统计信息的保存的文件夹名称(请以 .txt 结尾)" << endl; cin >> file; cout << endl; ofs.open(file, ios::out | ios::in | ios::app); cout << "您输入的文件名是否在此之前您是否用过:0 不是 其余键 是" << endl; string number; cin >> number; //判断文件是否使用过,如果没有使用过就输出表头,没有就不输出,避免重复输出表头 if (number == "0") { ofs << "学号 t姓名 t性别t年龄t班级 t缺课日期t第几节课t课程名称t迟到次数t早退次数t请假次数t旷课次数" << endl; } cout<<"1 从当前记录中去统计学生的考勤记录 2 从已有文件之中去统计学生的考勤记录 "<<endl; int Q; cin>>Q; cout<<endl<<endl; switch(Q) { case 1: { int k=0; int m[MAX]; //该循环用于查找学号重复的学生 并且存储他们在结构体中的序号 for (i = 0; i <K->K_size; i++) { if (K->stu[i].S_ID==ID) { m[k]=i;//存储序号 k = k + 1;//数组扩容 } } for (i = 0; i <K->K_size; i++) { if (K->que[m[i]].Q_sort == "迟到") { chidao = chidao + 1; tong[m[i]][0] = chidao; tong[m[i]][1] = tong[m[i-1]][1]; tong[m[i]][2] = tong[m[i-1]][2]; tong[m[i]][3] = tong[m[i-1]][3]; } else if (K->que[i].Q_sort == "早退") { zaotui = zaotui + 1; tong[m[i]][1] = zaotui; tong[m[i]][0] = tong[m[i-1]][0]; tong[m[i]][2] = tong[m[i-1]][2]; tong[m[i]][3] = tong[m[i-1]][3]; } else if (K->que[m[i]].Q_sort == "请假") { qingjia = qingjia + 1; tong[m[i]][2] = tong[m[i]][2]; tong[m[i]][0] = tong[m[i]][0]; tong[m[i]][1] = tong[m[i]][1]; tong[m[i]][3] = tong[m[i]][3]; } else if (K->que[i].Q_sort == "旷课") { kuangke = kuangke + 1; tong[m[i]][3] = kuangke; tong[m[i]][2] = tong[m[i]][2]; tong[m[i]][0] = tong[m[i]][0]; tong[m[i]][1] = tong[m[i]][1]; } else { tong[m[i]][3] = tong[m[i-1]][3]; tong[m[i]][2] = tong[m[i-1]][2]; tong[m[i]][0] = tong[m[i-1]][0]; tong[m[i]][1] = tong[m[i-1]][1]; } } ofs << K->stu[m[k-1]].S_ID << "t" << K->stu[m[k-1]].S_name << "t" << K->stu[m[k-1]].S_sex << "t" << K->stu[m[k-1]].S_age << "t" << K->stu[m[k-1]].S_class << "t" << K->que[m[k-1]].Q_data << "t" << K->que[m[k-1]].Q_diclass << "t" << K->que[m[k-1]].Q_project << "t" << tong[m[k-1]][0] << "t" << tong[m[k-1]][1] << "t" << tong[m[k-1]][2] << "t" << tong[m[k-1]][3] << endl; } case 2: { //读文件中的信息并且统计 char filename2[24]; cout << "请输入您想要统计的学生信息的来源文件夹(请以 .txt结尾)" << endl; cin >> filename2; cout << endl; Shuzu A1; readfile(filename2,&A1); int k=0; for (i = 1; i <M; i++) { if (strcmp(A1.AA[i].AA1[0],ID)==0) { m[k]=i; k = k + 1; } } char *Sort[24]; Sort[0]="迟到"; Sort[1]="早退"; Sort[2]="请假"; Sort[3]="旷课"; for (i = 0; i < k; i++) { if (strcmp(Sort[0],A1.AA[m[i]].AA1[8])==0) { chidao = chidao + 1; tong[m[i]][0] = chidao; tong[m[i]][1] = tong[m[i-1]][1]; tong[m[i]][2] = tong[m[i-1]][2]; tong[m[i]][3] = tong[m[i-1]][3]; } else if (strcmp(Sort[1],A1.AA[m[i]].AA1[8])==0) { zaotui = zaotui + 1; tong[m[i]][1] = zaotui; tong[m[i]][0] = tong[m[i-1]][0]; tong[m[i]][2] = tong[m[i-1]][2]; tong[m[i]][3] = tong[m[i-1]][3]; } else if (strcmp(Sort[2],A1.AA[m[i]].AA1[8])==0) { qingjia = qingjia + 1; tong[m[i]][2] = tong[m[i-1]][2]; tong[m[i]][0] = tong[m[i-1]][0]; tong[m[i]][1] = tong[m[i-1]][1]; tong[m[i]][3] = tong[m[i]][3]; } else if (strcmp(Sort[3],A1.AA[m[i]].AA1[8])==0) { kuangke = kuangke + 1; tong[m[i]][3] = kuangke; tong[m[i]][2] = tong[m[i-1]][2]; tong[m[i]][0] = tong[m[i-1]][0]; tong[m[i]][1] = tong[m[i-1]][1]; } else { tong[m[i]][3] = tong[m[i-1]][3]; tong[m[i]][2] = tong[m[i-1]][2]; tong[m[i]][0] = tong[m[i-1]][0]; tong[m[i]][1] = tong[m[i-1]][1]; } } //只输出最终结果 ofs << A1.AA[m[k-1]].AA1[0] << "t" <<A1.AA[m[k-1]].AA1[1] << "t" << A1.AA[m[k-1]].AA1[2] << "t" << A1.AA[m[k-1]].AA1[3]<< "t" << A1.AA[m[k-1]].AA1[4] << "t" <<A1.AA[m[k-1]].AA1[5]<< "t" << A1.AA[m[k-1]].AA1[6] << "t" <<A1.AA[m[k-1]].AA1[7]<< "t" << tong[m[k-1]][0] << "t" << tong[m[k-1]][1] << "t" << tong[m[k-1]][2] << "t" << tong[m[k-1]][3] << endl; } ofs.close(); } } //读入存储考勤信息的文件内的信息 void readfile(char* filename, struct Shuzu *A1) { ifstream filename1(filename, ios::in); if (!filename1) { cout << "文件打开出错!!!" << endl; exit(1); } M=Readfile(filename); for (int i = 0; i <M; i++) { for (int j = 0; j < 9; j++) { filename1 >>A1->AA[i].AA1[j]; } } filename1.close(); } //计算文件的行数(每一行数据个数一定) int Readfile(char *filename) { char *buf=(char*)malloc(24); ifstream filename1(filename, ios::in); if (!filename1) { cout << "文件打开出错!!!" << endl; exit(1); } FILE *fp; fp=fopen(filename,"rb"); if(fp==NULL) { cout<<"文件打开失败"<<endl; } int N=0; float K; while(!feof(fp)) { fscanf(fp,"%s",buf+(N++)); } fclose(fp); K=N/9;//该语句表示文件的总的行数为K行 总的数据个数为N个(带了表头),每一行的数据个数为9个 filename1.close(); return K; }

最后

以上就是满意黑裤最近收集整理的关于C++之学生考勤系统的全部内容,更多相关C++之学生考勤系统内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部