当前位置:文档之家› 实验报告_大数计算器

实验报告_大数计算器


{ n_1 = answers; n_2 = number; number = ""; textBox1.Text = "+"; sum_number += n_2 + "="; textBox2.Text = sum_number; answers = calculate_all(operate_way); operate_way = 1; Print(answers); n_1 = ""; n_2 = ""; } } } 其他运算赋值方法相同。
3、功能实现(见附录) 4、计算器演示 (1)基本四则运算
(2)三角函数运算
(3)其他运算
(4)纠错处理
5、性能分析 对于四则基本运算而言, 调用库函数可以极大减少编程量同时可 以高效的完成运算。 对于阶乘计算 1000!可以做到立刻出结果,但是当数量级继续 上升时,10000!程序需要计算 10s 才可以出结果,100000!程序会 卡死。 对于三角函数运算,在计算时对其使用泰勒展开,共展开了 50 项。在计算过程中会反复调用基本运算以及比较函数,同时因为设置 精度比较高,计算的过程耗费时间比较长。 开根号运算使用的是二分查找,对于大整数查找过程时间较长。 总体来说计算器对于万位以内的基本运算可以满足需求, 对于精 度设置比较高时,需要耗费一定时间进行计算,耗费时间在可忍耐范 围内。
(2)基本数字按键
private void button1_Click(object sender, EventArgs e){ if (number == "") answers = ""; if (textBox1.Text == "0") number = "1"; //当屏幕显示不为 0 else number += "1"; n++; textBox1.Text = number; //在屏幕显示当前字符串 } 其余按键 2~9 和数字 1 的实现方法相同。
计算机组成结构 实验报告
实验题目:大数计算器 报告人: 学号:
实验报告
实验题目:大数计算器 报告人: 学号: 实验要求: 通过编程完成大数计算器的各项功能。 实验目的: 通过编程设计合理的数据结构,存储、计算大数。并通过高效的 算法对各项运算进行实现。 实验环境: C# 实验过程记录: 1、界面设计 通过 c#的控件对计算器的界面进行设计。 包 括 基 本 数 字 按 键 1 ~ 9、PI、e ; 计 算 按 键
(3)计算按键
、 *、 / 、x i. 赋值操作( 、
y
、Mod、 )
private void button16_Click(object sender, EventArgs e){ //当前没有运算 y_s!=1 if ((buff_answer != "" || number != "" || answers != "")&&y_s!=1) { //第一次运算,首先给第一个运算数赋值 if (number != "" && n_1 == "" && buff_answer == "" && n_2 == "")
ln 、e^ x、x ^ 2、 ) 赋值操作( log 、
private void button24_Click(object sender, EventArgs e){ if (number != "") n_1 = number; if (number == "" && buff_answer != "") n_1 = buff_answer; sum_number += "√(" + n_1 + ")" + "="; textBox1.Text = "√(" + n_1 + ")"; textBox2.Text = sum_number; operate_way = 7; answers = calculate_all(operate_way); Print(answers); } 其他运算赋值方法相同。
、 、 *、 / 、log、ln、e ^ x、x 2、 sin 、 cos 、 tan 、x y、Mod、n!、 ;
、ans 以及历史查看按键。如下图: 基本功能按键 clear、C、
2、计算器简介 (1)数据结构设置 本计算器以 c#中 using System.Numerics 为基础,该库中含有对 大数运算的基本加、减、乘、除,四则运算,但是该库中运算只支持 整形不支持小数。 因此在该基础上对每个运算式中数字的小数点的位 数进行记录, 将小数点去除后按照大数加法运算, 再计算小数点位置, 点到相应的位置。 注意:
{ n_1 = number; textBox1.Text = "+"; number = ""; sum_number = n_1; sum_number += "+"; textBox2.Text = sum_number; operate_way = 1; y_s = 1; } //第一次运算,第一个运算数已有值对第二个运算数赋值 else if (n_1 != "" && number != "" && n_2 == "" && buff_answer == "") { n_2 = number; textBox1.Text = "+"; number = ""; sum_number += n_2 + "="; textBox2.Text = sum_number; answers = calculate_all(operate_way); operate_way = 1; Print(answers); n_1 = ""; n_2 = ""; } //连续输入第二次运算 buff_answer!="",两个运算数都为空, 输入值为空 else if (buff_answer != "" && number == "" && n_1 == "" && n_2 == "") { n_1 = answers; answers = ""; textBox1.Text = "+"; sum_number += n_1; sum_number += "+"; textBox2.Text = sum_number; operate_way = 1; y_s = 1; } // 连续输入第二次运算 buff_answer!="", 两个运算数都为 空,输入值不为空 else if (buff_answer != "" && number != "" && n_1 == "" && n_2 == "")
6、心得体会与总结 第一次上手大数计算器时, 首先想到的是用 c 语言中的数组进行 数据的存储,将小数与整数进行分开进行存储然后在对其分开运算。 但是在进行编程的过程中出现了很多问题,如在进行进位退位,除法 运算的精度确定,对运算数的预处理过程比较复杂,对于程序的效率 会有一定的影响。之后我想到的是将运算数以字符串的形式进行储 存,调用系统原有的基本运算以及其他科学运算,但是发现系统的精 度远远没有达到预定需求,系统中的函数精度只有 16 位。 经过两次数据结构设计失败之后,我再网上进行查询资料,发现 在 c#中有单独的大数类,但是该大数类并不能处理小数,所以我想 到将小数进行存储后进行移位操作,再将数字进行运算处理。这样做 的好处是不用对数字进行复杂的预处理,同时精度可以有质的提升。 在解决基本的数据结构后,对于基本运算可以很好的完成,其他 运算可以调用基本运算完成, 从中我体会到对于程序的模块化编程十 分重要。要将整个程序的功能细化,不要将多个功能写在一个函数之 中,这样在程序调用时会十分简捷使整个程序层次清晰。 在编程的过程中应当养成良好的习惯,对于变量的声明,注释的 填写以及函数的命名, 这些对于以后维护和修改程序提供了很大的便 利。编程时也应当更有耐心,更注意细节,在功能实现的同时也应注 意到使用时用户的习惯,这样才是一个好的程序。
sin 、 、
查找的方法进行计算,具体实现见功能实现部分。 (3)特殊功能 对于三角函数运算,特意添加度与弧度的选择按键,用户可以根 据需求计算不同单位下的三角函数值。 同时对于计算的过程可以通过历史按键进行查看。 通过 ans 按钮直接取出上次答案进行下次运算。 (4)纠错处理 第一点:除法操作时除 0,计算机弹窗显示错误,返回显 示”wrong”。 第二点:对于连续点击运算符或小数点,设置标志位使系统自动 识别当前是否有运算在进行操作, 若有则无法继续输入运算符或小数 点。 第三点:每次运算时,判断对应运算的参与运算数字是否合法。 (5)屏幕显示 整数部分全部显示,小数部分主屏幕显示 30 位,历史界面可显 示 800 位(精度可调) 。
附录: 功能实现(由于代码量较大,只给出核心代码部分) : (1)变量声明 ansrwes buff_answers number y_s n_1 n_2 sum_number operate_way 储存答案 缓冲答案 当前运算数字 计算次数,y_s=0 为初次运算;y_s=1 为多次运算 第一个运算数 第二个运算数 用作存储历史记录 计算方式,标记运算
相关主题