本文实例为大家分享了MFC实现学生选课系统的具体代码,供大家参考,具体内容如下
先上效果图:
主要功能:
输入学号,从数据库中查找学号,若找到相匹配的学号,则显示数据库中姓名、学历、导师,同时将所有可选课程显示出来。输入课程类型和课程名称查询课程进行选课,选课之后相应的选课门数、学分、学费、已选门数都会进行刷新。换个学号输入,选课总人数就会刷新,还有一些小功能就在代码里解释了。
我就只把按键的代码贴出来,完整工程下面有链接。
“确认输入”按键:
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
|
void Cversion02Dlg::OnBnClickedButton1() { UpdateData( true ); printmenshu=0; //将显示的选课门数、已选学分、学费清零 yixuanxf=0; xuefei=0; yixuanms=0; //printmenshu是用来显示在MFC上,程序里处理的是yixuanms,最后将yxuanms赋给printmenshu,其实可以不用yixuanms,将yixuanms全部替换为printmenshu也可以 if (yixuan.GetItemCount()!=0){ //如果yixuan列表不为空,则选课总人数加1。 xuankezrs++; } while ( yixuan.DeleteItem (0)); //yixuan列表清空 int i=0,j=0; for (i=0;i<30;i++){ if (ugs[i].chaxunxuehao(xuehao)){ CString edit1,edit2,edit3; edit1=ugs[i].printname(); edit2=ugs[i].printban(); edit3=ugs[i].printxue(); SetDlgItemText(IDC_EDIT2,edit1); //这里也可以直接在控件上添加变量,直接赋给它。就像printxueli=edit3 SetDlgItemText(IDC_EDIT3,edit2); //SetDlgItemText(IDC_EDIT3,edit3); printxueli=edit3; break ; } } for (j=0;j<15;j++){ if (gs[j].chaxunxuehao(xuehao)){ CString edit1,edit2,edit3; edit1=gs[j].printname(); edit2=gs[j].printdao(); edit3=gs[j].printxue(); SetDlgItemText(IDC_EDIT2,edit1); SetDlgItemText(IDC_EDIT3,edit2); //SetDlgItemText(IDC_EDIT3,edit3); printxueli=edit3; break ; } } if (i==30&&j==15){ INT_PTR nRes; nRes=MessageBox(_T( "请输入正确的学号" ),_T( "错误" ),MB_OK|MB_ICONERROR); return ; //这里不写return会直接运行下面的程序 } else { yixuannum[k]=xuehao; //将找到的学号存在数组里,用来判断后面输入的学号是否前面输入过 k++; } if (k>1){ //这里的k是从1开始的,即当k=1时,只输入了第一个学号,不用判断是否已经选过课 for ( int q=0;q<k-1;q++){ //这里注意q<k-1,当k=2时表示此时的学号是第二次输入的,需判断与第一次输入的学号是否相同,第一次的学号存在yixuannum[0]里 if (xuehao==yixuannum[q]){ MessageBox(_T( "该学生已经选过课了" ),_T( "错误" ),MB_OK|MB_ICONERROR); break ; //这里如果写成return,不知道为什么选课总人数不会刷新了 } } } while ( kexuan.DeleteItem (0)); for ( int p=0;p<12;p++){ CString klx,kmc,kxh,kxf,krs; klx=c[p].klx(); kmc=c[p].kmc(); krs.Format(_T( "%d" ),yixuankrs[p]); kxh.Format(_T( "%d" ),c[p].kxh()); kxf.Format(_T( "%d" ),c[p].kxf()); kexuan.InsertItem(p,kxh); kexuan.SetItemText(p,1,klx); kexuan.SetItemText(p,2,kmc); kexuan.SetItemText(p,3,kxf); kexuan.SetItemText(p,4,krs); } UpdateData( false ); } |
“查询”按键:
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
|
void Cversion02Dlg::OnBnClickedButton2() { // TODO: 在此添加控件通知处理程序代码 UpdateData( true ); while ( kexuan.DeleteItem (0)); //首先将kexuan清空,否则后面产生的列表都会加在原来的列表后面。这里只需循环清掉第一行就可以,因为清掉一行下面一行会自动上来 if (inputkmc.IsEmpty()){ //判断输入课程名称是否为空 int q=0,k=0; for (q=0;q<12;q++){ if (inputklx==c[q].klx()){ CString kmc,kxh,kxf,krs; //下面SetItemText中参数是CString类型,必须将各个参数转为CString kmc=c[q].kmc(); krs.Format(_T( "%d" ),yixuankrs[q]); //正常应该写成krs.Format("%d",yixuankrs[q]);但是会报错,前面加上_T就可以了 kxh.Format(_T( "%d" ),c[q].kxh()); kxf.Format(_T( "%d" ),c[q].kxf()); kexuan.InsertItem(k,kxh); kexuan.SetItemText(k,1,inputklx); kexuan.SetItemText(k,2,kmc); kexuan.SetItemText(k,3,kxf); kexuan.SetItemText(k,4,krs); k++; } } if (k==0){ MessageBox(_T( "请输入正确的课程类型" ),_T( "错误" ),MB_OK|MB_ICONERROR); for ( int p=0;p<12;p++){ //前面已经将列表清空,这里提示错误信息之后,将所有课程显示出来 CString klx,kmc,kxh,kxf,krs; klx=c[p].klx(); kmc=c[p].kmc(); krs.Format(_T( "%d" ),yixuankrs[p]); kxh.Format(_T( "%d" ),c[p].kxh()); kxf.Format(_T( "%d" ),c[p].kxf()); kexuan.InsertItem(p,kxh); kexuan.SetItemText(p,1,klx); kexuan.SetItemText(p,2,kmc); kexuan.SetItemText(p,3,kxf); kexuan.SetItemText(p,4,krs); } } } else if (inputklx.IsEmpty()){ //判断输入课程类型是否为空 int l=0; for (l=0;l<12;l++){ if (inputkmc==c[l].kmc()){ CString klx,kxh,kxf,krs; klx=c[l].klx(); krs.Format(_T( "%d" ),yixuankrs[l]); kxh.Format(_T( "%d" ),c[l].kxh()); kxf.Format(_T( "%d" ),c[l].kxf()); kexuan.InsertItem(0,kxh); kexuan.SetItemText(0,1,klx); kexuan.SetItemText(0,2,inputkmc); kexuan.SetItemText(0,3,kxf); kexuan.SetItemText(0,4,krs); break ; } } if (l==12){ MessageBox(_T( "请输入正确的课程名称" ),_T( "错误" ),MB_OK|MB_ICONERROR); for ( int p=0;p<12;p++){ CString klx,kmc,kxh,kxf,krs; klx=c[p].klx(); kmc=c[p].kmc(); krs.Format(_T( "%d" ),yixuankrs[p]); kxh.Format(_T( "%d" ),c[p].kxh()); kxf.Format(_T( "%d" ),c[p].kxf()); kexuan.InsertItem(p,kxh); kexuan.SetItemText(p,1,klx); kexuan.SetItemText(p,2,kmc); kexuan.SetItemText(p,3,kxf); kexuan.SetItemText(p,4,krs); } } } else { int m=0; for (m=0;m<12;m++){ if (inputkmc==c[m].kmc()&&inputklx==c[m].klx()){ //如果输入课程类型和课程名称都不为空,判断课程类型和课程名称是否匹配 CString kxh,kxf,krs; krs.Format(_T( "%d" ),yixuankrs[m]); kxh.Format(_T( "%d" ),c[m].kxh()); kxf.Format(_T( "%d" ),c[m].kxf()); kexuan.InsertItem(0,kxh); kexuan.SetItemText(0,1,inputklx); kexuan.SetItemText(0,2,inputkmc); kexuan.SetItemText(0,3,kxf); kexuan.SetItemText(0,4,krs); break ; } } if (m==12){ MessageBox(_T( "请输入正确的课程类型和课程名称" ),_T( "错误" ),MB_OK|MB_ICONERROR); for ( int p=0;p<12;p++){ CString klx,kmc,kxh,kxf,krs; klx=c[p].klx(); kmc=c[p].kmc(); krs.Format(_T( "%d" ),yixuankrs[p]); kxh.Format(_T( "%d" ),c[p].kxh()); kxf.Format(_T( "%d" ),c[p].kxf()); kexuan.InsertItem(p,kxh); kexuan.SetItemText(p,1,klx); kexuan.SetItemText(p,2,kmc); kexuan.SetItemText(p,3,kxf); kexuan.SetItemText(p,4,krs); } } } UpdateData( false ); } |
“选课”按键:
这里有一个关键的地方,就是假如用户选了两门相同的课,采用的是先添加后删掉的方法
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
|
void Cversion02Dlg::OnBnClickedButton3() { // TODO: 在此添加控件通知处理程序代码 UpdateData( true ); if (printxueli!= "本科生" &&printxueli!= "研究生" ){ //防止没输学号直接点选课导致程序错误 MessageBox(_T( "请选输入学号" ),_T( "错误" ),MB_OK|MB_ICONERROR); return ; } if (yixuanms<5){ //yixuanms是从0开始的 CString krs; yixuankrs[chosexh-1]++; //这里不能用chosehanghao,要用chosexh-1。因为如果不经过查询,chosehanghao=chosexh-1,但是如果查询成功之后,这里chosehanghao不一定等于chosexh-1 krs.Format(_T( "%d" ),yixuankrs[chosexh-1]); kexuan.SetItemText(chosehanghao,4,krs); int n=0; for (n=0;n<12;n++){ //在这个循环里即使选择的是同一门课也会添加进yixuan,若是想在这里不添加同一门课,不易做到 if (chosexh==c[n].kxh()){ CString klx,kmc,kxf,kxh; klx=c[n].klx(); kmc=c[n].kmc(); kxf.Format(_T( "%d" ),c[n].kxf()); kxh.Format(_T( "%d" ),chosexh); yixuan.InsertItem(yixuanms,kxh); yixuan.SetItemText(yixuanms,1,klx); yixuan.SetItemText(yixuanms,2,kmc); yixuan.SetItemText(yixuanms,3,kxf); yixuanxf=yixuanxf+c[n].kxf(); if (printxueli== "本科生" &&n>=0&&n<=3){ xuefei=xuefei+200*c[n].kxf(); } else if (printxueli== "本科生" &&n>=4&&n<=7){ xuefei=xuefei+150*c[n].kxf(); } else if (printxueli== "本科生" &&n>=8&&n<=11){ xuefei=xuefei+100*c[n].kxf(); } else if (printxueli== "研究生" &&n>=0&&n<=3){ xuefei=xuefei+200*c[n].kxf(); } else if (printxueli== "研究生" &&n>=4&&n<=7){ xuefei=xuefei+180*c[n].kxf(); } else if (printxueli== "研究生" &&n>=8&&n<=11){ xuefei=xuefei+150*c[n].kxf(); } yixuanms++; break ; } } } else { MessageBox(_T( "最多选择5门课" ),_T( "错误" ),MB_OK|MB_ICONERROR); } for ( int i=0;i<=yixuanms;i++){ //在这里判断选择的是否是同一门课,若是同一门课则将其删掉。相应的学分、选课人数和学费也要减掉 for ( int j=i+1;j<=yixuanms;j++){ if (yixuan.GetItemText(i,0)==yixuan.GetItemText(j,0)){ CString str,str1,krs; int strnum=0,strnum1=0; str=yixuan.GetItemText(i,3); strnum=_ttoi(str); yixuanxf=yixuanxf-strnum; str1=yixuan.GetItemText(i,0); strnum1=_ttoi(str1)-1; yixuankrs[chosexh-1]--; krs.Format(_T( "%d" ),yixuankrs[chosexh-1]); kexuan.SetItemText(chosehanghao,4,krs); if (printxueli== "本科生" &&strnum1>=0&&strnum1<=3){ xuefei=xuefei-200*c[strnum1].kxf(); } else if (printxueli== "本科生" &&strnum1>=4&&strnum1<=7){ xuefei=xuefei-150*c[strnum1].kxf(); } else if (printxueli== "本科生" &&strnum1>=8&&strnum1<=11){ xuefei=xuefei-100*c[strnum1].kxf(); } else if (printxueli== "研究生" &&strnum1>=0&&strnum1<=3){ xuefei=xuefei-200*c[strnum1].kxf(); } else if (printxueli== "研究生" &&strnum1>=4&&strnum1<=7){ xuefei=xuefei-180*c[strnum1].kxf(); } else if (printxueli== "研究生" &&strnum1>=8&&strnum1<=11){ xuefei=xuefei-150*c[strnum1].kxf(); } yixuan.DeleteItem(j); MessageBox(_T( "已经选过该门课" ),_T( "错误" ),MB_OK|MB_ICONERROR); yixuanms--; break ; } } } printmenshu=yixuanms; while ( kexuan.DeleteItem (0)); for ( int p=0;p<12;p++){ CString klx,kmc,kxh,kxf,krs; klx=c[p].klx(); kmc=c[p].kmc(); krs.Format(_T( "%d" ),yixuankrs[p]); kxh.Format(_T( "%d" ),c[p].kxh()); kxf.Format(_T( "%d" ),c[p].kxf()); kexuan.InsertItem(p,kxh); kexuan.SetItemText(p,1,klx); kexuan.SetItemText(p,2,kmc); kexuan.SetItemText(p,3,kxf); kexuan.SetItemText(p,4,krs); } UpdateData( false ); } |
“退课”按键:
这里要弄清楚列表项里的行号和序号
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
|
void Cversion02Dlg::OnBnClickedButton4() { // TODO: 在此添加控件通知处理程序代码 UpdateData( true ); if (yixuanms>0){ yixuanms--; //点击退课之后,选课门数-1 CString str,str1,krs; int tuixf=0,tuixh=0; str=yixuan.GetItemText(tuihanghao,3); tuixf=_ttoi(str); //CString转为int yixuanxf=yixuanxf-tuixf; //已选学分减掉相应的学分 str1=yixuan.GetItemText(tuihanghao,0); tuixh=_ttoi(str1)-1; //这里要注意课程序号是从1开始的,而对象数组和每门课已选人数数组是从0开始的 yixuankrs[tuixh]--; //每门课已选人数-1 if (printxueli== "本科生" &&tuixh>=0&&tuixh<=3){ //两个列表控件属性已经设置为只能单选一行,所以点击一次这里只需减一次 xuefei=xuefei-200*c[tuixh].kxf(); } else if (printxueli== "本科生" &&tuixh>=4&&tuixh<=7){ xuefei=xuefei-150*c[tuixh].kxf(); } else if (printxueli== "本科生" &&tuixh>=8&&tuixh<=11){ xuefei=xuefei-100*c[tuixh].kxf(); } else if (printxueli== "研究生" &&tuixh>=0&&tuixh<=3){ xuefei=xuefei-200*c[tuixh].kxf(); } else if (printxueli== "研究生" &&tuixh>=4&&tuixh<=7){ xuefei=xuefei-180*c[tuixh].kxf(); } else if (printxueli== "研究生" &&tuixh>=8&&tuixh<=11){ xuefei=xuefei-150*c[tuixh].kxf(); } printmenshu=yixuanms; yixuan.DeleteItem(tuihanghao); while ( kexuan.DeleteItem (0)); for ( int p=0;p<12;p++){ CString klx,kmc,kxh,kxf,krs; klx=c[p].klx(); kmc=c[p].kmc(); krs.Format(_T( "%d" ),yixuankrs[p]); kxh.Format(_T( "%d" ),c[p].kxh()); kxf.Format(_T( "%d" ),c[p].kxf()); kexuan.InsertItem(p,kxh); kexuan.SetItemText(p,1,klx); kexuan.SetItemText(p,2,kmc); kexuan.SetItemText(p,3,kxf); kexuan.SetItemText(p,4,krs); } } else { MessageBox(_T( "已经退完全部课程" ),_T( "错误" ),MB_OK|MB_ICONERROR); } UpdateData( false ); } |
完整的工程文件:MFC实现学生选课系统
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/AmazingUU/article/details/51465174