C语言课程设计手机通信录管理系统计



《C语言课程设计手机通信录管理系统计》由会员分享,可在线阅读,更多相关《C语言课程设计手机通信录管理系统计(29页珍藏版)》请在装配图网上搜索。
1、C程序上机实习报告 C语言课程设计 课程名称 C语言课程设计 教师姓名 本科生姓名 本科生学号 本科生专业 所在院系 类别: 日期: 课程设计评语 对课程论文的评语: 平时成绩: 课程论文成绩: 总 成 绩: 评阅人签名: 注:1、无评阅人签名成绩无效; 2、必须用钢笔或圆珠笔批阅,用铅笔阅卷无效; 3、如有平时
2、成绩,必须在上面评分表中标出,并计算入总成绩。 目 录 课程设计评语…………………………………………………………..2 目录……………………………………………………………………..3 1.课程论文题目………………………………………………………. 4 2. 程序设计思路…………………………….……………….…….…..4 3.功能模块图…………………………………………………………..4 4.数据结构设计………………………………………………………..5 5.算法设计……………………………………………………………..5 6.程序代码………………
3、……………………………………………15 7.程序运行结果………………………………………………………21 8.编程中遇到的问题及解决办法…………………………………28 9.总结心得及良好建议……………………………………………28 10.致谢………………………………………………………………29 1.课程论文题目 手机通信录管理系统设计 模拟手机通讯录管理系统,实现对手机中的通讯录进行管理。功能要求 下: (1)查看功能:选择此功能时,列出下列三类选择。 A 办公类 B 个人类 C 商务类 ,当选中某类型时,显示出此类所有数据中的姓名和电话号
4、 (2)增加功能:能录入新数据 一个结点包括:姓名、电话号码、分类(可选项有:A 办公类 B 个人类C商务类)、电子邮件。例如:杨春 13589664454 商务类 chuny@ 当录入了重复的姓名和电话号码时,则提示数据录入重复并取消录入;当通信录中超过15条信息时,存储空间已满,不能再录入新数据;录入的新数据能按递增的顺序自动进行条目编号。 (3)修改功能:选中某个人的姓名时,可对此人的相应数据进行修改 (4)删除功能:选中某个人的姓名时,可对此人的相应数据进行删除,并自 动调整后续条目的编号。 2.程序设计思路 根据题目要求,通讯录中的每一条信息应当是以文本
5、文件的方式存放,所以要提供文件的输入输出等操作;在程序中需要对通讯录内容的管理,应提供查看,增加,修改,删除条目等操作;另外还应提供键盘是选择菜单实现功能的选择。 3.功能模块图 手机通信录管理系统 退 出 删除功能 修改功能 增加功能 4.数据结构设计 根据题目要求,也是为了方便以后调用,我们选择应用结构体来进行该程序的编写。本程序也可以使用数组和链表完成,但是考虑到,链表对于我们还过于复杂,时间有限,且题目中有所谓“储存空间”的限制,所以没有必要应用链表。没有应用数组是考虑到结构体能更好的完成调用工作。而且可以使程
6、序看起来更有条理。 程序中应用函数调用是必须的。这种程序中,应用函数调用可以使系统更具模块化。本程序的函数调用中,主函数只是对菜单函数进行了调用,这样由于子函数之间是可以相互调用的关系,所以,为后面调用菜单提供方便。 5. 算法设计 1、主函数 主函数设计得应简单、直观,所以我应用了大量的函数调用。为了方便主菜单也可以调用,所以把菜单设计成了一个调用函数,具体方法流程可见流程图。 【流程图】 显示菜单 列出功能 输入n选择需要的功能,判断n的值是否在1—5之间 否
7、 是 根据n的值调用各功能模块函数 【程序】 /*菜单函数*/ void menu() {int n,w1; do {puts("\n\t\t*欢迎使用手机通讯录管理系统*\n"); puts("\t\t************菜单************\n"); puts("\t\t\t1.查看功能"); puts("\t\t\t2.增加功能"); puts("\t\t\t3.修改功能"); puts("\t\t\t4.删除功能");
8、puts("\t\t\t5.退出"); puts("\n\t\t****************************\n"); printf("请选择你想要的功能序号(1-5):"); scanf("%d",&n); if(n<1||n>5) {w1=1;getchar();printf("输入错误返回主菜单\n");menu();} else w1=0;} while(w1==1); switch(n) {case 1:search();break; case 2:add();break; case 3:modify();bre
9、ak; case 4:del();break; case 5:exit(0);break; } } /*主函数*/ main() {menu();} 2、各功能模块设计 (1)查看功能模块 【需求分析】 该模块的功能是选择一个查询的类别就可以显示出该类别中的所有信息条目(办公类,个人类,商务类),并且其重要考虑到该类中的内容是否 有为空的情况,以及在选择类别的过程中是否有输入错误的情况。 【流程图】 显示已有的种类菜单 输入n选择想要查看的种类,并判断n的值是否在1-3之间
10、 根据n值输出各种类中所有成员信息 是 否 返回主菜单 【程序】 /*查看功能*/ void search() {int n,w1; do
11、{ puts("\t\t**********查看类别**********\n"); puts("\t\t\tA.办公类\t\n"); puts("\t\t\tB.个人类\t\n"); puts("\t\t\tC.商务类\t\n"); puts("\t\t****************************\n"); printf("请输入类别(办公类请输入“1”,个人类请输入“2”,商务类请输入“3”):"); scanf("%d",&n); printf("\n"); if(n<1||n>3) {w1=1;getchar();printf("输入错误返回主菜单\n")
12、;menu();} else w1=0; } while(w1==1); switch(n) {case 1:putout(1);break; case 2:putout(2);break; case 3:putout(3);break; }} (2)添加功能模块 【需求分析】 该模块的功能是要求增添一个信息条目(其中包括姓名、电话号码、分类、电子邮件),观察这种信息条目,很容易就联想到用结构体的方式来储存。在添加之前应该先检查储存器是否已满;当然在添加过程应考虑到是否有姓名或电话号码重复的情况,在这种情况下应提醒操作者
13、并退出操作。 调用加载函数n=load();并计算可以记录个数n 【流程图】 判断储存器是否已满 是 否 输入姓名 判断输入的姓名是否存在 是
14、 否 输入电话号码 判断输入的电话号码是否存在 是 否 通过n来输入类别,并判断n是否在1-3之间 是 输入电子邮件地址 返回主菜单 【程序】 /*添加功能*/ void add()
15、
{int i,n,m,w1;
do
{n=load();/*打开文件*/
if(n==N) {printf("储存器已满返回主菜单\n");menu();}/*判断储存是否已满*/
if(n!=0)
{printf("请输入姓名:");
scanf("%s",&a[n].name);
for(i=0;i 16、phone);
for(i=0;i 17、);
m=a[n].zhonglei;
if(m<1||m>3)
{w1=1;getchar();printf("输入错误返回主菜单\n");menu();}
else w1=0;
}
while(w1==1);
switch(m)
{case 1:strcpy(a[n].type,"BGL");break;
case 2:strcpy(a[n].type,"GRL");break;
case 3:strcpy(a[n].type,"SWL");break;
default:printf("输入错误返回上一菜单\n");menu();
}
printf("请 18、输入电子邮件地址:");
scanf("%s",&a[n].mail);
saveA(n); /*将新的信息添加进通讯录*/
choice();
}
(3)修改功能模块
【需求分析】
该模块的功能是先判断通讯录是否为空,不为空的前提下输入所想要修改的姓名,如果不存在则提醒操作者输入错误并返回主菜单,如果存在则显示其信息,并作出提示依次输入修改后的内容并记录保存。
判断通讯录是否为空
【流程图】
是
19、 否
输入想要修改的姓名
判断要修改的姓名是否存在
是 否
输入新的类别
输入新的姓名
输入新的电话号码
输入新的电子邮箱地址
返回主菜单
【程序】
/*修改功能*/
void 20、modify()
{int i,n,k,w1;
do
{char c[100];
n=load();
if(n==0)
{printf("\n");printf("通讯录为空返回主菜单\n\n");menu();}
printf("请输入你要修改的人物名称:");
scanf("%s",&c);
for(i=0;i 21、rintf("%-20s %-15s %-5s %s\n",a[i].name,a[i].phone,a[i].type,a[i].mail);
printf("请输入新的类别(办公类请输入“1”,个人类请输入“2”,商务类请输入“3”,取消修改请输入“4”):");
scanf("%d",&a[i].zhonglei);
k=a[i].zhonglei;
if(k<1||k>5)
{w1=1;getchar();printf("输入错误返回主菜单\n");menu();
}
else w1=0;
}
while(w1==1);
switch(k)
{cas 22、e 1:strcpy(a[i].type,"BGL");break;
case 2:strcpy(a[i].type,"GRL");break;
case 3:strcpy(a[i].type,"SWL");break;
case 4:printf("取消操作返回上一菜单\n");menu();
}
printf("请输入新的姓名:");
scanf("%s",&(a[i].name));
printf("请输入新的电话号码:");
scanf("%s",&(a[i].phone));
printf("请输入新的邮箱地址:");
scanf("%s",&(a 23、[i].mail));
saveB(n);
choice();
}
(4) 删除功能模块
【需求分析】
该模块的功能是通过输入某一姓名,判断改姓名是否存在,如果不存在,返回主菜单;如果存在则输出该姓名的全部信息,再由操作者判断是否删除该条目。删除后将其他的数据保存。
【流程图】
判断通讯录是否为空
是
否
输入想要删除的姓名
判断该姓名是否存在
24、 否
是
确定删除?
是
删除成功,保存数据
否
返回主菜单
【程序】
/*删除功能*/
void del()
{
int i,n,j,w1,k;
char b[100];
do
{n=load();
if(n==0)
{printf("\n");printf("通讯录为空返回主菜单\n\n");menu();}
printf 25、("请输入你要删除的人物名称:");
scanf("%s",&b);
for(i=0;i 26、ntf("输入错误返回主菜单\n");menu();}
else w1=0;
}
while(w1==1);
switch(k)
{case 1:for(j=i;j 27、truct message
MAGE
{int zhonglei;
char name[20];
char phone[15];
char type[5];
char mail[100];
};
(在整个程序的开头有声明)
【程序】
load()
{FILE *fp;
int i;
if((fp=fopen("file.txt","ab+"))==NULL)
{printf("\n不能打开此文件返回主菜单\n");
return NULL;}
for(i=0;!feof(fp);i++)
fread(&a[i],sizeof(M 28、AGE),1,fp);
fclose(fp);
return(i-1);
}
(2)用于添加时的保存函数saveA()
【说明】
该函数用于在将新信息添加至文件尾。
【程序】
void saveA(int i)
{FILE *fp;
if((fp=fopen("file.txt","ab"))==NULL)
{printf("\n不能打开此文件\n"); return NULL;}
if(fwrite(&a[i],sizeof(MAGE),1,fp)!=1)
printf("读写错误\n");
fclose(fp);
}
(3)用于将修改或删除之后记 29、录的保存函数saveB()
【说明】
该函数与上面的函数不同在于,它是将原有的文件覆盖后重新将记录全部录入
【程序】
void saveB(int n)
{FILE *fp;
int i;
if((fp=fopen("file.txt","wb"))==NULL)/* 以wb的方式打开时,会将原来的文件删去重建*/
{printf("\n无法打开文件\n");return NULL;}
for(i=0;i 30、}
fclose(fp);
}
(4)用于查看时的输出函数putout()
【说明】
该函数用于查看时输出某一类别所有的信息。
【程序】
void putout(int m)
{int i,n;
int k=0;
n=load();
for(i=0;i 31、s %-15s %-5s %s\n",a[i].name,a[i].phone,a[i].type,a[i].mail);};
menu();
}
(5)操作成功函数choice()
【说明】
该函数用于在执行完某一操作时让操作者选择下一步的操作。
【程序】
void choice()
{int k,w1;
do
{printf("操作已成功,请选择下面的操作(1.返回主菜单 2.退出):");
scanf("%d",&k);
if(k<1||k>2)
{w1=1;getchar();printf("输入错误返回主菜单\n");men 32、u();}
else w1=0;
}
while(w1==1);
switch(k)
{case 1:menu();break;
case 2:exit(0);break;
}
}
6.程序代码
#include "stdio.h"
#include "string.h"
#include"malloc.h"
#define MAGE struct message
#define N 15
MAGE
{int zhonglei;
char name[20];
char phone[15];
cha 33、r type[5];
char mail[100];
}a[N];
load();
void saveA();
void saveB();
void menu();
void choice();
/*输出功能*/
void putout(int m)
{int i,n;
int k=0;
n=load();
for(i=0;i 34、
{if(a[i].zhonglei==m)
printf("%-20s %-15s %-5s %s\n",a[i].name,a[i].phone,a[i].type,a[i].mail);};
menu();
}
/*查看功能*/
void search()
{int n,w1;
do
{
puts("\t\t**********查看类别**********\n");
puts("\t\t\tA.办公类\t\n");
puts("\t\t\tB.个人类\t\n");
puts("\t\t\tC.商务类\t\n");
puts("\t\t********* 35、*******************\n");
printf("请输入类别(办公类请输入“1”,个人类请输入“2”,商务类请输入“3”):");
scanf("%d",&n);
printf("\n");
if(n<1||n>3)
{w1=1;getchar();printf("输入错误返回主菜单\n");menu();
}
else w1=0;
}
while(w1==1);
switch(n)
{case 1:putout(1);break;
case 2:putout(2);break;
case 3:putout(3);break;
} 36、
}
/*添加功能*/
void add()
{int i,n,m,w1;
do
{n=load();/*打开文件*/
if(n==N) {printf("储存器已满返回主菜单\n");menu();}/*判断储存是否已满*/
if(n!=0)
{
printf("请输入姓名:");
scanf("%s",&a[n].name);
for(i=0;i 37、scanf("%s",&a[n].phone);
for(i=0;i 38、n].zhonglei);
m=a[n].zhonglei;
if(m<1||m>3)
{w1=1;getchar();printf("输入错误返回主菜单\n");menu();
}
else w1=0;}
while(w1==1);
switch(m)
{case 1:strcpy(a[n].type,"BGL");break;
case 2:strcpy(a[n].type,"GRL");break;
case 3:strcpy(a[n].type,"SWL");break;
default:printf("输入错误返回上一菜单\n");menu();} 39、
printf("请输入电子邮件地址:");
scanf("%s",&a[n].mail);
saveA(n); /*将新的信息添加进通讯录*/
choice();
}
/*修改功能*/
void modify()
{int i,n,k,w1;
do
{
char c[100];
n=load();
if(n==0) {printf("\n");printf("通讯录为空返回主菜单\n\n");menu();}
printf("请输入你要修改的人物名称:");
scanf("%s",&c);
for(i=0;i 40、,a[i].name)==0)break;
if(i==n){printf("\n");printf("查无此人返回主菜单\n\n");menu();}
printf("%-20s %-15s %-5s %s\n",a[i].name,a[i].phone,a[i].type,a[i].mail);
printf("请输入新的类别(办公类请输入“1”,个人类请输入“2”,商务类请输入“3”,取消修改请输入“4”):");
scanf("%d",&a[i].zhonglei);
k=a[i].zhonglei;
if(k<1||k>5)
{w1=1;getchar();pri 41、ntf("输入错误返回主菜单\n");menu();
}
else w1=0;
}
while(w1==1);
switch(k)
{case 1:strcpy(a[i].type,"BGL");break;
case 2:strcpy(a[i].type,"GRL");break;
case 3:strcpy(a[i].type,"SWL");break;
case 4:printf("取消操作返回上一菜单\n");menu();
}
printf("请输入新的姓名:");
scanf("%s",&(a[i].name));
printf("请输 42、入新的电话号码:");
scanf("%s",&(a[i].phone));
printf("请输入新的邮箱地址:");
scanf("%s",&(a[i].mail));
saveB(n);choice();
}
/*删除功能*/
void del()
{
int i,n,j,w1,k;
char b[100];
do
{
n=load();
if(n==0) {printf("\n");printf("通讯录为空返回主菜单\n\n");menu();}
printf("请输入你要删除的人物名称:");
scanf("%s",&b);
for(i= 43、0;i 44、;
}
while(w1==1);
switch(k)
{case 1:for(j=i;j 45、ead(&a[i],sizeof(MAGE),1,fp);
fclose(fp);
return(i-1);
}
/*保存函数*/
void saveA(int i)
{FILE *fp;
if((fp=fopen("file.txt","ab"))==NULL)
{printf("\n不能打开此文件\n"); return NULL;}
if(fwrite(&a[i],sizeof(MAGE),1,fp)!=1)
printf("读写错误\n");
fclose(fp);
}
void saveB(int n)
{FILE *fp;
int i;
if(( 46、fp=fopen("file.txt","wb"))==NULL)
{printf("\n无法打开文件\n");return NULL;}
for(i=0;i 47、{w1=1;getchar();printf("输入错误返回主菜单\n");menu();}
else w1=0;
}
while(w1==1);
switch(k)
{case 1:menu();break;
case 2:exit(0);break;
}
}
/*菜单函数*/
void menu()
{int n,w1;
do
{puts("\n\t\t*欢迎使用手机通讯录管理系统*\n");
puts("\t\t************菜单************\n");
puts("\t\t\t1.查看功能");
puts 48、("\t\t\t2.增加功能");
puts("\t\t\t3.修改功能");
puts("\t\t\t4.删除功能");
puts("\t\t\t5.退出");
puts("\n\t\t****************************\n");
printf("请选择你想要的功能序号(1-5):");
scanf("%d",&n);
if(n<1||n>5)
{w1=1;getchar();printf("输入错误返回主菜单\n");menu();
}
else w1=0;}
while(w1==1);
switc 49、h(n)
{case 1:search();break;
case 2:add();break;
case 3:modify();break;
case 4:del();break;
case 5:exit(0);break;
}
}
/*主函数*/
main()
{menu();
}
7.程序运行结果
欢迎界面:
查看功能:
增加功能:
修改功能:
删除功能:
退出:
输入5,再输入【enter】,即可退出。 50、
8.编程中遇到的困难及解决方法
此次的编程对于我而言无疑是一件巨大的挑战,因自己的能力的问题,在编程过程中可以说是困难重重,首先便是时间的问题,虽然足足有好几天的时间让我们在完成一个程序,但是水平确实比较水,在程序中发现,由于函数过多,链接的问题自己无法解决。在运行程序的时候发现了其中的一些问题,并且得以解决,如运行中使用查看的时候,排版因为字数问题产生错位,这个可以通过转移字符来纠正。
该程序应用了文件的储存、调用。文件在载入和保存的使用上可以应用不同的函数来完成,在此我使用了wb的方式来打开文件,并且用fwrite及fread进行文件的读写。文件在进行调用或打 51、开时应注意文件是否正常打开,这个细节十分重要,可以防止在操作过程中产生不必要的麻烦。
最大的问题便是由于大量并且长时间的运转,程序中的函数调用过多之后部分细节出现问题,目前自己依旧是无法通过更改程序数据来更改,但是通过推出保存,再重新运行便可以了。
9.总结心得及良好建议
通过这次设计,让我得到了真正的锻炼。我的程序中还有一些不足,但是由于时间问题,和自己经验不足的原因,导致没能得到及时修改,请老师见谅。
该程序应用了数组,这是因为题目中有要求,有所谓“储存空间”的限制。但是现实生活中,一般储存设备都已很大,更适合用链表完成,这点可以在以后进行改进,通过判断再完成,储存空间 52、的提示。这样通用性会大大提高到的。
自然,上面只是一个例子,程序中自然还有很多或大或小的毛病。比如,在对程序长期操作后,可能出现计算运行错误。这点是平常不容易看出来的。我到现在仍没有找到问题的原因。还需要后续检测。
此次的课程设计基本上是我们所以同学的第一次经历,日后这样的机会还会有,并且以后我们会更多的去独立完成这样的项目。但是对于初次体验的我们而言,确实由于时间以及经验不足等等方面的原因,这个任务很艰巨,相信很多同学虽然尽了自己的努力依旧无法完成,因此我希望老师在我们学习的过程中能够给予我们更多的帮助以及稍微的减轻一下课程的难度,这样的话同学们会更专心的投入到编程的快乐之中,品尝 53、到c语言,计算机给我们带来的,以及老师们不懈努力下让我们收获的成果。这样可以更好的达到老师们的目的,也更能让学生们学到更多的知识。
10.致谢
这次学期结束的C语言课程设计虽然只有几天,但是却充实了我的整个假期,这次经历让我对编程产生了更多兴趣,让我渴望用更多的时间在编程上。同样这次的学习让我了解了许多不止是编程的东西,我对电脑的理解范围也进一步扩大,作为一名计算机学院的学生,这是意义深远的。非常感谢老师们给予我们这样一个学习的平台,不但让我们得到了展现自我能力的机会同样让我们发现许多自身存在的问题,也在学习交流之中得到一些重要信息。这让我对计算机产生了更多的热情,丰富了我的学习以及课余生活,感谢学校给予的机会,感谢老师们的付出。衷心的希望老师们身体健康,活到老学到老,在帮助我们的同时也能够有所收获。谢谢!!!
28
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 专题党课讲稿:以高质量党建保障国有企业高质量发展
- 廉政党课讲稿材料:坚决打好反腐败斗争攻坚战持久战总体战涵养风清气正的政治生态
- 在新录用选调生公务员座谈会上和基层单位调研座谈会上的发言材料
- 总工会关于2025年维护劳动领域政治安全的工作汇报材料
- 基层党建工作交流研讨会上的讲话发言材料
- 粮食和物资储备学习教育工作部署会上的讲话发言材料
- 市工业园区、市直机关单位、市纪委监委2025年工作计划
- 检察院政治部关于2025年工作计划
- 办公室主任2025年现实表现材料
- 2025年~村农村保洁员规范管理工作方案
- 在深入贯彻中央8项规定精神学习教育工作部署会议上的讲话发言材料4篇
- 开展深入贯彻规定精神学习教育动员部署会上的讲话发言材料3篇
- 在司法党组中心学习组学习会上的发言材料
- 国企党委关于推动基层党建与生产经营深度融合工作情况的报告材料
- 副书记在2025年工作务虚会上的发言材料2篇