第一篇:通讯录系统总结
通讯录管理系统的项目总结
信息1011-2010822109-田文静
通过这一阶段的学习,我们对这个通讯录管理系统有了一定的了解。我们组的项目设计主要是面向通讯录管理部分,首先我们做的是通讯录的登录界面,其次还有添加好友信息、修改好友信息、修改密码、注册新会员等界面。在课程设计中,程序设计主要的是采用C#语言,数据的存储采用文本存储的方式.程序设计主要是由我们大二第一学期的桌面软件开发转变为web项目开发.程序设计后通过运行调试,基本上可以实现解决班级通讯管理问题.在进行通讯录管理系统开发之前我们所涉及到的是一些基本控件的使用.例如在lable控件中显示日期和时间:lable.Text=DateTime.Now.ToString;除了控件以外还学习了一些控件的具体属性.而后就是数据库,数据库设计的任务是确定系统所需的数据库,数据库是表的集合,通常一个系统只需要一个数据库,设计的任务是根据需求分析,确定数据库所包含的表及字段,表间的关系,然后具体确定表的结构,包括字段名,字段类型及宽度,需要的索引.在此基础上我们就进入了通讯录管理系统的学习.总共是四个Panel,分别为PanelQuery,PanelAdd,PanelEdit,以及PanelDetail,在PanelQuery主要的是插入一个Gridview控件和一个SqlDataSourse,而在PanelAdd中主要是添加一些最基本的button和lable以及textbox控件,此外还涉及到一些之前没有用过的控件一些属性,例如RequireFieldValidator的ErrorMessage,ControlTovalidate属性,以及RegularExpressionValidator的ErrorMessage,ControlTovalidate和ValidationExpression属性 在后面的三个Panel中用到的基本控件的属性跟前面的差不多.在项目实施的过程中,我们首先对项目进行了整体规划。然后进行小组分工合作完成项目规划,然后由组长进行整合。在老师的细心教导和积极指导下,我们首先是将所有的界面做好,然后就是开始编写代码。在整个项目实施过程中,我们小组成员之间的相互合作和互动非常默契。我们积极处理各种在项目中遇到的问题,自己解决不了的就寻求帮助,整个项目完成的很顺利。
接下来是我们项目过程中实施过程中的相关代码: 1.login(用户登录界面)
public partial class _Default : System.Web.UI.Page { amendPassword transfer;protected void Page_Load(object sender, EventArgs e){ } protected void Button1_Click(object sender, EventArgs e){ transfer = new amendPassword();string NewPwd = this.txtUserPwd.Text.Trim();string sqlQuery = “select userId,userPwd from Users where userId='” + txtUserName.Text.Trim()+ “'”;DataBase DB = new DataBase();DataTable dt = DB.DataSelect(sqlQuery);try { int Row = dt.Rows.Count;if(Row == 0){ Response.Write(amendPassword.Show_MessageBox(“没有此用户!”));this.txtUserName.Text = “";this.txtUserName.Focus();return;} else { string sel_userid = dt.Rows[0][”UserID“].ToString();string sel_Pwd = dt.Rows[0][”userPwd“].ToString().Trim();string confirm_pwd = transfer.EncryptPassword(NewPwd, ”MD5“).Trim();if(sel_Pwd!= confirm_pwd){ Response.Write(amendPassword.Show_MessageBox(”用户密码错误!“));this.txtUserPwd.Text.Trim();this.txtUserPwd.Focus();return;} else { Session[”userID“] = txtUserName.Text.Trim();Response.Redirect(”TreeAddress/Tree.aspx“);} } } catch(System.Exception ee){ Response.Write(”script language=javascript>alert('“ + ee.Message.ToString()+ ”')“);} } } 2.ModifyPwd(修改密码)
public partial class ModifyPwd : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e){ if(!IsPostBack){ if(this.Session[”userID“] == null){ Response.Redirect(”Default.aspx“);} else { Label1.Text = Session[”userID“].ToString();} } } protected void btnSubmit_Click(object sender, EventArgs e){ amendPassword transfer = new amendPassword();string oldPwd = this.txtOldPwd.Text.Trim();string NewPwd = this.txtOldPwd.Text.Trim();string Old_password = transfer.EncryptPassword(oldPwd, ”MD5“).ToString();string New_password = transfer.EncryptPassword(NewPwd, ”MD5“).ToString();//string comfirmPwd=this.txtOldPwd.Text.Trim();SqlConnection conn = new
SqlConnection(ConfigurationManager.AppSettings[”VoteConnectionString“]);SqlCommand selectcmd = new SqlCommand(”select * from Users where userId='“ + Session[”userID“].ToString()+ ”'and userPwd='“ + Old_password + ”'“, conn);try { conn.Open();SqlDataReader sdr = selectcmd.ExecuteReader();if(sdr.Read()){ sdr.Close();SqlCommand updatecmd = new SqlCommand(”update Users set userPwd='“ + New_password + ”' where userId='“ + Session[”userID“].ToString()+ ”'“, conn);int i = updatecmd.ExecuteNonQuery();if(i > 0){ Response.Write(”“);} else { Response.Write(”“);} } else { Response.Write(”“);} } catch(System.Exception ee){ Response.Write(”“);} finally { conn.Close();} } protected void btnReset_Click(object sender, EventArgs e){ txtConfirmPwd.Text = ”“;txtNewPwd.Text = ”“;txtOldPwd.Text = ”“;} 3.GridViewUsage(添加好友信息)
public partial class GridViewUsage : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e){ if(!IsPostBack){ if(Session[”userID“] == null || Session[”userID“].ToString()== ”“){ Page.Response.Redirect(”default.aspx“);} else { dataBind();lblID.Text = Session[”userID“].ToString();detailsAllBind();} } } private void dataBind(){ string ID = Session[”UserID“].ToString();string sql1 = ”select * from addresslist where userID='“ + ID + ”'order by id desc“;DataBase db = new DataBase();DataSet ds = db.DataAll(sql1);GVUsage.DataSource = ds;GVUsage.DataKeyField = ”id“;GVUsage.DataBind();ShowStatsPage();return;} private void dataBind1(){ string ID = Session[”UserID“].ToString();string newfrdName=Session[”frdName“].ToString();string sql1 = ”select * from addresslist where userID='“ + ID + ”'“ + ” frdName like '%“ + newfrdName + ”%'“;DataBase db = new DataBase();DataSet ds = db.DataAll(sql1);GVUsage.DataSource = ds;GVUsage.DataKeyField = ”id“;GVUsage.DataBind();ShowStatsPage();return;} private void detailsBind(){ SqlConnection conn1 = new
SqlConnection(ConfigurationManager.ConnectionStrings[”ConnectionString“].ConnectionString);string detailsID = ViewState[”id“].ToString();string sql2 = ”select id,userId,frdName,frdPhone,frdMobilePhone,frdAddress,frdQQ,frdEmail from addresslist where id='“ + detailsID + ”'“;conn1.Open();SqlCommand cmd = new SqlCommand(sql2, conn1);SqlDataReader myReader = cmd.ExecuteReader();DetailsView1.DataSource = myReader;DetailsView1.DataBind();myReader.Close();} private void detailsAllBind(){ SqlConnection conn2 = new
SqlConnection(ConfigurationManager.ConnectionStrings[”ConnectionString“].ConnectionString);string sql3 = ”select * from addresslist order by id desc“;conn2.Open();SqlDataAdapter da = new SqlDataAdapter(sql3, conn2);DataSet ds = new DataSet();da.Fill(ds, ”detailsTable“);DetailsView1.DataSource = ds;DetailsView1.DataBind();conn2.Close();} protected void btnGo_Click(object sender, EventArgs e){ try { if(txtGoPage.Text.Trim()!= ”“){ int PageI = Int32.Parse(txtGoPage.Text.Trim())1)){ GVUsage.CurrentPageIndex += 1;} break;case ”prev“: if(GVUsage.CurrentPageIndex > 0){ GVUsage.CurrentPageIndex-= 1;} break;case ”last“: GVUsage.CurrentPageIndex =(GVUsage.PageCount-1);break;case ”fist": GVUsage.CurrentPageIndex = 0;break;default: GVUsage.CurrentPageIndex = System.Convert.ToInt32(arg);break;} dataBind();ShowStatsPage();} protected void Button3_Click(object sender, EventArgs e){ dataBind1();} } 这些代码是我们界面中使用的一部分,由于小组的能力有限,代码大部分参考老师所给的资料,虽然如此,我们还是从中学到了一些新知识,这对接下来我们要学习的大欧地板项目有一定的奠基作用。在整个项目实施过程中,我们小组合作的很愉快,也极大培养的我们分工合作以及团队合作精神。
第二篇:通讯录管理系统
课 程 设 计 任 务 书
题
目
C语言课程设计
系
(部)
专
业
班
级
学生姓名
学
号
06 月
信息科学与电气工程学院
计算机科学与技术
计职141
王雪
140819139 日至
07 月
04 日
共
周 指导教师
院
长
2015 年 6月 23日
一、课程设计目的
将理论教学中涉及到的知识点贯穿起来,对不同的数据类型、程序控制结构、数据结构作一比较和总结,结合设计题目进行综合性应用,对所学知识达到融会贯通的程度。通过课程设计,学生在下述各方面的能力应该得到锻炼:
(1)进一步巩固、加深学生所学专业课程《C++程序设计语言》的基本理论知识,理论联系实际,进一步培养学生综合分析问题,解决问题的能力。
(2)全面考核学生所掌握的基本理论知识及其实际业务能力,从而达到提高学生素质的最终目的。
(3)利用所学知识,开发小型应用系统,掌握运用C++语言编写调试应用系统程序,训练独立开发应用系统,进行数据处理的综合能力。
(4)对于给定的设计题目,如何进行分析,理清思路,并给出相应的数学模型。
(5)掌握结构化程序设计方法,熟悉面向对象程序设计方法。(6)熟练掌握C++语言的基本语法,灵活运用各种数据类型。(7)进一步掌握在集成环境下如何调试程序和修改程序。设计功能
录入联系人信息(包括姓名、电话号码、地址等信息);通讯录管理系统要求实现以下功能:
1、输入每一位联系人记录,将其信息存入文件中。
2、查询所有联系人的信息,并按可选的自定义规则进行排序;
3、记录修改,将修改的记录信息保存于文件中。设计要求
1、设一个通信录由以下几项数据信息构成: 数据项 类型
姓名 字符串
地址 字符串
邮政编码 字符串
电话号码 字符串
试为通信录数据定义类型和定义通信录变量,实现功能:存取、显示、删除记录、查询记录等功能。
2、要求:界面友好,易于操作 总体设计 系统功能模块图:
添加:可以添加通讯录记录,依次输入编号、姓名、年龄、电话号码、通讯地址、电子邮箱等后,会提示是否继续添加。
显示:可以以表格形式输出所有通讯录里的记录
删除:输入欲删除的那个人的名字后,会自动删除他(她)的记录内容 查询:可以选择用姓名、电话、地址三种方式查询
修改:输入欲修改的那个人的名字后,再依次输入编号、姓名、年龄、电话号码、通讯地址、电子邮箱即可完成修改
保存:,输入文件名(带后缀名)后,即可将通讯录信息保存到文件
课程设计名称及内容
课程设计名称:单项选择题标准化考试系统
设计内容:设计并实现一个单项选择题标准化考试系统。该系统可以完成试题录入、试题抽取、自动判卷等功能。
任务和要求
功能要求:
(1)用文件保存试题库。(每个试题包括题干、4个备选答案、标准答案)(2)试题录入:可随时增加试题到试题库中
(3)试题抽取:每次从试题库中可以随机抽出N道题(N由键盘输入)(4)答题:用户可实现输入自己的答案
(5)自动判卷:系统可根据用户答案与标准答案的对比实现判卷并给出成绩。
(二)其它要求:
(1)只能使用C/C++语言,源程序要有适当的注释,使程序容易阅读(2)至少采用文本菜单界面(如果能采用图形菜单界面更好)(3)学生可自动增加新功能模块(视情况可另外加分)
主要知识点
l 面向对象程序设计方法
l 界面制作,switch的应用。l 类和对象。l 动态数组(链表)类模板。l 文件的读写。
五、其他
程序设计可在Microsoft VC++6.0、Borland C++ Builder环境下进行。
六、参考资料
【1】《C语言程序设计》,谭浩强编,清华大学出版社,2008年 出版 【2】《C语言程序设计》,吴明发编,北京理工大学出版社,2007年出版 【3】《C语言参考手册》邱仲潘 机械工业出版社,2004年出版
【4】《C语言课程设计案例精编》 姜灵之 清华大学出版社 2008年出版
详细设计(1).通讯录: 主要代码
#include
//结构体 {
};class inter { private: student st[35];char no[13];char name[20];char address[100];char tel_no[12];char post_code[7];char e_mail[40];public: void add(char no[13],char name[20],char address[100],char tel_no[12],char post_code[7],char e_mail[40]);
void del(char name[20]);void find1(char no[13]);void find2(char name[20]);void list1();void list2();int correct(char name[20]);void read();void write();void format();int back(){
cout<<“
返回还是回到主菜单(T为退出,R为回到主菜单,不计大小写):
”;
} void print(int i){
cout<<“学号:”<
};
} cout<<“电话号码:”< inter a;a.format();char select1;cout< 计职141 ” < <<“tt★★★★★★★★★★★★★★★★★★★★★★★★★★” < ※” < 通 迅 录 ※” < ※” < ※” < ※” < ※” < <<“tt ”< <<“ttt选择 :”;cin>>select1; switch(select1){ case '1':cout<<“ (1)添加:”< cout<<“ (2)删除:”< (3)修改:”< 请选择:”< 输入添加的资料:”< char name[20]; char address[100]; char tel_no[12]; char post_code[7]; char e_mail[40]; cout<<“ 输入学号:”< 输入姓名:”< 输入地址:”< 输入电话号码:”< 输入邮编:”< cout<<“ 输入E_mail:”< cout<<“ 返回还是回到主菜单(T为退出,R为回到主菜单,不计大小写): ”; char back_add;cin>>back_add;if(back_add=='R'||back_add=='r')goto top;else goto bottom;break;case '2':cout<<“ 输入要删除人的姓名:”< char name2[20];cin>>name2;a.del(name2); cout<<“ 返回还是回到主菜单(T为退出,R为回到主菜单,不计大小写): ”; char back_del;cin>>back_del;if(back_del=='R'||back_del=='r')goto top;else goto bottom;break;case '3':cout<<“ 输入需要修改人的姓名:”< char name3[20];cin>>name3;if(a.correct(name3)) } goto top;else goto bottom;break;break;case '2':cout<<“ (1)根据姓名查找”< cout<<“ (2)根据学号查找”< 请选择: ”;cin>>select3;switch(select3){ case '1':char name4[20]; cout<<“ 输入姓名: ”;cin>>name4;a.find2(name4); cout<<“ 返回还是回到主菜单(T为退出,R为回到主菜单,不计大小写): ”; char back_f1;cin>>back_f1;if(back_f1=='R'||back_f1=='r')goto top;else goto bottom;break;case '2':char no4[13];cout<<“ 输入学号: ”;cin>>no4; a.find1(no4); cout<<“ 返回还是回到主菜单(T为退出,R为回到主菜单,不计大小写): ”; } break;char back_f2;cin>>back_f2;if(back_f2=='R'||back_f2=='r')goto top;else goto bottom;break;case '3':a.write();cout<<“ 返回还是回到主菜单(T为退出,R为回到主菜单,不计大小写): ”; char back_w;cin>>back_w;if(back_w=='R'||back_w=='r')goto top;else goto bottom;break;case '4':cout<<“ (1)按学号排序:”< cout<<“ (2)按姓名排序:”< 请选择:”;char select4;cin>>select4;switch(select4){ case '1':a.list1(); cout<<“ 返回还是回到主菜单(T为退出,R为回到主菜单,不计大小写): ”; char back;cin>>back;if(back=='R'||back=='r')goto top;else goto bottom;break;case '2':a.list2(); cout<<“ 返回还是回到主菜单(T为退出,R为回到主菜单,不计大小写): ”; } break;char back1;cin>>back1;if(back1=='R'||back1=='r')goto top;else goto bottom;break;case '5':a.read();cout<<“ 返回还是回到主菜单(T为退出,R为回到主菜单,不计大小写): ”; char back_r;cin>>back_r;if(back_r=='R'||back_r=='r') goto top;else goto bottom;break;case '6':cout<<“ 请确认删除所有资料!(Y/N) ”; char select5;cin>>select5;if(select5=='Y'||select5=='y')a.format();cout<<“ 返回还是回到主菜单(T为退出,R为回到主菜单,不计大小写): ”; } char back_f;cin>>back_f;if(back_f=='R'||back_f=='r')goto top;else goto bottom;break;bottom:cout<<“ ★★★★★★★★★★★★欢迎使用本软件!★★★★★★★★★★★ ”< void inter::add(char no[13],char name[20],char address[100],char tel_no[12],char post_code[7],char e_mail[40]){ int x=1;for(int i=0;i<35;i++)return 0; } { } if(!strcmp(st[i].no,“0”)){ } if(x==0)break;strcpy(st[i].address,address);strcpy(st[i].e_mail,e_mail);strcpy(st[i].name,name);strcpy(st[i].no,no);strcpy(st[i].post_code,post_code);strcpy(st[i].tel_no,tel_no);x=0;//删除联系人 void inter::del(char name[20]){ int x=1;for(int i=0;i<35;i++){ if(!strcmp(st[i].name,name)){ strcpy(st[i].address,“0”); strcpy(st[i].e_mail,“0”);strcpy(st[i].name,“0”);strcpy(st[i].no,“0”);strcpy(st[i].post_code,“0”);strcpy(st[i].tel_no,“0”); } } } else x=0;if(x==0)cout<<“ error:输入姓名错误!”< int inter::correct(char name[30]){ int x;for(int i=0;i<35;i++){ } char select;cout<<“ (1)修改姓名:”< (2)修改学号:”< (3)修改地址:”< (4)修改邮编:”< (5)修改电话号码:”< (6)修改E_MAIL:”< 请选择:”;cin>>select;switch(select){ case '1':cout<<“ 输入要修改的姓名:”;char name1[30];if(!strcmp(st[i].name,name))x=i; cin>>name1;strcpy(st[x].name,name1);cout<<“ 修改成功!”< 输入要修改的学号:”; char no1[13];cin>>no1;strcpy(st[i].no,no1);cout<<“ 修改成功!”< 输入要修改的地址:”; char address1[100];cin>>address1;strcpy(st[x].address,address1);cout<<“ 修改成功!”< 输入要修改的邮编:”; char post_code1[7];cin>>post_code1;strcpy(st[x].post_code,post_code1);cout<<“ 修改成功!”< 输入要修改的电话号码:”;char tel_no1[12]; cin>>tel_no1;strcpy(st[x].tel_no,tel_no1);cout<<“ 修改成功!”< 输入要修改的E_MAIL:”; char e_mail1[40]; cin>>e_mail1; strcpy(st[x].e_mail,e_mail1); cout<<“ 修改成功!”< return back(); break;} } //按学号查询联系人 void inter::find1(char no[13]){ int x,y=1,z=1;for(int i=0;i<35;i++){ if(!strcmp(st[i].no,no)) { x=i; z=0; } else y=0; if(z==0)break; } if(y==0)cout<<“ 输入的学号查找不到!!”< print(x);} //按姓名查询联系人 void inter::find2(char name[20]){ } //读取文件 void inter::read(){ int x,y=1,z=1;for(int i=0;i<35;i++){ } if(y==0)cout<<“ 输入的姓名查找不到!!”< } else y=0;if(z==0)break;x=i;z=0; print(x); char name1[20];cout<<“ 输入你要导入的文件名: ”;cin>>name1;strcat(name1,“.txt”);ifstream file(name1);char line[120];char no[120];char name[120];char address[120];char post_code[120];char tel_no[120];char e_mail[120];int time=0;file.getline(line,120);while(!file.eof()){ for(int k=0;k<35;k++){ if(time==0){ strcpy(no,line);time=1;for(int i=0;i<120;i++){ if(no[i]==':'){ i++;for(int j=0;j<13;j++) } } { } st[k].no[j]=no[i];i++;file.getline(line,120,'n');} if(time==1){ } if(time== 2){ strcpy(name,line);time=2; for(int i=0;i<120;i++){ } file.getline(line,120,'n');if(name[i]==':'){ } i++;for(int j=0;j<20;j++){ } st[k].name[j]=name[i];i++; } strcpy(address,line);time=3;for(int i=0;i<120;i++){ } file.getline(line,120,'n');if(address[i]==':'){ } i++;for(int j=0;j<100;j++){ } st[k].address[j]=address[i];i++;if(time==3){ strcpy(tel_no,line);time=4;for(int i=0;i<120;i++){ if(tel_no[i]==':'){ i++;for(int j=0;j<12;j++){ st[k].tel_no[j]=tel_no[i]; } } } } i++;file.getline(line,120,'n'); if(time==4){ } if(time==5){ strcpy(e_mail,line);strcpy(post_code,line);time=5;for(int i=0;i<120;i++){ } file.getline(line,120,'n');if(post_code[i]==':'){ } i++;for(int j=0;j<7;j++){ } st[k].post_code[j]=post_code[i];i++; } } } } time=0;for(int i=0;i<120;i++){ } file.getline(line,120,'n');if(e_mail[i]==':'){ } i++;for(int j=0;j<40;j++){ } st[k].e_mail[j]=e_mail[i];i++; file.close();//写入文件 void inter::write(){ char name[20];cout<<“ 输入要保存的文件名 ”;cin>>name;strcat(name,“.txt”);ofstream savefile(name);for(int i=0;i<35;i++) } { } savefile.close();savefile << “学号:”< savefile << “姓名:”< savefile << “地址:”< savefile << “电话号码:”< savefile << “邮编:”< savefile << “E_MAIL:”< strcpy(no,st[j].no);strcpy(st[j].no,st[j+1].no);for(int i=0;i<34;i++){ for(int j=0;j<35-i;j++){ if(strcmp(st[j].no,st[j+1].no)>0){ char no[13]; char name[20]; char address[100]; char tel_no[12]; char post_code[7]; char e_mail[40]; strcpy(st[j+1].no,no); strcpy(name,st[j].name);strcpy(st[j].name,st[j+1].name);strcpy(st[j+1].name,name); strcpy(address,st[j].address); } for(int k=0;k<35;k++){ int x=0;if(strcmp(st[k].no,“0”)) } } strcpy(st[j].address,st[j+1].address);strcpy(st[j+1].address,address); strcpy(tel_no,st[j].tel_no);strcpy(st[j].tel_no,st[j+1].tel_no);strcpy(st[j+1].tel_no,tel_no); strcpy(post_code,st[j].post_code);strcpy(st[j].post_code,st[j+1].post_code);strcpy(st[j+1].post_code,post_code); strcpy(e_mail,st[j].e_mail);strcpy(st[j].e_mail,st[j+1].e_mail);strcpy(st[j+1].e_mail,e_mail); { } if(x==1){ cout< } } } //按姓名排序 void inter::list2(){ for(int i=0;i<34;i++){ for(int j=0;j<35-i;j++){ if(strcmp(st[j].name,st[j+1].name)>0){ char no[13]; char name[20]; char address[100]; char tel_no[12]; char post_code[7]; char e_mail[40]; strcpy(no,st[j].no);strcpy(st[j].no,st[j+1].no);strcpy(st[j+1].no,no); strcpy(name,st[j].name);strcpy(st[j].name,st[j+1].name);strcpy(st[j+1].name,name); strcpy(address,st[j].address); } for(int k=0;k<35;k++){ } } strcpy(st[j].address,st[j+1].address);strcpy(st[j+1].address,address); strcpy(tel_no,st[j].tel_no);strcpy(st[j].tel_no,st[j+1].tel_no);strcpy(st[j+1].tel_no,tel_no); strcpy(post_code,st[j].post_code);strcpy(st[j].post_code,st[j+1].post_code);strcpy(st[j+1].post_code,post_code); strcpy(e_mail,st[j].e_mail);strcpy(st[j].e_mail,st[j+1].e_mail);strcpy(st[j+1].e_mail,e_mail); } } int x=0;if(strcmp(st[k].no,“0”)){ } if(x==1){ } cout< void inter::format(){ } for(int i=0;i<35;i++){ } strcpy(st[i].address,“0”);strcpy(st[i].e_mail,“0”);strcpy(st[i].name,“0”);strcpy(st[i].no,“0”);strcpy(st[i].post_code,“0”);strcpy(st[i].tel_no,“0”); (2).工作流程图: 1.通讯录主界面 2.添加:添加通讯录记录 3.显示:查询通讯录记录 4.删除:删除通讯录记录 5.修改:修改通讯录记录 小结(收获和建议)这次的程序实设计实验是对我们进入大学以来学习程序设计语言结果的一次大检验,面对许多不懂得知识,通过他人的帮助,以及参考他人的成果,自己动手尝试,修改等,才完成。这个课程设计,花费了我近两个星期的时间,这也是因为书本不熟悉。通过这次设计,使我对《C语言》这门课程有了更深一步的了解。它不仅是计算机程序设计的重要理论技术基础,也在我们电子与信息专业的学习中占据着十分重要的地位。同时也使我们知道,要学好这门课程,仅学习书本上的知识是不够的,还要有较强的实践能力。因为我们学习知识就是为了实践。而只有多实践,多编写程序,才能更好的理解与掌握书本上的东西。利用计算机来编写程序,也让我感受到了编程的乐趣,极大的激发了我的兴趣。 摘 要 为了人们对他人信息的记忆方便而设计,开发的一套“通讯录管理系统“软件。通过该题目的设计过程,可以培养学生结构化程序设计的思想,加深对高级语言基本语言要素和控制结构的理解,针对c语言中的重点和难点内容进行训练,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格。得到软件工程的综合训练,提高解决实际问题的能力。 关键字:信息;管理;实用 Abstract Designed for people to others the memory of information convenient, developed a set of “mail list management system” software.Through the design process of this subject, students can be structured programming ideas, deepen our understanding of the advanced language basic language elements and control the understanding of the structure, conduct training for emphasis and difficulty in C language, independently complete the program design has a certain work tasks, while emphasizing the good programming style.Comprehensive training in software engineering, improving the ability to solve practical problems.Keywords: Information;management;practical 目 录 概述.........................................................................1 1.1设计目的..................................................................1 1.2设计要求..................................................................1 1.3系统功能需求分析..........................................................2 2 总体设计.....................................................................3 2.1总体功能模块图............................................................3 2.2程序的数据设计............................................................4 3详细设计.....................................................................5 3.1功能及工作流程图..........................................................5 3.2源程序代码................................................................8 4调试分析....................................................................19 4.1测试.....................................................................19 4.2问题思考与调试:.........................................................27 5总结........................................................................28 参考文献......................................................................29 致 谢........................................................................27 概述 1.1设计目的 随着信息社会的高速发展,人与人之间的联系越来越频繁,通讯方式越来越多样化,如何保证与朋友、同学、同事、领导、亲戚等之间的联系,并能方便快捷的查找、记录、修改其相关通讯信息。仅靠以前单独的手工记录已远远不能满足当前的需要。 开发一个通讯录管理系统,借助计算机可以方便、快捷、灵活的管理个人的朋友及相关人员的通讯信息,了解友人相关信息,帮助与友人保持联络。 所以设计一个通讯录管理系统管理各人的通讯信息是是非必要的。 设计“通讯录管理系统”使其具有数据插入、修改、删除、显示和查询等功能。(1)数据包括:人名、工作单位、电话号码和E-mail地址。(2)可对记录中的姓名和电话号码进行修改。(3)可增加或删除记录。(4)可显示所有保存的记录。(5)可按人名或电话号码进行查询。 1.2设计要求 建立通讯录信息,信息至少包含姓名、住址、单位、固定电话、移动手机、分类(如同事、朋友、同学、家人等)、E-mail、QQ等。 该系统提供添加、删除、修改和查找功能,其中按姓名方式删除、修改,按姓名、单位、分类方式查找。 将通讯录保存在文件中。能够输出通讯录中的信息。 1.3系统功能需求分析 主要包含一下多种功能: 添加:添加通讯录记录 显示:显示通讯录记录 删除:删除通讯录记录 查询:查询通讯录记录 修改:修改通讯录记录 保存:将信息保存到文件 本系统为通讯录管理系统,可由用户自由添加,删除和修改信息,还可以将通讯录信息导出到文本文档,极大的方便了用户的使用。 总体设计 思路:我们首先设计出了主函数,然后根据去要实现的功能分别设计录入联系人信息、浏览、查询、修改、删除功能的子函数。删除函数的设计是首先从文件内找到要删除的人,然后通过写一个实现删除目的的FOR循环实现删除。修改也大体和删除相同,添加函数在设计时通过申请一片空间,然后通过指针将需要添加的信息添加进去,从而实现添加功能。 2.1总体功能模块图 图2.1 总体功能模块图 添加:可以添加通讯录记录,依次输入编号、姓名、年龄、电话号码、通讯地址、电子邮箱后,会提示是否继续添加。 显示:可以以表格形式输出所有通讯录里的记录。 删除:输入欲删除的那个人的名字后,会自动删除他(她)的记录内容。查询:可以选择用姓名、电话、地址三种方式查询。 修改:输入欲修改的那个人的名字后,再依次输入编号、姓名、年龄、电话号码、通讯地址、电子邮箱即可完成修改。 保存:输入文件名(带后缀名)后,即可将通讯录信息保存到文件。运行所需环境:win7及以下各版本windows,visual C++6.0。2.2程序的数据设计 该系统用下面六个功能模块编写,每个模块执行不同的功能,体现了模块化设计的思想。下面六个模块都是利用C语言文件,向文件中追加数据、修改数据、查询数据和除数据。 创建:用fopen()建立一个文本文件,然后用fprintf()向其中输入数据(例如,向文件中输入“姓名”,“地址”等),并对文件进行命名。 添加:可以添加通讯录记录,利用C语言文件,向文件中按顺序输入姓名、住址、单位、固定电话、手机号码、分类(如同事、朋友、同学、家人等)、E-mail、QQ,再用fclose()函数关闭并保存文件。 输出:也是用通过循环依次输出文件中的数据,即输出所有通讯录里的记录。删除:输入你要删除的人的姓名后,系统会自动删除他(她)的记录,在删除通过switch语句满足提示你确认删除的功能,只有等你确认删除后才会删除。查找:为了满足用户的实际需求,设计了三种查询方式,可以用姓名、单位、分类三种方式查找通讯录记录。这里用到strcmp()函数,通过比较字符串是否相同来判别是否找到相关信息,找到后,就把文件中的数据赋给对应的变量,再把变量所带的值输出到屏幕上。 修改:输入你要修改的那个人的姓名后,系统会查找该通讯录文件(此时用发ftell()函数来跟踪文件指针的指向地址,找到个人的记录后,会显示他(她)的记录,然后通过fseek()函数来找到修改处的地址,然后用户再依次输入他(她)的相关信息来替代以前的记录。 保存:用到fclose()函数,每次操作成功后会自动保存到指定的文件中。 3详细设计 3.1功能及工作流程图 ①添加:添加通讯录记录,依次输入编号、姓名、年龄、电话号码、通讯地址、电子邮箱后,会提示是否继续添加。 图3.1(1)添加流程图 ②显示:以表格形式输出所有通讯录里的 图3.1(2)显示流程图 ③删除::输入欲删除的那个人的名字后,会自动删除他(她)的记录内容。 图3.1(3)删除流程图 ④查询:可以选择用姓名、电话、地址三种方式查询。 图3.1(4)查询流程图 ⑤修改:输入欲修改的那个人的名字后,再依次输入编号、姓名、年龄、电话号码、通讯地址、电子邮箱即可完成修改。 图3.1(5)修改流程图 3.2源程序代码 #include typedef struct Person pe[80]; int menu_select() { char c;do{ system(“cls”); printf(“tt *****通讯录***** n”); printf(“tt┌───────┐n”); printf(“tt│ 1.添加记录 │n”);printf(“tt│ 2.显示记录 │n”);printf(“tt│ 3.删除记录 │n”);printf(“tt│ 4.查询记录 │n”);printf(“tt│ 5.修改记录 │n”);{ char score; /*编号*/ char name[10]; /*姓名*/ char num[15]; /*号码*/ char email[20];char age[8];char adds[20]; /*邮箱*/ /*年龄*/ /*住址*/ }Person; } printf(“tt│ 6.保存记录 │n”);printf(“tt│ 0.退出程序 │n”);printf(“tt└───────┘n”);printf(“tt请您选择(0-6):”);c=getchar(); }while(c<'0'||c>'6');return(c-'0'); int Input(Person per[],int n){ gets(x); int i=0; char sign,x[10]; while(sign!='n'&&sign!='N'){ printf(“t编号:”); scanf(“t%d”,&per[n+i].score);printf(“t姓名:”); scanf(“t%s”,per[n+i].name);printf(“t年龄:”);scanf(“t%s”,per[n+i].age);printf(“t电话号码:”);scanf(“t%s”,per[n+i].num);printf(“t通讯住址:”);scanf(“t%s”,per[n+i].adds);printf(“t电子邮箱:”);scanf(“t%s”,per[n+i].email); } } printf(“nt是否继续添加?(Y/N)”);scanf(“t%c”,&sign);i++; return(n+i); void Display(Person per[],int n) { int i; printf(“--------n”); /*格式*/ printf(“%-5d%-8s%-6s%-13s%-15s%-15sn”,per[i-1].score,per[i-1].name,per[i-1].age,perprintf(“编号 姓名 年龄 电话号码 通讯地址 电子邮箱n”);printf(“--------n”); for(i=1;i { [i-1].num,per[i-1].adds,per[i-1].email); } printf(“--------n”);system(“pause”);if(i>1&&i%10==0) { } printf(“t----n”);printf(“t”);system(“pause”); printf(“t----n”);} int Delete_a_record(Person per[],int n){ } char s[20];int i=0,j; printf(“t请输入想删除记录中的名字:”);scanf(“%s”,s); while(strcmp(per[i].name,s)!=0&&i } for(j=i;j } printf(“ttt已经成功删除!n”);return(n-1);strcpy(per[j].num,per[j+1].num);strcpy(per[j].name,per[j+1].name);strcpy(per[j].age,per[j+1].age);strcpy(per[j].adds,per[j+1].adds);strcpy(per[j].email,per[j+1].email);per[j].score=per[j+1].score;printf(“t通讯录中没有此人!n”);return(n);void Query_a_record(Person per[],int n){ int m;printf(“tn请选择查询方式:n”); printf(“t┌──────┐n”); printf(“t│1------姓名 │n”); printf(“t│2------电话 │n”); printf(“t│3------地址 │n”); printf(“t│4------返回 │n”); printf(“t└──────┘n”); printf(“请选择:”); scanf(“%d”,&m); while(m!=1&&m!=2&&m!=3&&m!=4) { if(m==1){ char s[20];int i=0; printf(“t请输入想查询的姓名:”);scanf(“t%s”,s); while(strcmp(per[i].name,s)!=0&&i } printf(“输入错误,请重新选择:”);scanf(“%d”,&m); };} return; printf(“t此人编号: %dn”,per[i].score);printf(“t此人年龄: %sn”,per[i].age);printf(“t电话号码: %sn”,per[i].num);printf(“t通讯地址: %sn”,per[i].adds);printf(“t电子邮箱: %sn”,per[i].email);if(m==2){ char s[20];int i=0; printf(“t请输入想查询的电话:”);scanf(“t%s”,s); while(strcmp(per[i].num,s)!=0&&i };} printf(“t此人编号: %dn”,per[i].score);printf(“t此人姓名: %sn”,per[i].name);printf(“t此人年龄: %sn”,per[i].age);printf(“t通讯地址: %sn”,per[i].adds);printf(“t电子邮箱: %sn”,per[i].email); } if(m==3){ };char s[20];int i=0; printf(“t请输入想查询的地址:”);scanf(“t%s”,s); while(strcmp(per[i].adds,s)!=0&&i } printf(“t此人编号: %dn”,per[i].score);printf(“t此人姓名: %sn”,per[i].name);printf(“t此人年龄: %sn”,per[i].age);printf(“t电话号码: %sn”,per[i].num);printf(“t电子邮箱: %sn”,per[i].email);printf(“t通讯录中没有此人!n”);return; void Change(Person per[],int n){ char s[20];int i=0; printf(“t请输入想修改的记录中的名字:”);scanf(“%s”,s); while(strcmp(per[i].name,s)!=0&&i printf(“t通讯录中没有此人!n”); return; } printf(“t编号:”); scanf(“t%d”,&per[i].score); printf(“t姓名:”); scanf(“t%s”,per[i].name); printf(“t年龄:”); scanf(“t%s”,per[i].age);printf(“t电话号码:”); scanf(“t%s”,per[i].num); printf(“t通讯住址:”); scanf(“t%s”,per[i].adds);printf(“t电子邮箱:”);scanf(“t%s”,per[i].email);printf(“t修改成功!”);} void WritetoText(Person per[],int n) { int i=0; FILE *fp; char filename[20]; printf(“t保存到文件n”); printf(“t请输入所保存的文件名:”); scanf(“t%s”,filename); if((fp=fopen(filename,“w”))==NULL) /*定义文件指针*/ /*定义文件名*/ /*输入文件名*/ { } fprintf(fp,“****************************************** 通 讯 录printf(”t无法打开文件n“);system(”pause“);return; ******************************************n”);fprintf(fp,“编号 姓名 年龄 电话号码 通讯地址 电子邮箱n”);; fprintf(fp,“%-3dt%-6st%-3st%-13st%-20st%-20sn”,per[i].score,per[i].name,per[i].agwhile(i ;fprintf(fp,“***************************************共有%d 条记录 } fprintf(fp,”----------------------------n“)i++; ****************************************n”,n); } void main() /*主函数*/ { int n=0;fclose(fp); /*关闭文件*/ printf(“保存成功!n”);for(;;){ switch(menu_select()) { case 1: printf(“nt添加记录到通讯录n”); n=Input(pe,n);break; case 2: printf(“nttt 通讯录记录表n”);Display(pe,n); break; case 3: printf(“nt从通讯录中删除记录n”);n=Delete_a_record(pe,n); printf(“t”); system(“pause”);break; case 4: printf(“nt在通讯录中查找记录n”);Query_a_record(pe,n); printf(“t”); system(“pause”); break; case 5: /*添加记录*/ /*显示记录*/ /*删除记录*/ /*查找记录*/ printf(“nt修改通讯录中的记录n”); Change(pe,n); printf(“t”); system(“pause”); break; case 6: printf(“nt保存功能n”); WritetoText(pe,n); printf(“t”); system(“pause”); break; case 0: printf(“ntt谢谢使用,再见!n”); printf(“ntt”); system(“pause”); exit(0); } } } /*修改数据*/ /*保存数据*/ /*结束程序*/ 4调试分析 调试的意义和目的:在管理信息系统的开发过程中,面对着错综复杂的各种问题,人的主观认识不可能完全符合客观现实,开发人员之间的思想交流也不可能十分完善。所以,在管理信息系统开发周期的各个阶段都不可避免地会出现差错。开发人员应力求在每个阶段结束之前进行认真、严格的技术审查,尽可能早的发现并纠正错误,否则等到系统投入运行后再回头来改正错误将在人力、物力上造成很大的浪费,有时甚至导致整个系统的瘫痪。然而,经验表明,单凭审查并不能发现全部差错,加之在程序设计阶段也不可避免还会产生新的错误,所以,对系统进行调试是不可缺少的,是保证系统质量的关键步骤。统计资料表明,对于一些较大规模的系统来说,系统调试的工作量往往占程序系统编制开发总工作量的40%以上。 调试的目的在于发现其中的错误并及时纠正,所以在调试时应想方设法使程序的各个部分都投入运行,力图找出所有错误。错误多少与程序质量有关。即使这样,调试通过也不能证明系统绝对无误,只不过说明各模块、各子系统的功能和运行情况正常,相互之间连接无误,系统交付用户使用以后,在系统的维护阶段仍有可能发现少量错误并进行纠正,这也是正常的。 4.1测试 1).显示的主菜单界面: 图4.1(1)主菜单界面 2).添加界面: 图4.1(2)添加界面 3).显示界面: 图4.1(3)显示界面 4).删除界面: 图4.1(4)删除前界面 删除后,通讯录里的显示记录: 图(4)删除后界面 5).查询界面:以姓名查询方式为例: 图4.1(5)查询界面 6).修改界面: 图4.1(6)修改前界面 修改后,通讯录里的显示记录: 图4.1(6)修改后界面 7).保存界面: 图4.1(7)保存界面 通讯录.txt 文件截图: 图4.1文件截图 4.2问题思考与调试: 1.当我在进行删除、查询、修改、保存等功能时,以查询为例,输入名字按回车后,虽然会显示该人的所有记录,但是显示后,它马上自动消失了,还没来得及等我看内容。因此,向别人请教后,在一些地方加入了system(“pause”);这个语言,用来对某项操作完成后进行暂停。 2.现在这个程序的界面个人感觉很清爽。但在最初,每次进行一项操作,运行窗口里的内容会一直保留着,感觉很杂乱,如下图(添加后,进行显示操作): 图4.2分析图 之后,我去网上寻求解决办法,知道可以使用system(“cls”);这一语句可以解决这个问题,最后,修改成功。5总结 这次的程序实设计实验是对我们进入大学以来学习程序设计语言结果的一次大检验。自己动手,自己发现和解决问题。发现了自己的许多不足。平时没有掌握好的知识在这次实验中彻底暴露出来,经过不断思考,不断查阅资料和上机运行,解决其中大部分问题,当然还存在一些问题没有解决。我相信在以后的学习能够解决好它们。但是,收获还是不小的,我不仅对C的操作有了进一步的掌握,还了解到了程序设计的书写风格及其注释的格式。 当我选择通讯录这个题目时,一开始想运用大量链表及指针来完成,但是在慢慢琢磨之后,觉得这个不一定要用链表,于是改变了编程思路。当然还有不少文件的读写问题,不过还是通过不断测试之后顺利解决了。另外一点要说的就是这个程序用了很多的循环,因此对于循环的控制要十分小心,有时while和do-while的区别也是十分重要的。 还有一点体会就是,书上和老师教的内容是有限的,我们需要不断地靠自己去学习,向他人请教,了解和掌握更多的知识,这样我们才能编出更好的C程序。 总体来说,这次C语言程序设计实验还是比较成功的,虽然最终程序还存在一些不足,但能取得这样的成绩我还是比较高兴的。 最后,要感谢学校为我们提供这次实验机会,也要感谢老师的教导和好心人对我的帮助与支持。 参考文献 [1]谭浩强,张基温。C语言程序设计教程。第三版。北京:高等教育出版社,2006 [2]谭浩强,张基温。C语言习题集与上机指导。第三版。北京:高等教育出版社,2006 [3]谭浩强。C程序设计(第三版)。北京:清华大学,2005 [4]谭浩强。C程序设计(第二版)。北京:清华大学,1999 [5]林建秋,韩静萍,等.C语言程序设计【M】.电子工业出版社,2004.[6]谭浩强.C语言程序设计【M】.清华大学出版社,2006.[7]黄维通.C语言设计教程.清华大学出版社,2005.[8]王成瑞.C语言程序设计.中国水利水电出版社,2005.[9]张基温.C语言程序设计案例教程.清华大学出版社,2004.[10]苏小红,陈惠鹏.C语言大学实用教程【M】.电子工业出版社,2007.致 谢 在这里我要感谢杨书鸿老师,她对我进行了无私的指导和帮助,不厌其烦的帮助进行论文的修改和改进。另外,在校图书馆查找资料的时候,图书馆的老师也给我提供了很多方面的支持与帮助。在此向帮助和指导过我的各位老师表示最中心的感谢!感谢这篇论文所涉及到的各位学者,如果没有各位学者的研究成果的帮助和启发,我将很难完成本篇论文的写作。感谢我的同学和朋友,在我写论文的过程中给予我很多素材,还在论文的撰写和排版等过程中提供热情的帮助。由于我的学术水平有限,所写论文难免有不足之处,恳请各位老师和学友批评和指正! 《数据结构》课程设计报告 计算机学院 软件工程专业 题目: 通信录查询系统(查找应用) 班级:软件102班 第11组 组长: 姓名:李伟 学号:1006550222 组员: 姓名:李呢 学号:1006550219 姓名:李强 学号:1006550221 指导老师:xxx 日期:2011 年 12月 30日 程序设计书目录 一、程序设计目标 二、问题描述 三、需求分析(说明课程设计的任务) 四、概要设计(说明课程设计中用到的抽象数据类型的定义、主程序的流程以及各程序模块之间的调用关系等) 五、详细设计(实现程序模块的具体算法) 六、软件说明书(给出软件应如何使用,使用时的注意事项) 七、源程序清单(要求400行以上,要有注释说明) 八、测试报告(调试过程中遇到的问题及解决方法,并列出测试结果,包括输入和输出) 九、课程设计总结 一、程序设计目标 通过本次课设进一步的了解哈希表函数及哈希表等有关概念,2 掌握哈希表查找的过程及方法。复习巩固大一时期学过的c语言知识。进一步加深对c语言、数据结构、离散数学等基础技能的理解和掌握。 让我们有一个既动手又动脑,独立实践的机会,可以让我们将课本上的理论知识和实际邮寄的结合起来,锻炼我们的分析解决实际问题的能力。提高我们实践编程能力。 通过本项课程设计,掌握工程软件设计的基本方法,强化上机动手编程能力,闯过理论与实践相 结合的难关!更加了解了c语言的好处和其可用性!同时增加了同学之间的团队合作精神!更加也体会到以后在工作中团队合作的重要性和必要性!通过C语言课程设计,使学生了解高级程序设计语言的结构,掌握基本的程序设计过程和技巧,掌握基本的分析问题和利用计算机求解问题的能力,具备初步的高级语言程序设计能力。为后续各门计算机课程的学习和毕业设计打下坚实基础。 二、问题描述 设计散列表实现通讯录查找系统。 (1)设每个记录有下列数据项:电话号码、用户名、地址; (2)从键盘输入各记录,分别以电话号码为关键字建立散列表; (3)采用二次探测再散列法解决冲突;(4)查找并显示给定电话号码的记录;(5)通讯录信息文件保存; (6)要求人机界面友好,使用图形化界面; 三、需求分析 一.查询:用户有一个电话号码,但不知道此电话号码是谁的,则需要输入号码来查询该号码是不是此通讯录中已记录的人的 号码,若是即显示该号码及姓名、所在地,若不是则显示“无记录”。 进入主菜单界面,输入4,进入通讯录查询模块。输入你想要搜索通讯人的电话号码。屏幕输出所搜通讯人的先关信息。二.通讯录信息添加: 若要向通讯录中添加新号码,也分两种情况:1若该通讯录是新的,既没有任何通讯记录的,则直接往里添加,需先输入姓名,随即输入号码和所在地,用于存储。2若通讯录不是空的,再添加新号码时则需在最后一个号码后面进行添加(输入姓名、电话号码及所在地),以此类推。 进入主菜单,输入1,进入通讯录信息添加模块。按照要求依次输入姓名、电话号码、住址。三.通讯录信息删除: 若要对通讯录中的内容进行删除: 然后输入所要删除的号码进行删除 删除成功。出现提示信息。按任意键回到主菜单。 四、概要设计 对功能键相对应的函数分别对各个函数在程序中进行定义如下: void Menu()void Create()void Append()void CreateHash()void Find()void Delete()void Alter()void List()void Save() void Load() 然后根据各功能键的选择主函数分别调用功能键相对应 4 的函数来实现通讯录的查询系统。 五、详细设计 1、定义结构体变量 typedef struct people //记录 { NA name;NA tel;//关键字 NA add;}Record;//查找表中记录类型 typedef struct //建立哈希表 { Record *elem[HASHSIZE];//数据元素存储基址 int count;//当前数据元素个数 int size;//当前容量 }HashTable; 2、定义显示函数 void Menu() 3、定义建立时间的函数 void benGetTime() 4、定义创建新的通讯录并添加信息的函数 void Create(Record* a) 5、定义关键字比较函数 Status eq(NA x,NA y) 6、定义添加信息函数 void Append(Record* a) 7、定义显示通讯录中所有信息函数 void List(Record* a) 8、定义哈希函数 int Hash(NA str) 9、定义冲突处理函数 Status collision(int p,int &c) 10、定义建立散列表的函数 void CreateHash(HashTable* H,Record* a) 11、定义通讯录查找的函数 void Find(HashTable* H,int &c) 12、定义修改信息的函数 void Alter(HashTable* H,int &c) 13、定义删除信息的函数 void Delete(HashTable* H,int &c) 14、定义保存信息到指定文件的函数 void Save(HashTable* H) 15、定义从指定文件中读取信息的函数 void Load() 16、定义主函数 int main(int argc, char* argv[]){ system(“color FO”);system(“CLS”);int c,flag=1;HashTable *H;H=(HashTable*)malloc(LEN);for(int i=0;i case 0:Quit();return 0;break;case 10:;;break;default: printf(“你输错了,请重新输入!”);printf(“n”);} system(“CLS”);} return 0;} 六、软件说明书 双击程序,程序运行后,进入通信录查询系统菜单的操作界面,然后采用键盘进行操作。各功能键的选择如下: 1、创建新的通讯录并写入新的信息 2、添加某人的信息 3、以电话号码建立散列表 4、查找并显示给定电话号码的记录 5、删除某人的信息 6、修改某人的信息 7、显示通讯录中所有记录 8、保存通讯录所有记录到指定文件 9、从指定文件中读取通讯录中的记录 0、退出选单 选择1,建立新的通讯录,通讯录创建成功,按Enter键进入添加信息界面,界面会出现 根据系统提示进行相应的添写,添加成功之后,按Enter键返回主菜单。 选择2,在通讯录的末尾写入新的信息,与上诉添加信息操作相同。同样按Enter键返回主菜单。 选择3,会立即调用冲突处理函数以及建立散列表,界面上会显示冲突次数,哈希表容量和当前储存记录的个数,按Enter键返回主菜单。3功能键必须在4、5、6功能键之前选择,才能使4、5、6功能键派上用场。 选择4,查找某人信息,写入查找的电话号码,如果通讯录中有则会出现查找成功否则出现此人不存在,查找不成功。按Enter键返回主菜单。 选择5,删除某人信息,写入删除的电话号码,如果通讯录中有则会出现删除成功否则出现此人不存在,删除不成功。按Enter键返回主菜单。 选择6,修改某人信息,写入修改的电话号码,通过查找函数找到要修改的信息,在对找的的信息进行修改,如果通讯录中 有则会出现原信息让用户输入修改后的信息,根据系统的提示输入修改后的信息,按Enter键会出现修改成功,否则出现此人不存在,修改不成功。按Enter键返回主菜单。 选择7,界面会输出全部成员的信息。按Enter键返回主菜单。选择8,利用存盘函数保存数据到指定文件,界面会出现保存成功,按Enter键返回主菜单。 选择9,载入存储过的电话、姓名、地址,界面会出现指定文件所存储的所有信息。按Enter键返回主菜单。选择0,显示再见,按Enter键退出系统。 七、源程序清单 #include typedef struct people //记录 { NA name;NA tel;//关键字 NA add;}Record;//查找表中记录类型 typedef struct //建立哈希表 { Record *elem[HASHSIZE];//数据元素存储基址 int count;//当前数据元素个数 int size;//当前容量 }HashTable;int i;void Menu(){ printf(“ n”);printf(“ ## ttt ―――――― ttt ##n”);printf(“ # ttt 丨 1.创建 丨 # n”);printf(“ # ttt ―――――― #n”);printf(“ # ttt 丨 2.写入 丨 #n”);printf(“ # ttt ―――――― #n”);printf(“ # ttt 丨 3.建表 丨 #n”);printf(“ # ttt ―――――― #n”);printf(“ # ttt 丨 4.查找 丨 #n”);printf(“ # ttt ―――――― #n”);printf(“ # ttt 丨 5.删除 丨 #n”);printf(“ # ttt ―――――― #n”);printf(“ # ttt 丨 6.修改 丨 #n”);printf(“ # ttt ―――――― #n”);printf(“ # ttt 丨 7.查看 丨 #n”);printf(“ # ttt ―――――― #n”);printf(“ # ttt 丨 8.保存 丨 #n”);printf(“ # ttt ―――――― #n”);printf(“ # ttt 丨 9.读取 丨 #n”);printf(“ # ttt ―――――― #n”);printf(“ # ttt 丨 0.退出 丨 #n”);printf(“ ## ttt ―――――― ##n”);printf(“ n”);} void benGetTime()//建立时间函数 { SYSTEMTIME sys;GetLocalTime(&sys);printf(“%4d/%02d/%02d %02d:%02d:%02d.%03d n”,sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute, sys.wSecond,sys.wMilliseconds);} Status NUM_BER;//记录的个数 Status NUM_BER1; void Create(Record* a)//创建新的通讯录 { system(“CLS”);//调用DOS命令CLS能够清屏 FILE *fp1,*fp2;if((fp1=fopen(“record.txt”,“r”))!=NULL)//打开文件 { fclose(fp1);//关闭文件 } else { fp2=fopen(“record.txt”,“w”);//如果不存在record.txt就创建一个 fclose(fp2);11 } printf(“n”); printf(“ #####n”);printf(“==================== → 创建成功 ← ===================n”); printf(“ #####n”); printf(“n”);printf(“◇◆请按ENTER进入添加通讯信息菜单◇◆n”);getchar();system(“CLS”);system(“CLS”);//调用DOS命令CLS能够清屏 printf(“ #####n”);printf(“==================== → 用户信息记录表 ← ===================n”); printf(“ #####n”);printf(“输入要添加的个数:n”);scanf(“%d”,&NUM_BER);for(i=0;i { printf(“请输入第%d个记录的用户名:n”,i+1);scanf(“%s”,a[i].name);printf(“请输入%d个记录的电话号码:n”,i+1);scanf(“%s”,a[i].tel);printf(“请输入第%d个记录的地址:n”,i+1);scanf(“%s”,a[i].add); } getchar(); printf(“ #n”); printf(“添加成功!!n”); benGetTime();printf(“~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~n”);printf(“◇◆请按ENTER返回功能操作菜单◇◆n”);printf(“ #n”);12 getchar();} Status eq(NA x,NA y)//关键字比较,相等返回SUCCESS;否则返回UNSUCCESS { if(strcmp(x,y)==0){ return SUCCESS;} else return UNSUCCESS;} void Append(Record* a)//键盘输入各人的信息 { system(“CLS”);//调用DOS命令CLS能够清屏 printf(“ #####n”);printf(“==================== → 用户信息记录表 ← ===================n”); printf(“ #####n”);printf(“输入要添加的个数:n”);scanf(“%d”,&NUM_BER1);int j=i;for(i;i printf(“ #n”); printf(“添加成功!!n”); benGetTime();13 printf(“~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~n”);printf(“◇◆请按ENTER返回功能操作菜单◇◆n”);printf(“ #n”);getchar();} void List(Record* a)//显示通讯录中所有记录 { Record *p;p=a;int i;system(“CLS”);//调用DOS命令CLS能够清屏 printf(“ #####n”);printf(“==================== → 用户信息记录表 ← ===================n”); printf(“ #####n”);if(a!=NULL){ printf(“nn姓名t电话号tt地址n”); printf(“_____________________________________________________n”);for(i=0;i { printf(“%st%stt%sn”,a[i].name,a[i].tel,a[i].add); printf(“_____________________________________________________n”); } } else { printf(“对不起!没有任何联系人记录!nn”); printf(“===============n”);} benGetTime();printf(“ #####n”);14 printf(“◇◆请按ENTER返回功能操作菜单◇◆n”);printf(“ #####n”);getchar();} int Hash(NA str)//哈希函数 { system(“CLS”);//调用DOS命令CLS能够清屏 long n;int m;n = atoi(str);//整型数.m=n%HASHSIZE;//造哈希函数 return m;//} Status collision(int p,int &c)//用二次探测再散列法解决冲突 { int i,q;i=c/2+1;while(i { return q; } else { i=c/2+1; } } else { q=(p-i*i)%HASHSIZE;把字符串转换成用除留余数法构并返回模值 冲突处理函数,采15 c++;if(q>=0) { return q; } else { i=c/2+1; } } } return UNSUCCESS;} void CreateHash(HashTable* H,Record* a)//建表,以电话号码为关键字,建立相应的散列表 { system(“CLS”);//调用DOS命令CLS能够清屏 int i,p=-1,c,pp;for(i=0;i { pp=collision(p,c);//若哈希地址冲突,进行冲突处理 if(pp<0) { printf(“ #####n”);printf(“==================== → 用户信息记录表 ← ===================n”); printf(“ #####n”);printf(“第%d记录无法解决冲突”,i+1);//需要显示冲突次数时输出 continue; } //无法解决冲突,跳入下一循环 } H->elem[pp]=&(a[i]);//求得哈希地址,将信息存入 H->count++; printf(“ #####n”);printf(“==================== → 用户信息记录表 ← ===================n”); printf(“ #####n”);printf(“第%d个记录冲突次数为%d。n”,i+1,c);//需要显示冲突次数时输出 } printf(“n建表完成!n此哈希表容量为%d,当前表内存储的记录个数为%d.n”,HASHSIZE,H->count);benGetTime();printf(“ #####n”);printf(“◇◆请按ENTER返回功能操作菜单◇◆n”);printf(“ #####n”);getchar();} void Find(HashTable* H,int &c)//在通讯录里查找电话号码关键字,若查找成功,显示信息 { system(“CLS”);//调用DOS命令CLS能够清屏 printf(“ #####n”);printf(“==================== → 用户信息记录表 ← ===================n”); printf(“ #####n”);benGetTime();17 NA tele;printf(“n请输入要查找记录的电话号码:n”);scanf(“%s”,tele);int p,pp;p=Hash(tele);pp=p;while((H->elem[pp]!=NULL)&&(eq(tele,H->elem[pp]->tel)==-1))pp=collision(p,c);if(H->elem[pp]!=NULL&&eq(tele,H->elem[pp]->tel)==1){ printf(“ #####n”);printf(“==================== → 用户信息记录表 ← ===================n”); printf(“ #####n”);printf(“n查找成功!n查找过程冲突次数为%d.以下是您需要要查找的信息:nn”,c);// printf(“姓 名:%sn电话号码:%sn联系地址:%sn”,H->elem[pp]->name,H->elem[pp]->tel,H->elem[pp]->add); printf(“nn姓名t电话号tt地址n”); printf(“_____________________________________________________n”); printf(“%st%stt%sn”,H->elem[pp]->name,H->elem[pp]->tel,H->elem[pp]->add); printf(“_____________________________________________________n”);} else printf(“n此人不存在,查找不成功!n”);benGetTime();getchar();printf(“ #####n”);printf(“◇◆请按ENTER返回功能操作菜单◇◆n”);printf(“ #####n”);getchar();} void Alter(HashTable* H,int &c)//在通讯录里修改某人信息 { system(“CLS”);//调用DOS命令CLS能够清屏 printf(“ #####n”);printf(“==================== → 用户信息记录表 ← ===================n”); printf(“ #####n”);benGetTime();NA tele;printf(“n请输入要修改记录的电话号码:n”);scanf(“%s”,tele);int p,pp;p=Hash(tele);pp=p;while((H->elem[pp]!=NULL)&&(eq(tele,H->elem[pp]->tel)==-1))pp=collision(p,c);if(H->elem[pp]!=NULL&&eq(tele,H->elem[pp]->tel)==1){ printf(“ #####n”);printf(“==================== → 用户信息记录表 ← ===================n”); printf(“ #####n”); printf(“n以下是您需要修改的信息:”); printf(“n”); printf(“nn姓名t电话号tt地址n”); printf(“_____________________________________________________n”); printf(“%st%stt%sn”,H->elem[pp]->name,H->elem[pp]->tel,H->elem[pp]->add); printf(“_____________________________________________________n”); (H->elem)[pp]->tel[0]=' '; printf(“请输入修改后记录的用户名:n”);scanf(“%s”,H->elem[pp]->name);printf(“请输入修改后记录的电话号码:n”);scanf(“%s”,H->elem[pp]->tel);printf(“请输入修改后记录的地址:n”);scanf(“%s”,H->elem[pp]->add); printf(“修改成功!!”);} else { printf(“ #####n”);printf(“==================== → 用户信息记录表 ← ===================n”); printf(“ #####n”); benGetTime(); printf(“n此人不存在,修改不成功!n”);} getchar();printf(“ #####n”);printf(“◇◆请按ENTER返回功能操作菜单◇◆n”);printf(“ #####n”);getchar();} void Delete(HashTable* H,int &c)//在通讯录里查找电话号码关键字,若查找成功,显示信息然后删除 { system(“CLS”);//调用DOS命令CLS能够清屏 printf(“ #####n”);printf(“==================== → 用户信息记录表 ← ===================n”); printf(“ #####n”);benGetTime();NA tele;printf(“n请输入要删除记录的电话号码:n”);m++;scanf(“%s”,tele);int p,pp;p=Hash(tele);pp=p;while((H->elem[pp]!=NULL)&&(eq(tele,H->elem[pp]->tel)==-1))pp=collision(p,c);if(H->elem[pp]!=NULL&&eq(tele,H->elem[pp]->tel)==1){ printf(“ #####n”);printf(“==================== → 用户信息记录表 ← ===================n”); printf(“ #####n”);printf(“n以下是您需要要删除的信息:nn”,c); printf(“nn姓名t电话号tt地址n”); printf(“_____________________________________________________n”); printf(“%st%stt%sn”,H->elem[pp]->name,H->elem[pp]->tel,H->elem[pp]->add); printf(“_____________________________________________________n”); printf(“n”); (H->elem)[pp]->tel[0]=' '; printf(“删除成功!!”);} else printf(“n此人不存在,删除不成功!n”);benGetTime();getchar();printf(“ #####n”);printf(“◇◆请按ENTER返回功能操作菜单◇◆n”);21 printf(“ #####n”);getchar();} void Save(HashTable * H)//将记录保存到指定文件 { system(“CLS”); FILE* fp; if((fp=fopen(“record.txt”,“w”))!=NULL) { fprintf(fp,“ #####n”);fprintf(fp,“==================== → 用户信息记录表 ← ===================n”); fprintf(fp,“ #####n”);for(int i=0;i { if((H->elem)[i]!=' ') { fprintf(fp,“======n”);fprintf(fp,“联系人姓名:%sn”,H->elem[i]->name);fprintf(fp,“联系人电话:%sn”,H->elem[i]->tel);fprintf(fp,“联系人地址:%sn”,H->elem[i]->add); fprintf(fp,“======n”); } } fclose(fp); printf(“ #####n”);printf(“==================== → 用户信息记录表 ← ===================n”); printf(“ #####n”); benGetTime();22 printf(“nn恭喜你!成功储存,你能在record.txt找到相应纪录n”); printf(“ #####n”); system(“pause”); } else { benGetTime(); printf(“抱歉,保存记录失败!”); system(“pause”); } } void Load(){ system(“CLS”);ifstream inFile;inFile.open(“record.txt”);// 打开文件 string str;// 行字符串缓存 if(inFile.is_open())// 若成功打开文件 { while(!inFile.eof())// 若未到文件结束 { getline(inFile, str, 'n');// 读取一行内容,并存入缓存str中,'n'表示一行结束的回车符 cout << str << endl;// 把缓存内容输出到屏幕 } } inFile.close();printf(“ #####n”);printf(“◇◆请按ENTER返回功能操作菜单◇◆n”);printf(“ #####n”);getchar();} void Quit()//结束 { system(“cls”);23 system(“color F0”); printf(“ n”); printf(“☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★n”); printf(“ 谢谢使用!再见!!n”); printf(“☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★n”); printf(“ n”);} int main(int argc, char* argv[]){ system(“color F0”);system(“CLS”);//调用DOS命令CLS能够清屏 int c,flag=1;HashTable *H;H=(HashTable*)malloc(LEN);for(int i=0;i case 0:Quit();return 0;break;case 10:;;break;default: printf(“你输错了,请重新输入!”);printf(“n”);} system(“CLS”);} return 0;} 八、测试报告 首先在编程过程中最先遇到的问题是用int整形定义电话号只能存10位,而现在手机号都为11位,用double双精度浮点型在进行哈希函数时会有错误,我们组最后经查询与询问老师后确定的解决办法是以字符串形式进行存储,哈希函数进行计算时把字符串转换成整型数。 起初我们在进行本地保存和读取是数据时是以数据块的形式进行存储但是后期遇到问题在进行修改和删除时过于复杂和繁琐,违背了程序的本意,经网上与书籍查询和老师的指导最后换为以字符进行存储.在建立哈希函数后进行的二次探测在散列的(1,-1,4,-4,9,-9。。。)的算法没有及时总结出来,最后经我组讨论以如下方法解决: Status collision(int p,int &c)//冲突处理函数,采用二次探测再散列法解决冲突 { int i,q;i=c/2+1;while(i { return q; } else { i=c/2+1; } } else { q=(p-i*i)%HASHSIZE;c++;if(q>=0) { return q; } else { i=c/2+1; } } } return UNSUCCESS;} 第一次c传进来的值为0运行时i为1,c%2=0,c++(c为1),p+i*i(i*i=1)。 第二次c传进来的值为1运行时i仍然为1(因为i是整型),c%2不等于0,p-i*i(i*i=1),c++(c为2)。下面为程序的运行测试: 进入界面首先输入1创建通讯录; 提示创建成功输入回车直接进入添加功能; 输入添加数1,姓名电话和地址然后回车确认,提示添加成功; 回车退回选单输入2进入追加通讯信息功能; 输入2添加两个记录提示添加成功按回车回到选单; 输入3进入建表功能提示有三个记录冲突数为2,***与***冲突; 回车回到选单是,输入4进入查询功能; 输入电话号回车显示查询成功,显示信息; 如果不存在这显示不成功; 回车返回选单输入5进入删除功能,输入电话号; 显示删除信息,提示删除成功; 回车返回选单,输入6进入修改功能,输入电话号; 查询到信息则显示并提示输入新信息人,输入后提示成功; 没有提示侧人不存在; 回车返回选单,输入7查看所有信息; 回车返回选单,输入8保存信息到record.txt中; record.txt文件中的信息; 输入9读取信息,显示所有已存信息; 回车返回选单,输入0显示再见,退出程序。 黑龙江工程学院 第一章 问题分析和任务定义 1.1 问题分析 问题: 编写一个通讯录管理系统。要求包括通讯录建立、增加号码、删除号码、查询号码(按姓名、按号码)、修改号码、号码分组、打印通讯录(全部或分组号码)等功能,并设计主控菜单和子菜单供用户选择要执行的操作。 分析: 实现以下功能: 1)通讯录编辑(添加、删除); 2)按不同的项进行查找; 3)对已存在的通讯录按不同的项排序; 4)将通讯录写入文件; 5)从文件读入通讯录。 1.2 任务定义 创建一个链表,每个节点有姓名和号码以及关系三个信息。增加号码操作为增加节点,删除号码操作为删除节点,查找号码为链表的遍历。每个功能以函数的形式出现,由主控菜单控制。并以文件的形式对号码信息进行保存。 第二章 详细设计 主函数(main()函数)是通过一个多分支语句(switch(i)语句)实现的。显示菜单函数(displaymenu()函数)显示与用户交互的界面。以下是各个模块实现程序各项功能的函数的详细设计: 1、插入新的记录:insert()函数 定义变量,设计loop模块,模块的功能是用来输入记录:输入姓名、性别、电话号码、地址的信息。用for语句查找是否输入了与原有记录相同的记录,用strcmp 函数比较,if 语句判断,如果输入了重复的记录,提示信息:“此记录已存在,请重新输入!”并且用 goto语句返回到loop,重新输入信息。设计一个a模块:键盘输入一个字符,必须是“Y”“y”“N”“n”,否则重新输入。最后if 语句判断变量的值是否重新输入信息,如果输入的是“Y”或“y”,返回到loop,黑龙江工程学院 用户可以输入下一条信息,直到用户输入“N”或“n”返回主界面。每插入一条记录n的值加1。功能的实现见源程序: 2、示好友的信息:display()函数 定义整型变量i用来循环输出记录。分别输出每条记录,并输出记录的个数。 3、查找好友的信息search()函数 定义字符型变量c,字符型数组a,定义loop模块,功能:通过键盘输入要查找的信息。首先显示提示信息:“输入你要查找的好友的姓名”然后从键盘输入姓名。For语句循环内嵌if语句,用strcmp 函数查找信息,并且显示该记录的所有信息,并跳出循环。再用for 语句内嵌if语句判断,如果没有查到显示提示信息:“如果没有查到相关语句,是否重新查找(Y/N)?定义abc模块的功能输入一个字符(“Y”或“y”“N”“n”)用来判断是否重新查找。如果输入“Y”或“y”,则用goto语句返回loop重新查找。否则令i的值为n跳出循环。最后返回主界面。 4、删除好友信息:del()函数 首先定义字符数组、变量和a、b两个goto标识符。在a模块中用scanf函数输入要删除的好友的姓名,用for循环和if 语来实现对好友的查找,如果找到记录末尾,提示查无此人。在b模块中,用来实现删除功能。先确认是否删除,如果键盘输入Y 或y来确认要删除再执行for循环,通过strcmpy函数把后一条记录复制到前一条记录。进行删除记录后,并把原末尾记录数据赋空字符,按任意键删除,按任意键返回主菜单。 5、修改记录:modify()函数 定义了a、b两个goto标识符。在a模块中,用scanf函数输入要修改人的姓名,用for 循环、if语句及strcmp函数找到该姓名的记录,若到记录末尾提示“查无此人”是否继续重新输入姓名,黑龙江工程学院 如果重新输入姓名再用goto语句再执行重新查找。在b模块中,用于修改记录,如果要修改记录则从键盘输入Y或y,用scanf函数来输入新的记录数据来实现修改记录。 6、排序:sort()函数 选择法排序的方法。定义变量i,j,用于循环,定义4个字符型数组,用于替换的中间变量;用两个for循环语句,用strcmp函数比较。按姓名升序排序。比较前一条记录和后一条记录的姓名,如果strcmp函数值大于0,则将这两条记录的所有信息替换,4个字符型数组用作替换的中间变量。最后调用display()(显示结果)显示排序后的结果。 第三章 程序编码 #include 黑龙江工程学院 void format();int back(){ cout<<“ 返回还是回到主菜单(T为退出,R为回到主菜单,不计大小写): ”; char back; cin>>back; if(back=='R'||back=='r') return 1; else return 0;} void print(int i){ cout<<“学号:”< cout<<“姓名:”< cout<<“地址:”< cout<<“电话号码:”< cout<<“邮编:”< cout<<“E_MAIL:”< <<“tt★★★★★★★★★★★★★★★★★★★★★★★★★★” < <<“tt※ ※” < <<“tt※ 通 迅 录 ※” < <<“tt※ ※” < <<“tt※ 1.通讯录编辑.4.按序排列.※” < <<“tt※ ※” < <<“tt※ 2.查询联系人.5.将文件读入程序.※” < <<“tt※ ※” < <<“tt※ 3.将资料写入文件.6.格式化(慎用).※” < <<“tt※ ※” < <<“tt★★★★★★★★★★★★★★★★★★★★★★★★★★” < <<“tt ”< <<“ttt选择 :”;cin>>select1;switch(select1) 黑龙江工程学院 { case '1':cout<<“(1)添加:”< cout<<“(2)删除:”< cout<<“(3)修改:”< char select2; cout<<“ 请选择:”< cin>>select2; switch(select2) { case '1':cout<<“ 输入添加的资料:”< char no[13];char name[20];char address[100];char tel_no[12];char post_code[7];char e_mail[40]; cout<<“ 输入学号:”< cin>>no; cout<<“ 输入姓名:”< cin>>name; cout<<“ 输入地址:”< cin>>address; cout<<“ 输入电话号码:”< cin>>tel_no; cout<<“ 输入邮编:”< cin>>post_code;cout<<“ 输入E_mail:”< cin>>e_mail; a.add(no,name,address,tel_no,post_code,e_mail); cout<<“ 返回还是回到主菜单(T为退出,R为回到主菜单,不计大小写): ”; char back_add; cin>>back_add; if(back_add=='R'||back_add=='r') goto top; else goto bottom; break; case '2':cout<<“ 输入要删除人的姓名:”< char name2[20]; cin>>name2; a.del(name2); cout<<“ 返回还是回到主菜单(T为退出,R为回到主菜单,不计大小写): ”; 黑龙江工程学院 “; ”; char back_del; cin>>back_del; if(back_del=='R'||back_del=='r') goto top; else goto bottom; break;case '3':cout<<“ 输入需要修改人的姓名:”< char name3[20]; cin>>name3; if(a.correct(name3)) goto top; else goto bottom; break;} break;case '2':cout<<“(1)根据姓名查找”< cout<<“ 输入姓名: ”; cin>>name4; a.find2(name4); cout<<“ 返回还是回到主菜单(T为退出,R为回到主菜单,不计大小写): char back_f1;cin>>back_f1;if(back_f1=='R'||back_f1=='r') goto top;else goto bottom;break;case '2':char no4[13];cout<<” 输入学号: “;cin>>no4;a.find1(no4); cout<<” 返回还是回到主菜单(T为退出,R为回到主菜单,不计大小写): char back_f2;cin>>back_f2; 黑龙江工程学院 “; ”; if(back_f2=='R'||back_f2=='r') goto top; else goto bottom; break;} break;case '3':a.write();cout<<“ 返回还是回到主菜单(T为退出,R为回到主菜单,不计大小写): ”;char back_w;cin>>back_w;if(back_w=='R'||back_w=='r') goto top;else goto bottom;break;case '4':cout<<“(1)按学号排序:”< cout<<“ 返回还是回到主菜单(T为退出,R为回到主菜单,不计大小写): char back;cin>>back;if(back=='R'||back=='r') goto top;else goto bottom;break;case '2':a.list2();cout<<” 返回还是回到主菜单(T为退出,R为回到主菜单,不计大小写): } char back1;cin>>back1;if(back1=='R'||back1=='r')goto top;else goto bottom;break; 黑龙江工程学院 break;case '5':a.read(); cout<<“ 返回还是回到主菜单(T为退出,R为回到主菜单,不计大小写): ”; char back_r; cin>>back_r; if(back_r=='R'||back_r=='r') goto top; else goto bottom; break;case '6':cout<<“ 请确认删除所有资料!(Y/N)”; char select5; cin>>select5; if(select5=='Y'||select5=='y') a.format(); cout<<“ 返回还是回到主菜单(T为退出,R为回到主菜单,不计大小写): ”; char back_f; cin>>back_f; if(back_f=='R'||back_f=='r') goto top; else goto bottom; break;} bottom:cout<<“ ★★★★★★★★★★★★★★★★★★★★★★★ ”< void inter::add(char no[13],char name[20],char address[100],char tel_no[12],char post_code[7],char e_mail[40]){ int x=1;for(int i=0;i<35;i++){ if(!strcmp(st[i].no,“0”)) { strcpy(st[i].address,address); strcpy(st[i].e_mail,e_mail); strcpy(st[i].name,name); strcpy(st[i].no,no); strcpy(st[i].post_code,post_code); strcpy(st[i].tel_no,tel_no); x=0; } 黑龙江工程学院 if(x==0) break;} } //删除联系人 void inter::del(char name[20]){ int x=1;for(int i=0;i<35;i++){ if(!strcmp(st[i].name,name)) { strcpy(st[i].address,“0”); strcpy(st[i].e_mail,“0”); strcpy(st[i].name,“0”); strcpy(st[i].no,“0”); strcpy(st[i].post_code,“0”); strcpy(st[i].tel_no,“0”); } else x=0;} if(x==0) cout<<“ error:输入姓名错误!”< int inter::correct(char name[30]){ int x;for(int i=0;i<35;i++){ if(!strcmp(st[i].name,name)) x=i;} char select;cout<<“(1)修改姓名:”< 黑龙江工程学院 char name1[30]; cin>>name1; strcpy(st[x].name,name1); cout<<“ 修改成功!”< return back(); break;case '2':cout<<“ 输入要修改的学号:”; char no1[13]; cin>>no1; strcpy(st[i].no,no1); cout<<“ 修改成功!”< return back(); break;case '3':cout<<“ 输入要修改的地址:”; char address1[100]; cin>>address1; strcpy(st[x].address,address1); cout<<“ 修改成功!”< return back(); break;case '4':cout<<“ 输入要修改的邮编:”; char post_code1[7]; cin>>post_code1; strcpy(st[x].post_code,post_code1); cout<<“ 修改成功!”< return back(); break;case '5':cout<<“ 输入要修改的电话号码:”; char tel_no1[12]; cin>>tel_no1; strcpy(st[x].tel_no,tel_no1); cout<<“ 修改成功!”< return back(); break;case '6':cout<<“ 输入要修改的E_MAIL:”; char e_mail1[40]; cin>>e_mail1; strcpy(st[x].e_mail,e_mail1); cout<<“ 修改成功!”< return back(); break;} } //按学号查询联系人 黑龙江工程学院 void inter::find1(char no[13]){ int x,y=1,z=1;for(int i=0;i<35;i++){ if(!strcmp(st[i].no,no)) { x=i; z=0; } else y=0; if(z==0) break;} if(y==0) cout<<“ 输入的学号查找不到!!”< } //按姓名查询联系人 void inter::find2(char name[20]){ int x,y=1,z=1;for(int i=0;i<35;i++){ if(!strcmp(st[i].name,name)) { x=i; z=0; } else y=0; if(z==0) break;} if(y==0) cout<<“ 输入的姓名查找不到!!”< void inter::read(){ char name1[20];cout<<“ 输入你要导入的文件名: ”;cin>>name1; 黑龙江工程学院 strcat(name1,“.txt”);ifstream file(name1);char line[120];char no[120];char name[120];char address[120];char post_code[120];char tel_no[120];char e_mail[120];int time=0;file.getline(line,120);while(!file.eof()){ for(int k=0;k<35;k++){ if(time==0) { strcpy(no,line); time=1; for(int i=0;i<120;i++) { if(no[i]==':') { i++; for(int j=0;j<13;j++) { st[k].no[j]=no[i]; i++; } } } file.getline(line,120,'n'); } if(time==1){ strcpy(name,line); time=2; for(int i=0;i<120;i++) { if(name[i]==':') { i++; for(int j=0;j<20;j++) { 黑龙江工程学院 st[k].name[j]=name[i]; i++; } } } file.getline(line,120,'n');} if(time== 2){ strcpy(address,line);time=3;for(int i=0;i<120;i++){ if(address[i]==':') { i++; for(int j=0;j<100;j++) { st[k].address[j]=address[i]; i++; } } } file.getline(line,120,'n');} if(time==3){ strcpy(tel_no,line);time=4;for(int i=0;i<120;i++){ if(tel_no[i]==':') { i++; for(int j=0;j<12;j++) { st[k].tel_no[j]=tel_no[i]; i++; } } } file.getline(line,120,'n');} 黑龙江工程学院 if(time==4) { strcpy(post_code,line); time=5; for(int i=0;i<120;i++) { if(post_code[i]==':') { i++; for(int j=0;j<7;j++) { st[k].post_code[j]=post_code[i]; i++; } } } file.getline(line,120,'n'); } if(time==5) { strcpy(e_mail,line); time=0; for(int i=0;i<120;i++) { if(e_mail[i]==':') { i++; for(int j=0;j<40;j++) { st[k].e_mail[j]=e_mail[i]; i++; } } } file.getline(line,120,'n'); } } } file.close();} //写入文件 void inter::write(){ char name[20]; 黑龙江工程学院 cout<<“ 输入要保存的文件名 ”;cin>>name;strcat(name,“.txt”);ofstream savefile(name);for(int i=0;i<35;i++){ savefile << “学号:”< savefile << “姓名:”< savefile << “地址:”< savefile << “电话号码:”< savefile << “邮编:”< savefile << “E_MAIL:”< void inter::list1(){ for(int i=0;i<34;i++){ for(int j=0;j<35-i;j++) { if(strcmp(st[j].no,st[j+1].no)>0) { char no[13];char name[20];char address[100];char tel_no[12];char post_code[7];char e_mail[40]; strcpy(no,st[j].no); strcpy(st[j].no,st[j+1].no); strcpy(st[j+1].no,no); strcpy(name,st[j].name); strcpy(st[j].name,st[j+1].name); strcpy(st[j+1].name,name); strcpy(address,st[j].address); strcpy(st[j].address,st[j+1].address); strcpy(st[j+1].address,address); strcpy(tel_no,st[j].tel_no); 黑龙江工程学院 strcpy(st[j].tel_no,st[j+1].tel_no); strcpy(st[j+1].tel_no,tel_no); strcpy(post_code,st[j].post_code); strcpy(st[j].post_code,st[j+1].post_code); strcpy(st[j+1].post_code,post_code); strcpy(e_mail,st[j].e_mail); strcpy(st[j].e_mail,st[j+1].e_mail); strcpy(st[j+1].e_mail,e_mail); } } } for(int k=0;k<35;k++){ int x=0; if(strcmp(st[k].no,“0”)) { print(k); x=1; } if(x==1) { cout< cout<<“---------------”< } } } //按姓名排序 void inter::list2(){ for(int i=0;i<34;i++){ for(int j=0;j<35-i;j++) { if(strcmp(st[j].name,st[j+1].name)>0) { char no[13];char name[20];char address[100];char tel_no[12];char post_code[7]; 黑龙江工程学院 char e_mail[40]; strcpy(no,st[j].no); strcpy(st[j].no,st[j+1].no); strcpy(st[j+1].no,no); strcpy(name,st[j].name); strcpy(st[j].name,st[j+1].name); strcpy(st[j+1].name,name); strcpy(address,st[j].address); strcpy(st[j].address,st[j+1].address); strcpy(st[j+1].address,address); strcpy(tel_no,st[j].tel_no); strcpy(st[j].tel_no,st[j+1].tel_no); strcpy(st[j+1].tel_no,tel_no); strcpy(post_code,st[j].post_code); strcpy(st[j].post_code,st[j+1].post_code); strcpy(st[j+1].post_code,post_code); strcpy(e_mail,st[j].e_mail); strcpy(st[j].e_mail,st[j+1].e_mail); strcpy(st[j+1].e_mail,e_mail); } } } for(int k=0;k<35;k++){ int x=0; if(strcmp(st[k].no,“0”)) { print(k); x=1; } if(x==1) { cout< cout<<“-------”< } } 黑龙江工程学院 } //格式化 void inter::format(){ for(int i=0;i<35;i++){ strcpy(st[i].address,“0”); strcpy(st[i].e_mail,“0”); strcpy(st[i].name,“0”); strcpy(st[i].no,“0”); strcpy(st[i].post_code,“0”); strcpy(st[i].tel_no,“0”);} } 第四章 程序调试与测试 运行程序,首页显示如下: 按1选择通讯录编辑,编辑通讯录,显示(1)添加,(2)删除,(3)修改,运行后结果如下: 黑龙江工程学院 第一次使用,按1添加联系人,填入相关信息,运行图如下: 返回首页,按2可以查找联系人,可以根据姓名查找和学号查找,本次运用学号查找,运行如下: 返回首页,按4可以进行排序,可以根据姓名和学号排序,按姓名排序需要自己编辑的姓氏排序规则才能使用,本次使用学号排序,运行如下: 将资料写入文件功能是将编辑好的通讯录写入文本文件,文本文件的名字可以自己输入。将文件读入程序,是将文本文件中的信息读入程序,进行添加,修改,删除,排序等功能。 第五章 结果分析 总体上可以满足一般的应用需求,但是还有一定的不足,程序运行流畅,没有未知错误。 第六章 设计创新及心得 黑龙江工程学院 程设计是培养学生综合运用所学知识 ,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对我们的实际工作能力的具体训练和考察过程.随着科学技术发展的日新月异,当今计算机应用在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握程序开发技术是十分重要的,而C++语言又是最常见,功能最强大的一种高级语言,因此做好C++语言课程设计是十分必要的。 通过几天的课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次真真的做程序设计,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体,指针„„通过这次课程设计之后,我们把前面所学过的知识又重新温故了一遍。 我做的是班级通讯录的课程设计,虽然是很简单的一个小的程序,但对我来说却是一个很大的困难。更加是第一次做课程设计,所以在机房做了一个下午却丝毫没有进展,最主要是不知从何开始,这个时候才知道上课老师们不厌其烦的教导是多么的宝贵,这个时候才后悔上课的时候没有认真的听讲。可是现在一切都晚了,还好时间还算是充裕,只好拿出书本重新复习一下。 开始的时候真的感觉编程是一件很无聊的事情,不过当一个程序运行成功的时候那种喜悦是无法言语的,那种成就感是无法比拟的。又经过几天的努力,终于把程序完成了,尽管程序还是有很多功能上的欠缺和漏洞,可我还是很高兴的。无论如何是自己的劳动成果,是自己经过努力得到的成绩,同时也是学习C++语言的一次实践作业,自己进步的证明。 在课程设计过程中,收获知识,提高能力的同时,我也学到了很多人生的哲理,懂得怎么样去制定计划,怎么样去实现这个计划,并掌握了在执行过程中怎么样去克服心理上的不良情绪。因此在以后的生活和学习的过程中,我一定会把课程设计的精神带到生活中,不畏艰难,勇往直前!第三篇:通讯录管理系统
第四篇:软件工程 通讯录查询系统
第五篇:C++通讯录管理系统