VC++课程设计报告第二题.docx
- 文档编号:9125790
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:27
- 大小:63.06KB
VC++课程设计报告第二题.docx
《VC++课程设计报告第二题.docx》由会员分享,可在线阅读,更多相关《VC++课程设计报告第二题.docx(27页珍藏版)》请在冰豆网上搜索。
VC++课程设计报告第二题
南京理工大学VC++课程设计报告
课程:
VC++课程设计
系别:
计算机科学与计算机学院
班级:
09068403
学号:
姓名:
第一题
选题名称:
通讯录(双向链表)
选题难易级别:
A级
起止时间:
2010.9.1/2010.9.10
指导教师:
陆建峰
日期:
2010年9月11日
一、课题目标
(1)扩充双向链表的功能,增加排序,根据顺序增加节点,根据顺序查找节点并删除的功能。
(2)将节点改成通讯录中的一个记录,添加年龄,姓名,电话等信息,并能根据不同的信息进行快速向前或者向后查找,链表支持姓名排序。
(3)根据名字查找记录时支持通配符*和?
,即*统配任意字符和字符串,?
统配一个字符,字符不分大小写。
(4)可以修改某个节点,即修改其中的年龄和电话字段,修改时,新旧记录要同时显示在屏幕上,经“确认”后新记录才可替代旧记录,否则取消修改操作。
(5)将通讯录以文件的形式存在磁盘上,每次操作时将通讯录调出,操作完毕后存盘。
1.3评定难易级别
A级
二、具体实现
2.1程序总体方案
2.1.1开发平台
操作系统:
Windows7开发工具:
VS2010
2.12流程图
抽象类定义:
classobject{
public:
virtualintisequalage(object&)=0;
virtualintisequalname(object&)=0;
virtualintisequaltele(object&)=0;
virtualintcompname(object&)=0;
virtualchar*readname(object&obj)=0;
virtualint*readage(object&obj)=0;
virtualchar*readtele(object&obj)=0;
virtualvoidshow()=0;
virtual~object(){};
};
结点类定义:
classNode{
object*info;
Node*prev,*next;
public:
Node()
{info=0;prev=0;next=0;}
Node(Node&node)
{
info=node.info;
prev=node.prev;
next=node.next;
}
voidfillinfo(object*obj){info=obj;}
friendclasslist;
};
双向链表类定义:
classlist{
Node*head,*tail;
public:
list(){head=tail=0;}
~list(){deletelist();}
voidaddnode(object&,Node*);
Node*deletenode(Node*);
Node*lookupage(object&);
Node*lookupname(object&);
Node*lookupname2(object&);
Node*lookuptele(object&);
voidshowlist();
voiddeletelist();
voidsavelist();
voidshownow(Node*);
voidaddheadnode(Node*);
voidaddtailnode(Node*);
};
双向链表类各种函数的定义:
voidlist:
:
addnode(object&obj,Node*node)
{
Node*nownode=head;
inta;
if(head==0)a=1;
else{
if(head->next==0)a=2;
else
if(head->next)a=3;
}
switch(a){
case1:
{
head=tail=node;
node->next=node->prev=0;break;
}
case2:
{
nownode=head;
if(nownode->info->compname(obj)>0)addheadnode(node);
elseaddtailnode(node);
break;
}
case3:
{
intflag=0;
nownode=head;
if(nownode->info->compname(obj)>0){addheadnode(node);break;}
nownode=nownode->next;
while(nownode)
{
if(nownode->info->compname(obj)>0){
node->prev=nownode->prev;
nownode->prev->next=node;
nownode->prev=node;
node->next=nownode;flag=1;break;}
nownode=nownode->next;
}
if(flag==0)addtailnode(node);
break;
}
}
}
voidlist:
:
addheadnode(Node*node)
{
node->next=head;
head->prev=node;
head=node;
}
voidlist:
:
addtailnode(Node*node)
{
tail->next=node;
node->prev=tail;
tail=node;
node->next=0;
}
Node*list:
:
deletenode(Node*node)
{
if(node==head)
if(node==tail)
head=tail=0;
else{
head=node->next;head->prev=0;
}
else{
node->prev->next=node->next;
if(node!
=tail)node->next->prev=node->prev;
elsetail=node->prev;
}
node->prev=node->next=0;
return(node);
}
Node*list:
:
lookupage(object&obj)
{
Node*pn=head;
while(pn){
if(pn->info->isequalage(obj))break;
pn=pn->next;
}
returnpn;
}
Node*list:
:
lookupname(object&obj)//查找姓名,返回查找节点
{
charcha[100];
char*chao=cha;
intc,st;
Node*pn=head;
Node*pt[100];
for(intj=0;j<100;j++)
pt[j]=0;
intflag=0;
intf=0;
inti;
while(pn){
if(pn->info->isequalname(obj)){pt[flag]=pn;flag++;}
pn=pn->next;
}
if(flag==1||flag==0)returnpt[0];
if(flag>1)
{
for(i=0;i {cout<info->show();} cout<<"查询到多个结果,请选择序号: \n"; do{f=0; cin.getline(cha,100); if(strlen(cha)==0){cout<<"请不要输入空字符,请重新输入: ";f=1;continue;}//容错 if(strlen(cha)==1&&*chao>48&&*chao<=57){ c=(int(cha[0]-'0')); if(c<=i) {cout< else {cout<<"您输入的有误,请重新输入: ";f=1;continue;} } if(strlen(cha)==2&&*chao>=48&&*chao<=57&&*(chao+1)>=48&&*(chao+1)<=57) {c=(int(cha[0]-'0'))*10+(int(cha[1]-'0')); if(c<=i) {cout< else {cout<<"您输入的有误,请重新输入: ";f=1;continue;} } if(strlen(cha)>2||*chao<48||*chao>57||*(chao+1)<48||*(chao+1)>57){cout<<"您输入的有误,请重新输入: ";f=1;continue;} }while(f); return(pt[c-1]); } } Node*list: : lookupname2(object&obj) { charcha[100]; char*chao=cha; Node*pn=head; Node*pb[500]; for(intj=0;j<500;j++) pb[j]=0; intw,flag=1,tm=0,i,f=0,c; chara[100],b[100],*a_ptr=a,*b_ptr=b; chartmp[100],*tmp_ptr=tmp; while(pn){ strcpy(a,pn->info->readname(*(pn->info)));//目的人名 strcpy(b,obj.readname(obj));//输入带通配符的人名 a_ptr=a;b_ptr=b; while(*b_ptr) {if((*b_ptr)=='*'&&(*(b_ptr+1))=='*'){strcpy(tmp_ptr,b_ptr+2);*(b_ptr+1)='\0';strcat(b_ptr,tmp_ptr);b_ptr=b;} elseb_ptr++; } b_ptr=b; while(*b_ptr) {if((*b_ptr)=='*'&&(*(b_ptr+1))=='\0'){flag=0;break;} b_ptr++; } b_ptr=b; if(flag==0)//*号在后面的情形: flag=0 { while(*b_ptr||*a_ptr) {if((*b_ptr)=='*'&&(*(b_ptr+1))=='\0'){ if(*a! ='\0'){w=1;break;}} w=1;tmp_ptr=tmp; if(*b_ptr=='\0'||*a_ptr=='\0'){w=0;break;} if((*b_ptr)=='? '){b_ptr++;a_ptr++;continue;} if((*b_ptr)=='*'){b_ptr++;a_ptr++; while (1){strcpy(tmp,a_ptr); if(*a_ptr=='\0'){w=0;break;} if(*tmp_ptr==*b_ptr&&*(tmp_ptr+1)! =*b_ptr){break;} elsea_ptr++;} } if(w==0)break; if(*a_ptr=='\0'){a_ptr--;b_ptr--;} if((*a_ptr)! =(*b_ptr)){w=0;break;} b_ptr++;a_ptr++; } } b_ptr=b; if(flag==1)//*号在前和中的情形flag=1 { while(*b_ptr||*a_ptr) {w=1;tmp_ptr=tmp; if(*b_ptr=='\0'||*a_ptr=='\0'){w=0;break;} if((*b_ptr)=='? '){b_ptr++;a_ptr++;continue;} if((*b_ptr)=='*'){b_ptr++;a_ptr++; while (1){strcpy(tmp,a_ptr); if(*a_ptr=='\0'){w=0;break;} if(*tmp_ptr==*b_ptr&&*(tmp_ptr+1)! =*b_ptr){break;} elsea_ptr++;} } if(w==0)break; if(*a_ptr=='\0'){a_ptr--;b_ptr--;} if((*a_ptr)! =(*b_ptr)){w=0;break;} b_ptr++;a_ptr++; } } if(w==1){pb[tm]=pn;tm++;} pn=pn->next; } if(tm==1||tm==0)returnpb[0]; if(tm>1) { for(i=0;i {cout< cout<<"查询到多个结果,请选择序号: \n"; do{f=0; cin.getline(cha,100); if(strlen(cha)==0){cout<<"请不要输入空字符,请重新输入: ";f=1;continue;}//容错 if(strlen(cha)==1&&*chao>48&&*chao<=57){ c=(int(cha[0]-'0')); if(c<=i) {cout< else {cout<<"您输入的有误,请重新输入: ";f=1;continue;} } if(strlen(cha)==2&&*chao>=48&&*chao<=57&&*(chao+1)>=48&&*(chao+1)<=57) {c=(int(cha[0]-'0'))*10+(int(cha[1]-'0')); if(c<=i) {cout< else {cout<<"您输入的有误,请重新输入: ";f=1;continue;} } if(strlen(cha)==3&&*chao>=48&&*chao<=57&&*(chao+1)>=48&&*(chao+1)<=57) {c=(int(cha[0]-'0'))*100+(int(cha[1]-'0'))*10+(int(cha[2]-'0')); if(c<=i) {cout< else {cout<<"您输入的有误,请重新输入: ";f=1;continue;} } if(strlen(cha)>3||*chao<48||*chao>57||*(chao+1)<48||*(chao+1)>57){cout<<"您输入的有误,请重新输入: ";f=1;continue;} }while(f); return(pb[c-1]); }} Node*list: : lookuptele(object&obj) { Node*pn=head; while(pn){ if(pn->info->isequaltele(obj))break; pn=pn->next; } returnpn; } voidlist: : showlist() { inti=0; Node*p=head; while(p){ i++; if(i! =20){p->info->show();p=p->next;} else{system("pause");system("cls");i=0;} } } voidlist: : deletelist() { Node*p,*q; p=head; while(p){ deletep->info; q=p;p=p->next; deleteq; } } voidlist: : savelist() { Node*p=head; ofstreamoutfile("conm.txt"); while(p){ outfile< p=p->next; } outfile.close(); } voidlist: : shownow(Node*t) { cout< } 通讯录类定义: classcon: publicobject{ char*name; intage; char*tele; public: con(char*a="0\0",intb=0,char*c="0\0") {name=newchar[20]; strcpy(name,a); age=b; tele=newchar[10]; strcpy(tele,c); } voidset(char*a,intb,char*c) { strcpy(name,a); age=b; strcpy(tele,c); } voidshow(void){cout< intisequalage(object&obj) {con&temp=(con&)obj; return(age==temp.age);} intisequalname(object&obj) {con&temp=(con&)obj; return(! strcmp(name,temp.name));} intisequaltele(object&obj) {con&temp=(con&)obj; return(! strcmp(tele,temp.tele));} intcompname(object&obj) {con&temp=(con&)obj; return(strcmp(name,temp.name));} char*readname(object&obj) {char*na; na=newchar[20]; con&temp=(con&)obj; na=temp.name; returnna;} char*readtele(object&obj) {char*te; te=newchar[20]; con&temp=(con&)obj; te=temp.tele; returnte;} int*readage(object&obj) {int*ag; ag=newint; con&temp=(con&)obj; *ag=temp.age; returnag;} }; Searchg函数: voidsearchg(void) { intcount=0; doublesum=0; charnn[100]; cout<<"请输入学号: "; cin.getline(nn,100); ifstreaminfile("b.txt"); chartm[100]; infile.getline(tm,100); chara[15],b[15],c[15]; doubled,e,f,g,h,i; studenttmpp; while(infile>>a) { infile>>b; infile>>c; infile>>d; infile>>e; infile>>f; infile>>g; infile>>h; infile>>i; gradetmp(a,b,c,d,e,f,g); if(strcmp(nn,a)==0) { count++;sum+=tmp.shide; ifstreaminfile2("a.txt"); chartm[100]; infile2.getline(tm,100); charaa[15],bb[15],cc[15],dd[15],ee[15]; while(strcmp(tmp.num,tmpp.num)! =0) {infile2>>aa; infile2>>bb; infile2>>cc; infile2>>dd; infile2>>ee; studenttmppp(aa,bb,cc,dd,ee); tmpp=tmppp; } infile2.close(); cout< cout< } cout<<"共修: "<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 课程设计 报告 第二