资源描述
C程序课程设计报告
--手机通讯录管理系统
组长:曾闯
学院:电子信息工程
学号:10071050
班级:电二
成员:晶,鄂跃宇,金迪
景飞,兴
一 课程设计目的和容概述
1.目的:加深对《C语言》课程所学知识的理解,进一步巩固C语言编程方法。学会编制结构清晰、风格良好、数据结构适当的C语言程序,从而具备解决综合性实际问题的能力,加强动手能力。
2.容:设计一个简易的手机通讯录管理系统。该题目要求在熟练掌握C语言的基本知识:数据类型(整形、实型、字符型、指针、数组、结构等);运算类型(算术运算、逻辑运算、自增自减运算、赋值运算等);程序结构(顺序结构、判断选择结构、循环结构);大程序的功能分解方法(即函数的使用)等。进一步掌握各种函数的应用,包括时间函数、、绘图函数,以与文件的读写操作等。
其中结构体,函数的调用,算法的设计是尤为重要的。
二 题目
手机通讯录管理系统。
[问题描述]
该系统模拟手机通讯录管理系统,实现对手机中的通讯录进行管理
[基本要求]
要能提供以下几种功能:
(1)查看功能:选择此功能时,列出下列三类选择:
A:办公类 B:个人类 C:商务类
(2)当选中某类时,显示出此类所有数据中的和
(3)添加数据功能:能录入新数据,每个结点包括:,,分类(可能选项有:w为办公类 p为个人类 b为商务类),电子。 例如: 春 商务类 chuny126.
当录入重复的和时,则提示数据录入重复并取消录入;当通讯录中超过15条信息时,存储空间已满,不能再录入新数据;录入的新数据能按递增的顺序自动进行条目编号。
(4)修改功能:选中某个人的时,可对此人的相应数据进行修改。
(5)删除功能:选中某个人的时,可对此人的相应数据进行删除,并自动调整后续条目的编号。
三 程序设计
1.总体设计
首先,因为每个个体有多种信息,所以要建立结构体来储存和整合各个信息。然后利用模块来分别实现程序的各个功能。各个模块用函数来实现。在通过通过主函数来判断输入字母,从而调动函数,实现所需功能。最后将输入的文件保存在文件里,以便重复使用。
2.详细设计
根据功能需要建立显示,添加,查看,删除,修改,保存五个模块。在模块过调用各个函数来实现功能。详细设计如下:
(1)构建结构体,写入文件
FILE *fp;
int i;
struct address
{ char a[40]; //email地址
};
struct ffriend
{ int num;
char name[20];
char kind[20];
long telephone;
struct address address;
}
friends[50];
void Load()
{
int j,k;
fp=fopen("friend.txt","a+");
if(fp!=NULL)
{
for(k=0;k<50;k++)
{
j=fgetc(fp);
if(j==EOF)
{
i=k-1;
return;
}
fseek(fp,k*sizeof(struct ffriend),SEEK_SET);
fread(&friends[k],sizeof(struct ffriend),1,fp);
}
}
else
{
fp=fopen("friend.txt","w");
i=1;
}
system("cls");
}
(2)构造函数与模块
构造显示模块,增加模块,删除模块,修改模块,查询模块。程序如下:
void Show(int j)
{
system("cls"); //实现分屏操作的函数
printf("\n\n\t编号-Nnumber: %3d",friends[j].num);
printf("\n\t-Name:%-20s",friends[j].name);
printf("\n\t性别-kind:%s",friends[j].kind);
printf("\n\t联系-Telephone:%-13ld",friends[j].telephone);
printf("\n\temail-address:%-40s",friends[j].address.a);
}
void Append(int j)
{
system("cls");
friends[j].num=j;
printf("\n\t\t\t序号-Number : %d",j);
printf("\n\t\t\t-Name : ");
scanf("%s",friends[j].name);
printf("\t\t\t类别-kind : ");
scanf("%s",&friends[j].kind);
printf("\t\t\t联系-telephone : ");
scanf("%ld",&friends[j].telephone);
while(friends[j].telephone<0||friends[j].telephone>)
{
printf("不合法!请重新输入 : ");
scanf("%ld",&friends[j].telephone);
}
printf("\t\t\temail-Address : ");
scanf("%s",friends[j].address.a);
getchar();
}
void Delete()
{
int k;int j;
system("cls");
printf("\n\tDelete 序号-Number : ");
scanf("%d",&k);
if(k-1<=i)
{
for(j=k-1;j<i+1;j++) /*插入位置后的元素顺序后移*/
{
strcpy(friends[j].name,friends[j+1].name); /*交换元素容*/
strcpy(friends[j].kind,friends[j+1].kind);
friends[j].telephone=friends[j+1].telephone;
strcpy(friends[j].address.a,friends[j+1].address.a);
}
i--;
}
else
{
printf("输入的序号太大!");
}
}
void Modify(int j)
{
system("cls");
Append(j);
}
void Save()
{
int k,j;
system("cls");
printf("\n\n\t\t请耐心等待,信息正在保存!\n");
printf("\n\n\n\n\t\t\tSaving");
for(k=0;k<20;k++)
{
Sleep(300);
printf(".");
}
printf("\n\n信息已经保存成功!\n");
fp=fopen("friend.txt","w");
for(j=0;j<=i;j++)
{
fwrite(&friends[0],sizeof(struct ffriend),1,fp);
}
fclose(fp);
}
(3)主函数调用各个模块
用switch语句判断输入者要使用的功能,然后调用函数,模块实现功能。程序如下:
void main()
{
int j;char a;char x;
char grade;
char searchkind[20];
char searchname[20];
load();
system("cls");
do
{
printf("\n\n\t\t\t=========================================\n");
printf("\t\t\t\t手机通讯录 \n");
printf("\t\t\t\t功能选择 \n"); //输出主界面
printf("\t\t\t=========================================\n");
printf("\t\t\t A.查看 *\n");
printf("\t\t\t B.增添 *\n");
printf("\t\t\t C.删除 *\n");
printf("\t\t\t D.查询 *\n");
printf("\t\t\t E.修改 *\n");
printf("\t\t\t F.保存 *\n");
printf("\t\t\t=========================================\n");
printf("\t\t\n请选择(Choice)\n\n\t\t注:输入a~h或A~H的字母:");
scanf("%c",&grade);
switch(grade) //用switch判断使用者要选择的功能
{
case 'a':
case 'A': j=0;
while(getchar()!=0x1b&&j<=i)
{
Show(j++);
printf("\n\n请按回车键继续!");
}
while(getchar()==0x1b||j>i)
{
if(j==0)printf("\n\t空文档,无任何记录-Empty Note\n");
else printf("\n\t记录已全部显示\n");
printf("\n\n请按回车键继续!");
getchar();
break;
}
printf("\n\t\t\t\t\t\t\t此次操作结束");
printf("\n\t------------------------------------------------------------\t\t\n");
break;
case 'b':
case 'B':
while(i<50)
{
i++;
Append(i);
printf("\t是否继续增加?(y/n)");
a=getchar();
if(a=='n')
break;
}
if(i==50)
printf("\n\t文档已满,无法增加记录-note full");
printf("\n\t\t\t\t\t\t\t此次操作结束");
printf("\n\t------------------------------------------------------------\t\t\n");
getchar();
break;
case 'c':
case 'C':
Delete();
if(i<1)
printf("\n没有记录-No records\n");
printf("\n\n请按回车键继续!");
getchar();
getchar();
printf("\n\t\t\t\t\t\t\t此次操作结束");
printf("\n\t------------------------------------------------------------\t\t\n");
break;
case 'd':
case 'D':
system("cls");
printf("\n\t请输入要查询记录的相关类别: p.个人类 b.商务类 w.办公类");
scanf("%s",searchkind);
for(j=0;j<=i;j++)
{
if(strcmp(searchkind,friends[j].kind)==0)
{
Show(j);
getchar();
}
}
break;
case 'e':
case 'E':
printf("\n\t请输入要修改记录的相关:");
gets(searchname);
scanf("%s",searchname);
for(j=0;j<=i;j++)
{
if(strcmp(searchname,friends[j].name)==0)
{
Modify(j);
}
}
if(i<1)
{ printf("\n 没有您所要修改的记录-No records");
printf("\n 请按回车键继续!");
getchar();
getchar();
}
printf("\n\t\t\t\t\t\t\t此次操作结束");
printf("\n\t------------------------------------------------------------\t\t\n");
break;
case 'f':
case 'F':
system("cls");
Save();
getchar();
printf("\n\t\t\t\t\t\t\t此次操作结束");
printf("\n\t------------------------------------------------------------\t\t\n");
break;
default:
printf("\n\t输入有误,请输入正确的序列号!");
printf("\n请按回车键继续!");
getchar();
printf("\n\t\t\t\t\t\t\t此次操作结束");
printf("\n\t------------------------------------------------------------\t\t\n");
}
}while(1);
}
上述三部分实现整个程序的功能。
四 程序源代码
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <windows.h>
FILE *fp;
int i;
struct address
{ char a[40];
};
struct ffriend
{ int num;
char name[20];
char kind[20];
long telephone;
struct address address;
}
friends[50];
void Load()
{
int j,k;
fp=fopen("friend.txt","a+");
if(fp!=NULL)
{
for(k=0;k<50;k++)
{
j=fgetc(fp);
if(j==EOF)
{
i=k-1;
return;
}
fseek(fp,k*sizeof(struct ffriend),SEEK_SET);
fread(&friends[k],sizeof(struct ffriend),1,fp);
}
}
else
{
fp=fopen("friend.txt","w");
i=1;
}
system("cls");
}
void Show(int j)
{
system("cls");
printf("\n\n\t编号-Nnumber: %3d",friends[j].num);
printf("\n\t-Name:%-20s",friends[j].name);
printf("\n\t性别-kind:%s",friends[j].kind);
printf("\n\t联系-Telephone:%-13ld",friends[j].telephone);
printf("\n\temail-address:%-40s",friends[j].address.a);
}
void Append(int j)
{
system("cls");
friends[j].num=j+1;
printf("\n\t\t\t类别:p.个人类 b.商务类 w.办公类");
printf("\n\t\t\t序号-Number : %d",j+1);
printf("\n\t\t\t-Name : ");
scanf("%s",friends[j].name);
printf("\t\t\t类别-kind : ");
scanf("%s",&friends[j].kind);
printf("\t\t\t联系-telephone : ");
scanf("%ld",&friends[j].telephone);
while(friends[j].telephone<0||friends[j].telephone>)
{
printf("不合法!请重新输入 : ");
scanf("%ld",&friends[j].telephone);
}
printf("\t\t\temail-Address : ");
scanf("%s",friends[j].address.a);
getchar();
}
void Delete()
{
int k;int j;
system("cls");
printf("\n\tDelete 序号-Number : ");
scanf("%d",&k);
if((k-1)<=i)
{
for(j=k-1;j<i+1;j++)
{
strcpy(friends[j].name,friends[j+1].name);
strcpy(friends[j].kind,friends[j+1].kind);
friends[j].telephone=friends[j+1].telephone;
strcpy(friends[j].address.a,friends[j+1].address.a);
}
i--;
}
else
{
printf("输入的序号太大!");
}
}
void Modify(int j)
{
system("cls");
Append(j);
}
void Save()
{
int k,j;
system("cls");
printf("\n\n\t\t请耐心等待,信息正在保存!\n");
printf("\n\n\n\n\t\t\tSaving");
for(k=0;k<20;k++)
{
Sleep(300);
printf(".");
}
printf("\n\n信息已经保存成功!\n");
fp=fopen("friend.txt","w");
for(j=0;j<=i;j++)
{
fwrite(&friends[j],sizeof(struct ffriend),1,fp);
}
fclose(fp);
}
void main()
{
int j;char a;char x;
char grade;
char searchkind[20];
char searchname[20];
Load();
system("cls");
do
{
printf("\n\n\t\t\t=========================================\n");
printf("\t\t\t\t手机通讯录 \n");
printf("\t\t\t\t功能选择 \n");
printf("\t\t\t=========================================\n");
printf("\t\t\t A.查看 *\n");
printf("\t\t\t B.增添 *\n");
printf("\t\t\t C.删除 *\n");
printf("\t\t\t D.查询 *\n");
printf("\t\t\t E.修改 *\n");
printf("\t\t\t F.保存 *\n");
printf("\t\t\t g.推出 *\n");
printf("\t\t\t=========================================\n");
printf("\t\t\n请选择(Choice)\n\n\t\t注:输入a~h或A~H的字母:");
scanf("%c",&grade);
switch(grade)
{
case 'a':
case 'A': j=0;
while(getchar()!=0x1b&&j<=i)
{
Show(j++);
printf("\n\n请按回车键继续!");
}
while(getchar()==0x1b||j>i)
{
if(j==0)printf("\n\t空文档,无任何记录-Empty Note\n");
else printf("\n\t记录已全部显示\n");
printf("\n\n请按回车键继续!");
getchar();
break;
}
printf("\n\t\t\t\t\t\t\t此次操作结束");
printf("\n\t------------------------------------------------------------\t\t\n");
break;
case 'b':
case 'B':
while(i<50)
{
i++;
Append(i);
printf("\t是否继续增加?(y/n)");
a=getchar();
if(a=='n')
break;
}
if(i==50)
printf("\n\t文档已满,无法增加记录-note full");
printf("\n\t\t\t\t\t\t\t此次操作结束");
printf("\n\t------------------------------------------------------------\t\t\n");
getchar();
break;
case 'c':
case 'C':
Delete();
if(i<0)
printf("\n没有记录-No records\n");
printf("\n\n请按回车键继续!");
getchar();
getchar();
printf("\n\t\t\t\t\t\t\t此次操作结束");
printf("\n\t------------------------------------------------------------\t\t\n");
break;
case 'd':
case 'D':
system("cls");
printf("\n\t请输入要查询记录的相关类别: p.个人类 b.商务类 w.办公类");
scanf("%s",searchkind);
getchar();
for(j=0;j<=i;j++)
{
if(strcmp(searchkind,friends[j].kind)==0)
{
Show(j);
printf("\n\t按回车请继续");
getchar();
}
}
break;
case 'e':
case 'E':
printf("\n\t请输入要修改记录的相关:");
gets(searchname);
scanf("%s",searchname);
for(j=0;j<=i;j++)
{
if(strcmp(searchname,friends[j].name)==0)
{
Modify(j);
}
}
if(i<0)
{ printf("\n 没有您所要修改的记录-No records");
printf("\n 请按回车键继续!");
getchar();
getchar();
}
printf("\n\t\t\t\t\t\t\t此次操作结束");
printf("\n\t------------------------------------------------------------\t\t\n");
break;
case 'f':
case 'F':
system("cls");
Save();
展开阅读全文