软件设计报告_软件设计总结报告
软件设计报告由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“软件设计总结报告”。
软件设计报告
姓名: 方轶琦
学号:10005808
2013年6月18日~2013年6月28日
目录
第一章 软件设计介绍.........................................................1 第三章 软件设计的内容.......................................................4 3.1 分数统计软件(A1)...................................................4 3.1.1设计题目及要求.....................................................4 3.1.2设计思想及程序流程框图.............................................4 3.1.3逻辑功能程序.......................................................5 3.1.4结果及完善方向.....................................................5 3.2 打字软件(A2).......................................................9 3.2.1设计题目及要求.....................................................9 3.2.2设计思想及程序流程框图.............................................9 3.2.3逻辑功能程序......................................................10 3.2.4结果及完善方向....................................................10 3.3 文本编辑器(A3)....................................................13 3.3.1设计题目及要求....................................................13 3.3.2设计思想及程序流程框图............................................14 3.3.3逻辑功能程序......................................................14 3.3.4结果及完善方向....................................................17 3.4 加密软件(A4)......................................................19 3.4.1设计题目及要求....................................................19 3.4.2设计思想及程序流程框图............................................19 3.4.3逻辑功能程序......................................................19 3.4.4结果及完善方向....................................................19 3.5 进制转换器(A5)....................................................23 3.5.1设计题目及要求....................................................23 3.5.2设计思想及程序流程框图............................................23 3.5.3逻辑功能程序......................................................24 3.5.4结果及完善方向....................................................29 3.6 学生成绩核算系统的设计与实现(B1)..................错误!未定义书签。3.6.1设计题目及要求....................................................30 3.6.2设计思想及程序流程框图............................................30 3.6.3逻辑功能程序......................................................32 3.6.4结果及完善方向....................................................32 3.7 模拟电信计费系统的设计与实现(B2)..................................39 3.7.1设计题目及要求....................................................39 3.7.2设计思想及程序流程框图............................................40 3.7.3逻辑功能程序......................................错误!未定义书签。3.7.4结果及完善方向....................................................41 第四章 心得体会............................................................49
软件设计报告 10005808 方轶琦
软件设计介绍
一. 软件的设计概念
软件设计是把许多事物和问题抽象起来,并且抽象它们不同的层次和角度。建议用数学语言来抽象事务和问题,因为数学是最好的抽象语言,并且它的本质就是抽象。将复杂的问题分解成可以管理的片断会更容易。将问题或事物分解并模块化这使得解决问题变得容易,分解的越细模块数量也就越多,它的副作用就是使得设计者考虑更多的模块之间耦合度的情况。
二.软件设计的性质、目的:
本课程是一门技能训练课,为在校学生的必修课程。通过设计培养学生良好的编程习惯,使学生掌握编程的基本步骤,规范学生的编写程序的格式,锻炼学生编写程序的能力,为将来编写较大程序的打好基础。
三.软件设计总时间:二周四.实验设备:南京邮电大学微机室微机。五.软件设计的任务
通过集中时间上机实验,使学生充分发挥已有的编程能力,熟悉编译环境,选择若干课题,进行审题、分析、设计和调试,并根据要求写出实验报告。
六.实验内容
软件设计课题共分A、B两档。A档共5题,第一周完成;B档共2题,第二周完成。
软件设计报告 10005808 方轶琦
第二章
软件开发平台简介
Visual Studio 2008 简介
Microsoft® Visual Studio® 2008 使开发人员能够快速创建高质量、用户体验丰富而又紧密联系的应用程序,充分展示了 Microsoft 开发智能客户端应用程序的构想。借助 Visual Studio 2008,采集和分析信息将变得更为简单便捷,业务决策也会因此变得更为有效。任何规模的组织都可以使用 Visual Studio 2008 快速创建能够利用 Windows Vista™ 和 2007 Visual Studio system 的更安全、更易于管理并且更可靠的应用程序。
Visual Studio 2008 提供了高级开发工具、调试功能、数据库功能和创新功能,帮助在各种平台上快速创建当前最先进的应用程序。
Visual Studio 2008 包括各种增强功能,例如可视化设计器(使用.NET Framework 3.5 加速开发)、对 Web 开发工具的大量改进,以及能够加速开发和处理所有类型数据的语言增强功能。Visual Studio 2008 为开发人员提供了所有相关的工具和框架支持,帮助创建引人注目的、令人印象深刻并支持 AJAX 的 Web 应用程序。开发人员能够利用这些丰富的客户端和服务器端框架轻松构建以客户为中心的 Web 应用程序,这些应用程序可以集成任何后端数据提供程序、在任何当前浏览器内运行并完全访问 ASP.NET 应用程序服务和 Microsoft 平台。
Visual Studio 2008 具备如下优势:
快速开发新突破
从建模到编码,再到调试,Visual Studio 2008 提供了增强的编程语言、设计器、编辑器以及和数据相关的新功能,可以帮助您体验到生产力的突破。
创建杰出的用户体验
Visual Studio 2008为开发人员提供了新的工具,通过使用最新的平台,如Web, Windows Vista、2007 Microsoft Office System、Microsoft SQL Server 2008、Windows Mobile®以及Windows Server®2008,开发人员可以快速创建个性化很强的用户体验以及互联的应用程序。
跨越开发周期的协作
Visual Studio 2008 可以让开发人员、设计人员、测试人员、架构师以及项目经理通过共享工具以及过程整合的方式,实现协同工作,从而减少了解决方案所花费的时间。
采用统一整合的方式处理数据
Visual Studio 2008 可以显著的改进开发人员处理数据的方法。传统方式中,开发人员不得不根据数据的存储位置以及用户的连接方法,对数据进行不同的操作。通过语言集成查询(Language-Integrated Query, LINQ), 开发人员可以使用单独的模型来查询并转换XML, Microsoft SQL Server™和对象数据,而不需要学习或使用特定的编程语言,这样就降低了复杂度并提高了生产力。
体验全新的Web开发工具
Visual Studio 2008为公司或开发团队提供了一个健壮的、端到端的平台来构建应用程序并通过Web 方式提供应用程序。通过Visual Studio 2008, 开发人员可以很容易的将最新的Windows Presentation Foundation(WPF)功能整合到现
有的Windows Forms 应用程序以及新的应用程序中,并在Windows 平台上创建高保真的用户体验。通过额外的ASP.NET AJAX 1.0和Microsoft
软件设计报告 10005808 方轶琦
IntelliSense®以及对调试JavaScript 8.0的支持,构建AJAX 应用程序将会更加快捷。增强的Web 设计器带有分离视图编辑功能,可以让开发人员同时看到HTML 页面以及结果页面,从而提升了Web 开发的体验。
将数据库功能整合到应用程序生命周期的管理中
Visual Studio 2008为不同的团队成员提供了一系列针对架构、设计、程序开发、数据库开发以及应用程序测试的相关工具。Microsoft Visual Studio Team System 2008 Database Edition 目前已经全部整合到了Microsoft Visual Studio Team System 2008 Team Suite 中。
构建运行在多个版本的.NET Framework 之上的应用程序
通过Visual Studio 2008, 开发人员可以使用一个工具来管理并构建针对多个版本的.NET Framework 的应用程序。Visual Studio 2008将会自动让项目以及设置适应开发人员所指定的.NET framework 版本。开发人员不再需要安装多个版本的Visual Studio 来维护运行于多个版本的.NET Framework 之上的应用程序。
为Microsoft Office 系列构建可靠的、可伸缩的应用程序
Visual Studio Tools for Office 目前已经完全整合到了Visual Studio 2008 专业版当中。Visual Studio 2008可以让开发人员自己定制Microsoft Office Word, Microsoft Office Excel ,Microsoft Office PowerPoint , Microsoft Office Outlook ,Microsoft Office Visio , Microsoft Office InfoPath , 以及Microsoft Office Project, 从而提升用户生产力并且更有效的利用了Office 2007 中的新增功能。对Microsoft Office 进行自定义,同时应用程序支持ClickOnce 部署,从而使开发人员可以采用正确的工具以及框架来实现对Microsoft Office 解决方案进行从容部署。
为Windows Vista 构建完美的应用程序
Visual Studio 2008可以让开发人员快捷的创建出同Windows Vista 外观风格一样炫的应用程序,并且可以利用Windows Vista 中所提供的8000多种新API.在开发人员和设计人员之间实现无缝协作
Microsoft已经针对设计人员发布了名为Microsoft Expreion的工具。在Visual Studio 2008中,来自于Microsoft Expreion Web 以及Microsoft Expreion Blend™中的设计元素可以在不更改后台代码的情况下,从Visual
Studio 中进行导入导出的操作。这就意味着开发人员和设计人员可以实时的进行无缝协作,并且不用担心用户界面设计更改所引起的开发问题。
软件设计报告 10005808 方轶琦
第三章 软件设计的内容
3.1 分数统计软件(A1)
3.1.1设计题目及要求 设计题目:分数统计 要求:(1)、输入某班级学生的姓名、分数;
(2)、对(1)的分数进行降幂排列并输出;(3)、具有输入输出界面。3.1.2设计思想及程序流程框图
这道题我是用C# 的可视化环境制作了一个分数统计系统。制作的界面如图3.1-1所示:
实现的功能和设计方法:
1.在“姓名”和“分数”后面的文本框内输入学生信息,输入完毕后,按“输入”按钮,学生信息就会显示到左下方的listbox中。
2.当用户输入若干名学生信息后,按“排序”按钮,右下方的listbox中就会显示按成绩降幂排序后的学生信息。排序方法是使用冒泡排序法。
3.当用户输入学生信息出错时,用鼠标选择出错项,按下“删除选中的输入项”,即可删除输错项,继续输入学生信息。方法是用listBox.SelectedIndex找到选中的索引值,然后删除数组中该学生信息和listbox中信息就可以了。
4.当用户想重新输入学生信息,按下“重新开始”清空数组和listbox中的信息。
5.当用户要结束操作,按下“结束”,调用close()函数就可以跳出界面。主程序的流程图如图3.1-2所示。冒泡排序的流程图如图3.1-3所示。
软件设计报告 10005808 方轶琦
开始N=学生数i=0ii?N开始输入学生信息score[j-1]
图3.1-1 主流程图
图3.1-2冒泡排序流程图 3.1.3逻辑功能程序 具体程序如下:
#include #include #include struct student //存放学生信息的结构体 { char name[20];//字符型数组存放姓名
int grade;//成绩类型 } temp,std[100];int main(){ int err;char x[5];int n;int i;int m;char ch[20];
软件设计报告 10005808 方轶琦
do { system(“cls”);printf(“ nn”);printf(“
--------n”);printf(“ | 欢迎使用本系统 | n”);printf(“
--------n”);printf(“ n”);printf(“
-------------请输入学生数--------------nn”);do{ printf(“tt学生数: ”);
err=0;i=0;
scanf(“%s”,x);//输入选项
getchar();
while(x[i]!=' ')//依次检查输入的字符串是否为数字
{
if(x[i]>'9'||x[i]
i++;
} if(err)printf(“ntt请输入数字!n”);}while(err);
n=atoi(x);//将字符型数组x转换成整型n for(i=0;i
{ printf(“ntt请输入第%d个人的信息ntt姓名:”,i+1);scanf(“%s”,std[i].name);getchar();printf(“tt分数:”);scanf(“%d”,&std[i].grade);getchar();
}
printf(“输入信息:n”);printf(“----n”);printf(“ 姓名 成绩 nn”);for(i=0;i
printf(“ %s %dn”,std[i].name,std[i].gra
软件设计报告 10005808 方轶琦
de);} printf(“nn----n”);
printf(“n排序后信息:n”);for(m=0;m
if(std[i].grade
{
temp=std[i];
std[i]=std[i+1];
std[i+1]=temp;//成绩按降幂排序
} } printf(“n您所输入的学生名次如下:nn”);printf(“
------------n”);printf(“ 名次 姓名 成绩 nn”);for(i=0;i
第 %d 名 %s %dn“,i+1,std[i].name,std[i].grade);} printf(”nn------------n“);printf(”t您还继续吗?请按Y键继续:“);//选择是否继续
scanf(”%s“,ch);} while(ch[0]=='Y'||ch[0]=='y');//与开头组成do-while结构循环
printf(”t“);return 0;}
软件设计报告 10005808 方轶琦
图3.1—4
图3.1-3 运行结果
系统的完善:
软件设计报告 10005808 方轶琦
1.当用户在分数框输入了非数字字符,则会提示用户输出正确格式的分数。2.当用户未完整输入姓名和分数,系统会提示用户完整输入。完善方向
该系统虽然考虑了并完善了很多用户操作可能出现的错误,但仍然有不足之处。比如,本系统中的删除按钮只能在用户排序前删除用户想删除的信息。若用户排序后删除左边栏目里的学生信息,再来排序,这时排序出的结果就可能会出错。这点是需要改进的。
另外这题和数据库SQL连接起来,程序会更加简单方便。这方面还需加以学习。
3.2 打字软件(A2)
3.2.1设计题目及要求 设计题目:打字程序 要求:(1)随即产生一字符串,每次产生的字符串内容、长度都不同;
(2)根据(1)的结果,输入字符串,判断输入是否正确,输出正确率;
(3)具有输入输出界面。3.2.2设计思想及程序流程框图 设计思想:采用C#界面编程。
(1).从题目的要求可知,本系统要求随机产生字符串,字符串的内容和长度都是随机的。要产生随机数,就可以使用rand()函数。设定字符串最长为20。用rand.Next(min, max)函数就可以产生min~max之间的随机数。
(2).为使系统随机产生字母字符,首先用rand.Next(0,25)产生0~25的随机数,将随机数加上97,然后再将数字转换为相应的ASCII码的字母就可以了。
(3).正确率的计算。将系统产生的随机字符和用户输入的字符进行逐个比较统计出相同的字符个数,在与系统产生的字符总数相除便可得到得正确率。
设计的用户界面如图3.2-1所示。主流程图如图3.2-2所示
开始 产生随机字符串用户输入字符串计算正确率N结束?Y结束
图3.2-1主流程图
界面按钮功能设计思想:“开始”:按下后,首先清空界面的三个输入文本框
软件设计报告 10005808 方轶琦
textbox。然后再随机生成字符串显示在第一个文本框textbox1中。
“确定”:用户在第二个文本框textbox2中输入字符串后,按下确定按钮,首先系统会读入用户的字符串,然后与系统字符串比较,计算出正确率最后输出到正确率的文本框里。
“结束”:使用close()函数,按下后退出系统。3.2.3逻辑功能程序 具体程序如下:
#include #include #include #include #define max_len 40
//定义产生的字符串最长为40个字符
void rand_str(char *p,int length);double compare(char *p,char *s,int length);void display();
int main(){
char ch[20];int length;double flag;srand(time(NULL));char p[80]=”“;char s[80]=”“;
display();
do {
char p[80]=”“;
char s[80]=”“;
printf(”nt----n“);
length=1+rand()%max_len;
rand_str(p,length);
printf(”nt----n“);
printf(”t请输入上面的字母:n“);
printf(”t“);
fflush(stdin);//减少不必要错误
scanf(”%s“,s);
flag=compare(p,s,length);
if(flag==1)
printf(”t输入完全正确!n“);
else
软件设计报告 10005808 方轶琦
printf(”t输入有误,您本次输入正确率:%0.2g%%n“,flag*100);
printf(”tn“);
getchar();
printf(”t您还继续吗?请按任意键继续或者按N键结束:“);
scanf(”%s“,ch);
}while(ch[0]!='N'&&ch[0]!='n');
printf(”t“);return 0;}
void rand_str(char *p,int length){ int i;char ch;printf(”t“);
for(i=0;i
{ int num;
do
{
num=65+rand()%(122-65+1);
}while(num>90&&num
ch=num;
printf(”%c“,num);
p[i]=ch;
} }
double compare(char *p,char *s,int length){ int j;int number=0;double rate;for(j=0;j
if((p[j]-s[j])==0)
number=number+1;} rate=1.0*number/length;return rate;
软件设计报告 10005808 方轶琦
}
void display(){ printf(”t****************************************************************n“);printf(”t****************************************************************n“);printf(”t**
欢迎进入打字练习程序
**n“);printf(”t****************************************************************n“);
printf(”t****************************************************************n“);printf(”tn“);}
程3.2.4结果及完善方向
序运
行结果:
软件设计报告 10005808 方轶琦
用户按下开始按钮后,输入字符串,最后按下确定按钮的程序运行情况如图3.2-3所示。
按下开始按钮
输入字符串后按下确定按钮
图3.2-2 程序运行结果
系统的完善
最初编写的程序中存在输出正确率的BUG。就是在用户输入字符串的前半段和系统的字符串一样,而后面又多输入了其他字符,这时算出的正确率是100%,这在常理上是不正确的,发现错误后,更正了正确率的计算方法。
当用户输入的字符串长度小于或等于系统产生的字符串长度时,正确率的计算方法为:
与系统字符串相同的字母数正确率=
系统产生的字符串长度当用户输入的字符长于系统字符串长度时,正确率的计算方法为:
与系统字符串相同的字母数正确率=
用户输入的字符串长度这样就避免了之前的错误情况。完善方向
本打字系统仍然有需要完善的地方,如可增加计时系统,这样就增加了打字程序的趣味性。系统中正确率的计算方法也有待改进。
3.3 文本编辑器(A3)
3.3.1设计题目及要求 设计题目:文本编辑器 要求:(1)、编辑文本;
软件设计报告 10005808 方轶琦
(2)、保存、打开指定位置的文本文件;(3)、具有输入输出界面。3.3.2设计思想及程序流程框图
文本编辑器的界面设计,我是参考了word中提供的部分功能,用C#界面环境设计编写一个小型的文字编辑工具。
在C#界面的工具箱中,RichTextBox控件拥有非常强大的文字格式化功能。很多对文字文本的各种操作只需要调用RichTextBox控件中的函数,就可以搞定,非常的方便。
界面设计时,具有工具栏和功能图标按钮,提高了操作的便利性。文本编辑器的界面如图3.3-1所示。
文本编辑器具有三个大模块,具有以下功能: 1:文件:(新建 打开 保存 退出)
2:编辑:(撤销 恢复 全选 复制 剪切 粘贴 清除)3:帮助:(关于版权信息)模块结构如图3.3-2所示。
开始用户选择操作文件编辑帮助关于新建打开保存退出撤销恢复全选复制剪切粘贴清除 图3.3-1模块结构图
3.3.3逻辑功能程序 具体程序和注释如下:
#include #include //包含exit(1)的原型 #include #include”windows.h“
void create_file(FILE *fp,char *fname);//建立文本函数 void write_file(FILE *fp,char *fname);//编辑函数 void read_file(FILE *fp,char *fname);//读取函数
int main(){ FILE *fp;
软件设计报告 10005808 方轶琦
int count=0;char choose[100];int flag1,flag2,flag3;char F_name[20];
while(1){
printf(”****************************************************************n“);printf(”****************************文本编辑器***************************n“);printf(”****************************************************************n“);printf(”**
1、建立文本 **n“);printf(”**
2、编辑文本 **n“);printf(”**
3、读取文本 **n“);printf(”**
4、退出程序 **n“);
printf(”****************************************************************n“);
printf(”t请选择你要进行的文件操作:“);
scanf(”%s“,choose);
getchar();
switch(choose[0])
{
case '1': flag1=1;break;
case '2': flag2=1;break;
case '3': flag3=1;break;
case '4': printf(”t“);printf(”nnt*** 谢谢使用!****n“);exit(0);break;
default : printf(”t输入错误!n“);Sleep(500);system(”cls“);
}
if(flag1==1)
{
flag1=0;printf(”n***********建立文件***********n“);
create_file(fp,F_name);
软件设计报告 10005808 方轶琦
}
else if(flag2==1)
{
flag2=0;
printf(”n***********编辑文件***********n“);
write_file(fp,F_name);
}
else if(flag3==1)
{
flag3=0;
printf(”n***********读取文件***********n“);
read_file(fp,F_name);
}
}
return 0;}
void write_file(FILE *fp,char *fname){ char ch;printf(”请键入编辑的文件名(如D:ame.txt):nt“);gets(fname);if((fp=fopen(fname,”w“))==NULL){
printf(”不能打开文件!n“);
exit(0);} printf(”请输入内容(以#号键结束):n“);ch=getchar();while(ch!='#'){
fputc(ch,fp);
ch=getchar();} printf(”nn“);getchar();fclose(fp);Sleep(500);system(”cls“);} void create_file(FILE *fp,char *fname){
软件设计报告 10005808 方轶琦
printf(”请键入新建的文件名(如D:ame.txt):nt“);gets(fname);if((fp=fopen(fname,”w+“))==NULL){
printf(”不能打开文件!n“);
exit(0);} printf(”%s文件已经创建好!nn“,fname);fclose(fp);Sleep(500);system(”cls“);} void read_file(FILE *fp,char *fname){ char ch;printf(”请键入读取的文件名(如D:ame.txt):nt“);gets(fname);if((fp=fopen(fname,”r“))==NULL){
printf(”不能打开文件!n“);
exit(0);} printf(”***********文件内容***********n“);printf(”--------n“);while((ch=fgetc(fp))!=EOF)//输出文件直到文件结束符
{
putchar(ch);} printf(”n--------nn“);fclose(fp);Sleep(1000);printf(”nn“);} 3.3.4结果及完善方向
软件设计报告 10005808 方轶琦
软件设计报告 10005808 方轶琦
系统完善方向
这次设计的文本编辑器基本上能够较好的模拟出word中对文本的部分操作功能。基于RichTextBox控件的功能很多,可以在此基础上添加更多的有用的方便的功能,如改变文本背景颜色,字体格式和颜色,文本左对齐右对齐等。这样文本编辑器的功能就会更加完善。
3.4 加密软件(A4)
3.4.1设计题目及要求 设计题目:加密 要求:(1)输入任意一段明文M,以及密钥K;(2)根据以下公式将其转换为密文C。
Ci = mi
+ K ,其中i = 0,1,„„n-1 , K 为密钥;
(3)具有输入输出界面。3.4.2设计思想及程序流程框图 设计思想:用C#界面编程。
由题目可以知道,要实现加密,就要对用户输入的字符串进行操作。首先要将用户输入的字符串存入数组。将字符类型转换为相应的ASCII码,再与输入的密钥相加,最后再转换为字符型就可以得到密文。
系统共有三个功能按钮,为“生成密文”,“重新输入”和“结束”。“生成密文”是按上述的思想对用户输入的字符串进行加密。“重新输入”是清空三个textbox。“结束是”调用close()函数退出系统。
系统界面和系统流程框图如图3.4-1所示。
开始用户输入明文,密钥加密重新开始结束
图3.4-1
程序流程框图
3.4.3逻辑功能程序
#include #include #include
void dis_menu();//显示函数
软件设计报告 10005808 方轶琦
void set_menu();//输入函数
void encryption(char *m, char *c, char *key);//加密函数 void decryption(char *m, char *c, char *key);//解密函数
int main(){ while(1){
dis_menu();set_menu();} return 0;} void dis_menu(){ printf(”t******************************************************n“);printf(”t***********************加密解密程序*******************n“);printf(”t**
1、加密 **n“);printf(”t**
2、解密 **n“);printf(”t**
3、退出 **n“);printf(”t******************************************************nn“);printf(”t请选择你要进行的操作:“);} void set_menu(){ char m[100]=”“;//明文 char c[100]=”“;//密文 char key[100]=”“;//密钥
char n[100];scanf(”%s“,n);if(strlen(n)>1){ printf(”t输入错误!请重新输入:“);
set_menu();} else {
switch(*n)
{
case '1': encryption(m, c, key);break;
case '2': decryption(m, c, key);break;
case '3': printf(”t“);exit(1);break;
default: printf(”t输入错误!请重新输入:“);set_menu();break;
软件设计报告 10005808 方轶琦
} } }
void encryption(char *m, char *c, char *key){
printf(”t-----------------------n“);printf(”t------------------------加密环节----------------------n“);printf(”t-----------------------n“);printf(”t请输入需加密的明文:“);scanf(”%s“,m);printf(”t请输入密钥:“);scanf(”%s“,key);while(strlen(key)>1)//密钥长度不能大于1 {
printf(”t输入密钥有误,请重输:“);scanf(”%s“,key);} { int i,length;length=strlen(m);printf(”t你输入的明文为:“);printf(”%sn“,m);for(i=0;i
{
c[i]=m[i]+key[0]-'0';} printf(”t转换后的码文为:“);printf(”%snn“,c);} }
void decryption(char *m, char *c, char *key){ printf(”t-----------------------n“);printf(”t------------------------解密环节----------------------n“);printf(”t-----------------------n“);printf(”t请输入需解密的密文:“);scanf(”%s“,c);printf(”t请输入密钥:“);scanf(”%s“,key);while(strlen(key)>1){
软件设计报告 10005808 方轶琦
printf(”t输入密钥有误(应输入一个字符),请重输:“);scanf(”%s“,key);}
{ int i,length;length=strlen(c);printf(”t你输入的密文为:“);printf(”%sn“,c);for(i=0;i
m[i]=c[i]-(key[0]-'0');//密文反译
} printf(”t破解后的明文为:“);printf(”%snn“,m);} } 3.4.4结果及完善方向 运行结果:
用户输入明文和密钥后,按下“生成密文”后的程序运行结果如图3.4-2所示。
软件设计报告 10005808 方轶琦
图3.4-2密钥运行结果
系统完善
1.当用户明文和密钥输入的不完整,系统会提示要求用户输入完整。2.当用户输入的密钥不在要求的0~9之间,系统会提示用户。如图3.4-3所示。
完善方向
当密钥过大时,生成的密文字符有些无法输出,因此可改进加密算法,更好完善这个加密系统。
3.5 进制转换器(A5)
3.5.1设计题目及要求 设计题目:进制转换器 要求:(1)可输入二进制、八进制、十进制、十六进制数;
(2)将已输入的数转换成其余进制的数;(3)具有输入输出界面。3.5.2设计思想及程序流程框图 设计思想:
由题目可以知道,本系统要求实现
二、八、十、十六进制数之间的相互转换功能。
(1)、对于数字的显示问题,可以用字符串的形式进行数字的输入输出。在23
软件设计报告 10005808 方轶琦
系统内部进行转换前,利用ASCII码将字符串再转换为相应的数字进行处理。
(2)、进制的转换。系统中,首先将用户输入的任意进制的数统一转换为十进制。然后再将得到的十进制数转换为其他进制最后输出。
(3).转化成十进制时可以先得到用户输入的字符串的长度,在知道输入是什么进制数的前提下就可以将不同位上的数乘以进制的相应幂次最后求和就可以十进制数;由十进制转换成任意进制时可以使用短除法,不断相除取余数直到商为零为止,得到的字符串在翻转后即使得到的任意进制数对应的字符串。
(4).转换输出时,是将该数据的所有进制转换结果进行输出。进制转换系统是采用C#界面环境编程制作的。系统界面如图3.5-1所示。
图3.5-1 进制转换系统界面
界面中用户可以打开下拉菜单选择要输入的进制,选定后,选择的进制输入文本框会变白,用户可以输入要转换的数,按下“转换”按钮后,其他进制后面的文本框就会显示转换后的数。按下“结束”按钮可以退出系统。
整个程序可分为四个模块,分别是:数据输入模块,数据转换为十进制模块,十进制转换为其他进制模块,数据输出模块。程序流程框图如图3.5-2所示。
开始用户选择要输入的进制数据读入转换为十进制十进制转换其他进制数据输出结束 图3.5-2程序流程框图
3.5.3逻辑功能程序 具体程序和注释如下:
#include ”stdio.h“ #include void bishow(int m);void main(){ char x,w;char c[10];int i=0,err=0,quitflag=0;int num=0;do{ system(”cls“);printf(”t--------n“);printf(”t 欢迎数制转换系统 n“);
软件设计报告 10005808 方轶琦
printf(”t--------n“);printf(”t n“);printf(”t--------n“);printf(”t| 1 二进制 |n“);printf(”t| 2 八进制 |n“);printf(”t| 3 十进制 |n“);printf(”t| 4 十六进制 |n“);printf(”t| 0 退出 |n“);printf(”t--------n“);printf(”nt请选择: “);do{ err=0;scanf(”%c“,&x);//输入选项
getchar();if(x>'4'||x
{ err=1;printf(”n输入错误,请重新输入n“);} }while(err);switch(x){ case '1': //输入二进制
do{
err=0;i=0;num=0;
printf(”nt请输入二进制数:“);scanf(”%s“,c);
getchar();
while(c[i]!=' ')//‘ ’字符结尾
{ if(c[i]!='1' && c[i]!='0')err=1;//若输入数字不为1或0则输入错误
i++;
}
if(err)printf(”n输入数值错误,不是二进制数!n“);} while(err);// err为1重复上面,否则继续
i=0;while(c[i]!=' ')//二进制转换为十进制
{
num=num*2;
if(c[i]=='1')num=num+1;
i++;}
软件设计报告 10005808 方轶琦
printf(”nt二进制数 %s 转换为其他进制:nn“,c);
printf(”t********************************************n“);
printf(”t八进制: %on“,num);//输出八进制
printf(”t十进制: %dn“,num);//输出十进制
printf(”t十六进制: %xn“,num);//输出十六进制
printf(”t********************************************n“);
printf(”是否继续?(任意键继续N键退出)“);scanf(”%c“,&w);getchar();if(w=='N'||w=='n')quitflag=1;
break;
case '2': //输入八进制
do{
err=0;i=0;num=0;
printf(”nt请输入八进制数:“);
scanf(”%s“,c);
getchar();
while(c[i]!=' ')
{
if(c[i]>'7' || c[i]
i++;
}
if(err)printf(”n输入数值错误,不是八进制数!n“);
} while(err);
i=0;
while(c[i]!=' ')
{
num=num*8;
num=num+c[i]-48;
i++;
}
printf(”nt八进制数 %s 转换为其他进制: nn“,c);
printf(”t********************************************n“);
bishow(num);
printf(”t十进制: %dn“,num);
printf(”t十六进制: %xn“,num);
printf(”t********************************************n“);
printf(”是否继续?(任意键继续N键退出)“);scanf(”%c“,&w);getchar();if(w=='N'||w=='n')quitflag=1;
break;
软件设计报告 10005808 方轶琦
case '3': //输入十进制
do{
err=0;i=0;num=0;
printf(”nt请输入十进制数:“);
scanf(”%s“,c);
getchar();
while(c[i]!=' ')
{
if(c[i]>'9' || c[i]
i++;
}
if(err)printf(”n输入数值错误,不是十进制数!n“);
} while(err);
i=0;
while(c[i]!=' ')
{
num=num*10;
num=num+c[i]-48;
i++;
}
printf(”nt十进制数 %s 转换为其他进制:nn“,c);
printf(”t********************************************n“);bishow(num);
printf(”t八进制: %on“,num);
printf(”t十六进制: %xn“,num);
printf(”t********************************************n“);
printf(”是否继续?(任意键继续N键退出)“);scanf(”%c“,&w);getchar();if(w=='N'||w=='n')quitflag=1;
break;
case '4': //输入十六进制
do{
err=0;i=0;num=0;
printf(”nt请输入十六进制数:“);
scanf(”%s“,c);
getchar();
while(c[i]!=' ')
{
if(c[i]='0')err=0;//若输入数据为非数字符号,则错误
软件设计报告 10005808 方轶琦
else if(c[i]>='a'&&c[i]
else if(c[i]>='A'&&c[i]
else err=1;
i++;
}
if(err)printf(”n输入数值错误,不是十六进制数!n“);
} while(err);
i=0;
while(c[i]!=' ')
{
num=num*16;
if('0'
if('a'
if('A'
i++;
}
printf(”nt十六进制数 %s 转换为其他进制:nn“,c);
printf(”t********************************************n“);bishow(num);
printf(”t八进制: %on“,num);
printf(”t十进制: %dn“,num);
printf(”t********************************************n“);
printf(”是否继续?(任意键继续N键退出)“);scanf(”%c“,&w);getchar();if(w=='N'||w=='n')quitflag=1;
break;case '0':
quitflag=1;
break;
}
}while(!quitflag);
}
void bishow(int m)//转换成二进制数 { int b[20];
int i=0;
软件设计报告 10005808 方轶琦
while(m){ b[i]=m%2;m=m/2;i++;} i--;printf(”t二进制: “);if(m==0)printf(”%d“,0);while(i>=0){ printf(”%d“,b[i--]);//输出二进制数 } printf(”n“);} 3.5.4结果及完善方向 程序运行结果:
图3.5-3 进制转换系统界面运行情况
系统的完善
本系统能够较好的完成二、八、十、十六进制数之间的相互转换,并且对可能出现的异常情况进行了处理。例如,当用户选择输入二进制,用户就无法在其
软件设计报告 10005808 方轶琦
他进制的文本框内输入数据。还有,如果用户要键入非该进制内的字符,用户的键入将无效,非法字符将无法输入到文本框内。这样的设计能方便用户操作。
系统还有一些地方有待完善,比如,用户输入的字符串的最大长度需要进行一定的限制等等。
3.6 分数统计
3.6.1设计题目及要求
设计题目:学生成绩核算系统的设计与实现 要求:(1)、按班级按课程从文件中读入相应的平时成绩、期中考试成绩和期末考试成绩。
(2)、三个成绩对总评成绩的百分比被定义为常数,各占总成绩的30%、30%和40%。
(3)、计算每位学生的总评成绩。(4)、计算该班级本课程的总平均成绩。(5)、计算处于优、良、中、及格、不及格的学生人数以及占总人数的百分比。其中100-90为优,89-80为良,79-70为中,69-60为及格,60分以下为不及格。
(6)、按要求输出成绩在优、良、中、及格、不及格各区间的学生学号、成绩。
3.6.2设计思想及程序流程框图 设计思想:
1.建立文本文件 note.dat,第一行为学生的总人数,其后为每个学生的成绩,每个学生的信息占一行,格式为:
学号(9位)平时成绩
期中考试成绩
期末考试成绩 例如: 15 B10040801
75.5
B10040802
79.5
B10040803
B10040804
80.5 B10040805
83.5
81.5
B10040806
B10040807
B10040808
B10040809
B10040810
B10040811
45.5
B10040812
B10040813
B10040814
B10040815
2.数据结构(用C++实现)
本题中共设计了两个类:学生(Student)和学生成绩(marks)(1)基类学生(Student),定义如下:
cla Student //基类学生
软件设计报告 10005808 方轶琦
{ private: //私有成员:
char stu_no[10];//学号(题目中用到的)char stu_name[10];//姓名(可拓展的)char stu_zhy[20];//专业(可拓展的)public: //公有成员:
Student()//构造函数
{
strcpy(stu_no,”NULL“);
strcpy(stu_name,”NULL“);
strcpy(stu_zhy,”NULL“);
}
~Student(){} //析构函数
void setno(char no[])//设置学号
{strcpy(stu_no,no);}
void setname(char name[])//设置姓名
{strcpy(stu_name,name);}
void setzhy(char zhy[])//设置专业
{strcpy(stu_zhy,zhy);}
char *getno()//取学号
{return stu_no;}
char *getname()//取姓名
{return stu_name;}
char *getzhy()//取专业
{return stu_zhy;} };
(2)基类学生(Student)的派生类学生成绩(marks),定义如下: cla marks:public Student //派生类学生成绩 { protected: //保护成员:
float sco1;//平时成绩
float sco2;//期中成绩
float sco3;//期末成绩
float avg;//总评成绩
char dengj;//等级 public: //公有成员:
void setsco1(float s1){sco1=s1;} //设置平时成绩
void setsco2(float s2){sco2=s2;} //设置期中成绩
void setsco3(float s3){sco3=s3;} //设置期末成绩
float getsco1(){return sco1;} //取平时成绩
float getsco2(){return sco2;} //取期中成绩
float getsco3(){return sco3;} //取期末成绩
float getavg(){return avg;} //取总评成绩
char getdengj(){return dengj;} //取等级
软件设计报告 10005808 方轶琦
void Computavg();//计算总评成绩 void GetDJ();//计算等级 }mark[100];3.从文件中读入相应的平时成绩、期中考试成绩和期末考试成绩时,用C++中的流实现。
4.每次计算出的结果可在屏幕输出,并把每个学生的总评成绩输入到新文件out.dat文件中,格式为:
学生学号(9位)
总评成绩
成绩等级 例如: B07040801
B
为查询方便,可把总评成绩所处等级(优、良、中、及格、不及格)同时保存在文件out.dat中,分别用字母A、B、C、D、E表示。
5.设计方法:本系统采用自顶向下,逐步细化的方法,将整个系统细化为5个模块:读入文件,计算成绩模块,保存文件模块,计算并输出等级分布模块以及退出模块。根据这个思想,主程序的流程图如3.6-1图所示:
开始显示菜单键盘输入选项读入文件否计算成绩保存文件计算输出等级分布退出系统是否退出系统?是结束图3.7-1主程序流程图
3.6.3逻辑功能程序 具体程序及注释如下:
#include #include #define N 100 struct student { char number[10];
char psgra[5];
软件设计报告 10005808 方轶琦
char qzgra[5];char qmgra[5];
};
int information(){
FILE* fp;
int i;
struct student std[15]=
{{”B10040801“, ”88“, ”75.5“, ”66“ },{”B10040802“ ,”91“, ”79.5“,”76“},{”B10040803“,”85“,”75“,”77“ },{”B10040804“,”79“,”82“,”80.5“},{”B10040805“,”94“,”83.5“,”81.5“},{”B10040806“ ,”80“,”69“,”68“},{”B10040807“,”82“,”77“,”71“} ,{”B10040808“,”77“,”57“,”58“},{”B10040809“,”91“,”88“,”86“} ,{”B10040810“,”96“, ”89“,”90“},{”B10040811“,”70“,”45.5“,”50“} ,{”B10040812“,”74“,”65“,”66“},{”B10040813“,”81“,”71“,”76“},{”B10040814“,”83“,”75“,”77“},{”B10040815“,”85“,”78“,”79“ }};
if((fp=fopen(”note.dat“,”w“))==NULL){
printf(”文件打开错误!n“);
exit(0);}
fprintf(fp,” 学号
平时成绩
期中成绩
期末成绩n
15n“);
for(i=0;i
fclose(fp);
return 0;
软件设计报告 10005808 方轶琦
}
int read(struct student st[15])
//读取文件的函数;{ FILE*fp1;
struct student s;int size;int i=0;if((fp1=fopen(”note.dat“,”r“))==NULL)
//打开information文件;{
printf(” 文件打开错误!n“);
exit(0);}
size=sizeof(struct student);fseek(fp1,0L,SEEK_SET);fread(&s,size,1,fp1);
//读取一个字节的fp1指针
fread(&s,size,1,fp1);for(i=0;i
{
fscanf(fp1,”%s“, st[i].number);
fscanf(fp1,”%s“, st[i].psgra);
fscanf(fp1,”%s“, st[i].qzgra);
fscanf(fp1,”%s“, st[i].qmgra);
}
fclose(fp1);
return 0;
}
void output(double n[20],char a[20],struct student st[15],char ch){
int j=0;
int i;
printf(”得等级%c的学生及其分数:n“,ch);
for(i=0;i
软件设计报告 10005808 方轶琦
{
if(a[i]==ch)
{
printf(”%-8s %8.1lf %8c n“,st[i].number,n[i],a[i]);
//判断后循环输出满足相应条件的学生的学号、分数及其等级;
j++;
}
} printf(”得%c的人数为:%d人n“,ch,j);printf(”得%c的比例为:%.1lf%%n“,ch,100*j/15.0);
printf(”nn“);}
char level(double //判断得ABCDE的条件;{ if(n>=0&&n
return 'E';
else
if(n>=60&&n
return 'D';
else
if(n>=70&&n
return 'C';
else
if(n>=80&&n
return 'B';
else
return 'A';}
n)
软件设计报告 10005808 方轶琦
int main(){ FILE*fp1;struct student st[15];int i=0;double n[N];char a[N];double d=0.0;
information();
read(st);
if((fp1=fopen(”out.dat“,”w“))==NULL){
printf(” File open error!n“);
exit(0);}
fprintf(fp1,” 学号
总评成绩
等级n
15n“);
for(i=0;i
{
n[i]=0.3*atof(st[i].psgra)+0.3*atof(st[i].qzgra)+0.4*atof(st[i].qzgra);
//按照0.3 0.3 0.4计算成绩;
a[i]=level(n[i]);
//输出等级给a[i];
fprintf(fp1,” %-8s %8.1lf %8c n“,st[i].number,n[i],a[i]);
d=d+n[i];
//求总成绩;
} fclose(fp1);
while(1){
printf(”tttt
南京邮电大学nnn“);
printf(”------------------“);
printf(”tttt请选择服务类型:ntttt1:输出得A的学生。ntttt2:输出得B的学生。ntttt3:输出得C的学生。n“);
printf(”tttt4:输出得D的学生。ntttt5:输出得E的学生。ntttt6:输出总平均成绩。ntttt7:输出学生相应的等级。n“);
printf(”tttt8:输出原始成绩。ntttt0:退出n“);
printf(”------------------“);
scanf(”%d“,&i);
printf(”nnn“);
软件设计报告 10005808 方轶琦
if(i==0)
break;
else
switch(i)
{
case 1:
//进入得A学生的判断;
{
printf(”A:优
B:良
C:中
D:及格
E:不及格n “);
output(n,a,st,'A');
system(”pause“);
暂停以清屏;
system(”cls“);
清屏;
}
break;
case 2:
进入得B学生的判断;
{
printf(”A:优
B:良
C:中
D:及格
E:不及格n “);
output(n,a,st,'B');
system(”pause“);
system(”cls“);
}
break;
case 3 //进入得C学生的判断;
{
printf(”A:优
B:良
C:中
D:及格
E:不及格n “);
output(n,a,st,'C');
system(”pause“);
system(”cls“);
}
break;
case //进入得D学生的判断;
{
printf(”A:优
B:良
C:中
D:及格
E:不及格n “);
output(n,a,st,'D');
system(”pause“);
system(”cls“);
}
break;
case 37
//////
: 4: 5:
软件设计报告 10005808 方轶琦
//进入得A学生的判断;
{
printf(”A:优
B:良
C:中
D:及格
E:不及格n “);
output(n,a,st,'E');
system(”pause“);
system(”cls“);
}
break;
case 6:printf(”总平均成绩为:%.2lfnnn“,d/15);
//总成绩d/15求平均成绩;
system(”pause“);
system(”cls“);
break;
case 7:{
//输出学生的成绩及其等级;
printf(” 成绩及相应等级信息n“);
printf(”
学号
成绩
等级n“);
for(i=0;i
//15个学生的信息全部输出;
printf(” %-8s %8.1lf %8c n“,st[i].number,n[i],a[i]);
system(”pause“);
system(”cls“);
}
break;
case 8:{
//输出15个学生的所有信息;
printf(” 学号
平时成绩
期中成绩
期末成绩n“);
printf(” 15n“);
for(i=0;i
{
printf(” %-8s %8s %8s “,st[i].number,st[i].psgra,st[i].qzgra);
printf(”%10sn“,st[i].qmgra);
}
system(”pause“);
system(”cls“);
}
break;
default: printf(”输入错误,请重新输入。n“);
break;
}
软件设计报告 10005808 方轶琦
printf(”n“);
}
}3.6.4结果及完善方向
(一).程序运行结果如下:
1、菜单选择界面如图3.6-2所示。
(三).系统有待完善的方向
该系统还有一些细节有待改进完善。如输出5个等级区间学生学号和成绩时,分别都进行了一个循环,共进行了5个循环,这个算法的时间效率较低。可以改进算法,使其进行一次循环便可输出5个等级的情况。
3.7 模拟电信计费系统的设计与实现(B2)
3.7.1设计题目及要求
设计题目:模拟电信计费系统的设计与实现 要求:(1)、计费功能。根据存放在源数据文件中的通话记录和长途费率文件对每一条通话记录计算其通话费用,并将结果保存在费用文件中。其中:通话费的计算方法如下:
通话费=长途电话费+本地电话费
长途电话费=费率(元/分钟)×通话时长(分钟)(通话时长不满1分钟的按1分钟计算)
软件设计报告 10005808 方轶琦
本地电话费为:3分钟以内0.5元,以后每3分钟递增0.2元。(2)、话费查询。输入一个电话号码,从费用文件中统计该电话号码的所有本地话费、长途话费,并从用户文件中查找其用户名,最后在屏幕上显示:
用户名 电话号码 本地话费 长途话费 话费总计(3)、话单查询。输入一个电话号码,查询并在屏幕显示该用户的所话通话记录,格式为:
用户名 主叫电话号码 被叫电话号码 通话时长 3.7.2设计思想及程序流程框图
1.本系统的输入输出文件 本系统的输入文件有三个:(1)源数据文件(hd.dat)存放:主叫区号
主叫电话号码
被叫区号 被叫电话号码
通话时长(秒)每次通话作为一条记录,占源数据文件的一行。每条记录中各数据之间以空格间隔,例如:025 83491234 010 62320983 90 每个电话号码可以有多次通话记录。如果主、被叫区号相同,则通话记录为本地通话记录;否则为长途通话记录。(2)长话费率文件(fl.dat)存放:区号 费率
例如:010 1.20 表示从本地打往区号为010的地区每分钟收费1.20元。(3)用户文件(yh.dat)
存放: 电话号码
用户姓名 例如: 83491234 张明
本系统的输出文件有一个: 费用文件(fy.dat)
存放:主叫电话号码
通话类型
话费金额 其中,通话类型表示本次通话是长途还是本地。2.系统输入数据
hd.dat—有20条通话记录,分别是:
fl.dat
有4条记录
025 83491234 025 85319971
010
1.20
025 84927038 010 62110045 236
020
1.20
025 87216340 025 84521009
310
021
0.80 025 83491234 0571 82199516 100
0571 1.00 025 58120321 021 81094532 50
025 83491234 025 85319971
025 84927038 025 83491234
115
yh.dat
有5条记录 025 58120321 025 87216340
83491234 张明 025 87216340 010 62110045 93
84927038 李小红 025 83491234 010 62110045 792
87216340 王励 025 84927038 0571 82199516 931
83492200 赵强 025 83491234 025 85319971
580
58120321 杨冬 025 84927038 025 83491234
358
025 58120321 021 81094532 197 025 87216340 025 84521009
256
025 87216340 010 62110045 193
软件设计报告 10005808 方轶琦
025 83492200 025 84521009
320
025 83491234 025 85319971
270 025 84927038 025 83491234
231
025 83492200 025 84927038
3.数据结构(用C++实现)
本题共设计了三个类:话单(callist)、费用(charge)和用户(user),类的定义如下:
(1)、基类:话单类Callist #include #include #include #include #define N 100
struct callist
{
char zqnum[5];
char znum[20];
char bqnum[5];
char bnum[20];
char longti[10];}cali[N];struct charge
{
char bqnum[5];
char cha[5];}
ch[N];struct user {
char znum[20];char name[15];}
use[N];struct huaf {
char znum[20];
int flag;
double huafei;}
hf[N];
int readuse(){
FILE* fp;int i=0;
char a[10];
strcpy(a,”yh.dat“);
if((fp=fopen(a,”r“))==NULL){
printf(”文件打开错误!n“);
exit(0);}
while(!feof(fp)){
fscanf(fp,”%s %s n“,use[i].znum,use[i].name);
i++;
}
fclose(fp);return i--;}
int readcharge(){
FILE* fp;int i=0;
if((fp=fopen(”fl.dat“,”r“))==NULL)
费规则;{
printf(” File open error!n“);
exit(0);} while(!feof(fp))
软件设计报告 10005808 方轶琦
//将yh.dat写入数组a;//输出号码与名字;
//打开fl.dat通话计费
软件设计报告 10005808 方轶琦
{
fscanf(fp,”%s %s n“,ch[i].bqnum,ch[i].cha);
i++;
}
fclose(fp);return i--;}
int readcallist(){
FILE* fp;int i=0;
if((fp=fopen(”hd.dat“,”r“))==NULL)
//打开通话记录表;{
printf(” 文件打开错误!n“);
exit(0);} while(!feof(fp)){
fscanf(fp,”%s
%s
%s
%s
%sn“,cali[i].zqnum,cali[i].znum,cali[i].bqnum,cali[i].bnum,cali[i].longti);
i++;
}
fclose(fp);return i--;}
int Billing()
//计费函数;{
FILE* fp;
int i;int j;int m;int l;
软件设计报告 10005808 方轶琦
double bd=0.0;
//通话时间初始化0;
j=readcallist();
m=readcharge();
for(i=0;i
{
strcpy(hf[i].znum,cali[i].znum);
hf[i].huafei=0.0;
//初始化话费为0.0元;
bd=atof(cali[i].longti)/60.0;
//计算通话时间(n个一分钟);
if(!strcmp(cali[i].bqnum,cali[i].zqnum))
{
hf[i].flag=0;
if(bd
//本地话费:3分钟以内0.3元,以后每1分钟递增0.2元;
hf[i].huafei=0.3;
else
if(bd==floor(bd))
hf[i].huafei=0.3+0.2*(bd-3);
else
hf[i].huafei=0.3+0.2*(floor(bd)-2);
}
else
{
hf[i].flag=1;
//长途话费计算;
for(l=0;l
{
if(!strcmp(cali[i].bqnum,ch[l].bqnum))
if(bd==floor(bd))
hf[i].huafei=atof(ch[l].cha)*bd;
else
hf[i].huafei=atof(ch[l].cha)*(floor(bd)+1);
}
}
}
if((fp=fopen(”fy.dat“,”w“))==NULL)
//打开通话
软件设计报告 10005808 方轶琦
类型数据并向其写入数据;{
printf(” 文件打开错误!n“);
exit(0);}
for(i=0;i
{
fprintf(fp,”%s
%d
%.2lfn“,hf[i].znum,hf[i].flag,hf[i].huafei);//输出号码、长途以及本地话费;
} fclose(fp);
return i--;}
int query()
话费函数;{
char a[10];
char na[15];
int i;
int j;
int l;
double bd=0.0;
double ct=0.0;
j=Billing();
l=readuse();
getchar();
printf(”请输入要查询的号码n“);
gets(a);
for(i=0;i
{
if(!strcmp(hf[i].znum,a))
数据;
if(hf[i].flag==0)
bd=bd+hf[i].huafei;
else
//查询
//寻找与输入字符串(号码)相匹配的 软件设计报告 10005808 方轶琦
ct=ct+hf[i].huafei;
}
for(i=0;i
{
if(!strcmp(use[i].znum,a))
{
strcpy(na,use[i].name);
//条件成立则将use[i].name的内容复制到na中
break;
}
}
if(i==l)
printf(”输用户不存在,请重新输入!n“);
else
printf(”tttt用户:%sntttt号码:%sntttt本地话费: %.2lfntttt长途话费:%.2lfntttt总话费: %.2lfn“,na,a,bd,ct,bd+ct);
return 0;
system(”cls“);}
int billquery()
//话单查询函数;{
int i;
int j;
int l;
char na[15];
char a[10];
j=Billing();
l=readuse();
getchar();
printf(”请输入要查询的号码n“);
gets(a);
for(i=0;i
//比较输入号码与表单中号码是否有符合;
软件设计报告 10005808 方轶琦
{
if(!strcmp(use[i].znum,a))
{
strcpy(na,use[i].name);
break;
}
}
if(i==l)
printf(”输用户不存在,请重新输入!n“);
else
for(i=0;i
if(!strcmp(hf[i].znum,a))
printf(”tttt用户:%sntttt主叫号码:%sntttt被叫电话号码:%sntttt通话时长%s秒n“,na,cali[i].znum,cali[i].bnum,cali[i].longti);//输出话单;
return 0;
}
int main(){ int i;
while(1){
printf(”tttt
南京邮电大学nnn“);
printf(”------------------“);
printf(”tttt 请选择服务类型:ntttt 1:计费功能。ntttt 2:话费查询。ntttt 3:话单查询。ntttt 0:退出服务。n“);
printf(”------------------“);
scanf(”%d“,&i);
if(i==0)
//选择服务类型;
break;
else
{
软件设计报告 10005808 方轶琦
switch(i)
{
case 1:
Billing();system(”pause“);//计费选项;
break;
case 2:
query();system(”pause“);system(”cls“);
system(”cls“);
//话费查询选项;
break;
case 3:
billquery();system(”pause“);//话单查询选项;
break;
default: printf(”输入错误!n“);
}
}
printf(”n“);
}
} 3.7.4结果及完善方向(一).程序运行结果如下:
1、菜单选择
界面48
如图system(”cls“);
3.7-2所示。