河南理工大学
计算机科学与技术学院课程设计报告
课程名称:高级语言程序设计设计题目:班级通讯录
学生姓名:杨传华
学号:311009030227
专业班级:信管1002 班
指导教师:于金霞
2010 年09月10 日
一、设计题目及要求
设计题目:班级通讯录
对象:信管10级
(一)、技术参数和设计要求:
1.该系统主要处理通讯录的相关信息。
2.通讯录信息主要包括:姓名、班级、手机、家庭电话、电子邮件、通讯录地址、
邮编等内容。
3.完成以下的操作:实现通讯录信息的添加、修改、删除和查询。
(二)、设计内容与步骤
1.分析并建立满足上述要求的数据结构
2.算法设计与分析
3.程序设计、实现、调试
4.课程设计说明书
二、算法设计分析
因为一个班级里面有很多学生,而且每个学生又包含很多信息如姓名、学号、电话、邮箱等,这些信息又分别属于不同的数据类型,但是每个学生所包含的数据信息成分相同,所以要用到构造数据类型:结构体。用到结构体,应为要能实现查找、修改、删除等,所以又要用到链表的知识!要实现这些功能,要用到模块化设计思想,用函数来解决问题!
三、具体函数分析
(一)、插入新结点
在插入新结点之前,先创建一个只有指针域的头结点,又指针p 扫描全链表,实现尾插法,并返回头指针。
(二)、删除结点
用连个指针p,q扫描全链表,先通过学号找到要删除的结点q,然后将q结点从链表中删除,然后释放此结点!
(三)、修改结点内容
通过学号找到此学生,通过switch 语句选择要修改的项目,然后进行修改。(四)、查找并输出
通过学号找到此学生,然后分别访问并输出此结点各项内容
(五)、输出通讯录
顺序访问链表各个结点,并输出结点信息。
(六)、保存为文件
现在d盘里面创建一个读写类型文件“班级通讯录.txt”,然后通过文件类型指针fp访问此文件并写入通讯录信息。
(七)、释放结点并结束程序
从头结点开始,使头结点不断后移,并将前面的结点释放。
四、算法流程图
g 4 c X 土品/Pt
五、函数运行情况及部分代码
一)、主函数框架
主函数要用到基本输入输出、 switch 语句转换操作命令,然后用 循环操作。具体如下:
int main()
int cz;// 操作符 struct stu *head,*q; head=(struct stu*)malloc(sizeof(struct stu));
head->next=NULL;
system("color 2e");// 修改 dos 窗口前背景色 , 用两个十六进制数表示
start :printf(" 输入操作符 1-7:");
scanf("%d",&cz); switch(cz)
{
case 1:
q=(struct stu *)malloc(sizeof(struct stu)); printf("\t 输入姓
名 :");scanf("%s",q->name); printf("\t 输入学号 :");scanf("%d",&q->xh); printf("\t 输入班级 :");scanf("%d",&q->grade); printf("\t 手机
号 :");scanf("%s",q->cel); printf("\t 家庭电话 :");scanf("%s",q->tel); printf("\t 输入电子邮件 :");scanf("%s",q->mail); printf("\t 通讯录地
址 :");scanf("%s",&q->add); printf("\t 输入邮编 :");scanf("%s",&q->post);
printf(" *************** 班级通讯录*****************、n\n\n")?
printf(" * 1:新建通讯录 *\n"); printf(" * 2:删除通讯录 *\n"); printf(" * 3:修改通讯录 *\n"); printf(" * 4:查询通讯录 *\n");
printf(" * 5:显示全部记录
*\n");
printf(" *
6:保存为文件
*\n"); printf(" * ■7 ?禅访納丰 士由*\n");
7:释放链表并结束程序
printf("
*********************************************************\n");
printf("\n ********************************C **********************************
语言课
goto 语句实现 程设计
charu(head,q);
printf("插入成功!!!\n");break;
case 2://删除
head=del(head); break;
case 3:
cha nge(head);break;
case 4:
search(head);break;
case 5:
prin tall(head);
break;
case 6:
prin tf("\n");
baoc(head); break;
case 7:
sf(head);
exit (0);
default: printf("输入操作错误,重新");
}
goto start;
return 0;
其中用到输出*来美化系统运行页面,然后用system("color 2e");语句来修改dos 界面前背景颜色,如;
(二)、插入函数
struct stu *charu(struct stu *head,struct stu *q)〃 插入新结点 {
struct stu *p;
for(p=head;p->n ext!=NULL;p=p->n ext); p_>n ext=q; q-> next=NULL; retur n head; }
通 讯 录 为
^空!!!*********************************\n\n\n")"
else {
printf("\t 输入要删除学生学号:"); scan f("%d", &a);
for(p=head,q=p->n ext;q->xh!=a&&q->n ext!=NULL;)
运行界面如图:
本部分采用尾插法。
(三)删除结点
代码如下:
struct stu *del(struct stu *head)〃 删除结点
struct stu *p,*q;
int a;//要删除学生的学号 if(head-> next==NULL)
printf(
p=p->n ext;
q=p->n ext;
}
if(q_>xh==a)
{
p_>n ext=q _>n ext;
free(q);
printf(” 删除成功!!!\n");
}
else printf("no people have foun d!!!");
}
retur n head;
运行界面通讯录为
不为空时:
(四)查找
输入要查找学生学号,找到后将其输出,如图:
(五)修改学生信息
先通过学号找到该学生,然后用switch语句选择修改项,再用switch和goto语句实现是否循环,运行如图:
(六) 、保存文件
在D:盘中创建一个读写文件,顺序将各节点信息保存进去,代码为: struct stu *baoc(struct stu *head)〃 保存文件 {
FILE *fp;
struct stu *p=head; if(head-> next==NULL)
********************************** ^空!!!*********************************、n\n\n")" else {
班级通讯录.txt","w"))==NULL)
{
prin tf("ca n't open file!!!\n"); exit(0); }
while(p-> next!=NULL) {
fwrite(p->n ext,sizeof(struct stu),1,fp); p=p->n ext; } fclose(fp);
printf("保存文件成功!!!\n\n");
f
l
改改畫话幷编
邮 写
--s
s S 5
S
:^匚 1234
5678
■I
2
1
是
1 s
1
输熾
printf (”
}
retur n head;
}
(七)释放结点退出系统
用指针p扫描链表,头指针逐步后移,释放结点p,代码如下: void sf(struct stu *head)
{
struct stu *p=head ;
printf("释放链表:\n”);
while(p!=NULL)
{
head=head->n ext;
free(p);
p=head;
}
printf("释放链表成功!!!\n");
}
运行如图;
六、附录:完整原代码
#in clude
#in clude
#in clude
#include
{
char name[100];// 姓名int xh;// 学号int grade;// 年级char cel[15];// 手机char tel[50];// 电话char mail[50];// 邮件char add[100];// 地址char post[15];// 邮编struct stu *next;
};
struct stu *charu(struct stu *head,struct stu *q)// 插入新结点
{ struct stu *p; for(p=head;p->next!=NULL;p=p->next); p->next=q;
q->next=NULL; return head;
}
void search(struct stu *head)// 查找结点并输出{
struct stu *p;
int a;// 要查找学生的学号
if(head->next==NULL)
printf( "**********************************
*********************************\n\n\n");
else
{
printf("\t 输入要查询学生学号:"); scanf("%d",&a);
for(p=head->next;p->next!=NULL;p=p->next)
{
if(p->xh==a)
{
printf(" 要查找的学生信息为:\n"); printf(" ★姓名:
");puts(p->name);
printf("\t 学号: ");printf("%d",p->xh); printf("\t 年级:
");printf("%d\n",p->grade); printf("\t 手机:
");puts(p->cel);
printf("\t 电话:");puts(p->tel); 讯录为
空!!!
printf("\t 邮箱: ");puts(p->mail); printf("\t 地址 ");puts(p->add); printf("\t 邮编: ");puts(p->post);
printf("\t 查找成功 !!!"): printf("\n\n\n"); break;
}
}
if(p->xh==a)
{
printf(" 要查找的学生信息为 :\n"); printf("
★姓名: ");puts(p->name);
printf("\t 年级: ");printf("%d\n",p->grade); printf("\t 手机: ");puts(p->cel); printf("\t 电话: ");puts(p->tel); printf("\t 邮箱: ");puts(p->mail);
printf("\t 地址 ");puts(p->add); printf("\t 邮编: ");puts(p->post); printf("\t 查找成功 !!!"): printf("\n\n\n");
}
else printf("no people have found!!!\n");
}
}
struct stu *del(struct stu *head)// 删除结点
{
struct stu *p,*q; int a;// 要删除学生的学号 if(head->next==NULL)
else
{
printf("\t 输入要删除学生学号 :"); scanf("%d",&a);
for(p=head,q=p->next;q->xh!=a&&q->next!=NULL;) { p=p->next; q=p->next;
} if(q->xh==a)
{
空!!! printf(
讯录为
******************************* **\n\n\n" );
p->next=q->next; free(q);
printf(" 删除成功 !!!\n");
}
else printf("no people have found!!!");
}
return head;
}
struct stu *change(struct stu *head)//
修改结点内容
{
int b,a,c; struct stu *p;
if(head->next==NULL)
else
{
printf (" 输入要修改学生学号 :"); scanf("%d",&a);
for(p=head->next;p!=NULL;p=p->next)
if(p->next->xh==a)
printf("\t\t\t 1: 修改姓名 \n"); printf("\t\t\t 2: 修改学号 \n"); printf("\t\t\t 3: 修改年级 \n"); printf("\t\t\t 4: 手机 \n"); printf("\t\t\t 5: 电话 \n"); printf("\t\t\t 6: 邮件 \n"); printf("\t\t\t 7: 地址 \n"); printf("\t\t\t
8: 邮编 \n");
printf(" 请输入你的选择: "); scanf("%d",&b); switch(b)
case 1:
printf("\t 输入新姓名 :");
scanf("%s",p->name);break; case 2:printf("\t 输入新学号 :");
scanf("%d",&p->xh);break; case 3:
空!!! printf( H********************************** 讯录为
******************************* **\n\n\n" );
start: printf("
输入想要修改什么 ?\n");
printf("\t 输入新的班级:");
scanf("%d",&p->grade);break; case 4: printf("\t 输入新的手机号:"); scanf("%s",p->cel);break; case 5:
printf("\t 输入新的电话号:"); scanf("%s",p->tel);break; case 6:
printf("\t 输入新的邮箱:");
scanf("%s",p->mail);break;
case 7:
printf("\t 输入新的地址:");
scanf("%s",p->add);break;
case 8:
printf("\t 输入新的邮编;");
scanf("%s",p->post);break;
default: printf(" 输入操作错误,请重新输入
}
printf(" 修改成功!!!\n");
printf(" 是否要修改其他项?1:是2:printf("
请输入你的选择:"); scanf("%d",&c);
switch(c)
{
case 1:goto start;
case 2:break;
}
}
}
}
return head;
}
void printall(struct stu *head)// 输出全部通讯录
{
struct stu *p=head->next;
while(1)
{
if(p==NULL)
cri n+f/"**********************************
2空!!!*********************************\n\n\n")?
:"); 否\n");
break;
}
else if(p->next==NULL)
{
printf("
★姓名: ");puts(p->name);
printf("\t 学号: ");printf("%d\n",p->xh); printf("\t 年级: ");printf("%d\n",p->grade); printf("\t 手机: ");puts(p->cel); printf("\t 电话: ");puts(p->tel); printf("\t 邮箱: ");puts(p->mail); printf("\t 地址: ");puts(p->add); printf("\t 邮编: ");puts(p->post); printf(" 输出成功 !!!\n"); printf("\n\n\n"); break;
}
else
{
printf(" ★姓名: ");puts(p->name); printf("\t 学号:
");printf("%d\n",p->xh); printf("\t 年级: ");printf("%d\n",p->grade); printf("\t 手机: ");puts(p->cel); printf("\t 电话: ");puts(p->tel); printf("\t 邮箱:
");puts(p->mail); printf("\t 地址:
");puts(p->add); printf("\t 邮编:
");puts(p->post);
printf("\n"); p=p->next;
continue;
}
printf(" 输出成功 !!!\n");
}
}
struct stu *baoc(struct stu *head)// 保存文件
{
FILE *fp; struct stu *p=head; if(head->next==NULL) else
{
空!!! printf( H********************************** 讯录为
******************************* **\n\n\n" );
班级通讯录 .txt","w"))==NULL)
printf("can't open file!!!\n"); exit(0);
}
while(p->next!=NULL)
fwrite(p->next,sizeof(struct stu),1,fp); p=p->next;
}
fclose(fp);
printf(" 保存文件成功 !!!\n\n");
}
return head;
}
void sf(struct stu *head)
{
struct stu *p=head ; printf(" 释放链表 :\n"); while(p!=NULL)
{ head=head->next; free(p); p=head;
}
printf(" 释放链表成功 !!!\n");
}
int main()
{
int cz;// 操作符
struct stu *head,*q;
head=(struct stu*)malloc(sizeof(struct stu));
head->next=NULL;
system("color 2e");// 修改 dos 窗口前背景色 , 用两个十六进制数表示 printf("\n
********************************C
printf(" * 1:新建通讯录 *\n"); printf(" * 2:删除通讯录 *\n"); printf(" * 3:修改通讯录 *\n"); printf(" * 4:查询通讯录 *\n");
printf(" *
5:显示全部记录
printf(" ***************
语言课程
★班级通讯录★ ***************** n\n\n");
6: 保存为文件 *\n");
7: 释放链表并结束程序 *\n");
*********************************************************\n");
scanf("%d",&cz); switch(cz)
{
case 1:
q=(struct stu *)malloc(sizeof(struct stu)); printf("\t 输入姓名 :");scanf("%s",q->name); printf("\t 输入学号 :");scanf("%d",&q->xh); printf("\t 输入班级 :");scanf("%d",&q->grade); printf("\t 手机号 :");scanf("%s",q->cel); printf("\t 家庭电话 :");scanf("%s",q->tel); printf("\t 输入电子邮件 :");scanf("%s",q->mail); printf("\t 通讯录地址 :");scanf("%s",&q->add); printf("\t 输入邮编 :");scanf("%s",&q->post); charu(head,q); printf(" 插入成功 !!!\n");break;
case 2:// 删除
head=del(head);break; case 3:
change(head);break; case 4:
search(head);break; case 5: printall(head);break;
case 6: printf("\n"); baoc(head);break; case 7: sf(head); exit (0);
default: printf(" 输入操作错误 ,重新 ");
}
goto start; return 0;
printf(" printf(" printf("
start :printf(" 输入操作符 1-7:");