实验报告_大数计算器

上传人:小** 文档编号:69713903 上传时间:2019-01-14 格式:PDF 页数:21 大小:595.79KB
返回 下载 相关 举报
实验报告_大数计算器_第1页
第1页 / 共21页
实验报告_大数计算器_第2页
第2页 / 共21页
实验报告_大数计算器_第3页
第3页 / 共21页
实验报告_大数计算器_第4页
第4页 / 共21页
实验报告_大数计算器_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《实验报告_大数计算器》由会员分享,可在线阅读,更多相关《实验报告_大数计算器(21页珍藏版)》请在金锄头文库上搜索。

1、计算机组成结构计算机组成结构 实验报告实验报告 实验题目:大数计算器实验题目:大数计算器 报告人:报告人: 学号:学号: 实验报告实验报告 实验题目实验题目:大数计算器 报告人报告人: 学号学号: 实验要求:实验要求: 通过编程完成大数计算器的各项功能。 实验目的:实验目的: 通过编程设计合理的数据结构,存储、计算大数。并通过高效的 算法对各项运算进行实现。 实验环境:实验环境: C# 实验过程记录:实验过程记录: 1、界面设计、界面设计 通过 c#的控件对计算器的界面进行设计。 包 括 基 本 数 字 按 键ePI、91; 计 算 按 键 、!tancossinelnlog/* 2 nMod

2、xxx y ; 基本功能按键ans、Cclear以及历史查看按键。如下图: 2、计算器简介计算器简介 (1)数据结构设置)数据结构设置 本计算器以 c#中 using System.Numerics 为基础,该库中含有对 大数运算的基本加、减、乘、除,四则运算,但是该库中运算只支持 整形不支持小数。 因此在该基础上对每个运算式中数字的小数点的位 数进行记录, 将小数点去除后按照大数加法运算, 再计算小数点位置, 点到相应的位置。 注意: i.在对加法和减法运算时,两个运算数字去除小数点前应将小数 点后位数补齐。 ii.在对除法操作时,在除数移位为整数的情况下,记录被除数的 小数位数,同时将其向

3、右移位,右移位数与小数位数之和即为最终结 果的精度。 iii.对于输出答案,要对其进行预处理,添加小数点,判断正负, 判断首位,判断结尾是否有冗余的 0。 (2)算法介绍算法介绍 由于引用库中没有对其他运算的调用函数, 对于特殊的计算如: 三角函数、xetansincos等,需要借助泰勒展开式,二分法 查找的方法进行计算,具体实现见功能实现功能实现部分。 (3)特殊功能)特殊功能 对于三角函数运算,特意添加度与弧度的选择按键,用户可以根 据需求计算不同单位下的三角函数值。 同时对于计算的过程可以通过历史按键进行查看。 通过 ans 按钮直接取出上次答案进行下次运算。 (4)纠错处理纠错处理 第

4、一点:除法操作时除 0,计算机弹窗显示错误,返回显 示”wrong”。 第二点:对于连续点击运算符或小数点,设置标志位使系统自动 识别当前是否有运算在进行操作, 若有则无法继续输入运算符或小数 点。 第三点:每次运算时,判断对应运算的参与运算数字是否合法。 (5)屏幕显示屏幕显示 整数部分全部显示,小数部分主屏幕显示 30 位,历史界面可显 示 800 位(精度可调) 。 3、功能实现(见附录)功能实现(见附录) 4、计算器演示计算器演示 (1)基本四则运算)基本四则运算 (2)三角函数运算三角函数运算 (3)其他运算)其他运算 (4)纠错处理)纠错处理 5、性能分析、性能分析 对于四则基本运

5、算而言, 调用库函数可以极大减少编程量同时可 以高效的完成运算。 对于阶乘计算 1000!可以做到立刻出结果,但是当数量级继续 上升时,10000!程序需要计算 10s 才可以出结果,100000!程序会 卡死。 对于三角函数运算,在计算时对其使用泰勒展开,共展开了 50 项。在计算过程中会反复调用基本运算以及比较函数,同时因为设置 精度比较高,计算的过程耗费时间比较长。 开根号运算使用的是二分查找,对于大整数查找过程时间较长。 总体来说计算器对于万位以内的基本运算可以满足需求, 对于精 度设置比较高时,需要耗费一定时间进行计算,耗费时间在可忍耐范 围内。 6、心得体会与总结心得体会与总结 第

6、一次上手大数计算器时, 首先想到的是用 c 语言中的数组进行 数据的存储,将小数与整数进行分开进行存储然后在对其分开运算。 但是在进行编程的过程中出现了很多问题,如在进行进位退位,除法 运算的精度确定,对运算数的预处理过程比较复杂,对于程序的效率 会有一定的影响。之后我想到的是将运算数以字符串的形式进行储 存,调用系统原有的基本运算以及其他科学运算,但是发现系统的精 度远远没有达到预定需求,系统中的函数精度只有 16 位。 经过两次数据结构设计失败之后,我再网上进行查询资料,发现 在 c#中有单独的大数类,但是该大数类并不能处理小数,所以我想 到将小数进行存储后进行移位操作,再将数字进行运算处

