自动生成简单数学题的小程序范例

偶尔浏览贴吧,在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)
原贴

实现效果:
这里写图片描述

实现代码:

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 list = new List();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();(方法括号内没有参数!)。

个人想法:
实际上是个很简答的问题,但解答方法很多,推荐所有初学者一定要先思考,然后再去问范例,直接看范例很难学到东西,自己思考出错后,先学习了解出错原因,再看范例会好很多。
平常日思考的时候,可以多写一点伪代码,方便捋顺业务逻辑。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部