《C语言程序设计报告.docx》由会员分享,可在线阅读,更多相关《C语言程序设计报告.docx(9页珍藏版)》请在优知文库上搜索。
1、二O一一年九月设计要求题目三通讯录管理系统任务:自学C语言中相关知识,设计出通讯录管理系统。要求如下所述: 建设通讯录信息,信息至少包含编号、姓名、年龄、通讯地址、电子邮箱等;; 能够提供添加、删除和修改通讯录信息的功能,并给出确认是否保存或删除记录的提示信息; 能够提供按姓名或等查询并显示相应记录信息; 将通讯录保存在文件中; 能够按表格方式输出通讯录信息。二、要求为了保证所有的数据可以长期被使用,要求程序能将相关数据存储在外部数据文件中,具体数据格式和文件名、路径等自定;根据所设计的算法,定义相应函数分别实现系统的各子功能模块,同时由主程序提供友好的用户界面,使用户可通过选择主菜单来调用课
2、程设计中要求完成的各个功能模块,子程序执行完后可返回到主菜单,继续选择其他功能执行。源程序要求书写标准,构造清晰。重点函数的重点变量,重点功能局部均要求给出清晰的程序注释。程序编译、链接成功后,自己设计实现程序功能的一组或多组测试数据,并严格按照此测试数据进展测试,然后分析测试结果。如果程序不能正常运行或结果不正确,那么需对程序进展单步调试,在调试过程中认真查找算法实现中存在的问题,并加以分析和修正。程序详解首先,定义构造体structstudentlongnUm;用于存储学号Charname20;姓名intage;年龄longtelephoney/号码charadress40;地址charE
3、_mail30;邮箱intQQ12;/增设的QQ一栏structstudent*next;用于存放下一级指针Jfirst;first为第一个节点,继而在其后动态的开创假设干节点。输入函数显示所有记录删除函数插入函数 按学号查找 按姓名查找查找函数选择函数以下是用于链表处理的各个函数:structstudent*creat(structstudent*p)voidprintall(structstudent*head)structstudent*delet(structstudent*head)structstudent*insert(structstudent*head)structstude
4、nt*searchbynum(structstudent*head)structstudent*searchbyname(structstudent*head)structstudent*search(structstudent*head)menu_select()以下是各个函数的详细说明:CreatO函数用于创立链表,其中以n记录节点的个数,并在创立时实现自加,以便于后面函数的处理,其循环输入的实现,依靠库函数mallocO和后面的WhiIe循环。PrintaIl函数用于显示当前的的所有记录,依靠头指针找到链表首地址,有WhiIe循环实现所有记录的输出。DeletO函数用于删除某个记录,删除
5、可以按姓名或学号这两种方式进展的,但本程序中没有这个功能即只可以按学号进展删除(因为学号唯一)。InsertO函数用于插入,同样以头指针找到链表的首地址,并将要插入的学号依次与各个节点中得num比较,然后按顺序将一个节点插入。SearchO函数用于查找,查找函数提供了两种方式,即按姓名查找和按学号查找。在SearCh()函数中可以按提示调用SearChbyname()和SearChbynUmMenu-SelectO函数用于提供函数选项,旨在简化主函数。流程图#include#include#include#include#define LEN :PrinlalISearch Insert ID
6、elet#defineNULLQ#defineSHU%dn%sn%5dn%ldn%sn%sn%sintn;structstudent(longnum;charname20;intage;longtelephone;charadress40J;charE-mail30;intQQ12;structstudent*next;first;structstudent*creat(structstudent*p)创立链表的函数,即输入函数(structstudent*head;structstudent*pl,*p2;n=0;先给n赋值0pl=p2=(structstudent*)malIoc(LEN)
7、;强制类型转换Printf(ttt*请输入用户信息*n);printf(,ttt输入学号:n”);scanf(%ld,num);Printfettt输入姓名:n);scanf(,%sp1-name);printf(,ttt输入年龄An”);scanf(,%dp1-age);printf(,ttt输入:nn);scanf(,%ld,telephone);printf(,ttt输入地址n);scanf(%sp1-adress);printf(,ttt输入E-mailn,);scanf(,%sp1-E_mail);printf(,ttt输入QQn);scanf(,%sp1-QQ)40head=NUL
8、L;while(pl-num!=O)(n=n+l;实现n的自加,记录节点的个数if(n=l)head=pl;elsep2-next=pl;p2=pl;pl=(structstudent*)malloc(LEN);printf(,ttt请输入用户信息*3num);Primf(ttt输入姓名:n);scanf(,%s,p1-name);printf(ttt输入年龄:n);scanf(,%d,pl-age);printf(ttt输入:nn);scanf(,%ld,pl-telephone);printf(ttt输入地址n);scanf(,%s,p1-adress);printf(,ttt输入E-ma
9、il:nH);scanf(,%s,p1-E_mail);printf(,ttt输入QQn);scanf(,%s,p1-QQ);p2-next=NULL;return0;voidprintall(structstudent*head)显示所有记录(structstudent*p;printf(,n全部的记录如下n:);p=head;doprintf(SHU,p-num,p-name,p-age,p-telephone,p-adress,p-E-mail,p-QQ);p=p-next;while(p!=NULL);)/80structstudent*delet(structstudent*head
10、)/删除函数(longnum;PrindC请输入要删除的号码:n,);scanf(,%ld,num&pl-next!=NULL)2=pl;pl-next;)if(num=p1-num)(if(pl=head)要删除的节点为首节点head=pl-next;elsep2-next=pl-next;printf(,deletz%dn,num);n=n-l;节点减一1elseprintf(,%d未找到该节点!n,num);returnhead;)structstudent*insert(structstudent*head)插入函数(structstudent*stud;structstudent*p
11、,*pl,*p2;pl=head;=studp指向的是要插入的节点if(head=O)(head=p;p0-next=NULL120)else(while(pO-numpl-num)&(pl-next!=NULL)(2=pl;pl=pl-next;1if(p-numnum)(if(head=pl)head=p,插入到原来第一个节点之前elsep2-next=p;p-next=pl;/插入到p2所指的节点之后n=n+l;returnhead;structstudent*searchbynum(structstudent*head)按学号查找(longnumb;Printf(请输入要删除的号码:n
12、,);scanf(,%ld,fenumb);structstudent*p;p=head147scanf(%ld,num)p=p-next;elseprintf(SHU,p-num,p-name,p-age,p-telephone,p-adress,p-E-mail,p-QQ);returnhead;)structstudent*searchbyname(structstudent*head)按姓名查找(chara100;PrMf(请输入要查找的姓名:n);scanf(,%s,a);structstudent*p;p=head;scanf(,%s,a);if(strcmp(a,p-name)!
13、=0)p=p-next;elseprintf(SHU,p-num,p-name,p-age,p-telephone,p-adress,p-E-mail,p-QQ);returnhead;)structstudent*search(structstudent*head)(charchoic;PriIHf(tttl-按号码查找2-按姓名查找”);Primfrttt请选择:”);choic=getch();switch(choic)(caserr:searchbynum(&first);break;case2:SearChbyname(&first);break;1returnhead;inimenu_select()chars80J;inta;定义整形变量system(cls);Printf(tt*欢迎进入通讯管理界面*nn);printf(ttt. pr