热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

第一周第1题万世想

第一题是要求实现一个自动生成小学生加减乘除四则运算题目的程序。后面可以将它扩展为网站或安卓应用或IOS应用或win10应用。我的思路比较简单。环境是JavaJDK1.8࿱

第一题是要求实现一个自动生成小学生加减乘除四则运算题目的程序。后面可以将它扩展为网站或安卓应用或IOS应用或win10应用。

 

我的思路比较简单。环境是Java JDK1.8;IDE为Intellij社区版。

首先,我们不考虑有括号的情形,那么符号只有+、-、*、/四种;涉及到的数包含两种:整数或分数。

1. 我们注意到,一个运算式中,总有“数的个数比运算符多1”的规则。于是,我们自然地想到创建一个固定长度为n的数组number存放数字,每个数都能随机生成,通过maxOfNumber变量控制式子中出现的最大数字。创建一个长度为n-1的数组character存放运算符号。

2. 接下来需要初始化数组number和character。number数组每个元素靠maxOfNumber控制最大数、minOfNumber控制最小数、hasFraction控制是否出现分数随机生成;character数组每个元素靠type变量控制只有加减、只有乘除、加减乘除都有的3种类型随机生成。

例如:n为5,minOfNumber为0,maxOfNumber为10,hasFraction为出现分数,type为只有加减的类型:5/7+8/7-1/7-2/7

3. 接下来就是结果的计算。对于纯整数,计算结果是简单的。通过查找资料,我发现纯整数字符串的计算依靠ScriptEngine类即可完成。函数使用示例如下:

1 //整型表达式的正确计算结果2 public String calIntResult() {3 ScriptEngine se = new ScriptEngineManager().getEngineByName("Javascript");4 try {5 Double result = (Double) se.eval(formular);6 return String.valueOf(result.doubleValue());7 } catch (ScriptException e) { 8 e.printStackTrace(); 9 } 10 return null; 11 }

 然而,对于分数,这种方法是不行的。比如1/5+2/3这样的式子,靠字符串渲染肯定行不通。依靠原始的数学求解方法,意识到需要借助求最大公约数和最小公倍数完成。例:求12和8的最小公倍数。12和8的最大公约数为4,12×8÷4=24 ,所以两数的最小公倍数是24。下面放上分数加减乘除法的简单实现。

