MFC實(shí)現(xiàn)學(xué)生選課系統(tǒng)
本文實(shí)例為大家分享了MFC實(shí)現(xiàn)學(xué)生選課系統(tǒng)的具體代碼,供大家參考,具體內(nèi)容如下
先上效果圖:

主要功能:
輸入學(xué)號,從數(shù)據(jù)庫中查找學(xué)號,若找到相匹配的學(xué)號,則顯示數(shù)據(jù)庫中姓名、學(xué)歷、導(dǎo)師,同時將所有可選課程顯示出來。輸入課程類型和課程名稱查詢課程進(jìn)行選課,選課之后相應(yīng)的選課門數(shù)、學(xué)分、學(xué)費(fèi)、已選門數(shù)都會進(jìn)行刷新。換個學(xué)號輸入,選課總?cè)藬?shù)就會刷新,還有一些小功能就在代碼里解釋了。
我就只把按鍵的代碼貼出來,完整工程下面有鏈接。
“確認(rèn)輸入”按鍵:
void Cversion02Dlg::OnBnClickedButton1()
{
UpdateData(true);
printmenshu=0;//將顯示的選課門數(shù)、已選學(xué)分、學(xué)費(fèi)清零
yixuanxf=0;
xuefei=0;
yixuanms=0;//printmenshu是用來顯示在MFC上,程序里處理的是yixuanms,最后將yxuanms賦給printmenshu,其實(shí)可以不用yixuanms,將yixuanms全部替換為printmenshu也可以
if(yixuan.GetItemCount()!=0){//如果yixuan列表不為空,則選課總?cè)藬?shù)加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("請輸入正確的學(xué)號"),_T("錯誤"),MB_OK|MB_ICONERROR);
return; //這里不寫return會直接運(yùn)行下面的程序
}else{
yixuannum[k]=xuehao;//將找到的學(xué)號存在數(shù)組里,用來判斷后面輸入的學(xué)號是否前面輸入過
k++;
}
if(k>1){ //這里的k是從1開始的,即當(dāng)k=1時,只輸入了第一個學(xué)號,不用判斷是否已經(jīng)選過課
for(int q=0;q<k-1;q++){ //這里注意q<k-1,當(dāng)k=2時表示此時的學(xué)號是第二次輸入的,需判斷與第一次輸入的學(xué)號是否相同,第一次的學(xué)號存在yixuannum[0]里
if(xuehao==yixuannum[q]){
MessageBox(_T("該學(xué)生已經(jīng)選過課了"),_T("錯誤"),MB_OK|MB_ICONERROR);
break;//這里如果寫成return,不知道為什么選課總?cè)藬?shù)不會刷新了
}
}
}
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);
}
“查詢”按鍵:
void Cversion02Dlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知處理程序代碼
UpdateData(true);
while ( kexuan.DeleteItem (0));//首先將kexuan清空,否則后面產(chǎn)生的列表都會加在原來的列表后面。這里只需循環(huán)清掉第一行就可以,因?yàn)榍宓粢恍邢旅嬉恍袝詣由蟻?
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中參數(shù)是CString類型,必須將各個參數(shù)轉(zhuǎn)為CString
kmc=c[q].kmc();
krs.Format(_T("%d"),yixuankrs[q]); //正常應(yīng)該寫成krs.Format("%d",yixuankrs[q]);但是會報(bào)錯,前面加上_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++){ //前面已經(jīng)將列表清空,這里提示錯誤信息之后,將所有課程顯示出來
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);
}
“選課”按鍵:
這里有一個關(guān)鍵的地方,就是假如用戶選了兩門相同的課,采用的是先添加后刪掉的方法
void Cversion02Dlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知處理程序代碼
UpdateData(true);
if(printxueli!="本科生"&&printxueli!="研究生"){//防止沒輸學(xué)號直接點(diǎn)選課導(dǎo)致程序錯誤
MessageBox(_T("請選輸入學(xué)號"),_T("錯誤"),MB_OK|MB_ICONERROR);
return;
}
if(yixuanms<5){ //yixuanms是從0開始的
CString krs;
yixuankrs[chosexh-1]++;//這里不能用chosehanghao,要用chosexh-1。因?yàn)槿绻唤?jīng)過查詢,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++){ //在這個循環(huán)里即使選擇的是同一門課也會添加進(jì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++){ //在這里判斷選擇的是否是同一門課,若是同一門課則將其刪掉。相應(yīng)的學(xué)分、選課人數(shù)和學(xué)費(fè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("已經(jīng)選過該門課"),_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);
}
“退課”按鍵:
這里要弄清楚列表項(xiàng)里的行號和序號
void Cversion02Dlg::OnBnClickedButton4()
{
// TODO: 在此添加控件通知處理程序代碼
UpdateData(true);
if(yixuanms>0){
yixuanms--;//點(diǎn)擊退課之后,選課門數(shù)-1
CString str,str1,krs;
int tuixf=0,tuixh=0;
str=yixuan.GetItemText(tuihanghao,3);
tuixf=_ttoi(str);//CString轉(zhuǎn)為int
yixuanxf=yixuanxf-tuixf;//已選學(xué)分減掉相應(yīng)的學(xué)分
str1=yixuan.GetItemText(tuihanghao,0);
tuixh=_ttoi(str1)-1;//這里要注意課程序號是從1開始的,而對象數(shù)組和每門課已選人數(shù)數(shù)組是從0開始的
yixuankrs[tuixh]--;//每門課已選人數(shù)-1
if(printxueli=="本科生"&&tuixh>=0&&tuixh<=3){//兩個列表控件屬性已經(jīng)設(shè)置為只能單選一行,所以點(diǎn)擊一次這里只需減一次
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("已經(jīng)退完全部課程"),_T("錯誤"),MB_OK|MB_ICONERROR);
}
UpdateData(false);
}
完整的工程文件:MFC實(shí)現(xiàn)學(xué)生選課系統(tǒng)
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語言實(shí)現(xiàn)學(xué)生宿舍信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)學(xué)生宿舍信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03
C/C++詳解實(shí)現(xiàn)二層轉(zhuǎn)發(fā)
數(shù)據(jù)鏈路層是開放系統(tǒng)互連 (OSI) 模型中的第二層,該層用于通過 LAN 等單一網(wǎng)絡(luò)進(jìn)行通信的節(jié)點(diǎn),第二層數(shù)據(jù)包不能從一個網(wǎng)絡(luò)傳輸?shù)搅硪粋€網(wǎng)絡(luò)。而二層轉(zhuǎn)發(fā)是根據(jù)報(bào)文的目的MAC直接進(jìn)行轉(zhuǎn)發(fā),轉(zhuǎn)發(fā)過程中不用對報(bào)文的頭部做任何的修改2022-05-05
C++數(shù)據(jù)精度問題的解決方案(對浮點(diǎn)數(shù)保存指定位小數(shù))
對浮點(diǎn)數(shù)保存指定位小數(shù),怎么解決這個問題呢?如果有小伙伴對C++數(shù)據(jù)精度問題的解決方案感興趣的朋友一起看看吧2017-08-08
C++ 實(shí)現(xiàn)靜態(tài)單鏈表的實(shí)例
這篇文章主要介紹了C++ 實(shí)現(xiàn)靜態(tài)單鏈表的實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-06-06
C語言驅(qū)動開發(fā)之內(nèi)核通過PEB獲取進(jìn)程參數(shù)
PEB結(jié)構(gòu)(Process Envirorment Block Structure)其中文名是進(jìn)程環(huán)境塊信息。本文將通過PEB實(shí)現(xiàn)獲取進(jìn)程參數(shù),感興趣的小伙伴可以了解一下2022-10-10
c++ STL set_difference set_intersection set_union 操作
這篇文章主要介紹了c++ STL set_difference set_intersection set_union 操作,需要的朋友可以參考下2017-03-03
C語言詳細(xì)分析不同類型數(shù)據(jù)在內(nèi)存中的存儲
使用編程語言進(jìn)行編程時,需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個變量時,就會在內(nèi)存中保留一些空間。您可能需要存儲各種數(shù)據(jù)類型的信息,操作系統(tǒng)會根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲什么2022-08-08

