软件工程实验报告三
软件工程实验报告
实验三、系统详细设计
一、实验名称
系统详细设计
二、实验目的
根据需求分析、概要设计,完成系统的详细设计
三、实验主要内容
详细设计的主要任务是设计每个模块的实现算法、所需的局部数据结构。详细设计的目标有两个:实现模块功能的算法要逻辑上正确和算法描述要简明易懂。
四、实验原理
1、模块说明。说明该模块需要实现什么功能,还有设计要点。
2、流程逻辑。用流程图说明该模块的处理过程。
3、算法。不一定有,如果涉及一些比较特殊的算法或关键模块,就写一下算法的伪代码或用流程图说明。
4、限制条件。该模块的功能有哪些限制,比如用户ID不能重复,只能查询自己权限范围内的用户。
5、输入项。每个子模块可以看做一个”方法“,我传给你什么,你给我输出什么。比如删除用户,输入项就是用户ID。
6、输出项。删除用户的输出项,就是不能在查询模块里查询到已删除的用户
7、界面设计。用visio或者其他工具画一些界面图
8、需要操作的数据表。
五、实验结果
通讯录管理系统详细设计
目录
一、界面
二、源程序
三、总结与展望
一、界面
1).显示的主菜单界面
二、源程序代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct
{
char score; /*编号*/
char name[10]; /*姓名*/
char num[15]; /*号码*/
char email[20]; /*邮箱*/
char age[8]; /*年龄*/
char adds[20]; /*住址*/
}Person;
Person pe[80];
int menu_select()
{
char c;
do{
system("cls");
printf("\t\t *****通讯录***** \n");
printf("\t\t┌───────┐\n");
printf("\t\t│ 1. 添加记录 │\n");
printf("\t\t│ 2. 显示记录 │\n");
printf("\t\t│ 3. 删除记录 │\n");
printf("\t\t│ 4. 查询记录 │\n");
printf("\t\t│ 5. 修改记录 │\n");
printf("\t\t│ 6. 保存记录 │\n");
printf("\t\t│ 0. 退出程序 │\n");
printf("\t\t└───────┘\n");
printf("\t\t请您选择(0-6):");
c=getchar();
}while(c<'0'||c>'6');
return(c-'0');
}
int Input(Person per[],int n)
{
int i=0;
char sign,x[10];
while(sign!='n'&&sign!='N')
{
printf("\t编号:");
scanf("\t%d",&per[n+i].score);
printf("\t姓名:");
scanf("\t%s",per[n+i].name);
printf("\t年龄:");
scanf("\t%s",per[n+i].age);
printf("\t电话号码:");
scanf("\t%s",per[n+i].num);
printf("\t通讯住址:");
scanf("\t%s",per[n+i].adds);
printf("\t电子邮箱:");
scanf("\t%s",per[n+i].email);
gets(x);
printf("\n\t是否继续添加?(Y/N)");
scanf("\t%c",&sign);
i++;
}
return(n+i);
}
void Display(Person per[],int n)
{
int i;
printf("----------------------------------------------------------------------\n"); /*格式*/
printf("编号 姓名 年龄 电话号码 通讯地址 电子邮箱\n");
printf("----------------------------------------------------------------------\n");
for(i=1;i<n+1;i++)
{
printf("%-5d%-8s%-6s%-13s%-15s%-15s\n",per[i-1].score,per[i-1].name,per[i-1].age,per[i-1].num,per[i-1].adds,per[i-1].email);
if(i>1&&i%10==0)
{
printf("\t-----------------------------------\n");
printf("\t");
system("pause");
printf("\t-----------------------------------\n");
}
}
printf("----------------------------------------------------------------------\n");
system("pause");
}
int Delete_a_record(Person per[],int n)
{
char s[20];
int i=0,j;
printf("\t请输入想删除记录中的名字:");
scanf("%s",s);
while(strcmp(per[i].name,s)!=0&&i<n) i++;
if(i==n)
{
printf("\t通讯录中没有此人!\n");
return(n);
}
for(j=i;j<n-1;j++)
{
strcpy(per[j].num,per[j+1].num);
strcpy(per[j].name,per[j+1].name);
strcpy(per[j].age,per[j+1].age);
strcpy(per[j].adds,per[j+1].adds);
strcpy(per[j].email,per[j+1].email);
per[j].score=per[j+1].score;
}
printf("\t\t\t已经成功删除!\n");
return(n-1);
}
void Query_a_record(Person per[],int n)
{
int m;
printf("\t\n请选择查询方式:\n");
printf("\t┌──────┐\n");
printf("\t│1------姓名 │\n");
printf("\t│2------电话 │\n");
printf("\t│3------地址 │\n");
printf("\t│4------返回 │\n");
printf("\t└──────┘\n");
printf("请选择:");
scanf("%d",&m);
while(m!=1&&m!=2&&m!=3&&m!=4)
{
printf("输入错误,请重新选择:");
scanf("%d",&m);
}
if(m==1)
{
char s[20];
int i=0;
printf("\t请输入想查询的姓名:");
scanf("\t%s",s);
while(strcmp(per[i].name,s)!=0&&i<n) i++;
if(i==n)
{
printf("\t通讯录中没有此人!\n");
return;
}
printf("\t此人编号: %d\n",per[i].score);
printf("\t此人年龄: %s\n",per[i].age);
printf("\t电话号码: %s\n",per[i].num);
printf("\t通讯地址: %s\n",per[i].adds);
printf("\t电子邮箱: %s\n",per[i].email);
} ;
if(m==2)
{
char s[20];
int i=0;
printf("\t请输入想查询的电话:");
scanf("\t%s",s);
while(strcmp(per[i].num,s)!=0&&i<n) i++;
if(i==n)
{
printf("\t通讯录中没有此人!\n");
return;
}
printf("\t此人编号: %d\n",per[i].score);
printf("\t此人姓名: %s\n",per[i].name);
printf("\t此人年龄: %s\n",per[i].age);
printf("\t通讯地址: %s\n",per[i].adds);
printf("\t电子邮箱: %s\n",per[i].email);
} ;
if(m==3)
{
char s[20];
int i=0;
printf("\t请输入想查询的地址:");
scanf("\t%s",s);
while(strcmp(per[i].adds,s)!=0&&i<n) i++;
if(i==n)
{
printf("\t通讯录中没有此人!\n");
return;
}
printf("\t此人编号: %d\n",per[i].score);
printf("\t此人姓名: %s\n",per[i].name);
printf("\t此人年龄: %s\n",per[i].age);
printf("\t电话号码: %s\n",per[i].num);
printf("\t电子邮箱: %s\n",per[i].email);
} ;
}
void Change(Person per[],int n)
{
char s[20];
int i=0;
printf("\t请输入想修改的记录中的名字:");
scanf("%s",s);
while(strcmp(per[i].name,s)!=0&&i<n) i++;
if(i==n)
{
printf("\t通讯录中没有此人!\n");
return;
}
printf("\t编号:");
scanf("\t%d",&per[i].score);
printf("\t姓名:");
scanf("\t%s",per[i].name);
printf("\t年龄:");
scanf("\t%s",per[i].age);
printf("\t电话号码:");
scanf("\t%s",per[i].num);
printf("\t通讯住址:");
scanf("\t%s",per[i].adds);
printf("\t电子邮箱:");
scanf("\t%s",per[i].email);
printf("\t修改成功!");
}
void WritetoText(Person per[],int n)
{
int i=0;
FILE *fp; /*定义文件指针*/
char filename[20]; /*定义文件名*/
printf("\t保存到文件\n"); /*输入文件名*/
printf("\t请输入所保存的文件名:");
scanf("\t%s",filename);
if((fp=fopen(filename,"w"))==NULL)
{
printf("\t无法打开文件\n");
system("pause");
return;
}
fprintf(fp,"******************************************通讯录******************************************\n");
fprintf(fp,"编号 姓名 年龄 电话号码 通讯地址 电子邮箱\n");
fprintf(fp,"------------------------------------------------------------------------------------------\n");
while(i<n)
{
fprintf(fp,"%-3d\t%-6s\t%-3s\t%-13s\t%-20s\t%-20s\n",per[i].score,per[i].name,per[i].age,per[i].num,per[i].adds,per[i].email);
i++;
}
fprintf(fp,"------------------------------------------------------------------------------------------\n");
fprintf(fp,"***************************************共有%d条记录****************************************\n",n);
fclose(fp); /*关闭文件*/
printf("保存成功!\n");
}
void main() /*主函数*/
{
int n=0;
for(;;)
{
switch(menu_select())
{
case 1:
printf("\n\t添加记录到通讯录\n"); /*添加记录*/
n=Input(pe,n);
break;
case 2:
printf("\n\t\t\t 通讯录记录表\n"); /*显示记录*/
Display(pe,n);
break;
case 3:
printf("\n\t从通讯录中删除记录\n");
n=Delete_a_record(pe,n); /*删除记录*/
printf("\t");
system("pause");
break;
case 4:
printf("\n\t在通讯录中查找记录\n");
Query_a_record(pe,n); /*查找记录*/
printf("\t");
system("pause");
break;
case 5:
printf("\n\t修改通讯录中的记录\n");
Change(pe,n); /*修改数据*/
printf("\t");
system("pause");
break;
case 6:
printf("\n\t保存功能\n");
WritetoText(pe,n); /*保存数据*/
printf("\t");
system("pause");
break;
case 0:
printf("\n\t\t谢谢使用,再见!\n"); /*结束程序*/
printf("\n\t\t");
system("pause");
exit(0);
}
}
}
三、总结与展望
总结: 这次的程序实设计实验是对我们进入大学以来学习程序设计语言结果的一次大检验。自己动手,自己发现和解决问题。发现了自己的许多不足。平时没有掌握好的知识在这次实验中彻底暴露出来,经过不断思考,不断查阅资料和上机运行,解决其中大部分问题,当然还存在一些问题没有解决。我相信在以后的学习能够解决好它们。但是,收获还是不小的,我不仅对C的操作有了进一步的掌握,还了解到了程序设计的书写风格及其注释的格式。
在对程序的调过程中,我遇到了一些问题。在解决问题的过程中,我深刻体会到一个程序健壮性的重要,也就是要考虑到该程序在解决具体问题的直观性与全面性,还有就是要加强程序的可读性,也就是要尽可能地多加注释。也会方便读者了解到程序的层次及功能。界面得提供较多的提示,以方便程序的进一步执行。
本设计基本能实现此次课程设计的要求,但是美中不足的是,该程序的代码不够高级,没有运用更简洁的代码编写,代码较冗杂。经过此次课程设计我感受到了实践的重要性,实践远远比理论要重要。只有不断的实践才能够更好的成长。
展望: 据艾瑞的《2011-2012年中国智能手机市场研究报告》, 2011年中国智能手机出货量达到7210万台,增速高达103.1%。艾瑞认为目前中国有超过10亿的手机用户,市场潜力巨大;数据得出,目前移动互联网的发展前景较好,智能手机成为移动互联网用户争夺的重要工具。通讯录是手机基础功能的入口,手机主要功能必然还是通话和短信,入口就是通讯录。占据入口,以后发展为平台便能嫁接其它应用。但是目前智能手机系统自带的通讯录存在诸多交互体验问题,功能也较少,比如快速查找联系人、联系人备份和去重等功能,优质的通讯录产品是用户核心需求,这也留给第三方手机通讯录软件发展的机会,各种第三方通讯录软件开始不断推出。大型互联网企业如百度、360、腾讯等也开始介入通讯录市场,纷纷想在移动互联网发展初期,夺取用户、占据这个重要的流量入口。
随着信息社会的高速发展,人与人之间的联系越来越频繁,通讯方式越来越多样化,如何保证与朋友、同学、同事、领导、亲戚等之间的联系,并能方便快捷的查找、记录、修改其相关通讯信息,并保证多个终端之间的通讯录信息一致,仅依靠手工的方法已经无法满足管理日益膨胀的通讯录的需要。用户生活中需要的大量通讯录导致用户管理通讯录的工作量越来越大,各个通讯录的数据又不同步,导致用户维护通讯录成为一场噩梦。在这种情况下,云端通讯录应运而生。云通讯录能将用户的号码保存到云端,并实时更新。
当然要达到这种云通讯录,目前主要有三个问题,在下次改造中,我们将在以下方面实现突破::一是用户隐私保护;二是用户对平台的信任,打消用户对个人隐私泄漏的忧虑;三是技术壁垒,如稳定性、终端适配等。
参考文献
[1] 作者. 书名[M]. 出版社城市:出版社名称, 出版年份.
[2] 严蔚敏. 数据结构(C语言版)[M]. 北京:清华大学出版社,1997.
[3] 作者. 期刊论文名称[J]. 期刊名称,出版年份,总期次(期次):起始页码-终止页码.
[4] 任丰原, 黄海宁, 林闯. 无线传感器网络[J]. 软件学报, 2003, 14(7):1282-1291.
[5] 《信息系统开发方法教程》 陈佳著 清华大学出版社