一、
设计要求与功能分析
1.设计的任务和需要的知识点
建立一个人通讯录,输入姓名、电话号码、住址等信息,然后对通信簿进行显示、查找、添加、修改及删除。功能要求包括:
(1) 通讯录的每一条信息包括姓名、单位、固定电话、移动手机、分类(如同事、朋友、同学、家人等)、EMAIL、QQ等。
(2) 输入功能:可以一次完成若干条信息的输入。
(3) 显示功能:完成全部通讯录信息的显示(一屏最多显示10条,超过十条应能够自动分屏显示)
(4) 查找功能:可以按姓名等多种方式查找通讯信息
(5) 增加、删除、修改功能:完成通讯录信息的多种更新
2.具体完成的设计内容(设计目标),包括功能需求描述,可以画出功能模块图
该系统用下面六个功能模块编写,每个模块执行不同的功能,体现了模块化设计的思想。下面六个模块都是利用C语言文件,向文件中添加数据、修改数据、查询数据、删除数据和保存数据。
(1)输入联系人
初始通过键盘输入通讯录人员的姓名、电话号码、地址信息便可实现将信息添加到通讯录文件内。。
(2)输出联系人
输出联系人的所有信息。
(3)添加联系人
通过键盘输入通讯录人员的姓名、电话号码、地址信息便可实现将信息添加到通讯录文件内,添加完毕后,系统会自动询问你是否继续添加,如你想继续添加,再通过键盘输入通讯录人员的姓名、电话号码、地址信息即可实现继续添加。
(4)查找联系人
通过前面第一个模块打得录入我们便可以执行第二个模块,通过第二个模块我们可以进行对联系人进行查找和显示。
(5)删除联系人
我定义了Delete()函数来实现删除功能,删除不成功会提示重新删除。
(6)修改联系人
我定义了modification()函数来实现修改功能。
二、 总体设计
本部分为程序总体(概要)设计,包括抽象数据类型、算法设计的思想、整个程序的框架结构(功能模块结构图)、各模块(一般对应某个函数)的功能接口设计与简介及主要算法的流程图。可以如下设计编排本部分内容。
1. 功能模块划分与设计
程序的模块图很直观的反映出程序能够实现的功能,由下面的模块图可以很直观的看出我设计的通讯录软件能够方便的实现添加联系人、显示联系人、删除联系人、修改联系人功能,另外,我设计的软件还实现了保存退出和不保存退出功能,这个功能很独特。
①在增加联系人部分,我用了三个函数调用来分别实现录入联系人姓名、号码、地址。
②在显示和查询联系人部分,我也有三个模块: 逐个显示联系人,按姓名查询,按号码查询。
③在删除联系人部分,我设计了界面,可以实现单个删除,回到主菜单。
④在修改联系人模块,我也设计了三个界面,按姓名修改,按号码修改,回到主菜单。
2.数据结构设计
本程序采用了不同的函数来进行定义不同模块的功能,通过调用不同的函数,可以实现不同的功能。软件中采用了五个主体函数来实现添加联系人,修改联系人,查找联系人,显示联系人,删除联系人的功能。软件调用不同的函数来实现不同的功能,通过反复调用函数来实现反复输入。代码中通过scanf从键盘上输入不同的数字选项,然后通过address_book ()来实现对不同函数的调用。
2. 函数功能描述
由添加联系人的程序流程图可以看出,在添加联系人板块上,我设计了三种信息,输入姓名,输入电话和输入地址,输入完成后会提示是否继续输入,如果输入y后则可以继续输入,输入n后返回主菜单。
在主菜单上输入2后便可以进入显示和查询联系人的主界面,我为您提供了三个选项,1.显示全部 2.按姓名查询 3.按电话查询。输入对应的数字便可以实现对应的功能,同理,系统会在您查询完毕后询问您是否继续查询,操作同上。
三、 详细设计与程序实现
1.系统的详细设计
(1) 预处理,如使用到的头文件等
使用到的头文件
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
(2) 数据类型定义
int, char ,
(3) 函数及变量声明
void print(address L, int i); //输出信息
int check(address L); //查找
void cread(address *L); //创建联系人
void Delete(address *L); //删除联系人
void inint(address *L); //添加联系人
void modification(address *L); //修改联系人
void menu();//主菜单
(4) 主控模块main()函数
int main()
{address L; int n, i, j;
while(1)
{menu();
printf("请输入主菜单中的代号\n");
scanf("%d", &n);
if(n==1)
cread(&L);
else if(n==2)
{
printf("请输入需要输出的人的位置\n");
scanf("%d", &i);
print(L, i);
}
else if(n==3)
{
inint(&L);
}
else if(n==4)
{
j = check(L);
}
else if(n==5)
{
Delete(&L);
}
else
{
printf("1");
modification(&L);
}
}
}
main()函数功能分析:main()函数通过调用menu()函数实现对界面进行控制。
(5) 主要处理函数功能介绍
系统通过键盘依次输入联系人的信息,其源程序如下:
void print(address L, int i)
{
printf("系统输出联系人的信息\n");
printf("-------------------------------------\n");
printf("姓名: ");
printf("%s\n", L.a[i].Name);
printf("工作单位: ");
printf("%s\n", L.a[i].Unit);
printf("固定电话: ");
printf("%s\n", L.a[i].Fix_phone);
printf("移动电话: ");
printf("%s\n", L.a[i].mobile_phone);
printf("分类: ");
printf("%s\n", L.a[i].classify);
printf("Emall: ");
printf("%s\n", L.a[i].Emall);
printf("QQ: ");
printf("%s\n", L.a[i].QQ);
printf("------------------------------------\n");
printf("请按任意键\n");
getch();
}
系统通过输入的信息查找联系人信息其源程序如下:
if(i==1)
{
while(j<=num)
{
if(strcmp(A, L.a[j].Name)==0)
{
n++;//记录名字相同的个数;
printf("相同条件又%d个\n", n);
printf("编号: %d\n", j);
print(L, j);
}
j++;//遍历的位置
}
return j;
}
if(i==2)
{
while(j<=num)
{
if(strcmp(A, L.a[j].Unit)==0)
{
n++;//记录名字相同的个数;
printf("相同条件又%d个\n", n);
printf("编号: %d\n", j);
print(L, j);
}
j++;//遍历的位置
}
return j;
}
if(i==3)
{
while(j<=num)
{
if(strcmp(A, L.a[j].Fix_phone)==0)
{
printf("编号: %d\n", j);
print(L, j);
break;
}
j++;//遍历的位置
}
return j;//由于固定电话不会出现相同的所以不需要执行 check1;
}
if(i==4)
{
while(j<=num)
{
if(strcmp(A, L.a[j].mobile_phone)==0)
{
printf("编号: %d\n", j);
print(L, j);
break;
}
j++;//遍历的位置
}
return j;//由于移动电话不会出现相同的所以不需要执行 check1;
}
if(i==5)
{
while(j<=num)
{
if(strcmp(A, L.a[j].Emall)==0)
{
printf("编号: %d\n", j);
print(L, j);
break;
}
j++;//遍历的位置
}
return j;//由于EMall不会出现相同的所以不需要执行 check1;
}
if(i==6)
{
while(j<=num)
{
if(strcmp(A, L.a[j].QQ)==0)
{
printf("编号: %d\n", j);
print(L, j);
break;
}
j++;//遍历的位置
}
return j;//由于QQ不会出现相同的所以不需要执行 check1;
}
if(i<=0 || i>=7)
{
printf("查找出现错误\n");
return 0;
}
}
删除联系人:
void Delete(address *L)
{
int i;
i = check(*L);
if(i==0)
printf("删除不成功请重新操作\n");
else
{
// L->a[i] = memset(&L->a[i], 0, sizeof());
L->blank[bnum++] = i;
}
}
2.运行结果与分析
(1)code blocks 编译软件
(2)程序的运行界面截图及运行结果的屏幕截图及分析
运行程序显示主界面
输入代号1输入联系人
输入联系人数目1
输入联系人所有信息
输入代号3添加联系人
输入代号4查找联系人
输入代号6修改联系人
四、 收获、体会及意见
经过了一期的C语言课程设计上机实践学习,使我对C语言有了更进一步的认识和了解,通过老师对文件的讲解,使我对文件的使用有了更近一步的了解,对以前在这些地方没有弄懂的地方,经过老师的讲解我终于弄懂了。以前的我上机的时候太少了,编程的能力有限,这次的C语言课程设计给了我一个教训,一门课程要想学好首先它要重在实践,要通过不断的实际动手操作训练才能更好地学习它。通过上机操作,我发现我的好多不足之处:
① 我对键盘的熟悉程度远远不够,编写一个程序很费时间,录入程序的速度很慢,还经常按错字母,在编译的时候经常发生拼写警告,通过一周的训练,我有了一个提高;
② 其次,对C语言的知识掌握不够,对文件的调用、打开和保存方式比较陌生,通过老师讲解,我基本上掌握了文件的知识;
③ 对C语言的一些标准库函数不太了解,容易忘记添加头文件就调用函数,往往形成错误找了很久没找到,还有对函数调用的正确使用不够熟悉;
④ 还有对C语言中经常出现的错误也不了解,通过实践,使我在程序修改方面有了一个较大的提高。
通过C语言课程设计的学习,我认识到学好计算机知识需要我们不断的实践操作,只有重视实践操作,才能学到最有用的知识。不仅仅是学习C语言,学习其他知识,都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己学到有用的知识。
五、 参考资料索引
参考资料:(五号,宋体加粗)
[1] 谭浩强. C语言程序设计教程[M]. 北京:清华大学出版社,2009年
[2] …………………………………………………………………………..
(要求:五号字,宋体,单倍行距。按作者、书名、出版社、地点、出版时间格式逐一列出)
六、 程序清单
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define max 1000
int num = 1;
int bnum = 1;
typedef struct address_book
{
char Name[20]; // 通讯录姓名
char Unit[100]; // 单位
char Fix_phone[20]; //固定电话
char mobile_phone[20]; //移动电话
char classify[20]; //分类
char Emall[20]; // emall
char QQ[20]; //QQ
}address_book;
typedef struct address
{
address_book a[max];
int blank[1000]; // 空位置
}address;
void print(address L, int i); //输出信息
int check(address L); //查找
void cread(address *L); //创建联系人
void Delete(address *L); //删除联系人
void inint(address *L); //添加联系人
void modification(address *L); //修改联系人
void menu();
int main()
{
address L;
int n, i, j;
while(1)
{
menu();
printf("请输入主菜单中的代号\n");
scanf("%d", &n);
if(n==1)
cread(&L);
else if(n==2)
{
printf("请输入需要输出的人的位置\n");
scanf("%d", &i);
print(L, i);
}
else if(n==3)
{
inint(&L);
}
else if(n==4)
{
j = check(L);
}
else if(n==5)
{
Delete(&L);
}
else
{
printf("1");
modification(&L);
}
}
}
void print(address L, int i)
{
printf("系统输出联系人的信息\n");
printf("-------------------------------------\n");
printf("姓名: ");
printf("%s\n", L.a[i].Name);
printf("工作单位: ");
printf("%s\n", L.a[i].Unit);
printf("固定电话: ");
printf("%s\n", L.a[i].Fix_phone);
printf("移动电话: ");
printf("%s\n", L.a[i].mobile_phone);
printf("分类: ");
printf("%s\n", L.a[i].classify);
printf("Emall: ");
printf("%s\n", L.a[i].Emall);
printf("QQ: ");
printf("%s\n", L.a[i].QQ);
printf("------------------------------------\n");
printf("请按任意键\n");
getch();
}
int check(address L)
{
int i, j=1, n=0, m;
char A[100];
printf(" 查找方式 \n");
printf("*******************************************\n");
printf(" 1. 姓名 \n");
printf(" 2. 单位 \n");
printf(" 3. 移动电话 \n");
printf(" 4. 固定电话 \n");
printf(" 5. EMALL \n");
printf(" 6. QQ \n");
printf("******************************************\n");
printf("输入查找人的方式:\n");
scanf("%d", &i);
printf("请输入需要查找人的信息:");
scanf("%s", A);
if(i==1)
{
while(j<=num)
{
if(strcmp(A, L.a[j].Name)==0)
{
n++;//记录名字相同的个数;
printf("相同条件又%d个\n", n);
printf("编号: %d\n", j);
print(L, j);
}
j++;//遍历的位置
}
return j;
}
if(i==2)
{
while(j<=num)
{
if(strcmp(A, L.a[j].Unit)==0)
{
n++;//记录名字相同的个数;
printf("相同条件又%d个\n", n);
printf("编号: %d\n", j);
print(L, j);
}
j++;//遍历的位置
}
return j;
}
if(i==3)
{
while(j<=num)
{
if(strcmp(A, L.a[j].Fix_phone)==0)
{
printf("编号: %d\n", j);
print(L, j);
break;
}
j++;//遍历的位置
}
return j;//由于固定电话不会出现相同的所以不需要执行 check1;
}
if(i==4)
{
while(j<=num)
{
if(strcmp(A, L.a[j].mobile_phone)==0)
{
printf("编号: %d\n", j);
print(L, j);
break;
}
j++;//遍历的位置
}
return j;//由于移动电话不会出现相同的所以不需要执行 check1;
}
if(i==5)
{
while(j<=num)
{
if(strcmp(A, L.a[j].Emall)==0)
{
printf("编号: %d\n", j);
print(L, j);
break;
}
j++;//遍历的位置
}
return j;//由于EMall不会出现相同的所以不需要执行 check1;
}
if(i==6)
{
while(j<=num)
{
if(strcmp(A, L.a[j].QQ)==0)
{
printf("编号: %d\n", j);
print(L, j);
break;
}
j++;//遍历的位置
}
return j;//由于QQ不会出现相同的所以不需要执行 check1;
}
if(i<=0 || i>=7)
{
printf("查找出现错误\n");
return 0;
}
}
void cread(address *L)
{
int n, i;
printf("请输入需要输入联系人的数目\n");
scanf("%d", &n);
for(i=1; i<=n; i++)
{
printf("请输入联系人的信息\n");
printf("-------------------------------------\n");
printf("请输入姓名:\n");
scanf("%s", L->a[i].Name);
printf("请输入工作单位:\n");
scanf("%s", L->a[i].Unit);
printf("请输入固定电话:\n");
scanf("%s", L->a[i].Fix_phone);
printf("请输入移动电话:\n");
scanf("%s", L->a[i].mobile_phone);
printf("请输入联系人的分类:\n");
scanf("%s", L->a[i].classify);
printf("请输入联系人的EMALL:\n");
scanf("%s", L->a[i].Emall);
printf("请输入联系人的QQ号:\n");
scanf("%s", L->a[i].QQ);
printf("-------------------------------------\n");
num++;
}
}
void Delete(address *L)
{
int i;
i = check(*L);
if(i==0)
printf("删除不成功请重新操作\n");
else
{
// L->a[i] = memset(&L->a[i], 0, sizeof());
L->blank[bnum++] = i;
}
}
void inint(address *L)
{
if(bnum)
{
printf("请输入姓名:\n");
scanf("%s", L->a[bnum].Name);
printf("请输入工作单位:\n");
scanf("%s", L->a[bnum].Unit);
printf("请输入固定电话:\n");
scanf("%s", L->a[bnum].Fix_phone);
printf("请输入移动电话:\n");
scanf("%s", L->a[bnum].mobile_phone);
printf("请输入联系人的分类:\n");
scanf("%s", L->a[bnum].classify);
printf("请输入联系人的EMALL:\n");
scanf("%s", L->a[bnum].Emall);
printf("请输入联系人的QQ号:\n");
scanf("%s", L->a[bnum].QQ);
bnum--;
}
else
{
printf("请输入姓名:\n");
scanf("%s", L->a[num].Name);
printf("请输入工作单位:\n");
scanf("%s", L->a[num].Unit);
printf("请输入固定电话:\n");
scanf("%s", L->a[num].Fix_phone);
printf("请输入移动电话:\n");
scanf("%s", L->a[num].mobile_phone);
printf("请输入联系人的分类:\n");
scanf("%s", L->a[num].classify);
printf("请输入联系人的EMALL:\n");
scanf("%s", L->a[num].Emall);
printf("请输入联系人的QQ号:\n");
scanf("%s", L->a[num].QQ);
num++;
}
}
void modification(address *L)
{
int i, j;
char A[100];
i = check(*L);
printf(" 修改信息的序号 \n");
printf("*******************************************\n");
printf(" 1. 姓名 \n");
printf(" 2. 单位 \n");
printf(" 3. 移动电话 \n");
printf(" 4. 固定电话 \n");
printf(" 5. 联系人分类 \n");
printf(" 6. EMALL \n");
printf(" 7. QQ \n");
printf("******************************************\n");
printf("输入需要修改信息的序号: \n");
scanf("%d", &j);
printf("输入修改信息:\n");
scanf("%s", A);
if(j == 1)
{
strcpy(L->a[i].Name, A);
}
if(j == 2)
{
strcpy(L->a[i].Unit, A);
}
if(j == 3)
{
strcpy(L->a[i].Fix_phone, A);
}
if(j == 4)
{
strcpy(L->a[i].mobile_phone, A);
}
if(j == 5)
{
strcpy(L->a[i].classify, A);
}
if(j == 6)
{
strcpy(L->a[i].Emall, A);
}
if(j == 7)
{
strcpy(L->a[i].QQ, A);
}
}
void menu()
{
printf(" 主菜单 \n");
printf("=============================================\n");
printf(" 1. 输入联系人\n");
printf(" 2. 输出联系人\n");
printf(" 3. 添加联系人\n");
printf(" 4. 查找联系人\n");
printf(" 5. 删除联系人\n");
printf(" 6. 修改联系人\n");
printf("=============================================\n\n");
}
自评 意见 |
通过这次课程设计通过C语言课程设计的学习,我认识到学好计算机知识需要我们不断的实践操作,只有重视实践操作,才能学到最有用的知识。不仅仅是学习C语言,学习其他知识,都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己学到有用的知识, 做完这个系统发现自己能将所学的知识融合在一起,提高了我的编程能力,锻炼了我的编程技术,还有对C语言中经常出现的错误也不了解,通过实践,使我在程序修改方面有了一个较大的提高。
签名: 陈军辉
2014年 12月 23日 |
自评 等级 |
|
指导 教师 评定 等级 |
签名:
年 月 日 |