语言程序设计实训报告
课程名称 C 语言程序设计实训
课题名称 通讯录管理
专
业
软件工程
班
级
K 软件 151
学
号
姓
名
指导教师
2016年1月1日
1
湖北汽车工业学院科技学院
语言程序设计实训任务书
课程名称 C 语言程序设计实训
课 题 通讯录管理
专业班级 软件工程
学生姓名
学 号
指导老师
审 批
2
一、设计内容与设计要求
1.设计内容:
设计课题:通讯录管理
一、问题描述:
该设计实现对通讯录得管理功能,具体包括从键盘输入通讯录的信息、从指定
的文件中读入通讯录的信息、 按姓名查询通讯录的信息、 按分类查询通讯录的信息、
删除指定姓名的通讯录的信息、将通讯录信息保存在指定的文件中等。
二、功能要求:
能从键盘输入通讯录的信息(增加,输入时需要能检查该姓名的通讯录的记录是否已经存在,如果存在,需要询问是否是覆盖还是增加,需要判断输入的类型是否存在)
能从指定的文件中读入通讯录的信息
能按姓名查询通讯录的信息
能按分类查询通讯录的信息
能删除指定姓名的通讯录的信息
能将通讯录信息保存在指定的文件中
所有数据符合实际应用要求
2.设计要求:
1)设计正确,方案合理。
2)界面友好,使用方便。
3)程序精炼,结构清晰。
4)上机演示。
3.设计报告要求:
课程设计报告格式如下:
1)正文的格式:一级标题用 3 号黑体,二级标题用四号宋体加粗,正文用小四号
宋体,行距为 22。
2)正文的内容:课题的主要功能、课题的功能模块的划分、主要功能的实现、程
序调试、总结、附件(所有程序的源代码,要求对程序写出必要的注释) 。
3)课程设计报告装订顺序:封面、任务书、目录、正文、评分、程序清单附件。
二、进度安排
3
星期
时间
班级
内容
K 软件 151
熟悉课题的任务和要求,
二
6:30-8:30
查阅相关资
料,做好编码
准备
三
6:30-8:30
K 软件 151
程序编码、 调
试
四
K 软件 151
程序编码、 调
6:30-8:30
试和测试, 书
写报告
日
K 软件 151
答辩、检查、
6:30-8:30
验收、提交设
计报告
地点
2601
2601
2601
2601
湖北汽车工业学院科技学院
2015年 12月 20 日
4
目 录
1 系统需求分析 6
2 概要设计 6
3 详细设计 6
4 系统测试 14
5 课程设计总结 15
5
系统需求分析
本系统首先设计出了主函数,然后根据去要实现的功能分别设计,添加、显示、删
除、查找、修改功能的子函数。在现实的函数设计过程中首先运用文件的读取等必要的知识通过把文件的内容读取到内存然后打印出来。添加函数在设计时通过申请一片空
间,然后通过指针将需要添加进去,从而实现添加功能。删除函数的设计是首先从文件
找到要删除的人,然后通过写一个实现删除目的的 for 循环将人从内存里面删除,然后
在用写的方式打开文件,将内存的信息写入文件,实现删除。查找也是先打开文件,用
一个字符串对比的方法找出用户要查找的人,然后打印出来。修改也大体和删除相同。
概要设计
系统功能模块图:
主菜单
添加 查询 删除 修改 退出
编号、姓名、 编号、姓名、 输入姓名 输入编号, 重新输入编号、
电话号码 电话号码 姓名、电话号码
详细设计
3.1 数据结构
本系统主要采用链表结构类型来表示储存在“通讯录管理系统”中的信息。其中,链表结点由四个分量构成:编号、联系人姓名、电话号码、指向该结构体的指针。
3.2 主菜单模块:
本系统设置了 5 个子功能菜单, 5 个子功能的设计描述如下。
(1) 通讯录信息的输入。可以一次输入多个通讯成员的信息,建立通讯录。该功能由
insert() 函数实现。
6
(2) 通讯录信息的显示。可以查看通讯录中所有的通讯录成员记录。
该功能由 output() 函数实现。
(3) 通讯录信息的保存。
可以将输入的通讯录成员的信息进行保存。
该功能由 save() 函数实现。
(4) 通信记录的删除。可以对通讯录中不再需要的信息进行删除。该功能由 del() 函
数实现。(要彻底删除,必须要删除 counter.txt 和通讯录 .txt 中的内容。如下
图:)
(5) 通信记录的修改。可以将通讯录中的联系成员的信息进行修改,并保存。该功能
modify() 函数实现。
(6) 通信记录的查找。可以通过 3 种方式进行对通讯信息进行查找。该功能由
found(found_code() 、found_name() 、found_tele()) 函数实现。
struct tele // 定义数据结构
{
char code[8]; // 编号
char name[20]; // 姓名
char tele[16]; // 电话号码
};
/********************* 函数声明 ********************/
void creat();
//
创建通讯录
void load();
//
加载数据
void menu();
//
菜单显示
void choose_1(int); // 选择功能
7
void insert();
//1
、通讯录信息的输入
void output();
//2
、通讯录信息的显示
void save();
//3
、通讯录信息的保存
void del();
//4
、通信记录的删除
void modify();
//5
、通信记录的修改
void found();
//6
、记录的查找( 3 种方式)
void choose_2(int);
//
选择查询的方式
void found_code();
//6.1
、按编号查询
void found_name();
//6.2
、按姓名查询
void found_tele();
//6.3
、按电话号码查询
void quit();
//7
、退出系统
3.3 添加模块
此模块为添加信息模块,添加后再调用保存所添加的数据,支持多条信息的添加。
开始
0~6 调用 insert
函数
Y N
k=1 ?
保存调用 save函 返回主菜单
数
结束
【程序】
/************************* 通讯信息录入函数 **********************/
/************** 将函数写入内存中,由 person[N] 数组保存着 **********/
void insert()
{
8
struct tele*p;
system("cls");
p=(struct tele*)malloc(sizeof(struct tele)); // 将动态分配
的内存首地址赋给 p
printf("\n\n\n\n\n\n");
printf("\t *******************************\n\n");
printf("\t 编号 :");
scanf("%s",p->code);
strcpy(person[counter+1].code,p->code);
printf("\t 姓名 :");
scanf("%s",p->name);
strcpy(person[counter+1].name,p->name);
printf("\t 电话 :");
scanf("%s",p->tele);
strcpy(person[counter+1].tele,p->tele);
printf("\n\t ************************************");
counter++;
free(p); // 释放空
间
getchar();
getchar();
system("cls");
menu();
}
3.4 显示模块
此模块为显示所有记录,流程图如下:
选择显示功能
显示所有记录
9
返回主菜单
【程序】
/********************** 通讯信息显示函数 ****************************/
/*********** 从内存中将数据显示在屏幕上,不用打开文件 ***************/
void output()
{
int i=1;
system("cls");
if(counter)
{
for(i=0;i<=counter;i++)
printf("\n\t%-8s%-20s%-16s\n",person[i].code,person[i].name,person[i].te
le);
printf("\t");
}
else
printf("\n\n\n\n\n\t\t
记录为空,请输入联系人信息!
");
getchar();
getchar();
system("cls");
menu();
}
3.5 删除模块
此模块先利用查找模块找到所要删除的信息,然后根据用户的选择来确定是否删除
信息,此种调用到 save 函数。其流程图如下:
开始
输入要删除信息的姓
名
10
Y N
是否找到信
息
显示找到的信息 没 有 找 到 信 息
Y
是否删
除
N
删 除 成 功 提示未删除
结束
【程序】
/*************************** 信息删除函数 ***************************/
void del() // 根据姓名删除,根
据显示选择要删除的内容
{
int k=1;
int c=0;
char m;
char namekey[20];
system("cls");
printf("\n\n\n\n\n\n\t\t\t 请输入要删除的姓名 :");
scanf("%s",namekey);
while(k<=counter)
{
if(!strcmp(namekey,person[k++].name))
{
c=k-1;
break;
11
}
}
if(c)
{
printf("\t\t\t 已查到,记录为 :\n\n\n");
printf("\t%-10s%-20s%-20s\n",person[0].code,person[0].name,person[0].tel
e);
printf("\t%-10s%-20s%-20s\n",person[c].code,person[c].name,person[c].tel
e);
printf("\n\n\t\t\t 确定要删除吗? (Y/N):");
scanf("%s",&m);
if(m=='y'||m=='Y')
{
if(c==counter)
{
strcpy(person[counter].code,"\0");
strcpy(person[counter].name,"\0");
strcpy(person[counter].tele,"\0");
counter--;
}
else
{
for(k=c;k<=counter;k++) // 后面的信息将
前面的信息覆盖掉
{
strcpy(person[k].code,person[k+1].code);
strcpy(person[k].code,person[k+1].name);
12
strcpy(person[k].code,person[k+1].tele);
}
strcpy(person[counter].code,"\0"); // 最后的信息
为空
strcpy(person[counter].name,"\0");
strcpy(person[counter].tele,"\0");
counter--;
}
printf("\t\t\t 删除成功! ");
getchar();
getchar();
system("cls");
save(); // 用 sava()
函数将删除后的信息重新保存
menu();
}
else
{
system("cls");
menu();
}
}
else
{
printf("\n\t\t\t 对不起没有此人记录! ");
getchar();
getchar();
system("cls");
menu();
}
13
}
系统测试
4.1 菜单显示
主菜单具有所有函数的功能实现的选择功能,通过主菜单的操作进入各个功能。主菜单主要由主函数提供,其功能由子函数实现。运行结果如下图所示:
4.2 添加
在主菜单界面,用户输入 1 并回车,然后按照提示建立通讯录,分别输入通讯录成员的编号,姓名,电话号码,运行结果如下图所示:
14
4.3 显示
在主菜单下,用户输入 2 并回车,可以查看通讯录中所有成员信息。运行结果如下图所示:
课程设计总结
通过这次的课程设计,我对很多的函数有了新的认识,也学会了很多,学会了运用多种函数,我也明白了编写软件的基本过程和方法。在这个过程中我学会了很多平时编程不会使用的函数,还有编写的方法。特别是文件的开启和关闭,读与写,总的来说,这次课程设计让我受益匪浅啊 !
其实在编写软件的过程中也遇到了很多的困难, 每一个自定义函数都是经过多次的调试和改正错误,曾经想过要放弃的,但是为了完成这个任务还是拼命的坚持了下来,毫不畏惧困难才是真正的我,还有就是编写和改错的过程中受到许多同学的帮助,在一番折腾之后,我总算是顺利的完成了这次的《通讯录管理》的程序设计。
虽然在调试程序的过程中,遇到过很多很多的困难,但是当软件调试成功时那种喜悦的感觉没有什么东西可以代替。
在程序的编写过程中我发现我自己有很多的知识漏洞和缺陷,以至于编写完后,一经过编译,发现了好多的错误,所以我需要进一步的来完善我自己。
在这几天的编写过程中,对我而言,我的 C语言是有了很大的进步和了解。在此次的编写过程中,我知道和掌握了很多的经验,它们肯定是能够促进我学习的。
此次的课程设计不仅给了我很多很好的经验,也让我体会到了失败时的焦虑、无助和难受,当然我更喜欢成功后的兴奋和喜悦咯 ~~~啦啦啦 ~~~
15
附录:
源程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#define N 35
struct tele
{
char code[8];
char name[20];
char tele[16];
};
/*********************
FILE*fp;
struct tele person[N]; int counter;
/*********************
void creat();
void load();
void menu();
void choose_1(int); void insert();
void output();
void save();
void del();
void modify();
void found();
void choose_2(int); void found_code(); void found_name(); void found_tele();
void quit();
改变 N 的值,就可以改变记录的联系人个数
//定义数据结构
//编号
姓名
电话号码
定义全局变量 *********************/
文件指针
记录联系人信息
//统计记录个数(联系人个数)
函数声明 ********************/
//创建通讯录
//加载数据
//菜单显示
//选择功能
//1、通讯录信息的输入
//2、通讯录信息的显示
//3、通讯录信息的保存
//4、通信记录的删除
//5、通信记录的修改
//6、记录的查找( 3 种方式)
//选择查询的方式
//6.1、按编号查询
//6.2、按姓名查询
//6.3、按电话号码查询
//7、退出系统
16
/***********************MAIN 函数 *******************/
int main()
{
system("cls"); // 清屏
creat(); //为程序创建文件
fp=fopen("counter.txt","r"); //r 只读(打开)
fscanf(fp,"%d",&counter); //将数据赋值给 counter
fclose(fp); //关闭打开的文件
load(); //数据装载至内存中
menu();
return 0;
}
/*********************** 创建通讯录 ******************/
void creat()
{
if((fp=fopen(" 通讯录 .txt","r"))==NULL) //r 只读(打开)
{
fp=fopen(" 通讯录 .txt","w"); //w 为只写建立一
个新的文件
fprintf(fp,"%-10s%-20s%-20s\n"," 编号 "," 姓名 "," 电话 "); //写入基本信息 person
【0】
fclose(fp);
}
if((fp=fopen("counter.txt","r"))==NULL) //r 只读(打开)
{
fp=fopen("counter.txt","w");
fprintf(fp,"%d",0); //写入初值(自有文
件新建时才有)
fclose(fp);
}
}
void load()
{
int i;
if((fp=fopen(" 通讯录 .txt","r"))!=NULL) //r 只读(打开),打
开文件成功
for(i=0;i<=counter;i++)
fscanf(fp,"%s%s%s",person[i].code,person[i].name,person[i].tele); // 将文件中的信息加载到内存中,供操作使用
else
17
printf(" 打开文件失败! \n");
fclose(fp);
}
/************************* 界面菜单显示函数 ************************/
void menu()
{
int k;
printf("\n");
printf("\n");
printf("\t
*********************************************\n");
printf("\t
**********
MENU
*************\n");
printf("\t
*********************************************\n");
printf("\t
**********
1
、通讯录信息的输入:
**********\n");
printf("\t
**********
2
、通讯录信息的显示:
**********\n");
printf("\t
**********
3
、通讯录信息的保存:
**********\n");
printf("\t
**********
4
、通信记录的删除:
************\n");
printf("\t
**********
5、通信记录的修改:
************\n");
printf("\t
**********
6
、通信记录的查找:
************\n");
printf("\t
**********
0
、退出系统:
************\n");
printf("\t
*********************************************\n");
printf("\t
Now Please Enter your choose(0-6): ");
scanf("%d",&k);
choose_1(k);
}
/*************************** 函数功能选择函数 ***************************/
void choose_1(int k)
{
switch(k)
{
case 1: insert();break;
case 2: output();break;
case 3: save();system("cls");printf("\n\n\n\n\n\n\n\n\n\n\t\t\t\t 保 存
成 功!");
getchar();getchar();system("cls");menu();break; case 4:del();break;
case 5:modify();break;
case 6:found();break;
case 0:quit();break;
default:;break;
}
}
18
/*******************************OK******************************/
/************************* 通讯信息录入函数 **********************/
/************** 将函数写入内存中,由 person[N]数组保存着 **********/
void insert()
{
struct tele*p;
system("cls");
p=(struct tele*)malloc(sizeof(struct tele)); //将动态分配的内存首地址赋
给 p
printf("\n\n\n\n\n\n");
printf("\t *******************************\n\n");
printf("\t 编号 :");
scanf("%s",p->code);
strcpy(person[counter+1].code,p->code);
printf("\t 姓名 :");
scanf("%s",p->name);
strcpy(person[counter+1].name,p->name);
printf("\t 电话 :");
scanf("%s",p->tele);
strcpy(person[counter+1].tele,p->tele);
printf("\n\t ************************************");
counter++;
free(p); //释放空间
getchar();
getchar();
system("cls");
menu();
}
/********************** 通讯信息显示函数 ****************************/
/*********** 从内存中将数据显示在屏幕上,不用打开文件 ***************/
void output()
{
int i=1;
system("cls");
if(counter)
{
for(i=0;i<=counter;i++)
printf("\n\t%-8s%-20s%-16s\n",person[i].code,person[i].name,person[i].tele); printf("\t");
}
else
19
printf("\n\n\n\n\n\t\t 记录为空,请输入联系人信息! "); getchar();
getchar();
system("cls");
menu();
}
/************ 保存、修改、删除只针内存中的数组进行操作 *************/
/************************ 通讯信息保存函数 *************************/
void save()
{
int i;
system("cls");
if((fp=fopen("counter.txt","w"))==NULL) //w 只写覆盖原来的数
据
{
printf("\n\n\n\t\t\t 操作失败 .");
exit(1);
}
fprintf(fp,"%d",counter); // 向磁盘写入现在的值,
即保存
fclose(fp);
if((fp=fopen(" 通讯录 .txt","w"))!=NULL)
fprintf(fp,"%s","\0");
fclose(fp);
if((fp=fopen(" 通讯录 .txt","a"))!=NULL)
for(i=0;i<=counter;i++)
fprintf(fp,"%-10s%-20s%-20s",person[i].code,person[i].name,person[i].tele);
fclose(fp);
system("cls");
}
/*************************** 信息删除函数 ***************************/
void del() // 根据姓名删除,根据显示
选择要删除的内容
{
int k=1;
int c=0;
char m;
char namekey[20];
system("cls");
printf("\n\n\n\n\n\n\t\t\t 请输入要删除的姓名 :");
scanf("%s",namekey);
20
while(k<=counter)
{
if(!strcmp(namekey,person[k++].name))
{
c=k-1;
break;
}
}
if(c)
{
printf("\t\t\t 已查到,记录为 :\n\n\n");
printf("\t%-10s%-20s%-20s\n",person[0].code,person[0].name,person[0].tele);
printf("\t%-10s%-20s%-20s\n",person[c].code,person[c].name,person[c].tele); printf("\n\n\t\t\t 确定要删除吗? (Y/N):");
scanf("%s",&m);
if(m=='y'||m=='Y')
{
if(c==counter)
{
strcpy(person[counter].code,"\0");
strcpy(person[counter].name,"\0");
strcpy(person[counter].tele,"\0");
counter--;
}
else
{
for(k=c;k<=counter;k++) // 后面的信息将前面
的信息覆盖掉
{
strcpy(person[k].code,person[k+1].code);
strcpy(person[k].code,person[k+1].name);
strcpy(person[k].code,person[k+1].tele);
}
strcpy(person[counter].code,"\0"); //最后的信息为空
strcpy(person[counter].name,"\0");
strcpy(person[counter].tele,"\0");
counter--;
}
printf("\t\t\t 删除成功! ");
getchar();
21
getchar();
system("cls");
save(); //用 sava()函
数将删除后的信息重新保存
menu();
}
else
{
system("cls");
menu();
}
}
else
{
printf("\n\t\t\t 对不起没有此人记录! ");
getchar();
getchar();
system("cls");
menu();
}
}
/************************** 信息修改函数 *************************/
void modify() //可以设定编号唯一,通过编号来确定记录位置,进而进行修改
{
int k=1;
char m;
char codekey[20];
system("cls");
printf("\n\n\t\t\t 请输入要修改的编号 :");
scanf("%s",codekey);
while(k<=counter)
{
if(!strcmp(codekey,person[k].code))
break;
k++;
}
if(k<=counter)
{
printf("\n\t\t\t 已查到,记录为 :\n"); printf("\n%-10s%-20s%-20s"," 编号 "," 姓名 "," 电话号码 ");
22
printf("\t\t\n%-10s%-20s%-20s\n",person[k].code,person[k].name,person[k].tele);
printf("\t\t\t 确定要修改吗? (Y/N):");
scanf("%s",&m);
if(m=='y'||m=='Y')
{
printf("\n\t\t\t 请输入新的信息 :\n\n");
printf("\t ******************************\n\n");
printf("\t 编号 :");
scanf("%s",person[k].code);
printf("\t 姓名 :");
scanf("%s",person[k].name);
printf("\t 电话 :");
scanf("%s",person[k].tele);
printf("\n\t
**********************************");
printf("\n\n\t\t\t 修改成功! ");
getchar();
getchar();
system("cls");
save(); // 用 sava()函数将修改完后的信息立马保
存
menu();
}
else
{
printf("\n\n\t\t\t 对不起,没有此人记录! ");
getchar();
getchar();
system("cls");
menu();
}
}
}
/************************* 信息查询 ************************/
void found() //调试合适
{
int k;
system("cls");
printf("\n");
printf("\n");
23
printf("\n\t\t************************************\n");
printf("\n\t\t
1
、按编号查询 :\n");
printf("\n\t\t
2
、按姓名查询 :\n");
printf("\n\t\t
3
、按电话号码查询 :\n");
printf("\n\t\t
0
、返回 :\n");
printf("\n\t\t***********************************\n\n");
printf("\t\tPlease Enter Your Choose now:");
scanf("%d",&k);
choose_2(k);
}
void choose_2(int k)
{
switch(k)
{
case 1:found_code();break;
case 2:found_name();break;
case 3:found_tele();break;
case 0:system("cls");menu();break;
default: system("cls");menu();break;
}
system("cls");
menu();
}
void found_code() // 按编号查询
{
int k=0;
char codekey[8];
struct tele*p;
p=(struct tele*)malloc(sizeof(struct tele));
printf("\n\t\t 请输入要查询的编号 :");
scanf("%s",codekey);
if((fp=fopen(" 通讯录 .txt","r"))==NULL)
{
printf("\n 不能打开通讯录! \n");
exit(0);
}
while(!feof(fp)) // 当文件结束时, feof()返回值为
1
{
fscanf(fp,"%s%s%s\n",p->code,p->name,p->tele);
if(!strcmp(codekey,p->code))
{
24
k=1;break; //k=1,说明已经查到
}
}
if(k)
{
printf("\n\t\t%-10s%-20s%-20s\n"," 编号 "," 姓名 "," 电话号码 "); printf("\n\t\t%-10s%-20s%-20s",p->code,p->name,p->tele);
}
else
printf("\n\t\t 您查询的编号不存在! ");
fclose(fp);
getchar();
getchar();
system("cls");
}
void found_name() //按姓名查找
{
int k=0;
char namekey[8];
struct tele*p;
p=(struct tele*)malloc(sizeof(struct tele));
printf("\n\t\t 请输入要查询的姓名 :");
scanf("%s",namekey);
if((fp=fopen(" 通讯录 .txt","r"))==NULL)
{
printf("\n 不能打开通讯录! \n");
exit(0);
}
while(!feof(fp)) //当文件结束时, feof()返
回值为 1
{
fscanf(fp,"%s%s%s\n",p->code,p->name,p->tele);
if(!strcmp(namekey,p->name))
{
k=1;break; //k=1 ,说明已经查到
}
}
if(k)
{
printf("\n\t\t%-10s%-20s%-20s\n"," 编号 "," 姓名 "," 电话号码 "); printf("\n\t\t%-10s%-20s%-20s",p->code,p->name,p->tele);
}
else
25
printf("\n\t\t 您查询的姓名不存在! ");
fclose(fp);
getchar();
getchar();
system("cls");
}
void found_tele() // 按电话号码查询
{
int k=0;
char telekey[8];
struct tele*p;
p=(struct tele*)malloc(sizeof(struct tele));
printf("\n\t\t 请输入要查询的电话号码 :");
scanf("%s",telekey);
if((fp=fopen(" 通讯录 .txt","r"))==NULL)
{
printf("\n 不能打开通讯录! \n");
exit(0);
}
while(!feof(fp)) // 当文件结束时, feof()
返回值为 1
{
fscanf(fp,"%s%s%s\n",p->code,p->name,p->tele);
if(!strcmp(telekey,p->tele))
{
k=1;break; //k=1,说明已经查到
}
}
if(k)
{
printf("\n\t\t%-10s%-20s%-20s\n"," 编号 "," 姓名 "," 电话号码 "); printf("\n\t\t%-10s%-20s%-20s",p->code,p->name,p->tele);
}
else
printf("\n\t\t 您查询的号码不存在! ");
fclose(fp);
getchar();
getchar();
system("cls");
}
/**************************** 退 出 系 统
****************************/
void quit() //调试合适
26
{
printf("\t\t");
exit(0);
}
27
语言程序设计实训评分表
课程名称: C 语言程序设计实训
项 目 评 价
设计方案的合理性与创造性
设计与调试结果
设计说明书的质量
答辩陈述与回答问题情况
课程设计周表现情况
综合成绩
教师签名:
日 期:
28
相关热词搜索: 源程序 通讯录 语言 实验 代码