偶尔浏览贴吧,在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();(方法括号内没有参数!)。
个人想法:
实际上是个很简答的问题,但解答方法很多,推荐所有初学者一定要先思考,然后再去问范例,直接看范例很难学到东西,自己思考出错后,先学习了解出错原因,再看范例会好很多。
平常日思考的时候,可以多写一点伪代码,方便捋顺业务逻辑。