hello 大家好呀 这里是布丁学姐~
今天给大家带来的是《C语言课设计划》的第一篇,个人通讯录管理系统
引言
通讯录是当前社会每个人不可缺少的信息系统,利用C语言和Dve c++制作个人通讯录管理系统,从根本上改变纸质通讯录难以长久保存、容易丢失的弊端,从而提高信息管理和存储效率。在对系统进行分析和设计的基础上,创建各种项目组件,若干个功能模块连接成个人通讯录管理系统。
功能及操作介绍
该系统可以简单明了的通过用户输入的数据创建成通讯录,实现最基本的新建、更改、查找、排序等功能。本系统通过链表和函数的调用,实现最基本的功能。
系统设计分析
本系统包括主函数和多个实现具体功能的函数,现分别介绍如下。
(1)主函数模块:主函数设计比较简洁,只是提供输入输出和处理部分的函数调用,其中具体的功能模块显示为菜单之后由用户进行选择。具体流程如下:
①显示菜单
②用户输入操作选项
③通过switch语句进行函数的调用
④运行goto语句进行循环
(2)新建通讯录的功能模块:通过提示让用户输入联系人的各类信息,然后用insert函数将各个联系人的信息用链表进行连接。具体流程如下;
①显示适当的提示,用户输入信息
②调用insert函数准备进行下一个联系人的输入和链接
③输出提示创建成功
(3)显示通讯录的功能模块:调用printff函数将通讯录中的信息打印出来
(4)查找联系人的功能模块:调用search函数按照要求对通讯录里的内容进行查找,并进行输出。
(5)修改通讯录的功能模块:调用change函数根据用户需求对联系人的信息进行修改
(6)排序通讯录的功能模块:调用sortt函数根据分类对联系人按照字典序升序进行排序
(7)退出通讯录的功能模块:退出系统。
各个函数的流程介绍如下:
(1)insert函数:插入函数的本质是在头结点后插入一个新结点,定义一个结构体指针p,使p也指向head,当p为空时,p指向下一个结点q,q的下一个结点为NULL,插入完成。
(2)search函数:search函数的本质是通过结构体指针对单链表进行遍历,当遇到与所查找信息相匹配的信息是跳出。这时候进行判断,如果相匹配就打印出所查找到的信息,如果不匹配就显示未查找到该联系人的信息。注意在此之前要先判断通讯录是否为空,如果为空,则显示适当的提示信息并且停止执行下面的语句。
(3)printff函数:printff函数是将通讯录中的所有信息打印到屏幕上。在执行主体语句之前先对通讯录进行判断,如果为空,则打印提示信息并且停止执行函数,否则则对链表进行遍历并且进行打印的操作。执行主体时,要判断此个结点是否为最后一个结点。
(4)change函数:change函数是根据用户需求对联系人的信息进行更新。同样先判断通讯录是否为空,如果非空则执行后续操作。首先遍历链表并且运用strcmp函数找到想要更改的联系人的位置,并通过switch和goto语句进行根据用户需求更新甚至循环更新的功能。
(5)sortt函数:sortt函数是将通讯录中的全部联系人按照分类根据字典序进行排序。在此函数中,首先保证结构体指针变量p有后续节点,然后构造只有一个数据结点的有序表,然后通过循环和比较进行排序。
测试运行结果
为了截图运行结果,在本次测试过程中没有调用cls,运行结果如下:
1.新建联系人
2.显示新建的联系人
3.查找联系人tom
4.修改联系人tom的qq
5.显示信息查看是否修改成功
6.对通讯录中的联系人进行排序,然后显示联系人信息
7.退出系统
不足之处
原意是想用文件一次性读入大量用户的信息,然后结束时将通讯录的最新状态保存到新的文件中,但是失败了,说明对文件的有关操作还是不够熟练。在此系统的代码书写过程中,在一些地方遇到了困难,但已获得老师和同学的帮助,都已解决。其中,在sortt函数的书写过程中,最开始的思路仅仅将分类进行了排序,而并没有改变结构体内其他变量的顺序,参考了博客上大佬的方法,对链表的排序又得到了新的认知。而文件的输入保存还是有待完善。还有search函数的书写也是出现了问题,但最后已经得到解决。具体的错误代码依旧保留并且被注释掉。
程序设计心得
在本次程序设计过程中,由于一开始的目的比较明确,而且系统主体用调用函数实现功能,所以最开始比较顺利。但是在排序函数的书写中以及保存通讯录的过程中遇到了困难,说明自己对C语言的掌握能力以及对程序整体的认知还不够熟练,有待提高。这次程序设计也让我懂得了一个基本的程序的基础是框架的有序书写,在以后的程序设计过程中,我会先构建出一个框架,然后再去完善功能。
代码
#include<stdio.h>
#include<windows.h>
#include<string.h>
#include<stdlib.h>
struct stu{
char name[100];//学生姓名
char postion[100];//家庭住址
char tel[50];//电话
char leibie[50];//类别
char email[50];//电子邮件
char qq[50];//QQ
struct stu *next;//用指针处理链表,next是指针变量指向结构体变量
};
struct stu *head=NULL;
struct stu *insert(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;
char a[100];
if(head->next==NULL)
printf("通讯录为空\n");
else{
printf(" 请输入要查找的人的姓名:");
scanf("%s",a);
// int flag=0;
for(p=head->next;p->next!=NULL;p=p->next){
if(strcmp(p->name,a)==0){
//flag=1;
/*printf(" 要查找的人的信息如下:");
printf("测试\n");
printf(" *姓名:");printf("%s\n",p->name);
printf(" *住址:");printf("%s\n",p->postion);
printf(" *电话:");printf("%s\n",p->tel);
printf(" *类别:");printf("%s\n",p->leibie);
printf(" *电子邮件:"); printf("%s\n",p->email);
printf(" *QQ:");printf("%s\n",p->qq);*/
break;
}
}
if(strcmp(p->name,a)==0){
//flag==1;
printf(" 要查找的人的信息如下:\n");
printf(" *姓名:");printf("%s\n",p->name);
printf(" *住址:");printf("%s\n",p->postion);
printf(" *电话:");printf("%s\n",p->tel);
printf(" *类别:");printf("%s\n",p->leibie);
printf(" *电子邮件:"); printf("%s\n",p->email);
printf(" *QQ:");printf("%s\n",p->qq);
// break;
}
// if(!flag) printf("未找到此人的信息\n");
else printf("未找到此人的信息\n");
}
}
void printff(struct stu *head){
struct stu *p=head->next;
while(1){
if(p==NULL){
printf("通讯录为空\n");
break;
}
else if(p->next==NULL){
printf(" *姓名:");printf("%s\n",p->name);
printf(" *住址:");printf("%s\n",p->postion);
printf(" *电话:");printf("%s\n",p->tel);
printf(" *类别:");printf("%s\n",p->leibie);
printf(" *电子邮件:"); printf("%s\n",p->email);
printf(" *QQ:");printf("%s\n",p->qq);
printf("\n");
break;
}
else{
printf(" *姓名:");printf("%s\n",p->name);
printf(" *住址:");printf("%s\n",p->postion);
printf(" *电话:");printf("%s\n",p->tel);
printf(" *类别:");printf("%s\n",p->leibie);
printf(" *电子邮件:"); printf("%s\n",p->email);
printf(" *QQ:");printf("%s\n",p->qq);
printf("\n");
p=p->next;
continue;
}
}
}
struct stu *change(struct stu *head){
struct stu *p;
char a1[100],b1[100],c1[100];
int flag=1,x;
if(head->next==NULL) printf("通讯录为空\n");
else{
printf("请输入您想要更新的人的姓名:"); scanf("%s",a1);
p=head->next;
while(p!=NULL){
if(strcmp(p->name,a1)==0){
flag=0;
B:
printf("请输入您想要更新的信息:\n");
printf(" 1.姓名:\n");
printf(" 2.住址:\n");
printf(" 3.电话:\n");
printf(" 4.类别:\n");
printf(" 5.电子邮件:\n");
printf(" 6.QQ:\n");
printf("您选择的是:\n");
scanf("%d",&x);
switch(x){
case 1:
printf(" 请输入新姓名:\n");
scanf("%s",p->name);break;
case 2:
printf(" 请输入新住址:\n");
scanf("%s",p->postion);break;
case 3:
printf(" 请输入新电话:\n");
scanf("%s",p->tel);break;
case 4:
printf(" 请输入新类别:\n");
scanf("%s",p->leibie);break;
case 5:
printf(" 请输入新电子邮件:\n");
scanf("%s",p->email);break;
case 6:
printf(" 请输入新qq:\n");
scanf("%s",p->qq);break;
default:
printf("输入不合法!请重新输入:");
break;
}
printf("更新成功!\n");
printf("是否继续更新?1.是;2.否:\n");
int y;
C:scanf("%d",&y);
switch(y){
case 1:
goto B;break;
case 2:
break;
default:
printf("输入符号不合法,请重新输入!");
goto C;
break;
}
}
p=p->next;
}
if(flag) printf("要更新的人的信息不存在!\n");
}
return head;
}
void sortt(struct stu *l){
struct stu *p,*r,*pre;
p=l->next;
r=p->next;//保证r是p的后续节点
p->next=NULL;//构造一个只有一个数据结点的有序表 就是让一个有序表的长度为1
p=r;
while(p){
r=p->next;
pre=l;
while(pre->next!=NULL&&strcmp(pre->next->leibie,p->leibie)<0)
pre = pre->next;
p->next = pre->next;
pre->next = p;
p = r; //扫描剩下的结点
}
}
/*struct stu *sortt(struct stu *head){
struct stu *q,*p,*s;
char temp[50];
p=head->next;
while(p->next){
s=p;
q=p->next;
while(q){
if(strcmp(q->leibie,s->leibie)<0)
s=q;
q=q->next;
}
if(s!=p){
strcpy(temp,p->leibie);
strcpy(p->leibie,s->leibie);
strcpy(s->leibie,temp);
}
p=p->next;
}
return head;
}*/
void save(){
struct stu *p=NULL;
FILE *fp;
char *book="list.txt";
if(head==NULL){
printf("通讯录为空\n");
return ;
}
else p=head->next;
if((fp=fopen(book,"w+"))==NULL){
printf("无法打开此文件\n");
return ;
}
while(p!=NULL){
fwrite(p,sizeof(struct stu),1,fp);
p=p->next;
}
printf("保存完成!\n");
fclose(fp);
}
int main(){
//creat();
system("color F4");//更改系统颜色
struct stu *q;
head=(struct stu*)malloc(sizeof(struct stu));//动态分配内存
head->next=NULL;//完成构建
printf("*****个人通讯录管理系统*****\n");
A: printf(" **1.新建通讯录**\n");
printf(" **2.显示通讯录**\n");
printf(" **3.查找通讯录**\n");
printf(" **4.修改通讯录**\n");
printf(" **5.排序通讯录**\n");
printf(" **6.保存并退出**\n");
printf("****************************\n");
//A:
printf("请输入您想要进行的操作序号:");
int oper;
scanf("%d",&oper);
switch(oper){
case 1:
// add();
q=(struct stu*)malloc(sizeof (struct stu));
printf("请输入姓名:");scanf("%s",q->name);
printf("请输入住址:");scanf("%s",q->postion);
printf("请输入电话:");scanf("%s",q->tel);
printf("请输入类别:");scanf("%s",q->leibie);
printf("请输入邮件:");scanf("%s",q->email);
printf("请输入QQ:");scanf("%s",q->qq);
insert(head,q);
printf("建立成功!\n");
break;
case 2:
printff(head);
Sleep(1000);
break;
case 3:
search(head);
Sleep(500);
break;
case 4:
change(head);
break;
case 5:
sortt(head);
break;
case 6:
//save();
printf("谢谢您的使用!");
return 0;
default:
printf("输入不合法!请重新输入:");
}
Sleep(500);
system("cls");//清屏
goto A;//循环
return 0;
}