1、 宜宾学院 课程设计文档 课 程 软件编程实践 题 目 手机短信管理系统 院 别 计算机与信息工程学院 专 业 软 件 工 程 学生姓名 学 号 班 级 2015级 6班 授课教师
2、 1 目录 第1章 系统总体设计 2 1.1 系统功能结构描述 2 1.2 系统功能结构图 3 1.3 系统开发目标 3 第2章 通讯录设计 4 2.1 通讯录概念结构设计 4 2.2 数据存储 4 第3章 短信录设计 5 3.1 短信概念结构设计 5 3.2 数据存储 5 第4章 系统详细设计 6 4.1 概要设计 6 4.1.1 函数声明 6 4.1.2 结构体声明 6 4.2 主要函数 7 4.2.1 主函数 7 4.2.1.2 流程图 7 4.2.1.3 程序截图 8 4.2.1.4 源
3、代码 8 4.2.2 通讯录 10 4.2.2.2 流程图 10 4.2.2.3 程序截图 13 4.2.2.4 源代码 15 4.2.3 短信录 23 4.2.3.2 流程图 23 4.2.3.3 程序截图 25 4.2.3.4 源代码 27 第5章 总结 35 第1章 系统总体设计 1.1 系统功能结构描述 手机短信管理系统是手机实现功能的一组重要的代码程序,主要实现对手机中的通讯录进行添加、修改、查询功能,实现对手机中短信进行添加、修改、查询功能,能对短信进行记录和管理 ,在新建短信的时候也可以查看通讯录上联系人的信息,通讯录是对手机上的联系人进行操作,可以
4、方便的查看和使用,对联系人的姓名、电话、类型、邮箱进行管理,建立通讯录更是方便了短信的操作。 功能结构需求如下: q 通讯录模块 :本功能主要是实现对用户信息的添加、删除、查询功能。 q 短信模块:本功能主要是实现对用户发送短信的添加、删除、查询功能。 基本功能: (1)查看功能: a.当输入编号时,显示出该编号的数据; b.可以查看所有的编号的数据; (2)添加功能: a.能录入新数据添加到文件中(联系人添加到addressbook.dll文件中,短信信息添加到message.dll文件中),当录入了重复的编号时,则提示数据录入重复并取消录入。 (3)修改功能: a.选
5、中某个人的编号时,可对此人的信息进行修改; (4)删除功能:选中某个人的编号时,可对此人在文件中的相应数据进行删除。 (5)主界面提供菜单选择的方法选择实现某一功能,一次运行程序能进行多次选择执行不同的功能。 1.2 系统功能结构图 手机短信管理系统 通讯录 短信 添加联系人 删除联系人 修改联系人 查看联系人 新建短信 删除短信 修改短信 查看短信 显示所有 图3-1 系统功能结构图 1.3 系统开发目标 对于典型的管理系统,尤其是对像手机短信管理系统这样的非常实用的管理系统,必须要满足使用方便、操作灵活等设计需求。本系统在设计时应
6、满足以下几个目标: 1.采用人机对话的操作方式,界面设计美观友好,信息查看灵活、方便、快捷、准确,数据存储安全可靠。 2.对用户输入的数据,系统进行严格的数据检验,尽可能排除重复的错误。 3.系统运行稳定安全可靠。 第2章 通讯录设计 2.1 通讯录概念结构设计 通讯录是对手机上的联系人进行操作,可以方便的查看和使用,对联系人的姓名、电话、类型、邮箱进行管理,建立通讯录更是方便了短信的操作,数据储存在addressbook.dll 文件中 2.2 数据存储 表2-1 用户基本信息 中文名称: 用户基本信息 中文名称 类型 键值 注释 编号 整型 记
7、录用户编号(唯一) 姓名 字符型 记录用户姓名 电话 字符型 记录用户电话 邮箱 字符型 记录用户邮箱 类型 字符型 记录用户类型 第3章 短信设计 3.1 短信概念结构设计 短信的功能能对通信录的联系人进行添加短信,也可以由用户新建,数据保存在message.dll 文件中。 3.2 数据存储 表2-2 短信功能基本信息 中文名称: 竞赛项目基本信息 中文名称 类型 键值 注释 编号 整型 姓名 字符型 电话 字符型 内容 字符型 第4章 系统详细设
8、计 4.1 概要设计 4.1.1 函数声明 void main();//主函数 void Addressbookmenu();//通讯录 void Messagemenu();//短信 4.1.2 结构体声明 typedef struct Patient_Info//typedef自定义结构体类型PatientInfo,可以用PatientInfo来定义变量 { int number;//编号 char name[8];//姓名 char phonecode[20]; //电话号码 char group[10];//类型 char email[20]
9、//邮箱 char content[200];//短信内容 }PatientInfo; 4.2 主要函数 4.2.1 主函数 4.2.1.2 流程图 图4-1 主函数流程图 4.2.1.3 程序截图 图4-2主界面截图 图4-1 主界面流程图 4.2.1.4 源代码 /* 项目名称:手机短信管理系统 实施时间:2015年12月22日 创建人:郭成 */ //调用预处理 #include"stdio.h"//标准输入输出 #include"stdlib.h"//常用的系统函数 //函数声明
10、 void Addressbookmenu();//通讯录 void Messagemenu();//短信 //主函数 void main() { char filename[20];//文件名变量 int i; system("title 手机短信管理系统");//设置cmd窗口标题 system("color 3B");//背景湖蓝,字体白 do { system("cls");//清屏 printf("now datetime:\n"); system("date /T");//调用系统日期 system(
11、"TIME /T");//调用系统时间 printf( "\n\n\n" ); printf("\n\t\t\t ------------------------------------------------------------\n"); printf("\t\t\t *==============手机短信管理系统==============*\n"); printf("\n\t\t\t ------------------------------------------------------------\n"); printf("\t\
12、t * *\n"); printf("\t\t * ** 1.通讯录 ** *\n"); printf("\t\t * ** 2.短信 ** *\n"); printf("\t\t *
13、 *\n"); printf("\t\t * ****************** *\n"); printf("\t\t * ** 0.退出系统 ** *\n"); printf("\t\t * ************
14、 *\n"); printf("\n\t\t\t ------------------------------------------------------------\n"); printf("\t\t\t YIBIN University "); printf("\n\t\t\t ------------------------------------------------------------\n"); scanf("%
15、d", &i); switch (i) { case 1: system("cls"); Addressbookmenu(); break;//case1 调用addressbookmenu函数 case 2: system("cls"); Messagemenu(); break;//case2 调用messagemenu函数 case 0: break;//case0 退出 default:printf("错误选择!请重选"); break; //default : ....break;一般用在switch语句里面,它的作用是在比较i和下面的1、2
16、之后都不一致就执行。当然如果都不满足也可以不去做任何事,所以就可以省略不用 } } while (i != 0);//当i不等于0循环 } 4.2.2 通讯录 4.2.2.2 流程图 开始 读出功能代号 添加 删除 修改 查看 显示 关闭 1 2 3 4 5 6 结束 退出通讯录 (图4-3)通讯录流程图 添加功能:录入新的联系人数据,姓名、电话号码、类型、邮箱。 开始 读入编号 录入数据 录入数据失败 返回主菜单 保存 编号重复 Y N 录入成功 Y N (图4-4)添加功能流程图
17、 删除功能:输入编号,对其信息进行删除。 开始 读入编号 删除 删除失败 返回主菜单 保存 有此编号 N Y (图4-4)删除功能流程图 修改功能:输入编号,对其信息进行修改。 开始 读入编号 修改 修改失败 返回主菜单 保存 有此编号 N Y (图4-5)修改功能流程图 查看:输入编号,显示出此编号的姓名、电话号码、类型、邮箱。 开始 打开文件 输入编号 没有此编号 返回主菜单 显示信息 有此编号 N Y (图4-6)显示功能流程图 4.2.2.3 程序截图 (图4-7)通讯录主界面截图
18、 (图4-8)添加功能截图 (图4-9)修改功能截图 (图4-10)显示功能截图 4.2.2.4 源代码 /* 项目名称:手机短信管理系统 实施时间:2015年12月22日 创建人:郭成 */ #include"stdio.h" #include"stdlib.h" #include"string.h" //定义结构体类型 typedef struct Patient_Info//typedef自定义结构体类型PatientInfo,可以用PatientInfo来定义变量 { i
19、nt number;//编号 char name[8];//姓名 char phonecode[20]; //电话号码 char group[10];//类型 char email[20];//邮箱 char content[200];//短信内容 }PatientInfo; //局部函数声明 static void Insert(char[]); static void Search(char[]); static void Update(char[]); static void Delete(char[]); static void Show(char
20、[]); //主菜单 void Addressbookmenu() { char filename[20] ;//文件名变量 int i; char Add[]="Addressbook.dll";//指定文件 strcpy(filename,Add); do { printf("\nnow datetime:\n"); system("date /T"); system("TIME /T"); printf("\n\n\n"); printf("\t\t *====
21、手★机★通★讯★录★管★理★系★统==============*\n"); printf("\t\t * *\n"); printf("\t\t * 1.添加联系人 2.删除联系人 *\n"); printf("\t\t * 3.修改联系人 4.查看联系人
22、 *\n"); printf("\t\t * 5.显示所有联系人 6.关闭通讯录 *\n"); printf("\t\t * *\n"); printf("\t\t * ****************** *\n"); printf("\t\t
23、 * * 请输入序号 * *\n"); printf("\t\t * ****************** *\n"); printf("\t\t *==============================================================*\n"); scanf("%d", &i); fflush(stdin);/
24、/清空输入缓存,以便不影响后面输入的东西 switch (i) { case 1: system("cls"); Insert(filename); break; case 2: system("cls"); Delete(filename); break; case 3: system("cls"); Update(filename); break; case 4: system("cls"); Search(filename); break; case 5: system("cls"); Show(filename); break;
25、 case 6: break; default:printf("错误选择!请重选"); break; } } while (i != 6); } //添加联系人 void Insert(char Filename[]) { /* 函数说明:对指定文件名进行数据的插入 形参说明:数组作为形参,实参必须是一个地址,用于传递文件名 调用位置:addressbookmenu函数 创建人:郭成 创建日期:12月22日 */ int in_number; PatientInfo P;//定义一个信息的变量 int flag =
26、 1; FILE *fp; fp = fopen(Filename, "r");//以只读方式打开文件,第一个参数:文件名,第二个参数是打开方式,a表示追加写方式,w表示覆盖写,r表示只读方式,返回值是一个文件指针 printf(" 请根据以下提示信息操作:"); printf("\n 编号:");//先查重,再追加插入 scanf("%d", &in_number); while (!feof(fp) && flag)//feof表示 end of file,表示文件末尾,true表示文件末尾,否则不是文件末尾。&&flag表示
27、还未查找到 { if (fread(&P, sizeof(PatientInfo), 1, fp))/*fread是文件输出函数,从文件中读取一条联系人信息放入P变量中,第一个参数是目标变量的地址, 第二个参数是读取的长度单位,第三个参数是读取几个单位,第四个参数是要读取的文件,返回值为1表示成功,否则表示失败*/ { if (P.number == in_number) { printf("\n 该编号已存在,自动取消录入!\n"); flag = 0; } }
28、} fclose(fp);//关闭文件以便追加记录 if (flag) { fp = fopen(Filename, "a");//以追加方式打开文件准备追加 } else return; P.number = in_number; printf(" 请输入姓名:"); scanf("%s", P.name); printf(" 请输入电话:"); scanf("%s", &P.phonecode); printf(" 请输入类型:"); printf(" 存储类别:(A
29、办公类 B.个人类 C.商务类) "); scanf("%s",P.group); printf(" 请输入邮箱:"); fflush(stdin);//清空输入缓存,以便不影响后面输入的东西 scanf("%s", P.email); printf(" \n ------------------------------------------------------------"); if (fwrite(&P, sizeof(PatientInfo), 1, fp) != 1)/*fwrite是文件写函数,
30、从P变量中向文件中写入一条短信信息,第一个参数是来源变量的地址, 第二个参数是写的长度单位,第三个参数是写几个单位,第四个参数是要写的文件*/ { printf("输入数据失败,请重新输入!"); } else printf("\n 添加成功!"); fclose(fp); } void Search(char Filename[]) { /* 函数说明:从指定文件中查找数据 形参说明:数组作为形
31、参,实参必须是一个地址,用于传递文件名 调用位置:addressbookmenu函数 创建人:郭成 创建日期:12月22日 */ int in_number; PatientInfo P; int flag = 1; FILE *fp; fp = fopen(Filename, "r"); printf("\n 请根据以下提示信息操作:"); printf("\n 编号:"); scanf("%d", &in_number); system("cls"); while (fread(&P, size
32、of(PatientInfo), 1, fp) && flag)//fread是文件输出函数,返回值为1表示读成功 { if (P.number == in_number) { printf("\n\t\t\t ------------------------------------------------------------\n"); printf("\n\t\t\t| 编号\t| 姓名\t| 电话\t\t| 类型\t| 邮箱\t\t\t|"); printf("\n\t\t\t| %d\t ",P.number); printf("
33、s\t ",P.name); printf(" %s\t ",P.phonecode); printf(" %s\t ",P.group); printf(" %s\t|",P.email); printf("\n\n\t\t\t 联系人%s的信息已显示出来!\n",P.name); printf("\t\t\t ------------------------------------------------------------"); flag=0; } } fclose(fp); if (fla
34、g) { printf(" 没有你要找的联系人!"); } } void Update(char Filename[])// { /* 函数说明:修改指定文件中的数据 形参说明:数组作为形参,实参必须是一个地址,用于传递文件名 调用位置:addressbookmenu函数 创建人:郭成 创建日期:12月22日 */ int in_number; PatientInfo P; int flag = 1; FILE *fp, *fptemp;//必须两个文件操作,fp是数据源
35、文件,fptemp是临时文件,修改后的数据临时放入该文件中 fp = fopen(Filename, "r");//文件读 fptemp = fopen("temp.txt", "w");//文件写 printf("\n 修改联系人信息"); printf("\n 请输入你要修改的联系人的编号:");//先查询,再修改 scanf("%d", &in_number); while (fread(&P, sizeof(PatientInfo), 1, fp))//文件读 { if (P.number =
36、 in_number)//读出修改 { P.number = in_number; printf(" 请输入姓名:"); scanf("%s", P.name); printf(" 请输入电话:"); scanf("%s", &P.phonecode); printf(" 请输入类型:"); printf(" 存储类别:(A.办公类 B.个人类 C.商务类) "); scanf("%s",P.group); printf("
37、 请输入邮箱:"); fflush(stdin);//清空输入缓存,以便不影响后面输入的东西 scanf("%s", P.email); printf(" \n ------------------------------------------------------------"); flag = 0; } fwrite(&P, sizeof(PatientInfo), 1, fptemp);/*找没找到都往临时文件中写,因为对文件操作只有追加和覆盖写两种方方式,
38、 因此修改中间某条记录不方便,只能引入第二个文件或者放入数据、链表中*/ printf(" \n 修改成功!"); } fclose(fp); fclose(fptemp); if (flag) { printf("没有你要查询的结果!"); } else { fptemp = fopen("temp.txt", "r");//从临时文件中读 fp = fopen(Filename, "w");//往源文件中覆盖写 while (fread(
39、P, sizeof(PatientInfo), 1, fptemp)) { fwrite(&P, sizeof(PatientInfo), 1, fp);//从临时文件中回写 } fclose(fp); fclose(fptemp); } } void Delete(char Filename[])// { /* 函数说明:删除指定文件中的某条数据 形参说明:数组作为形参,实参必须是一个地址,用于传递文件名 调用位置:addressbookmenu函数 创建人:郭成 创建日期:12月22日 */ int in_nu
40、mber; PatientInfo P; int flag = 1; FILE *fp, *fptemp; fp = fopen(Filename, "r"); fptemp = fopen("temp.txt", "w"); printf("\n 请输入你想要删除的联系人的编号:");//先查询,再删除 scanf("%d", &in_number); while (fread(&P, sizeof(PatientInfo), 1, fp)) { if (P.number != in_number)//如果找到要删除的记
41、录则不写,否则都要写 fwrite(&P, sizeof(PatientInfo), 1, fptemp); else flag = 0; } fclose(fp); fclose(fptemp); if (flag) { printf(" 没有你要删除的编号!"); } else { fp = fopen(Filename, "w"); fptemp = fopen("temp.txt", "r"); while (fread(&P, sizeof(PatientInfo), 1, fpt
42、emp)) { fwrite(&P, sizeof(PatientInfo), 1, fp); } printf(" 删除成功!"); fclose(fp); fclose(fptemp); } } void Show(char Filename[]) { /* 函数说明:显示指定文件中的所有数据 形参说明:数组作为形参,实参必须是一个地址,用于传递文件名 调用位置:addressbookmenu函数 创建人:郭成 创建日期:12月22日 */ PatientInfo P; i
43、nt flag = 1; FILE *fp; fp = fopen(Filename, "r"); while (fread(&P, sizeof(PatientInfo), 1, fp)) { printf("\n\t\t\t ------------------------------------------------------------\n"); printf("\n\t\t\t| 编号\t| 姓名\t| 电话\t\t| 类型\t| 邮箱\t\t\t|"); printf("\n\t\t\t| %d\t ",P.number); p
44、rintf(" %s\t ",P.name); printf(" %s\t ",P.phonecode); printf(" %s\t ",P.group); printf(" %s\t|",P.email); printf("\n\t\t\t ------------------------------------------------------------"); } printf("\n\t\t\t 所有联系人信息已全部显示出来!\n"); fclose(fp); } 4.2.3 短信录 4.
45、2.3.2 流程图 开始 读出功能代号 新建 删除 修改 查看 显示 关闭 1 2 3 4 5 6 结束 关闭短信录 (图4-11)短信录主函数流程图 新建功能:在新建短信输入编号时,将判断此编号在通讯录上有无,如果有则显示出来,并对此编号发送信息,如果没有此编号则新建一条信息。 开始 读入编号 显示此编号信息 发送短信 返回主菜单 保存 编号是否存在 N Y (图4-12)新建短信流程图 (删除、修改、查看、显示流程图均与通讯录相差不大,这里就不画出来了)
46、 4.2.3.3 程序截图 (图4-13)短信录主界面截图 (图4-14)短信录新建短信截图 (图4-15)短信录显示短信截图 (图4-16)短信录删除短信截图 4.2.3.4 源代码 /* 项目名称:手机短信管理系统 实施时间:2015年12月22日 创建人:郭成 */ #include"stdio.h" #include"stdlib.h" #include"string.h" #include "windows.h" //定
47、义了Windows的所有资料型态、函数调用、资料结构和常数识别字 #include "conio.h" //进行输入、输出的 //定义结构体类型 typedef struct Patient_Info//typedef自定义结构体类型PatientInfo,可以用PatientInfo来定义变量 { int number;//编号 char name[8];//姓名 char phonecode[20]; //电话号码 char group[10];//类型 char email[20];//邮箱 char content[200];//短信内容
48、}PatientInfo; //局部函数声明 static void Add(char[]); static void Search(char[]); static void Alter(char[]); static void Del(char[]); static void Show(char[]); //主菜单 void Messagemenu() { int i; char Filename[20];//文件名变量 char Mes[]="Message.dll";//指定文件 strcpy(Filename,Mes); do {
49、 printf("\nnow datetime:\n"); system("date /T"); system("TIME /T"); printf("\n\n\n"); printf("\t\t *================手★机★短★信★管★理★系★统================*\n"); printf("\t\t * *\n"); prin
50、tf("\t\t * 1.新建信息 2.删除信息 *\n"); printf("\t\t * 3.修改信息 4.查看联系人 *\n"); printf("\t\t * 5.显示所有信息 6.关闭短信录 *\n"); printf("\t\t *






