自动生成简单数学题的小程序范例
2017-10-26 03:36
281 查看
偶尔浏览贴吧,在C#吧发现某网友提出一个初学者练习题,求“老铁”提供答案,看上去像是培训班的课后作业。本着能帮一把是一把的心态,写一个简单的例子并略微聊一聊。
需求:
1、随机生成10个结果在0~50以内的两位数加减法计算题。
2、每个题10分,每道题允许给出三次答案,答错分值递减规则为10-7-5-0。
3、10道题答完后,给出分数统计,并分四个等次给出等级评语。(>90是SMART,80-90是GOOD,70-80是OK,60-70是PASS,60以下是TRY ARAIN)
原贴
实现效果:
![](http://img.blog.csdn.net/20171026031218902?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjg0MTkyNDk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
实现代码:
简单介绍:
C#毕竟是面向对象语言,因此建立一个类来解决问题。
建立了一个MyMath类,类包含三个主要方法:Create、out_question、ss,分别负责创建题目、输出题目和统计最终结果。
MyMath类的构造函数带输入参数,分别是生成题目数量、运算数字最小/最大极限值,类型为int,所以结果没有小数,都是整数。
两个计算方法add和subtraction分别负责加法和减法的实现,这两个方法的public修饰实际上可以改为private,因为这两个方法服务于类内部,并不需要外部调用。计算方法内判断数值结果是否在0~50范围内,不在范围则返回-1作为错误判断标志。
为了方便储存题目,构造一个结构体,并创建一个类内部的泛型列表list储存生成的题目,通过遍历列表输出所有题目。每个结构体内包含两个运算数字、运算符合预存的运算结果,可通过foreach轻松遍历获取。
结果储存在一个动态数组al里面,储存的是答题次数,一道题目重复次数越少,分值越高。
整个范例中Random的实例只有一个ran,所有不同范围的随机数生成可通过在ran.Next()方法中添加不同的参数实现,例如:
生成并返回一个0~1之间的整形随机数:ran.Next(0,1);
生成并返回一个0~50之间的整形随机数:ran.Next(0,50);
如果要生成小数,则需要Math.random();(方法括号内没有参数!)。
个人想法:
实际上是个很简答的问题,但解答方法很多,推荐所有初学者一定要先思考,然后再去问范例,直接看范例很难学到东西,自己思考出错后,先学习了解出错原因,再看范例会好很多。
平常日思考的时候,可以多写一点伪代码,方便捋顺业务逻辑。
需求:
1、随机生成10个结果在0~50以内的两位数加减法计算题。
2、每个题10分,每道题允许给出三次答案,答错分值递减规则为10-7-5-0。
3、10道题答完后,给出分数统计,并分四个等次给出等级评语。(>90是SMART,80-90是GOOD,70-80是OK,60-70是PASS,60以下是TRY ARAIN)
原贴
实现效果:
实现代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Collections; namespace primary_school { class Program { static void Main(string[] args) { MyMath my = new MyMath(10,0,50); Console.WriteLine("******************************"); Console.WriteLine(" 小学1~2年级50以内加减法自测"); Console.WriteLine("******************************"); Console.Write("点击任意按键开始。。。"); Console.ReadKey(); Console.WriteLine(""); Console.WriteLine("******************************"); Console.WriteLine(" 题目生成中"); Console.WriteLine("******************************"); my.creat(); my.out_question(); my.ss(); Console.WriteLine("点击任意按键退出。。。"); Console.ReadKey(); } } class MyMath { int _count;//题目数量 int _minNum;//运算数最小极限 int _maxNum;//运算数最大极限 List<Topic> list = new List<Topic>(); ArrayList al = new ArrayList(); public struct Topic { public int num1;//运算数 public int num2;//运算数 public string symbol;//运算符 public int result;//结果 //public bool res_flag;//结果状态 } public MyMath(int count,int min,int max) { this._count = count; this._maxNum = max; this._minNum = min; } public int add(int a,int b) { if (0 < (a + b) && 50 > (a + b)) { return a + b; } else { return -1; } } public int subtraction(int a,int b) { if (0 < (a - b) && 50 > (a - b)) { return a - b; } else { return -1; } } public void creat() { Random ran = new Random(); for (int i = 0; i < _count; i++) { Topic t; switch (ran.Next(0, 1)) { case 0://生成减法 t.symbol = "-"; do { t.num1 = ran.Next(0, 50); t.num2 = ran.Next(0, 50); t.result = subtraction(t.num1, t.num2); } while (t.result == -1); //t.res_flag = false; list.Add(t); break; case 1://生成加法 t.symbol = "+"; do { t.num1 = ran.Next(0, 50); t.num2 = ran.Next(0, 50); t.result = add(t.num1, t.num2); } while (t.result == -1); //t.res_flag = false; list.Add(t); break; } } } public void out_question() { int index = 1; foreach (Topic t in list) { int k = 1; bool temp = true; do { if(k == 1) Console.WriteLine("第" + index + "题:"); Console.Write(t.num1.ToString() + " " + t.symbol + " " + t.num2.ToString() + " = "); if (t.result == int.Parse(Console.ReadLine())) { //t.res_flag = true; temp = false; } else { if (k <= 3) { Console.WriteLine("错误,请重新作答!"); k++; } else { k++; temp = false; } } } while (temp); al.Add(k); index++; Console.WriteLine("------------------------------"); } } public void ss() { int score = 0; string grade = ""; foreach (int a in al) { switch (a) { case 1: score += 10; break; case 2: score += 7; break; case 3: score += 5; break; case 4: score += 0; break; } } if (90<=score) { grade = "SMART"; } else if ((80<=score) && (score < 90)) { grade = "GOOD"; } else if ((70 <= score) && (score < 80)) { grade = "OK"; } else if ((60 <= score) && (score < 70)) { grade = "PASS"; } else { grade = "TRY AGAIN"; } Console.WriteLine("******************************"); Console.WriteLine("您的成绩是:{0}", score); Console.WriteLine("您的等级是:" + grade); Console.WriteLine("******************************"); } } }
简单介绍:
C#毕竟是面向对象语言,因此建立一个类来解决问题。
建立了一个MyMath类,类包含三个主要方法:Create、out_question、ss,分别负责创建题目、输出题目和统计最终结果。
MyMath类的构造函数带输入参数,分别是生成题目数量、运算数字最小/最大极限值,类型为int,所以结果没有小数,都是整数。
两个计算方法add和subtraction分别负责加法和减法的实现,这两个方法的public修饰实际上可以改为private,因为这两个方法服务于类内部,并不需要外部调用。计算方法内判断数值结果是否在0~50范围内,不在范围则返回-1作为错误判断标志。
为了方便储存题目,构造一个结构体,并创建一个类内部的泛型列表list储存生成的题目,通过遍历列表输出所有题目。每个结构体内包含两个运算数字、运算符合预存的运算结果,可通过foreach轻松遍历获取。
结果储存在一个动态数组al里面,储存的是答题次数,一道题目重复次数越少,分值越高。
整个范例中Random的实例只有一个ran,所有不同范围的随机数生成可通过在ran.Next()方法中添加不同的参数实现,例如:
生成并返回一个0~1之间的整形随机数:ran.Next(0,1);
生成并返回一个0~50之间的整形随机数:ran.Next(0,50);
如果要生成小数,则需要Math.random();(方法括号内没有参数!)。
个人想法:
实际上是个很简答的问题,但解答方法很多,推荐所有初学者一定要先思考,然后再去问范例,直接看范例很难学到东西,自己思考出错后,先学习了解出错原因,再看范例会好很多。
平常日思考的时候,可以多写一点伪代码,方便捋顺业务逻辑。
相关文章推荐
- 求一个能够 自动生成小学生数学练习题目 的Java程序。
- 超完整ASP程序自动生成HTML文件教学范例
- 帮同学写的一个简单地随机数学题生成程序,非常简单,适合练手
- 一个简单的加减乘除自动生成小程序升级版(JAVA)
- 一个简单的执行程序的GNU automake自动生成Makefile的方法及案例
- 一个简单的加减乘除自动生成小程序(JAVA)
- 在VB2005中自动生成最简单的数据库程序
- 一个简单的执行程序的GNU automake自动生成Makefile的方法及案例
- 3ff0 一个简单的执行程序的GNU automake自动生成Makefile的方法及案例
- 一个简单的执行程序的GNU automake自动生成Makefile的方法及案例
- 自动生成IP模拟POST访问后端程序
- 简单工程Makefile的自动生成
- 程序自动生成Dump文件
- 微信小程序前端开发框架,自动生成前端代码
- ABAP自动生成程序
- 编写程序,统计某旅馆住宿客人的总数,要求输入客人姓名,输出客人编号(按先后顺序自动生成),姓名以及总人数。
- [delphi]小程序一例,自动生成随机数。
- c# 简单的自动更新程序实现
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库
- 守护进程(简单实现)--程序关闭后自动启动