7、理。这样做 的好处是不用对数字进行复杂的预处理,同时精度可以有质的提升。 在解决基本的数据结构后,对于基本运算可以很好的完成,其他 运算可以调用基本运算完成, 从中我体会到对于程序的模块化编程十 分重要。要将整个程序的功能细化,不要将多个功能写在一个函数之 中,这样在程序调用时会十分简捷使整个程序层次清晰。 在编程的过程中应当养成良好的习惯,对于变量的声明,注释的 填写以及函数的命名, 这些对于以后维护和修改程序提供了很大的便 利。编程时也应当更有耐心,更注意细节,在功能实现的同时也应注 意到使用时用户的习惯,这样才是一个好的程序。 附录:附录: 功能实现(由于代码量较大,只给出核心代码部分功

8、能实现(由于代码量较大,只给出核心代码部分) : (1)变量声明变量声明 ansrwes储存答案 buff_answers缓冲答案 number当前运算数字 y_s计算次数,y_s=0 为初次运算;y_s=1 为多次运算 n_1第一个运算数 n_2第二个运算数 sum_number用作存储历史记录 operate_way计算方式,标记运算 (2)基本数字按键)基本数字按键 private void button1_Click(object sender, EventArgs e) if (number = “) answers = “; if (textBox1.Text = “0“) num

9、ber = “1“; /当屏幕显示不为 0 else number += “1“; n+; textBox1.Text = number; /在屏幕显示当前字符串 其余按键 29 和数字 1 的实现方法相同。 (3)计算按键)计算按键 i. 赋值操作(赋值操作(、Modx y /*) private void button16_Click(object sender, EventArgs e) /当前没有运算 y_s!=1 if (buff_answer != “ | number != “ | answers != “) textBox1.Text = “+“; number = “; su

10、m_number = n_1; sum_number += “+“; textBox2.Text = sum_number; operate_way = 1; y_s = 1; /第一次运算,第一个运算数已有值对第二个运算数赋值 else if (n_1 != “ textBox1.Text = “+“; number = “; sum_number += n_2 + “=“; textBox2.Text = sum_number; answers = calculate_all(operate_way); operate_way = 1; Print(answers); n_1 = “; n

11、_2 = “; /连续输入第二次运算 buff_answer!=“,两个运算数都为空, 输入值为空 else if (buff_answer != “ 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 != “ n_2 = number; number = “; tex

12、tBox1.Text = “+“; sum_number += n_2 + “=“; textBox2.Text = sum_number; answers = calculate_all(operate_way); operate_way = 1; Print(answers); n_1 = “; n_2 = “; 其他运算赋值方法相同。 赋值操作赋值操作(、2lnlogxxe) private void button24_Click(object sender, EventArgs e) if (number != “) n_1 = number; if (number = “ sum_n

13、umber += “(“ + n_1 + “)“ + “=“; textBox1.Text = “(“ + n_1 + “)“; textBox2.Text = sum_number; operate_way = 7; answers = calculate_all(operate_way); Print(answers); 其他运算赋值方法相同。 赋值操作(赋值操作(tansincos、) private void button26_Click(object sender, EventArgs e) if (number != “) double x; if (type = 0)/判断度与弧

14、度 n_1 = number; else n_1=(Math.PI/180)* Convert.ToDouble(number).ToString(); sum_number += “cos(“ + number + “)“ + “=“; textBox1.Text = “cos(“ + number + “)“; textBox2.Text = sum_number; operate_way = 12; x = Math.Cos(Convert.ToDouble(n_1); if (x = 0.5 | x = 0 | x = 1)/判断特殊值 answers = x.ToString();

15、else answers = calculate_all(operate_way); Print(answers); 其他运算赋值方法相同。 ii.计算操作计算操作 public string calculate_plus(string a, string b) string result = “0“, f = “; int a1, b1, a_l; a1 = a.Length; b1 = b.Length; /小数点位置计算 int flag1 = a.Length - a.IndexOf(“.“) - 1; int flag2 = b.Length - b.IndexOf(“.“) - 1

16、; textBox3.Text = flag1 + “ “ + flag2 + “ “; if (a.IndexOf(“.“) = -1) flag1 = 0; if (b.IndexOf(“.“) = -1) flag2 = 0; a_l = Math.Max(flag1, flag2); /补 0 操作 while (flag1 flag2) b = b + “0“; flag2+; while (flag1 0) a = a + “0“; buff1+; /设置精度 for (int i = 0; i 0) if (result.Substring(result.Length - 1, 1) = “0“) result = result.Substri

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号