1 public class Fraction { 2 static int numera &#61; 0;3 static int deomina &#61; 0;4 5 public static void main(String[] args) { 6 int a1 &#61; 9;7 int a2 &#61; 10; 8 int b1 &#61; 3; 9 int b2 &#61; 11; 10 new Fraction().fracAdd(a1,a2,b1,b2);//结果为&#xff1a;11/20 11 System.out.println("分数加法运算&#xff1a;"&#43;numera&#43;"/"&#43;deomina); 12 new Fraction().fracSub(a1,a2,b1,b2);//分数相减 13 System.out.println("分数减法运算&#xff1a;"&#43;numera&#43;"/"&#43;deomina); 14 new Fraction().fracMul(a1,a2,b1,b2);//分数相乘 15 System.out.println("分数乘法运算&#xff1a;"&#43;numera&#43;"/"&#43;deomina); 16 new Fraction().fractDiv(a1,a2,b1,b2);//分数相除 17 System.out.println("分数除法运算&#xff1a;"&#43;numera&#43;"/"&#43;deomina); 18 } 19 20 //定义分数相加函数 21 public void fracAdd(int first_numerator, int first_denominator, int second_numrator, int second_denominator){ 22 int lcm, gcd; 23 lcm &#61; lcm(first_denominator,second_denominator);//需要调用求最小公倍数的函数求的最小公倍数 24 numera &#61; (lcm/first_denominator)*first_numerator&#43;(lcm/second_denominator)* second_numrator;// 未化简的分子和 25 deomina &#61; lcm; //未化简的分母 26 gcd &#61; gcd(numera,deomina); //需要调用求最大公约数的函数 27 numera &#61; numera/gcd; //化简后的分子 28 deomina &#61; deomina/gcd; //化简后的分母 29 } 30 31 //定义分数相减函数 32 public void fracSub(int first_numerator,int first_denominator,int second_numrator,int second_denominator){ 33 int lcm, gcd; 34 lcm &#61; lcm(first_denominator,second_denominator);//需要调用求最小公倍数的函数求的最小公倍数 35 numera &#61; (lcm/first_denominator)*first_numerator-(lcm/second_denominator)* second_numrator;// 未化简的分子差 36 deomina &#61; lcm; //未化简的分母 37 gcd &#61; gcd(numera,deomina); //需要调用求最大公约数的函数 38 numera &#61; numera/gcd; //化简后的分子 39 deomina &#61; deomina/gcd; //化简后的分母 40 } 41 42 //定义分数相乘函数 43 public void fracMul(int first_numerator,int first_denominator,int second_numrator,int second_denominator){ 44 int z, m, gcd; 45 z &#61; first_numerator * second_numrator; 46 m &#61; first_denominator * second_denominator; 47 gcd &#61; gcd(z,m); 48 numera &#61; z / gcd; 49 deomina &#61; m / gcd; 50 } 51 52 //定义分数相除函数 53 public void fractDiv(int first_numerator,int first_denominator,int second_numrator,int second_denominator){ 54 int z, a, m, gcd; 55 a &#61; second_denominator; 56 second_denominator &#61; second_numrator; 57 second_numrator &#61; a; 58 z &#61; first_numerator * second_numrator; 59 m &#61; first_denominator * second_denominator; 60 gcd &#61; gcd(z,m); 61 numera &#61; z / gcd; 62 deomina &#61; m / gcd; 63 } 64 65 //求最大公约数 66 public static int gcd(int m,int n){ 67 int i &#61; 2; //定义整型变量i&#xff0c;为循环变量 68 int g, min; 69 min &#61; m>n ? n : m; 70 g &#61; 1; //最大公约数初始值为1 71 while(i <&#61; min) //判断条件&#xff0c;一直循环到两个数中较小的那个结束 72 { 73 while (m % i &#61;&#61; 0 && n % i &#61;&#61; 0) 74 { 75 m &#61; m / i; 76 n &#61; n /i; 77 g &#61; g * i; 78 } 79 i&#43;&#43;; 80 } 81 return g; 82 } 83 84 //求最小公倍数函数 85 public static int lcm(int m,int n){ 86 int g, l; 87 g &#61; gcd(m,n); //调用求最大公约数函数 88 l &#61; m * n / g; 89 return l; 90 } 91 }

4. 整数和分数的自动生成已经OK&#xff0c;计算结果方法也实现了。下面放上另一个类的具体代码。该代码与上面的代码一起实现了题目一的要求。

1 public class AutoFormula {2 static String formular &#61; new String();3 static String result &#61; new String();4 int numerator;5 int denominator;6 7 public static void main(String[] args) { 8 /* 9 * 参数mode为符号模式&#xff0c;0是加减、1是乘除、2是加减乘除&#xff1b; 10 * 参数hasFraction为控制分数个数&#xff1b; 11 * 参数numOfCharacter为符号数量&#xff1b; 12 * 参数minOfNumber为式子中出现的最小数值&#xff1b; 13 * 参数maxOfNumber为式子中出现的最大数值&#xff1b; 14 */ 15 new AutoFormula().generate(0, 1, 3, 0, 10); 16 System.out.println(formular); 17 System.out.println(result); 18 } 19 20 21 public void generate(int mode, int hasFraction, int numOfCharacter, int minOfNumber, int maxOfNumber) { 22 int numOfNumber &#61; numOfCharacter &#43; 1; 23 String[] character &#61; new String[numOfCharacter]; 24 String[] number &#61; new String[numOfNumber]; 25 StringBuilder stringBuilder &#61; new StringBuilder(); 26 27 //初始化符号数组 28 for (int i&#61;0; i

5. 做到这里&#xff0c;您可能会问&#xff1a;

为什么你要用Java语言实现呢&#xff1f;使用Python语言实现会不会更简单呢&#xff1f;

答&#xff1a;嗯&#xff0c;Python实现的确更简单&#xff0c;但是我们最后要做的当然是将它实现成一个网站或App。如果实现成网站&#xff0c;基于Spring MVC&#43;Spring&#43;Hibernate/Mybatis的Java Web拥有着更强大的逻辑表达能力以及更耦合、更稳定的技术架构。Java的强面向对象语言特性也能够更好地帮助团队严格化代码的编写&#xff0c;利于软件工程团队协作开发&#xff0c;Python弱语法的特点不利于规范代码&#xff0c;在后期维护更强大的功能时势必会复杂。PHP则只能应用于网站建设&#xff0c;后期不利于转型为Android应用&#xff0c;因此它不在我们的考虑范围内。.NET则只能用于微软服务器&#xff0c;这对于挚爱Linux的我。。。无法忍受。

为什么你要用Intellij IDE呢&#xff1f;Eclipse或者MyEclipse你咋不用&#xff1f;

答&#xff1a;这个问题已经讨论透了。我喜欢Intellij的原因是它非常完善的代码提示功能&#xff0c;即使你在写CSS或Javascript脚本时&#xff0c;它都有HTML5特性的语法提示&#xff0c;更别提Java各种类、包、函数的精巧提示了&#xff1b;此外&#xff0c;它无条件支持Maven&#xff0c;Gradle这些Java的项目管理工具&#xff0c;必须点个大写的赞。

6. 既然我们打算将这个服务做成网站&#xff0c;并且是基于Java SSH框架的&#xff0c;那么前端我暂时使用Bootstrap框架&#xff0c;上手简单&#xff0c;对于这个项目&#xff0c;足够了。

我们团队的Github代码托管地址为&#xff1a;https://github.com/NorthWolives/。里面包含基础的运算式生成代码以及目前网站前端实现的代码。

这是我的前端页面简单实现&#xff1a;http://server.malab.cn/PupilLearn/

首页截图如下&#xff0c;希望未来小朋友们喜欢&#xff1a;

 

时间&#xff1a;2016年9月9日

作者&#xff1a;万世想&#xff0c;天津大学计算机学院计算机科学与技术系

 

转:https://www.cnblogs.com/jiwafate/p/5857977.html



推荐阅读
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • WPF之Binding初探
      初学wpf,经常被Binding搞晕,以下记录写Binding的基础。首先,盗用张图。这图形象的说明了Binding的机理。对于Binding,意思是数据绑定,基本用法是:1、 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • Python基础知识:注释、输出和input交互
    本文介绍了Python基础知识,包括注释的使用、输出函数print的用法以及input函数的交互功能。其中涉及到字符串和整数的类型转换等内容。 ... [详细]
  • 判断编码是否可立即解码的程序及电话号码一致性判断程序
    本文介绍了两个编程题目,一个是判断编码是否可立即解码的程序,另一个是判断电话号码一致性的程序。对于第一个题目,给出一组二进制编码,判断是否存在一个编码是另一个编码的前缀,如果不存在则称为可立即解码的编码。对于第二个题目,给出一些电话号码,判断是否存在一个号码是另一个号码的前缀,如果不存在则说明这些号码是一致的。两个题目的解法类似,都使用了树的数据结构来实现。 ... [详细]
  • 获取时间的函数js代码,js获取时区代码
    本文目录一览:1、js获取服务器时间(动态)2 ... [详细]
author-avatar
少才奇妙Albert
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有