中南大学
二○一三~二○一四学年第一学期
信息科学与工程学院
程序设计基础实践
设计报告
课程名称: 程序设计基础实践
班 级: 20##级信息安全1302 班
学 号: 0906130221
姓 名: 张振宇
指导教师: 杨希
二○##年 十二 月
目录
一、需求分析... 3
二、总体设计... 4
1.设计环境.... 4
2.基本要求.... 4
3.设计步骤.... 4
三、详细设计... 5
1.算法分析.... 5
2.设计流程图.... 5
3.我的任务.... 5
四、调试与测试... 8
五、本次课程设计的心得体会... 12
六、附录... 12
一、需求分析
通过课程设计使学生综合使用所学过的C语言程序设计知识,掌握结构化程序设计的基本思路和方法,在所掌握的基本知识和技能的基础上,进一步提高自学能力和查找资料的能力,解决一定程度的复杂的结构化程序设计问题,加深对所学知识的理解与掌握,增强学生利用自己所学知识解决实际问题的能力,为以后的程序开发打下基础。
课程设计的目的和要求:
1、使学生巩固和加强《C语言程序设计》课程的理论知识。
2、使学生掌握C语言的基本概念、语法、语义和数据类型的使用特点。
3、使学生掌握C语言程序设计的方法及编程技巧,能正确使用C语言编写程序。
4、进一步理解和运用结构化程序设计的思想和方法;学会利用传统流程图或N-S图表示算法。
5、使学生掌握调试程序的基本方法及上机操作方法。
6、掌握书写程序设计开发文档的能力,使学生学会撰写课程设计总结报告。课程设计的思想和方法还可以作为学生做毕业论文时的参考资料。
7、通过查阅手册和文献资料,培养学生独立分析问题和解决问题的能力。为学生做毕业设计打好基础。
8、初步掌握开发一个小型实用系统的基本方法:结合实际应用的要求,使课程设计既覆盖知识点,又接近工程实际需要。通过激发学习兴趣,调动学生主动学习的积极性,并引导他们根据实际编程要求,训练自己实际分析问题的能力及编程能力,并养成良好的编程习惯。
9、培养学生的创新能力和创新思维。学生可以根据指导书和相关文献上的参考算法,自己设计出相应的应用程序。
10、培养学生良好的程序设计风格。在实际编程中,为了提高编程质量,对空行、空格和注释均有要求。学生在课程设计书写代码时,应该严格按要求处理,以便建立良好的程序设计风格。
11、课程设计题目及内容
员工通讯管理系统:
通讯录信息为:姓名、地址、单位、固定电话、移动手机、分类(包括同事、朋友、同学、家人等)、EMAIL、QQ等。
1. 通讯录的增加;
2. 通讯录的修改、删除;
3. 按姓名、电话、QQ查询;
4. 通讯录的排序;
5. 分类统计;
6. 通讯录输出。
二、总体设计
1.设计环境
⑴硬件:一般PC机。
⑵软件:操作系统为WindowsXP或Windows2000,设计语言为Visual C++或Turbo C2.0。
2.基本要求
⑴课程设计题目可以协商合作,但每名同学必须完成每个功能函数,甚至每条语句的作用。只有了解了整个程序设计思路,每个函数、设置每条语句的作用,才达到开“计算机与程序设计语言”这门课的目的。
⑵由于上机时间有限,要求在没上机时事先写好代码,再在上机时进行调试。
⑶要求利用结构化程序设计方法以及C的编程思想来完成系统的设计;
⑷要求有欢迎界面、命令选择菜单、录入的数据保存在文件中,对数据的操作通过链表(每条记录保存在一个节点中(每个节点是一个结构体类型的数据),将节点链接在一起构成链表)、数组、结构体等数据结构实现;
⑸模块化程序设计:要求在设计的过程中,按功能定义函数或书写多个源程序文件,按照从顶向下逐步细化的模块化原则进行程序设计,各个功能模块用函数的形式来实现;
⑹学生所选课题必须上机通过,并获得满意的结果;
3.设计步骤
⑴根据问题描述,设计数据存储方式;
⑵分析系统功能,划分功能模块,确定各模块函数名称;
⑶主程序算法设计和各模块算法设计;
⑷编程实现;
⑸调试和测试;
三、详细设计
1.算法分析
以上所给的课程设计的题目,每一个对象都包括多个属性。所以要考虑数据的存储形式要用结构体类型来实现。首先,应该考虑定义一个结构,其次,我们应该考虑数据的存储形式:是定义一个数组来存储,还是定义一个链表呢?在这里假如我们以数组的方式来存储,当然可以,但是我们知道,假如我们定义一个数组的话,我们首先必须知道学生人数大概是多少,以便我们确定数组的大小,但是题目中没有给出,而且题目要求中有大量的删除、插入操作,所以用链表的方式比较方便。
对于菜单的实现,首先我们用printf函数把程序的功能列出来,然后等待用户选择而执行不同的函数,执行完了一个功能后又回到菜单。保存数据要通过文件来实现。
2.设计流程图
3.我的任务
在简单的分工之后,我的任务是完成通讯录的排序,因为主题是用链表来实现通讯录之间的连接,而链表是不好直接进行排序的,所以我想到了数组。即把链表中指针指向的内容赋给一个数组,利用我们学到的冒泡排序法对其进行排序,排序结束之后重新赋回去。
思路虽然听起来很简单,但是在实际操作起来总存在这样那样的错误,比如说变量名不统一等合作性问题,而由于链表不是授课内容,不能很好的掌握,在写的过程中总是出现考虑不周全的情况。但是在百度的帮助下和不懈的努力下,在预期时间完成了我的任务并且还参与了最终程序的合并调试。
struct address_list *paixu(struct address_list *head)
{
struct address_list *p1,*p2;
int i,j;
struct address_list1
{
char name[30]; //名字
char work[50]; //单位
char handset[30]; //手机
char phone[30]; //固定电话
char email[30]; //电子邮件
char address[30]; //通讯地址
char QQ[20]; //QQ
int t; //类别标记
char fenlei[30]; //分类
};
struct address_list1 px[200];
struct address_list1 temp;
if(head==NULL)
{
printf("通讯录为空,无法排序!\n");
return(head);
}
p1=head;
for(i=0;i<n,p1!=NULL;i++)
{
strcpy(px[i].name,p1->name);
strcpy(px[i].work,p1->work);
strcpy(px[i].handset,p1->handset);
strcpy(px[i].phone,p1->phone);
strcpy(px[i].email,p1->email);
strcpy(px[i].address,p1->address);
strcpy(px[i].QQ,p1->QQ);
px[i].t=p1->t;
strcpy(px[i].fenlei,p1->fenlei);
p2=p1;
p1=p1->next;
}
head=shifang(head);
for(j=0;j<n-1;j++)
{
for(i=j+1;i<n;i++)
{
if(strcmp(px[i].name,px[j].name)<0)
{
temp=px[i];
px[i]=px[j];
px[j]=temp;
}
}
}
p1=(struct address_list *)malloc(LEN);
p2=p1;
strcpy(p1->name,px[0].name);
strcpy(p1->work,px[0].work);
strcpy(p1->handset,px[0].handset);
strcpy(p1->phone,px[0].phone);
strcpy(p1->email,px[0].email);
strcpy(p1->address,px[0].address);
strcpy(p1->QQ,px[0].QQ);
p1->t=px[0].t;
strcpy(p1->fenlei,px[0].fenlei);
head=p1;
for(i=1;i<n;i++)
{
p1=(struct address_list *)malloc(LEN);
strcpy(p1->name,px[i].name);
strcpy(p1->name,px[i].name);
strcpy(p1->work,px[i].work);
strcpy(p1->handset,px[i].handset);
strcpy(p1->phone,px[i].phone);
strcpy(p1->email,px[i].email);
strcpy(p1->address,px[i].address);
strcpy(p1->QQ,px[i].QQ);
p1->t=px[i].t;
strcpy(p1->fenlei,px[i].fenlei);
p2->next=p1;
p2=p1;
}
p2->next=NULL;
printf("按姓名排序后为:\n");
print(head);
return(head);
}
四、调试与测试
一、主页面
二、创建通讯录
1、输入信息
2、创建成功后自动输出所有信息
三、 按照名字排序
四、综合操作
1、综合操作主页面
2、分类显示
五、保存
六、打开
七、删除
五、本次课程设计的心得体会
该程序的新颖性在于结构体和文件的使用上,这两个章节都是老师在课堂上没有讲过的,因此也是在不断的实践,不断的调试中实现的。结构体和文本的使用保证了这个程序可以存储大量的信息。该程序具备一个基本的员工通讯录所需要的功能。我不仅巩固《C语言程序设计》课程学习的内容,掌握设计的基本方法,强化上机动手能力,还进一步掌握以下了知识:数据类型、分支控制、循环控制、函数的定义及调用、结构体及数组、指针、文件操作、编译预处理等;通过课程设计,掌握了程序的局部测试、调试方法,建立程序系统调试、测试的基本概念和思想,学会较大程序的系统测试和调试方法。
团队精神不可少,分工合作也是必须的,身为组长就要以身作则,带领好小组,做好各项工作。在开始,对本组人员进行整理,分析其特点,再分配任务,然后进行综合应用,最后对所需资料及要编的程序进行整理得出最后程序。
通过这次课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
六、附录
【源程序】
#include <stdio.h>
#include <malloc.h> //得到指向大小为Size的内存区域的首字节的指针//
#include <string.h>
#include <stdlib.h> //标准库函数//
#define NULL 0
#define LEN sizeof(struct address_list) //计算字节//
int n;
struct address_list
{
char name[30]; //名字
char work[50]; //单位
char handset[30]; //手机
char phone[30]; //固定电话
char email[30]; //电子邮件
char address[30]; //通讯地址
char QQ[20]; //QQ
int t; //类别标记
char fenlei[30]; //分类
struct address_list *next;
};
struct address_list *shifang(struct address_list *head); // 释放内存函数声明
//创建函数,不带头结点的链表
struct address_list *creat(void)
{
struct address_list *head,*p1,*p2;
char name[20];
n=0;
p1=(struct address_list *)malloc(LEN);
p2=p1; //强制内存转换
printf("请输入通讯录的内容!\n姓名输入为0时表示创建完毕!\n");
printf("请输入姓名:");
gets(name);
if(strcmp(name,"0")!=0)
{
strcpy(p1->name,name);
printf("请输入单位:"); gets(p1->work);
printf("请输入手机:"); gets(p1->handset);
printf("请输入固定电话:"); gets(p1->phone);
printf("请输入电子邮件:"); gets(p1->email);
printf("请输入QQ号码:"); gets(p1->QQ);
printf("请输入通讯地址:"); gets(p1->address);
printf("请输入分类(1.同事 2.朋友 3.同学 4.家人 5.其他):"); scanf("%d",&p1->t);
switch(p1->t)
{
case 1:strcpy(p1->fenlei,"同事"); break;
case 2:strcpy(p1->fenlei,"朋友"); break;
case 3:strcpy(p1->fenlei,"同学"); break;
case 4:strcpy(p1->fenlei,"家人"); break;
case 5:strcpy(p1->fenlei,"其他"); break;
}
head=NULL;
while(1)
{
n=n+1; //记录通讯录人数个数
if(n==1)
head=p1;
else
p2->next=p1;
p2=p1;
printf("请输入姓名:"); scanf("%s",name);
if(strcmp(name,"0")==0)
{
break;
}
else
{
p1=(struct address_list *)malloc(LEN);
strcpy(p1->name,name);
printf("请输入单位:"); scanf("%s",&p1->work);
printf("请输入手机:"); scanf("%s",&p1->handset);
printf("请输入固定电话:"); scanf("%s",&p1->phone);
printf("请输入电子邮件:"); scanf("%s",&p1->email);
printf("请输入QQ号码:"); scanf("%s",&p1->QQ);
printf("请输入通讯地址:"); scanf("%s",&p1->address);
printf("请输入分类(1.同事 2.朋友 3.同学 4.家人 5.其他):"); scanf("%d",&p1->t);
switch(p1->t)
{
case 1:strcpy(p1->fenlei,"同事"); break;
case 2:strcpy(p1->fenlei,"朋友"); break;
case 3:strcpy(p1->fenlei,"同学"); break;
case 4:strcpy(p1->fenlei,"家人"); break;
case 5:strcpy(p1->fenlei,"其他"); break;
}
}
}
p2->next=NULL;
return head;
}
else
return 0;
}
//输出函数
void print(struct address_list *head)
{
struct address_list *p;
if(head!=NULL)
{
p=head;
printf("本通讯录现在共有%d人:\n",n);
printf("---姓名-------单位--------手机-------固定电话-------Email--------QQ--------通讯地址--------类别--\n");
printf("==================================\n");
do
{
printf("== %s",p->name); printf(" ");
printf("%s",p->work); printf(" ");
printf("%s",p->handset); printf(" ");
printf("%s",p->phone); printf(" ");
printf("%s",p->email); printf(" ");
printf("%s",p->QQ); printf(" ");
printf("%s",p->address); printf(" ");
printf("%s",p->fenlei); printf(" \n");
p=p->next;
}while(p!=NULL);
printf("==================================\n");
}
else
printf("通讯录为空,无法输出!\n");
}
//增加函数
struct address_list *insert(struct address_list *head)
{
struct address_list *p0,*p1,*p2;
char name[20];
p1=head;
printf("请输入增加的内容:\n");
printf("请输入姓名:"); gets(name);
if(strcmp(name,"0")==0)
{
printf("姓名不能为0,增加失败!\n");
return(head);
}
else
{
p0=(struct address_list *)malloc(LEN);
strcpy(p0->name,name);
printf("请输入单位:"); gets(p0->work);
printf("请输入手机:"); gets(p0->handset);
printf("请输入固定电话:"); gets(p0->phone);
printf("请输入电子邮件:"); gets(p0->email);
printf("请输入QQ号码:"); gets(p0->QQ);
printf("请输入通讯地址:"); gets(p0->address);
printf("请输入分类(1.同事 2.朋友 3.同学 4.家人 5.其他):"); scanf("%d",&p0->t);
switch(p0->t)
{
case 1:strcpy(p0->fenlei,"同事"); break;
case 2:strcpy(p0->fenlei,"朋友"); break;
case 3:strcpy(p0->fenlei,"同学"); break;
case 4:strcpy(p0->fenlei,"家人"); break;
case 5:strcpy(p0->fenlei,"其他"); break;
}
n=n+1;
if(head==NULL)
{
head=p0;
p0->next=NULL;
return head;
}
else
{
while(strcmp(p0->name,p1->name)>0&&(p1->next!=NULL))
{
p2=p1;
p1=p1->next;
}
if(strcmp(p0->name,p1->name)<0 || strcmp(p0->name,p1->name)==0)
{
if(head==p1)
{
head=p0;
}
else
{
p2->next=p0;
}
p0->next=p1;
}
else
{
p1->next=p0;
p0->next=NULL;
}
return head;
}
}
}
struct address_list* delete_txl(struct address_list *head)
{
struct address_list *p,*q;
char name[30];
if(head==NULL)
{
printf("通讯录为空,无法显示!\n");
return head;
}
p=head;
printf("请输入需要删除的人的姓名:");
gets(name);
if(strcmp(head->name,name)==0)
{
head=head->next;
free(p);
printf("删除操作成功!\n");
return head;
}
else
{
q=head,p=head->next;
while(p!=NULL)
{
if(strcmp(p->name,name)==0)
{
q->next=p->next;
free(p);
printf("删除操作成功!\n");
return head;
}
p=p->next;
q=q->next;
}
}
}
//显示函数
struct address_list *display(struct address_list *head)
{
struct address_list *p1,*p2;
char name[30];
int m;
if(head==NULL)
{
printf("通讯录为空,无法显示!\n");
return head;
}
p1=head;
m=0;
printf("请输入需要显示人的姓名:");
gets(name);
while(p1!=NULL)
{
while((strcmp(p1->name,name))!=0 && p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(strcmp(p1->name,name)==0)
{
m++;
printf("%s的通讯内容如下:\n",name);
printf("---姓名---- 单位----手机----固定电话----Email----QQ----通讯地址----类别--\n");
printf("==================================\n");
printf("== %s",p1->name); printf(" ");
printf("%s",p1->work); printf(" ");
printf("%s",p1->handset); printf(" ");
printf("%s",p1->phone); printf(" ");
printf("%s",p1->email); printf(" ");
printf("%s",p1->QQ); printf(" ");
printf("%s",p1->address); printf(" ");
printf("%s",p1->fenlei); printf(" ");
printf("==================================\n");
}
p1=p1->next;
}
if(m==0)
{
printf("此人未在本通讯录中!\n");
}
return(head);
}
//排序函数
struct address_list *paixu(struct address_list *head)
{
struct address_list *p1,*p2;
int i,j;
struct address_list1
{
char name[30]; //名字
char work[50]; //单位
char handset[30]; //手机
char phone[30]; //固定电话
char email[30]; //电子邮件
char address[30]; //通讯地址
char QQ[20]; //QQ
int t; //类别标记
char fenlei[30]; //分类
};
struct address_list1 px[200];
struct address_list1 temp;
if(head==NULL)
{
printf("通讯录为空,无法排序!\n");
return(head);
}
p1=head;
for(i=0;i<n,p1!=NULL;i++)
{
strcpy(px[i].name,p1->name);
strcpy(px[i].work,p1->work);
strcpy(px[i].handset,p1->handset);
strcpy(px[i].phone,p1->phone);
strcpy(px[i].email,p1->email);
strcpy(px[i].address,p1->address);
strcpy(px[i].QQ,p1->QQ);
px[i].t=p1->t;
strcpy(px[i].fenlei,p1->fenlei);
p2=p1;
p1=p1->next;
}
head=shifang(head);
for(j=0;j<n-1;j++)
{
for(i=j+1;i<n;i++)
{
if(strcmp(px[i].name,px[j].name)<0)
{
temp=px[i];
px[i]=px[j];
px[j]=temp;
}
}
}
p1=(struct address_list *)malloc(LEN);
p2=p1;
strcpy(p1->name,px[0].name);
strcpy(p1->work,px[0].work);
strcpy(p1->handset,px[0].handset);
strcpy(p1->phone,px[0].phone);
strcpy(p1->email,px[0].email);
strcpy(p1->address,px[0].address);
strcpy(p1->QQ,px[0].QQ);
p1->t=px[0].t;
strcpy(p1->fenlei,px[0].fenlei);
head=p1;
for(i=1;i<n;i++)
{
p1=(struct address_list *)malloc(LEN);
strcpy(p1->name,px[i].name);
strcpy(p1->name,px[i].name);
strcpy(p1->work,px[i].work);
strcpy(p1->handset,px[i].handset);
strcpy(p1->phone,px[i].phone);
strcpy(p1->email,px[i].email);
strcpy(p1->address,px[i].address);
strcpy(p1->QQ,px[i].QQ);
p1->t=px[i].t;
strcpy(p1->fenlei,px[i].fenlei);
p2->next=p1;
p2=p1;
}
p2->next=NULL;
printf("按姓名排序后为:\n");
print(head);
return(head);
}
//姓名查找函数
struct address_list *search(struct address_list *head)
{
struct address_list *p1,*p2;
int m;
char name[30];
if(head==NULL)
{
printf("通讯录为空,无法分类查找!\n");
return(head);
}
p1=head;
printf("********************\n");
printf("** 请输入需要查找的姓名 **\n");
printf("********************\n");
m=0;
gets(name);
while(p1!=NULL)
{
while(strcmp(p1->name,name)!=0&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(strcmp(p1->name,name)==0)
{
m++;
printf("你查找的内容是:\n");
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf("---姓名---- 单位----手机----固定电话----Email----QQ----通讯地址----类别--\n");
printf(" %s %s %s %s %s %s %s %s\n",p1->name,p1->work,p1->handset,p1->phone,p1->email,p1->QQ,p1->address,p1->fenlei);
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
}
p1=p1->next;
if(m==0)
{
printf("此人未在本通讯录中!\n");
}
break;
}
return(head);
}
//分类显示
struct address_list *classfy(struct address_list *head)
{
struct address_list *p1;
int m;
int kind;
if(head==NULL)
{
printf("通讯录为空,无法分类统计!\n");
return(head);
}
p1=head;
printf("********************\n");
printf("** 请输入分类(1.同事 2.朋友 3.同学 4家人 5.其他) **\n");
scanf("%d",&kind);
printf("********************\n");
m=0;
printf("---姓名---- 单位----手机----固定电话----Email----QQ----通讯地址---\n");
while(p1!=NULL)
{
while(kind!=p1->t&&p1!=NULL)
{
p1=p1->next;
}
if(kind==p1->t)
{
m++;
printf("\n");
printf("%s %s %s %s %s %s %s \n",p1->name,p1->work,p1->handset,p1->phone,p1->email,p1->address,p1->QQ);
}
p1=p1->next;
if(m==0)
{
printf("没有任何人在该分类中!\n");
break;
}
}
printf("该分类中共 %d 人",m);
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
return(head);
}
//释放内存函数
struct address_list *shifang(struct address_list *head)
{
struct address_list *p1;
while(head!=NULL)
{
p1=head;
head=head->next;
free(p1);
}
return(head);
}
//文件写入函数
void save(struct address_list *head)
{
FILE *fp;
struct address_list *p1;
char tong[30];
if(head==NULL)
{
printf("通讯录为空,无法存储!\n");
return;
}
printf("请输入保存后的文件名:");
gets(tong);
fp=fopen("(tong).txt","w");
if(fp==NULL)
{
printf("cannot open file\n");
return;
}
p1=head;
fprintf(fp,"姓名 单位 手机 固定电话 Email QQ 通讯地址 类别\n");
for(;p1!=NULL;)
{
fprintf(fp,"%s %s %s %s %s %s %s %s\n",p1->name,p1->work,p1->handset,p1->phone,p1->email,p1->QQ,p1->address,p1->fenlei);
p1=p1->next;
}
printf("保存完毕!\n");
fclose(fp);
}
//文件读出函数
struct address_list *load(struct address_list *head)
{
FILE *fp;
char tong[30];
struct address_list *p1,*p2;
printf("请输入要输出的文件名:");
gets(tong);
fp=fopen("(tong).txt","r");
if(fp==NULL)
{
printf("此通讯录名不存在,无法输出!\n");
return(head);
}
else
{
head=shifang(head);
}
p1=(struct address_list *)malloc(LEN);
fscanf(fp,"%s%s%s%s%s",&p1->name,&p1->work,&p1->handset,&p1->email,&p1->address);
if(feof(fp)!=0)
{
printf("文件为空,无法打开!\n");
return(head);
}
else
{
rewind(fp);
p2=p1;
head=p1;
n=0;
while(feof(fp)==0)
{
fscanf(fp,"%s%s%s%s%s%s%s%s",&p1->name,&p1->work,&p1->handset,&p1->phone,&p1->email,&p1->QQ,&p1->address,&p1->fenlei);
if(feof(fp)!=0)
break;
p2->next=p1;
p2=p1;
p1=(struct address_list *)malloc(LEN);
n=n+1;
}
p2->next=NULL;
p1=head;
head=head->next;
n=n-1;
free(p1);
print(head);
printf("打开完毕!\n");
return(head);
}
fclose(fp);
}
//手机查找
struct address_list *posearch(struct address_list *head)
{
struct address_list *p1,*p2;
int m;
char handset[30];
if(head==NULL)
{
printf("通讯录为空,无法分类查找!\n");
return(head);
}
p1=head;
printf("********************\n");
printf("** 请输入需要查找的手机 **\n");
printf("********************\n");
m=0;
gets(handset);
while(p1!=NULL)
{
while(strcmp(p1->handset,handset)!=0&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(strcmp(p1->handset,handset)==0)
{
m++;
printf("你查找的内容是:\n");
printf("+++++++++++++++++++++++++++++++++++\n");
printf("---姓名---- 单位----手机----固定电话----Email----QQ----通讯地址----类别--\n");
printf(" %s %s %s %s %s %s %s %s\n",p1->name,p1->work,p1->handset,p1->phone,p1->email,p1->QQ,p1->address,p1->fenlei);
printf("+++++++++++++++++++++++++++++++++++\n");
}
p1=p1->next;
if(m==0)
{
printf("此人未在本通讯录中!\n");
}
break;
}
return(head);
}
//修改
struct address_list *xiugai(struct address_list *head)
{
struct address_list *p1,*p2;
int i,m=0,k,kind=0;
char name[30];
if(head==NULL)
{
printf("通讯录为空,无法修改!\n");
return(head);
}
p1=head;
printf("********************\n");
printf("** 请输入需要修改联系人的姓名 **\n");
printf("********************\n");
gets(name);
while(1)
{
while(strcmp(p1->name,name)!=0&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(strcmp(p1->name,name)==0)
{
m++;
printf("你所要修改的联系人是:\n");
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
printf("---姓名---- 单位----手机----固定电话----Email----QQ----通讯地址----类别--\n");
printf(" %s %s %s %s %s %s %s %s\n",p1->name,p1->work,p1->handset,p1->phone,p1->email,p1->QQ,p1->address,p1->fenlei);
printf("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
}
p1=p1->next;
if(m==0||p1->next==NULL)
{
printf("此人未在本通讯录中!\n");
break;
}
printf("请输入你所需要修改的信息:1:姓名 2职业 3手机 4电话 5邮箱 6QQ 7分类,完成后请输入");
scanf("%d",&k);
switch(k)
{
case 0:break;
case 1:scanf("%s",p1->name); break;
case 2:scanf("%s",p1->work); break;
case 3:scanf("%s",p1->handset); break;
case 4:scanf("%s",p1->phone); break;
case 5:scanf("%s",p1->email); break;
case 6:scanf("%s",p1->QQ); break;
case 7:scanf("%d",&p1->t);printf("请输入分类(1.同事 2.朋友 3.同学 4.家人 5.其他):");scanf("%d",&kind);break;
}
switch(kind)
{
case 0:break;
case 1:strcpy(p1->fenlei,"同事"); break;
case 2:strcpy(p1->fenlei,"朋友"); break;
case 3:strcpy(p1->fenlei,"同学"); break;
case 4:strcpy(p1->fenlei,"家人"); break;
case 5:strcpy(p1->fenlei,"其他"); break;
}
break;
}
return (head);
}
//QQ 查找
struct address_list *qqsearch(struct address_list *head)
{
struct address_list *p1,*p2;
int m;
char qq[30];
if(head==NULL)
{
printf("通讯录为空,无法分类查找!\n");
return(head);
}
p1=head;
printf("********************\n");
printf("** 请输入需要查找的QQ **\n");
printf("********************\n");
m=0;
gets(qq);
while(p1!=NULL)
{
while(strcmp(p1->QQ,qq)!=0&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(strcmp(p1->QQ,qq)==0)
{
m++;
printf("你查找的内容是:\n");
printf("+++++++++++++++++++++++++++++++++++\n");
printf("---姓名---- 单位----手机----固定电话----Email----QQ----通讯地址----类别--\n");
printf(" %s %s %s %s %s %s %s %s\n",p1->name,p1->work,p1->handset,p1->phone,p1->email,p1->QQ,p1->address,p1->fenlei);
printf("+++++++++++++++++++++++++++++++++++\n");
}
p1=p1->next;
if(m==0)
{
printf("此人未在本通讯录中!\n");
}
break;
}
return(head);
}
//综合操作函数
struct address_list *menu(struct address_list *head)
{
char num[10];
while(1)
{
printf("*********************\n");
printf("*** 1 姓名查找 ****\n");
printf("*** 2 按QQ查找 ****\n");
printf("*** 3 按手机查找 ****\n");
printf("*** 4 单个显示 ****\n");
printf("*** 5 增加 ****\n");
printf("*** 6 分类显示 ****\n");
printf("*** 7 修改 ****\n");
printf("*** 8 退出 ****\n");
printf("*********************\n");
printf("请输入您选择的操作:");
gets(num);
switch(*num)
{
case '1':
{
head=search(head); //姓名查找
}
break;
case '2':
{
head=qqsearch(head);
}
break;
case '3':
{
head=posearch(head);
}
break;
case '4':
{
head=display(head); //显示
}
break;
case '5':
{
head=insert(head); //增加
print(head);
}
break;
case '6':
{
head=classfy(head); //分类
}
break;
case '7':
{
head=xiugai(head);
print(head);
break;
}
case '8':
return head;
default:
printf("操作错误,此项不存在!\n");
break;
}
if(strcmp(num,"6")==0)
break;
}
return head;
}
//主函数
int main()
{
struct address_list *head=NULL;
char num[10];
printf("*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n");
printf("*=* 程序说明 *=*\n");
printf("*=* 请及时保存创建完毕的通讯录内容! *=*\n");
printf("*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*\n");
while(1)
{
printf("************************\n");
printf("*** 1 创建通讯录 ****\n");
printf("*** 2 按名字排序 ****\n");
printf("*** 3 综合操作 ****\n");
printf("*** 4 保存 ****\n");
printf("*** 5 打开 ****\n");
printf("*** 6 删除 ****\n");
printf("*** 7 退出 ****\n");
printf("************************\n");
printf("请输入您选择的操作:");
gets(num);
switch(*num)
{
case '1':
{
if(head==NULL)
{
head=creat(); //创建
print(head);
}
else
{
head=shifang(head);
head=creat(); //重新创建
print(head);
}
}
break;
case '2':
{
head=paixu(head); //排序
}
break;
case '3':
{
head=menu(head);
//综合操作
}
break;
case '4':
{
save(head); //文件保存
print(head);
}
break;
case '5':
{
head=load(head); //文件输出
}
break;
case '6':
{
head=delete_txl(head); //删除
print(head);
}
break;
case '7':
{ head=shifang(head);
break;
}
default:
printf("操作错误,此项不存在!\n");
break;
}
if(strcmp(num,"7")==0)
break;
}
}
东莞理工学院《C语言程序设计》课程设计题目:图书信息管理系统院系:电子工程学院专业:电子信息工程年级:20##班别:2班指导教师:…
C语言程序设计课程设计学生姓名学号系院专业设计论文题目学生选课系统管理完成日期20xx年6月指导教师目录一实验目的二实验内容三总体…
河南理工大学计算机科学与技术学院课程设计报告20XX20XX学年第一学期课程名称C语言课程设计设计题目《小学算术运算测试》学生姓名…
C语言课程设计报告设计题目专业班级学号姓名任课老师时间目录一课程设计题目及所涉及知识点二课程设计思路及设计流程图三课程设计中遇到的…
C语言程序设计课程设计报告20xx20xx学年第1学期题目专业班级姓名学号指导教师成绩计算机科学与技术系20xx年12月31日目录…
C程序设计实验报告实验名称控制结构综合程序设计学时安排2课时实验类别上机操作型实验要求1人1组一实验目的1熟练掌握分支结构循环结构…
C课程设计报告题目小学算术运算测试设计者刘星刘俊良凌锋专业班级计算机网络0901班学号343337指导教师任长安所属系部计算机与信…
海南大学三亚学院信息管理与信息系统专业课程设计实验报告题目C语言程序设计实习分院管理分院专业信息管理与信息系统班级信管0902姓名…
程序设计基础课程设计C课程设计报告贪吃蛇院系:计算机学院网络工程系班级:122班姓名:指导教师:20##年12月25日程序设计基础…
C语言程序设计实验报告专业班级日期11月26日成绩实验组别第327次实验指导教师李开学生姓名学号同组人姓名实验名称数组实验一实验目…