C语言电影俱乐部管理程序.docx
- 文档编号:28392617
- 上传时间:2023-07-13
- 格式:DOCX
- 页数:14
- 大小:155.35KB
C语言电影俱乐部管理程序.docx
《C语言电影俱乐部管理程序.docx》由会员分享,可在线阅读,更多相关《C语言电影俱乐部管理程序.docx(14页珍藏版)》请在冰豆网上搜索。
C语言电影俱乐部管理程序
C++课程设计报告
191114班黄玲
学号:
20111003886
一.前言
本次课程设计运用MFC,基于对话框编程。
运用C++语言的特点,在对话框中实现信息的添加,查找,删除,浏览等功能。
充分发挥对话框的作用。
二.正文
(1)题目:
电影俱乐部
【要求】允许俱乐部成员租用DVD。
若想成为会员,首先应签约并且可按月交纳费用。
会员一次可租用三个DVD,没有时间限制。
可浏览所有可租用的DVD,能实现新成员的开户、会员对其帐户状况的查询以及俱乐部管理者对所有交易情况的查看功能。
(2)需求分析:
DVD信息和俱乐部会员信息用文件存储,提供文件的输入输出操作;注册新会员,提供文件的添加操作;实现查询则提供文件的查找操作;另外提供键盘式选择菜单以实现功能选择。
(3)代码设计
总体设计过程:
在对话框中加入相应的按钮和文本框,如图:
然后对相应的文本框和按钮加入相应的变量,如在类向导中的所示:
1.
然后在MoiveClubDLG.CPP文件中对所加的文本所要实现的功能添加相应的函数,如下列表中所示:
(1)从文件读取数据函数
功能:
完成从文件读取数据的操作,如果文件不存在则只建立链表
输入输出均为空,只是一个过程.
voidCMoiveClubDlg:
:
DataInit()
{
structMoiveCard*p,*q;//定义两个临时指针
bFileEmpty=FALSE;//文件默认为不空
bNewFile=FALSE;//假定不是新文件
bFileModified=FALSE;//初始化文件属性
p=head=(structMoiveCard*)malloc(sizeof(structMoiveCard));
head->prev=head->next=NULL;//建立头结点(不存放数据)
if(!
(fp=fopen("data.dat","r")))//试图用只读方式打开数据文件,如文件不存在则fp返回NULL值
{
bNewFile=TRUE;//文件不存在,当然是新文件了
bFileEmpty=TRUE;//文件当前状态是空的,第一次运行程序嘛
iCount=0;//总结点数为0,注意不包括头结点,头结点不用来存放数据
last=head;//尾结点此时就是头结点
}
if(!
bFileEmpty)//因为文件默认为不空,如果文件已存在,则从文件中读取数据建立链表
{
fread(&iCount,sizeof(int),1,fp);//先从文件中读取总结点数
for(inti=0;i { q=(structMoiveCard*)malloc(sizeof(structMoiveCard)); fread(q,sizeof(structMoiveCard),1,fp); q->next=NULL; q->prev=p; p->next=q; p=p->next; m_huiyuan.InsertString(i,p->name);//显示名单 } last=p;//改变尾指针的指向 } if(iCount==0)//如果名单为空,禁用更新、删除和查找等按钮,以免发生误操作导致错误 { GetDlgItem(IDC_UPDATE)->EnableWindow(FALSE); GetDlgItem(IDC_delete)->EnableWindow(FALSE); GetDlgItem(IDC_namefind)->EnableWindow(FALSE); GetDlgItem(IDC_DVDfind)->EnableWindow(FALSE); GetDlgItem(IDC_name)->EnableWindow(FALSE); GetDlgItem(IDC_DVD1)->EnableWindow(FALSE); GetDlgItem(IDC_DVD2)->EnableWindow(FALSE); GetDlgItem(IDC_DVD3)->EnableWindow(FALSE); GetDlgItem(IDC_huifei)->EnableWindow(FALSE); } else { m_huiyuan.SetCurSel(0);//默认选中第一条记录 OnSelchangehuiyuan(); } } (2)添加函数 功能: 在链表的结尾添加一条记录,并将默认将新记录的姓名置为“新名字”,其它项为空输入输出均为空,只是一个过程. voidCMoiveClubDlg: : Onadd() { //TODO: Addyourcontrolnotificationhandlercodehere GetDlgItem(IDC_name)->EnableWindow(TRUE); GetDlgItem(IDC_DVD1)->EnableWindow(TRUE); GetDlgItem(IDC_DVD2)->EnableWindow(TRUE); GetDlgItem(IDC_huifei)->EnableWindow(TRUE); GetDlgItem(IDC_DVD3)->EnableWindow(TRUE);//启用文本框控件 curr=(structMoiveCard*)malloc(sizeof(structMoiveCard));//将当前指针指向新增加的结点上 strcpy(curr->name,"新名字"); strcpy(curr->DVD1,""); strcpy(curr->DVD2,""); strcpy(curr->huifei,""); strcpy(curr->DVD3,"");//将默认的数据复制到当前结点 m_huiyuan.InsertString(m_huiyuan.GetCount(),"新名字"); m_huiyuan.SetCurSel(m_huiyuan.GetCount()-1);//在列表框中插入新名字并选中 iCount++;//总结点数加1 curr->next=NULL; curr->prev=last; last->next=curr; last=curr;//在尾结点后插入新结点 bFileEmpty=FALSE; bFileModified=TRUE;//修改文件属性,文件被修改且不为空 GetDlgItem(IDC_UPDATE)->EnableWindow(TRUE); GetDlgItem(IDC_delete)->EnableWindow(TRUE); GetDlgItem(IDC_namefind)->EnableWindow(TRUE); GetDlgItem(IDC_DVDfind)->EnableWindow(TRUE);//启用更新、删除、查找按钮控件 LoadInfo(curr);//在文本框显示个人信息 } (3)函数更新 功能: 完成修改当前记录的操作 输入输出均为空,只是一个过程. voidCMoiveClubDlg: : OnUpdate() { //TODO: Addyourcontrolnotificationhandlercodehere UpdateData(); intsel=m_huiyuan.GetCurSel();//得到所选择记录在列表框中的序号 if(m_name=="") { MessageBox("必须键入姓名! ","错误! ",MB_ICONERROR); m_IDC_Name.SetFocus(); return;//如果姓名输入框为空则发生错误 } strcpy(curr->name,m_name); strcpy(curr->DVD1,m_DVD1); strcpy(curr->DVD2,m_DVD2); strcpy(curr->huifei,m_huifei); strcpy(curr->DVD3,m_DVD3);//将更新的数据从文本输入框复制到结点 m_huiyuan.DeleteString(sel); m_huiyuan.InsertString(sel,m_name); m_huiyuan.SetCurSel(sel);//更新列表框中的姓名 m_add.SetFocus();//将焦点设置到“添加”按钮上 } (4)变更列表框选项 功能: 当列表框的选择项改变时,移动指针到指定结点的位置 输入输出均为空,只是一个过程. voidCMoiveClubDlg: : OnSelchangehuiyuan() { //TODO: Addyourcontrolnotificationhandlercodehere intsel=m_huiyuan.GetCurSel();//获得当前的选择 curr=head->next; for(inti=0;i curr=curr->next;//移动当前指针到选定结点 LoadInfo(curr);//更新界面 } (5)结点中存放的数据信息显示在文本框 voidCMoiveClubDlg: : LoadInfo(MoiveCard*p) { m_name=p->name; m_DVD1=p->DVD1; m_DVD2=p->DVD2; m_DVD3=p->DVD3; m_huifei=p->huifei; UpdateData(FALSE); m_IDC_Name.SetFocus(); m_IDC_Name.SetSel(0,20,TRUE); } (6)删除函数 voidCMoiveClubDlg: : Ondelete() { //TODO: Addyourcontrolnotificationhandlercodehere intsel=m_huiyuan.GetCurSel();//得到所选记录在列表框中的序号 structMoiveCard*p=curr;//新建一个临时指针变量 if(MessageBox("确定要删除吗? ","警告",MB_ICONQUESTION|MB_OKCANCEL)==IDCANCEL) return;//弹出确认对话框 iCount--;//总结点数减1 //删除当前结点 p->prev->next=p->next; if((p->next)! =NULL)//注意删除结点为末尾结点时的操作! p->next->prev=p->prev; else last=p->prev; free(p);//释放内存空间 m_huiyuan.DeleteString(sel);//在列表框中删除记录 if(m_huiyuan.GetCount()==0){ GetDlgItem(IDC_UPDATE)->EnableWindow(FALSE); GetDlgItem(IDC_delete)->EnableWindow(FALSE); GetDlgItem(IDC_namefind)->EnableWindow(FALSE); GetDlgItem(IDC_DVDfind)->EnableWindow(FALSE); GetDlgItem(IDC_name)->EnableWindow(FALSE); GetDlgItem(IDC_DVD1)->EnableWindow(FALSE); GetDlgItem(IDC_DVD2)->EnableWindow(FALSE); GetDlgItem(IDC_DVD3)->EnableWindow(FALSE); GetDlgItem(IDC_huifei)->EnableWindow(FALSE); OnClear(); bFileEmpty=TRUE; bFileModified=TRUE; return;//如果剩除到一条记录都不剩,则需要禁用一些控件以免发生误操作,同时修改文件属性 } if(sel m_huiyuan.SetCurSel(sel); else m_huiyuan.SetCurSel(sel-1);//将焦点定义在列表中上一条记录 OnSelchangehuiyuan(); } (7)清楚函数 voidCMoiveClubDlg: : OnClear() { //TODO: Addyourcontrolnotificationhandlercodehere m_name=""; m_DVD1=""; m_DVD2=""; m_DVD3=""; m_huifei=""; UpdateData(FALSE); } (8)程序结束时将链表中的数据保存到文件函数 voidCMoiveClubDlg: : OnClose() { //TODO: Addyourmessagehandlercodehereand/orcalldefault structMoiveCard*p;//声明一个临时指针变量 if((! bNewFile)&&bFileModified)//根据文件属性来决定是否要删除原文件 { fclose(fp); DeleteFile("data.dat"); } if(! bFileEmpty)//根据文件是否为空来决定是否要新建文件并写入数据 { if(! (fp=fopen("data.dat","w+")))//如果创建新文件失败 { MessageBox("I'msorrybuttheprogramencounterafilediskproblem! ","ERROR",MB_ICONERROR); return; } fwrite(&iCount,sizeof(int),1,fp);//将总结点数写入文件 fseek(fp,sizeof(int),0);//移动文件指针 p=head->next;//将临时指针变量移动来头结点的下一个结点,也就是第一个存放数据的结点 while(p)//当结点不为空 { fwrite(p,sizeof(structMoiveCard),1,fp); p=p->next;//将数据写入文件并将指针后移 } } CDialog: : OnClose(); } (9)About函数 voidCMoiveClubDlg: : OnAbout() { //TODO: Addyourcontrolnotificationhandlercodehere CAboutDlgdlg; dlg.DoModal(); } (10)处理回车键函数 voidCMoiveClubDlg: : OnOK() { OnUpdate();//这个函数是为了处理回车键的事件,默认为关闭对话框,现在改为调用OnUpdate()函数 } (11)名字查找 功能: 以姓名方式查找相应的记录,如不存在则提示找不到 输入为空 输出为空 voidCMoiveClubDlg: : Onnamefind() { //TODO: Addyourcontrolnotificationhandlercodehere UpdateData(); intsel=m_huiyuan.FindString(m_huiyuan.GetCurSel(),m_findwhat);//直接调用FindString函数查找并得到序号 if(sel==LB_ERR)//如果找不到记录,则输入查找失败提示 { MessageBox("找不到记录! ","提示",MB_ICONWARNING); return; } m_huiyuan.SetCurSel(sel);//选中所找到的记录项 OnSelchangehuiyuan(); } (12)DVD查找 voidCMoiveClubDlg: : OnDVDfind() { //TODO: Addyourcontrolnotificationhandlercodehere UpdateData(); MoiveCard*temp=curr;//将当前结点的地址存入一个临时指针中 intsel=m_huiyuan.GetCurSel();//得到当前记录的序号 do { curr=curr->next;//从当前记录的下一记录开始查找 sel++;//序号加1 if(curr==NULL)//如果已经查找到表尾 { curr=head->next;//将当前指针移动到头结点的下一个结点,因为头结点并不存放数据 sel=0;//第一条记录的序号为0 } if(! (strcmp(curr->DVD1,m_findwhat)))//如果匹配成功 { m_huiyuan.SetCurSel(sel);//选中找到的记录项 OnSelchangehuiyuan(); return;//已完成查找,退出函数体 } }while(curr! =temp);//循环条件为没有遍历整个链表 MessageBox("找不到记录! ","提示",MB_ICONWARNING);//已经遍历整个链表但没有找到记录,输出查找失败信息 return; } (13)更改名字 voidCMoiveClubDlg: : OnChangeName() { //TODO: IfthisisaRICHEDITcontrol,thecontrolwillnot //sendthisnotificationunlessyouoverridetheCDialog: : OnInitDialog() //functionandcallCRichEditCtrl().SetEventMask() //withtheENM_CHANGEflagORedintothemask. //TODO: Addyourcontrolnotificationhandlercodehere }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 电影 俱乐部 管理程序