标签:
编写一个自动生成小学四则运算题目的程序,除了支持整数以外,还要支持真分数的四则运算。
编程语言选择了C#,编程软件选择了Visual Studio 2015。
在看到题目首先想到了使用Random()这个随机方法进行随机产生数字,同时加减乘除四个运算符用0、1、2、3这个四个数字表示,也通过随机方法生成,在打印输出时再进行判断输出成相应的数学符号。我将题目分成了几个阶段进行编写,分别为整数阶段、分数阶段、混合阶段和优化阶段。
在这个阶段主要解决的问题就是如何进行随机生成数字与运算符,需要注意的部分是在C#语言中Random()在使用时随机生成的数字是小于你所输入的数字的。为了方便使用同时加入了设置了出题数目与最大值范围的语句,通过用户的输入进行设定,在接收时C#语句默认接收的为String的字符,需要进行转换成Int类型再进行使用。
代码如下所示:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 随机生成_控制台 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 Console.Write("请输入生成题目数量:"); 14 String strnum = Console.ReadLine();//接收字符 15 int num = Convert.ToInt32(strnum);//转义 题目个数 16 17 Console.Write("请输入生成数字上限:"); 18 String strmaxnum = Console.ReadLine();//接收字符 19 int maxnum = Convert.ToInt32(strmaxnum);//转义 题目数字最大上限 20 Random R = new Random(); 21 int symbol = 0; 22 for (int i = 0; i < num; i++) 23 { 24 Console.Write(R.Next(1, maxnum)); 25 symbol = R.Next(0, 4); 26 switch(symbol)//0-3分别表示加减乘除 27 { 28 case 0:Console.Write("+");break; 29 case 1:Console.Write("-");break; 30 case 2:Console.Write("*");break; 31 case 3:Console.Write("/");break; 32 } 33 Console.WriteLine(R.Next(1, maxnum) + "="); 34 } 35 Console.ReadLine(); 36 } 37 } 38 }
阶段一实验截图如下:
分数阶段就需要在整数阶段进行一定的修改,首先在随机生成的部分就要多生成两个数字,程序中用n1、n2表示第一个分数的分子与分母,m1、m2来表示第二个数字的分子与分母,题目中要求分数需为真分数,则我们在输出时需要对分子与分母的大小进行比较,将较小的一个数字作为一个分子另一个则为分母,如若两个数字相同时则将其输出为1。运算符则与整数阶段用的一样的方法。
代码如下所示:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 随机生成_控制台 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 Console.Write("请输入生成题目数量:"); 14 String strnum = Console.ReadLine();//接收字符 15 int num = Convert.ToInt32(strnum);//转义 题目个数 16 17 Console.Write("请输入生成数字上限:"); 18 String strmaxnum = Console.ReadLine();//接收字符 19 int maxnum = Convert.ToInt32(strmaxnum);//转义 题目数字最大上限 20 Random R = new Random(); 21 int symbol = 0;//运算符 22 int n1, n2, m1, m2;//分数 23 for(int i = 0; i < num; i++)//循环输出 24 { 25 n1 = R.Next(1, maxnum); 26 n2 = R.Next(1, maxnum); 27 m1 = R.Next(1, maxnum); 28 m2 = R.Next(1, maxnum); 29 symbol = R.Next(0, 4); 30 if (n1<n2)//判断是否为真分数,不是则调换顺序,若相同则输出1 31 { 32 Console.Write(n1 + "/" + n2); 33 } 34 else if(n1 == n2) 35 { 36 Console.Write(1); 37 } 38 else 39 { 40 Console.Write(n2 + "/" + n1); 41 } 42 switch (symbol)//0-3分别表示加减乘除 43 { 44 case 0: Console.Write("+"); break; 45 case 1: Console.Write("-"); break; 46 case 2: Console.Write("*"); break; 47 case 3: Console.Write("/"); break; 48 } 49 if (m1 < m2) 50 { 51 Console.WriteLine(m1 + "/" + m2 + "="); 52 } 53 else if(m1 > m2) 54 { 55 Console.WriteLine(m2 + "/" + m1 + "="); 56 } 57 else 58 { 59 Console.WriteLine(1 + "="); 60 } 61 } 62 Console.ReadLine(); 63 } 64 } 65 }
阶段二实验截图如下:
结合实际情况编写了第三阶段,混合模式(这个混合模式为既有全为整数也有全为分数的,但没有一个式子中分数和整数并存的),混合模式下在出题时前半题目为整数运算,后半为分数运算。在整个程序开始时加入了模式的选择,程序启动时会提示选择,一共有三个模式:整数模式、分数模式、混合模式。在用户选择后会提示选择题目数量与最大数字范围。
代码如下所示:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace 随机生成_控制台 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 Console.Write("请选择模式(1、分数 2、整数 3、混合):");//模式选择 14 String numType = Console.ReadLine(); 15 switch (numType) 16 { 17 case "1": Fraction(); break; 18 case "2": Integer(); break; 19 case "3": Mixture(); break; 20 default: Console.WriteLine("输入有误!");break; 21 } 22 Console.ReadLine(); 23 } 24 public static void Fraction()//分数模式 25 { 26 Console.Write("请输入生成题目数量:"); 27 String strnum = Console.ReadLine();//接收字符 28 int num = Convert.ToInt32(strnum);//转义 29 30 Console.Write("请输入生成数字上限:"); 31 String strmaxnum = Console.ReadLine();//接收字符 32 int maxnum = Convert.ToInt32(strmaxnum);//转义 33 34 Random R = new Random(); 35 int symbol = 0;//运算符 36 int n1, n2, m1, m2;//分数 37 for (int i = 0; i < num; i++)//循环输出 38 { 39 n1 = R.Next(1, maxnum); 40 n2 = R.Next(1, maxnum); 41 m1 = R.Next(1, maxnum); 42 m2 = R.Next(1, maxnum); 43 symbol = R.Next(0, 4); 44 if (n1 < n2) 45 { 46 Console.Write(n1 + "/" + n2); 47 } 48 else if (n1 == n2) 49 { 50 Console.Write(1); 51 } 52 else 53 { 54 Console.Write(n2 + "/" + n1); 55 } 56 switch (symbol) 57 { 58 case 0: Console.Write("+"); break; 59 case 1: Console.Write("-"); break; 60 case 2: Console.Write("*"); break; 61 case 3: Console.Write("/"); break; 62 } 63 if (m1 < m2) 64 { 65 Console.WriteLine(m1 + "/" + m2 + "="); 66 } 67 else if (m1 > m2) 68 { 69 Console.WriteLine(m2 + "/" + m1 + "="); 70 } 71 else 72 { 73 Console.WriteLine(1 + "="); 74 } 75 } 76 } 77 public static void Integer()//整数模式 78 { 79 Console.Write("请输入生成题目数量:"); 80 String strnum = Console.ReadLine();//接收字符 81 int num = Convert.ToInt32(strnum);//转义 82 83 Console.Write("请输入生成数字上限:"); 84 String strmaxnum = Console.ReadLine();//接收字符 85 int maxnum = Convert.ToInt32(strmaxnum);//转义 86 87 Random R = new Random(); 88 int symbol = 0;//运算符 89 for (int i = 0; i < num; i++)//循环输出 90 { 91 Console.Write(R.Next(1, maxnum)); 92 symbol = R.Next(0, 4); 93 switch (symbol) 94 { 95 case 0: Console.Write("+"); break; 96 case 1: Console.Write("-"); break; 97 case 2: Console.Write("*"); break; 98 case 3: Console.Write("/"); break; 99 } 100 Console.WriteLine(R.Next(1, maxnum) + "="); 101 } 102 } 103 public static void Mixture()//混合模式 104 { 105 Console.Write("请输入生成题目数量:"); 106 String strnum = Console.ReadLine();//接收字符 107 int num = Convert.ToInt32(strnum);//转义 108 109 Console.Write("请输入生成数字上限:"); 110 String strmaxnum = Console.ReadLine();//接收字符 111 int maxnum = Convert.ToInt32(strmaxnum);//转义 112 113 Random R = new Random(); 114 int symbol = 0;//运算符 115 int n1, n2, m1, m2;//分数 116 for (int i = 0; i < num; i++)//循环输出 117 { 118 if (i < (num / 2)) 119 { 120 Console.Write(R.Next(1, maxnum)); 121 symbol = R.Next(0, 4); 122 switch (symbol) 123 { 124 case 0: Console.Write("+"); break; 125 case 1: Console.Write("-"); break; 126 case 2: Console.Write("*"); break; 127 case 3: Console.Write("/"); break; 128 } 129 Console.WriteLine(R.Next(1, maxnum) + "="); 130 } 131 else 132 { 133 n1 = R.Next(1, maxnum); 134 n2 = R.Next(1, maxnum); 135 m1 = R.Next(1, maxnum); 136 m2 = R.Next(1, maxnum); 137 symbol = R.Next(0, 4); 138 if (n1 < n2) 139 { 140 Console.Write(n1 + "/" + n2); 141 } 142 else if (n1 == n2) 143 { 144 Console.Write(1); 145 } 146 else 147 { 148 Console.Write(n2 + "/" + n1); 149 } 150 switch (symbol) 151 { 152 case 0: Console.Write("+"); break; 153 case 1: Console.Write("-"); break; 154 case 2: Console.Write("*"); break; 155 case 3: Console.Write("/"); break; 156 } 157 if (m1 < m2) 158 { 159 Console.WriteLine(m1 + "/" + m2 + "="); 160 } 161 else if (m1 > m2) 162 { 163 Console.WriteLine(m2 + "/" + m1 + "="); 164 } 165 else 166 { 167 Console.WriteLine(1 + "="); 168 } 169 } 170 } 171 } 172 } 173 }
阶段三实验截图如下:
本次作业的难度还是比较容易的,再编写的时候也没有过多的问题,只要从最简单的整数开始做起就会比较容易做,通过这个作业我发现我这几个阶段的代码都有部分的冗余,第二阶段的分数没有进行约分,这几个问题我在这次作业的最终版本会进行改进。C#语言的熟练度不高,在使用的时候经常会进行API的查询,选择C#进行编写的原因也是在于为了提高对C#语言的熟练度。觉得自己做的好的方面有:代码比较整洁,同时各个重要代码进行了注释。
这次的作业我认为还要继续做下去的必要,因为我的妹妹刚刚上小学,我可以进一步进行改进可以让她在接下来的学习中进行使用!打算改进的部分有:将其做成窗口模式、加入随机模式(一道题中既有真分数、也有整数)、加入小数模式、加入多式子运算(即一道运算题有多个需要运算的数字)、判断程序(每个题目做完自动进行判断对错,并计算总分)、错题本(每个错过的题目生成TXT文本进行记录,可以二次进行学习)。
标签:
原文地址:http://www.cnblogs.com/CLSVEN/p/5271083.html