云南大学软件学院数据结构实验一实验报告桌面复数计算器.docx
《云南大学软件学院数据结构实验一实验报告桌面复数计算器.docx》由会员分享,可在线阅读,更多相关《云南大学软件学院数据结构实验一实验报告桌面复数计算器.docx(40页珍藏版)》请在冰点文库上搜索。
云南大学软件学院数据结构实验一实验报告桌面复数计算器
(本实验项目方案受“教育部人才培养模式创新实验区(X3108005)”项目资助)
实验难度:
A□B□C□
序号
学号
姓名
成绩
1
2
3
指导教师
(签名)
学 期:
任课教师:
实验题目:
实验一,设计桌面计算器
小组长:
联系电话:
电子邮件:
完成提交时间:
年月日
云南大学软件学院2010学年秋季学期
《数据结构实验》成绩考核表
学号:
姓名:
本人承担角色:
课题分析,算法设计,程序编写,后期调试,完成实验报告
评分项目
评分指标
分值
得分
实验构思(10%)
1.实验目的明确
5
2.实验内容理解透彻、对实验所涉及到的知识点分析到位
5
实验设计(15%)
1.有对基本数据结构的抽象数据类型定义
5
2.实验方案设计完整,数据结构、算法选择合理
5
3.算法结构和程序功能模块之间逻辑清晰、有相应的流程图
5
实验实现(25%)
1.代码编写规范、风格统一、注释清楚易读
5
2.程序运行正常,测试结果正确
15
3.界面友好、易于操作、有较强的容错性
5
实验报告撰写(10%)
1.内容详实无缺漏,文字流畅、图表清楚
5
2.实验结果分析客观、详细,实验体会真实可信,对原实验方案的改进和对实验内容的发散性思考
5
个人工作量(30%)
1.个人完成工作量
15
2.个人技术水平
10
3.团队合作精神
5
实验运作(10%)
1.有一定用户群
5
2.应用前景分析
5
综合得分:
(满分100分)
指导教师:
年月日
(注:
此表在难度为C时使用,每个成员一份。
)
云南大学软件学院2010学年秋季学期
《数据结构实验》成绩考核表
学号:
姓名:
本人承担角色:
课题分析,算法设计,后期调试
评分项目
评分指标
分值
得分
实验构思(10%)
1.实验目的明确
5
2.实验内容理解透彻、对实验所涉及到的知识点分析到位
5
实验设计(15%)
1.有对基本数据结构的抽象数据类型定义
5
2.实验方案设计完整,数据结构、算法选择合理
5
3.算法结构和程序功能模块之间逻辑清晰、有相应的流程图
5
实验实现(25%)
1.代码编写规范、风格统一、注释清楚易读
5
2.程序运行正常,测试结果正确
15
3.界面友好、易于操作、有较强的容错性
5
实验报告撰写(10%)
1.内容详实无缺漏,文字流畅、图表清楚
5
2.实验结果分析客观、详细,实验体会真实可信,对原实验方案的改进和对实验内容的发散性思考
5
个人工作量(30%)
1.个人完成工作量
15
2.个人技术水平
10
3.团队合作精神
5
实验运作(10%)
1.有一定用户群
5
2.应用前景分析
5
综合得分:
(满分100分)
指导教师:
年月日
(注:
此表在难度为C时使用,每个成员一份。
)
云南大学软件学院2010学年秋季学期
《数据结构实验》成绩考核表
学号:
姓名:
本人承担角色:
课题分析,算法设计,后期调试
评分项目
评分指标
分值
得分
实验构思(10%)
1.实验目的明确
5
2.实验内容理解透彻、对实验所涉及到的知识点分析到位
5
实验设计(15%)
1.有对基本数据结构的抽象数据类型定义
5
2.实验方案设计完整,数据结构、算法选择合理
5
3.算法结构和程序功能模块之间逻辑清晰、有相应的流程图
5
实验实现(25%)
1.代码编写规范、风格统一、注释清楚易读
5
2.程序运行正常,测试结果正确
15
3.界面友好、易于操作、有较强的容错性
5
实验报告撰写(10%)
1.内容详实无缺漏,文字流畅、图表清楚
5
2.实验结果分析客观、详细,实验体会真实可信,对原实验方案的改进和对实验内容的发散性思考
5
个人工作量(30%)
1.个人完成工作量
15
2.个人技术水平
10
3.团队合作精神
5
实验运作(10%)
1.有一定用户群
5
2.应用前景分析
5
综合得分:
(满分100分)
指导教师:
年月日
(注:
此表在难度为C时使用,每个成员一份。
)
(下面的内容由学生填写,格式统一为,字体:
楷体,行距:
固定行距18,字号:
小四,个人报告按下面每一项的百分比打分。
难度A满分70分,难度B满分90分)
一、【实验构思(Conceive)】(10%)
(本部分应包括:
描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计、算法等相关知识)
本实验要求制作一个桌面计算器,要求能进行实数和虚数的混合运算,首先要解决如何处理四则运算的算法,并进行正确无误的数据存储以及传递。
本程序使用两个变量来保存一个复数,分别存储实部和虚部,利用四个子程序事先加减乘除四则运算,最后在主程序中调用并显示结果。
利用程序设计的相关知识:
贯彻设计程序所必需的五大步骤,目标分析->设计算法->程序编写->后期调试->售后服务的流程完成这个项目。
利用算法设计相关知识:
该算法满足有穷性,确定性·,可行性,有0个或多个输入,有一个或多个输出输出,以及正确性,可读性,健壮性的特性。
数学基础知识:
利用高中所学之复数的基本运算的知识。
离散数学相关知识:
正确合理的适用与或非之间的关系,进行程序分支判断,保证程序正常进行。
二、【实验设计(Design)】(20%)
(本部分应包括:
抽象数据类型的功能规格说明、主程序模块、各子程序模块的伪码说明,主程序模块与各子程序模块间的调用关系)
本程序使用C#进行编写,全部程序一共22个对象,3个类:
窗口类,按钮类,文本框类:
窗口类:
用于实现整个程序窗口的初始化,窗口重绘,程序变量的初始化,以及最后窗口的销毁。
按钮类:
用于对各种触发事件以予正确的响应,实现程序的友好界面。
文本框类:
能对部分触发事件进行响应,并正确接受以及传递数据作为内部程序的参数,也能提供给用户检查输入的值是否正确,并以予更正的机会。
当程序运行后窗口类生成的窗口对个值进行初始化,当用户按下各个功能键时,分别调用各个触发事件函数,当用户按下计算按钮时,计算机根据判断符的取值来进行选择具体调用那一个函数进行计算。
各个触发时间函数伪代码:
按钮0:
判断输入指针指向那一个文本框;
判断目标文本框里面是否为0,若是不做任何反应,结束子程序;
判断操作符是不是为=,若是,清楚目标文本框里面的所有数据,结束子程序;
向目标文本框的字符串中的末尾添加一个0,结束子程序;
按钮1:
判断输入指针指向那一个文本框;
判断目标文本框里面是否为0,若是不做任何反应,结束子程序;
判断操作符是不是为=,若是,清楚目标文本框里面的所有数据,结束子程序;
向目标文本框的字符串中的末尾添加一个1,结束子程序;
按钮2:
判断输入指针指向那一个文本框;
判断目标文本框里面是否为0,若是不做任何反应,结束子程序;
判断操作符是不是为=,若是,清楚目标文本框里面的所有数据,结束子程序;
向目标文本框的字符串中的末尾添加一个2,结束子程序;
按钮3:
判断输入指针指向那一个文本框;
判断目标文本框里面是否为0,若是不做任何反应,结束子程序;
判断操作符是不是为=,若是,清楚目标文本框里面的所有数据,结束子程序;
向目标文本框的字符串中的末尾添加一个3,结束子程序;
按钮4:
判断输入指针指向那一个文本框;
判断目标文本框里面是否为0,若是不做任何反应,结束子程序;
判断操作符是不是为=,若是,清楚目标文本框里面的所有数据,结束子程序;
向目标文本框的字符串中的末尾添加一个4,结束子程序;
按钮5:
判断输入指针指向那一个文本框;
判断目标文本框里面是否为0,若是不做任何反应,结束子程序;
判断操作符是不是为=,若是,清楚目标文本框里面的所有数据,结束子程序;
向目标文本框的字符串中的末尾添加一个5,结束子程序;
按钮6:
判断输入指针指向那一个文本框;
判断目标文本框里面是否为0,若是不做任何反应,结束子程序;
判断操作符是不是为=,若是,清楚目标文本框里面的所有数据,结束子程序;
向目标文本框的字符串中的末尾添加一个6,结束子程序;
按钮7:
判断输入指针指向那一个文本框;
判断目标文本框里面是否为0,若是不做任何反应,结束子程序;
判断操作符是不是为=,若是,清楚目标文本框里面的所有数据,结束子程序;
向目标文本框的字符串中的末尾添加一个7,结束子程序;
按钮8:
判断输入指针指向那一个文本框;
判断目标文本框里面是否为0,若是不做任何反应,结束子程序;
判断操作符是不是为=,若是,清楚目标文本框里面的所有数据,结束子程序;
向目标文本框的字符串中的末尾添加一个8,结束子程序;
按钮9:
判断输入指针指向那一个文本框;
判断目标文本框里面是否为0,若是不做任何反应,结束子程序;
判断操作符是不是为=,若是,清楚目标文本框里面的所有数据,结束子程序;
向目标文本框的字符串中的末尾添加一个9,结束子程序;
输入实部按钮:
将输入指针指向实部文本框;
令输入实部按钮的有效性为false;
输入虚部按钮:
将输入指针指向虚部文本框;
令输入虚部按钮的有效性为false;
Reset按钮:
令实部文本框的字符串为0;
令虚部文本框的字符串为0;
令各个寄存器内的数字为0;
令操作符为空;
令输入实部按钮有效性为true;
令输入虚部按钮有效性为true;
Backspace按钮:
判断输入指针指向的文本框是不是只有一个字符,若是,则将指针指向的文本框清零,结束子程序;
将指针指向的文本框的文本长度-1;
结束子程序;
+按钮:
将操作符存储器刷新为+;
结束子程序;
-按钮:
将操作符存储器刷新为-;
结束子程序;
*按钮:
将操作符存储器刷新为*;
结束子程序;
/按钮:
将操作符存储器刷新为/;
结束子程序;
Calculate键:
判断操作符;
如果是+,调用加法函数;
如果是-,调用减法函数;
如果是*,调用乘法函数;
如果是/,调用除法程序;
输出结果;
结束子程序;
三、【实现描述(Implement)】(30%)
(本部分应包括:
抽象数据类型具体实现的函数原型说明、关键操作实现的伪码算法、函数设计、函数间的调用关系,关键的程序流程图等,给出关键算法的时间复杂度分析。
)
本程序含有22个C#对象函数:
0-910个数字按钮:
实现往程序输入框中输入数据。
运算符号按钮:
用于更改操作符暂存器的值,以便后面的程序正常执行。
系统功能键:
主要用于实现某些系统功能,如寄存器清零,操作符清零,文本框退格等等。
计算按钮:
根据已经输入的数值和运算符来判断输入是否合法,如合法就通过调用对应的子程序来给出正确结果,不正确就给出友好错误提示。
程序输入框:
用于输入程序的各种等待运算的数据。
窗体:
用于窗体的初始化,程序变量的初始化以及显示。
时间复杂度分析:
各个子程序的时间复杂度均为n.
人性化设计:
1.在输入出现错误时例如除数的实部与虚部同时为零时,程序会给出友好的提示。
2.充分尊重不同用户群的使用习惯,本程序提供了三种人机交互方式:
(1).利用鼠标进行操作:
在输入实部时,点击“输入实部”按钮,光标自动切换到实部输入框;欲输入虚部时,点击“输入虚部”按钮,光标自动切换至虚部输入框,在任何一个输入框中都能依靠鼠标点击下面的数字按钮来输入数据,最后点击calculate显示结果。
(2).利用键盘进行操作:
在输入实部时,按下Tab键转移焦点至“输入实部”按钮,光标自动切换到实部输入框;欲输入虚部时,按Tab键转移焦点至“输入虚部”按钮,光标自动切换至虚部输入框,在任何一个输入框中都能按Tab键转移焦点至下面的数字按钮来输入数据,最后按Tab键转移焦点至calculate键进行计算,显示结果。
(3).利用鼠标与键盘同时操作,这也是最快捷的方法:
在输入实部时,点击实部输入框,光标自动切换到实部输入框;欲输入虚部时,点击虚部输入框,光标自动切换至虚部输入框,在任何一个输入框中都能直接依靠鼠标键盘的数字键来输入数据,最后点击calculate按钮显示结果。
3.利用算法设计尽量避免用户出现操作失误:
当用户通过任意一种手段切换光标至实部输入框时,实部切换按钮自动变为不可用,当用户通过任意一种手段切换光标至虚部输入框时,虚部切换按钮也自动变为不可用。
四、【测试结果(Testing)】(10%)
(本部分应包括:
对实验的测试结果,应具体列出每次测试所输入的数据以及输出的数据,并对测试结果进行分析总结)
程序开始运行后进行初始化,完成后的界面:
焦点在实部时:
焦点在虚部时:
程序正确性测试1:
计算(1+i)+(2+2i):
计算结果:
程序正确性测试2:
计算(6+3i)—(9+4i)
计算结果:
程序正确性测试3:
计算(4+5i)*(3+9i)
计算结果:
程序正确性测试4:
计算(12+9i)/(3+3i)
计算结果:
程序健壮性测试:
令除数为0:
测试:
(9+3i)/(0+0i)
显示结果:
四、【实验总结】(10%)
(本部分应包括:
自己在实验中完成的任务,注意组内的任意一位同学都必须独立完成至少一项接口的实现;对所完成实验的经验总结、心得)
这次和我们小组完成这个桌面计算器,大家分工协作,配合默契。
我在这个小组中参与了课题分析,算法设计,后期测试。
独立完成了程序代码的编写,实验报告的编写。
总结:
由于是功利化地为了完成试验才突击某一门编程语言,虽然有所基础,还是难免仓促,现在回顾自己编写的代码,相比较同学的代码,我发现我没有完全的利用面向对象的代码重用性的便利,代码几乎没有重复利用,导致代码有500行之巨,实在是有悖于面向对象编程的简洁性,重用性,安全性的设计初衷,这现象在以后对面向对象编程有了更深了解之后将会大量减少。
五、【项目运作描述(Operate)】(10%)
(本部分应包括:
项目的成本效益分析,应用效果等的分析。
)
这是一个初级的,基本的桌面计算器程序,主要目的是锻炼我们的团队合作意识,这个桌面计算器能用来进行简单的复数计算,方便同学们从繁杂的复数乘除法解脱出来。
六、】【代码】(10%)
(本部分应包括:
完整的代码及充分的注释。
注意纸质的实验报告无需包括此部分。
格式统一为,字体:
Georgia,行距:
固定行距12,字号:
小五)
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
//ByYangYang
namespace数据结构实验一桌面计算器
{
publicpartialclassForm1:
Form
{
boolreal_or_imag=true;//用来判断需要输入的是实部还是虚部,令true=real,false=imag
stringoper="";//存放操作符
doubleresult_real=0;//存放实部运算结果
doubleresult_imag=0;//存放虚部运算结果
doublenum1_real=0;//第一个数的实部
doublenum2_real=0;//第二个数的实部
doublenum1_imag=0;//第一个数的虚部
doublenum2_imag=0;//第二个数的虚部
publicForm1()
{
InitializeComponent();
}
privatevoidoperplus()//加法模块函数
{
num2_real=Convert.ToDouble(text_real.Text);//字符串转化为双精度数
num2_imag=Convert.ToDouble(text_imag.Text);
result_real=num1_real+num2_real;
result_imag=num1_imag+num2_imag;
text_real.Text=Convert.ToString(result_real);//双精度数转化成为字符串
text_imag.Text=Convert.ToString(result_imag);
}
privatevoidopermin()//减法模块函数
{
num2_real=Convert.ToDouble(text_real.Text);//字符串转化为双精度数
num2_imag=Convert.ToDouble(text_imag.Text);
result_real=num1_real-num2_real;
result_imag=num1_imag-num2_imag;
text_real.Text=Convert.ToString(result_real);//双精度数转化成为字符串
text_imag.Text=Convert.ToString(result_imag);
}
privatevoidopermul()//乘法模块函数
{
num2_real=Convert.ToDouble(text_real.Text);//字符串转化为双精度数
num2_imag=Convert.ToDouble(text_imag.Text);
result_real=(num1_real*num2_real)-(num1_imag*num2_imag);
result_imag=(num1_real*num2_imag)+(num1_imag*num2_real);
text_real.Text=Convert.ToString(result_real);//双精度数转化成为字符串
text_imag.Text=Convert.ToString(result_imag);
}
privateintoperdiv()//除法模块函数
{
num2_real=Convert.ToDouble(text_real.Text);//字符串转化为双精度数
num2_imag=Convert.ToDouble(text_imag.Text);
if((num2_real*num2_real)+(num2_imag*num2_imag)==0)//判断除数是否为零,避免非法操作
{
text_real.Text="除数不合法";
text_imag.Text="请从新输入";
return0;
}
result_real=((num1_real*num2_real)+(num1_imag*num2_imag))/((num2_real*num2_real)+(num2_imag*num2_imag));
result_imag=((num1_imag*num2_real)-(num1_real*num2_imag))/((num2_real*num2_real)+(num2_imag*num2_imag));
text_real.Text=Convert.ToString(result_real);//双精度数转化成为字符串
text_imag.Text=Convert.ToString(result_imag);
return0;
}
privatevoidForm1_Load(objectsender,EventArgse)//窗口载入程序,令Backspace键暂时不可用
{
button_backspace.Enabled=false;
}
privatevoidlabel1_Click(objectsender,EventArgse)
{
}
privatevoidbutton18_Click(objectsender,EventArgse)//加号键的触发事件
{
oper="+";
num1_real=Convert.ToDouble(text_real.Text);
num1_imag=Convert.ToDouble(text_imag.Text);
text_real.Text="0";
text_imag.Text="0";
}
privatevoidbutton15_Click(objectsender,EventArgse)//减号健的触发事件
{
oper="-";
num1_real=Convert.ToDouble(text_real.Text);
num1_imag=Convert.ToDouble(text_imag.Text);
text_real.Text="0";
text_imag.Text="0";
}
privatevoidbutton16_Click(objectsender,EventArgse)//乘号键的触发事件
{
oper="*";
num1_real=Convert.ToDouble(text_real.Text);
num1_imag=Convert.ToDouble(text_imag.Text);
text_real.Text="0";
text_imag.Text="0";
}
privatevoidenter_real_Click(objectsender,EventArgse)//输入实部键的触发事件
{
real_or_imag=true;
enter_real.Enabled=false;
enter_imag.Enabled=true;
}
privatevoident