C语言程序设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二○一一年九月
设计要求
题目三通讯录管理系统
任务:自学C 语言中相关知识,设计出通讯录管理系统。要求如下所述:建立通讯录信息,信息至少包含编号、姓名、年龄、电话、通讯地址、电子邮箱等;;
能够提供添加、删除和修改通讯录信息的功能,并给出确认是否保存或删除记录的提示信息;
能够提供按姓名或电话等查询并显示相应记录信息;
将通讯录保存在文件中;
能够按表格方式输出通讯录信息。
二、要求
为了保证所有的数据可以长期被使用,要求程序能将相关数据存储在外部数据文件中,具体数据格式和文件名、路径等自定;
根据所设计的算法,定义相应函数分别实现系统的各子功能模块,同时由主程序提供友好的用户界面,使用户可通过选择主菜单来调用课程设计中要求完成的各个功能模块,子程序执行完后可返回到主菜单,继续选择其他功能执行。源程序要求书写规范,结构清晰。重点函数的重点变量,重点功能部分均要求给出清晰的程序注释。
程序编译、链接成功后,自己设计实现程序功能的一组或多组测试数据,并严格按照此测试数据进行测试,然后分析测试结果。如果程序不能正常运行或结果不正确,则需对程序进行单步调试,在调试过程中认真查找算法实现中存在的问题,并加以分析和修正。
程序详解
首先,定义结构体
struct student
{
long num;// 用于存储学号
char name[20];// 姓名int
age;// 年龄
long telephone;// 电话号码
char adress[40];// 地址
char E_mail[30];// 邮箱
int QQ[12];// 增设的QQ 一栏
struct student *next;// 用于存放下一级指针
}first;
first 为第一个节点,继而在其后动态的开创若干节点。
以下是用于链表处理的各个函数:
struct student * creat(struct student *p) //输入函数
void printall(struct student * head) // 显示所有记录
struct student * delet(struct student *head) //删除函数
struct student * insert(struct student *head) // 插入函数
struct student *searchbynum(struct student *head) // 按学号查找
struct student *searchbyname(struct student *head) // 按姓名查找
struct student *search(struct student *head) //查找函数
menu_select() // 选择函数
以下是各个函数的详细说明:
Creat()函数用于创建链表,其中以n 记录节点的个数,并在创建时实现自加,以便于后
面函数的处理,其循环输入的实现,依靠库函数malloc ()和后面的while 循环。
Printall 函数用于显示当前的的所有记录,依靠头指针找到链表首地址,有while 循环实现所有记录的输出。
Delet ()函数用于删除某个记录,删除可以按姓名或学号这两种方式进行的,但本程序中
没有这个功能即只可以按学号进行删除(因为学号唯一)。
Insert()函数用于插入,同样以头指针找到链表的首地址,并将要插入的学号依次与各个
节点中得num 比较,然后按顺序将一个节点插入。
主函数
Menu_selec
t()
1 2 4 3 0 Printall()Search()Delet()Insert()Creat()
1 2
Searchbyna me()Searchbynum ()
Search()函数用于查找,查找函数提供了两种方式,即按姓名查找和按学号查找。在search ()函数中可以按提示调用searchbyname()和searchbynum()。
Menu_select() 函数用于提供函数选项,旨在简化主函数。
流程图
此即为该程序的主流程图。
以下是详细的源程序及部分注释:
#include
#include
#include
#include
#include
#define NULL 0
#define LEN sizeof(struct student)
源程序
#define SHU "%d\n%s\n%5d\n%ld\n%s\n%s\n%s"
int n;
struct student
{
long num;
char name[20];
int age;
long telephone;
char adress[40];
char E_mail[30];
int QQ[12];
struct student *next;
}first;
struct student * creat(struct student *p) // 创建链表的函数,即输入函数{
struct student *head;
struct student *p1,*p2;
n=0; // 先给n 赋值0
p1=p2=(struct student*) malloc(LEN);// 强制类型转换
printf("\t\t\t**************** 请输入用户信息****************\n");
printf("\t\t\t 输入学号:\n");
scanf("%ld",&p1->num);
printf("\t\t\t 输入姓名:\n");
scanf("%s",&p1->name);
printf("\t\t\t 输入年龄:\n");
scanf("%d",&p1->age);
printf("\t\t\t 输入电话:\n");
scanf("%ld",&p1->telephone);
printf("\t\t\t 输入地址\n");
scanf("%s",&p1->adress);
printf("\t\t\t 输入E-mail:\n");
scanf("%s",&p1->E_mail);
printf("\t\t\t 输入QQ\n");
scanf("%s",&p1->QQ);//40
head=NULL;
while(p1->num!=0)
{
n=n+1; // 实现n 的自加,记录节点的个数
if(n==1)
head=p1;
else
p2->next=p1;
p2=p1;
p1=(struct student *) malloc(LEN);
printf("\t\t\t**************** 请输入用户信息****************\n");
printf("\t\t\t 输入学号:\n");