编写C#36选6彩票抽奖系统代码
系统功能分析本系统由以下几个功能模块(方法)构成:
显示模块(方法):显示指定(已知)数组中的非0元素。
校验模块(方法):验证指定(已知)数组的合法性,数组中的数据是否有重复?是否有超出1-36范围的数据?
选号模块(方法):将输入的整数存入数组a1,并将a1作为本模块(方法)的结果。
随机数产生模块(方法):产生随机数存入数组b1,并将b1作为本模块(方法)的结果。
兑奖模块(方法):将选号模块得到的数组a1与随机数产生模块得到的数组b1进行比对,看有多少个数组元素是相同的,相同的数据则为已中奖的数据,相同数据越多,中奖级别越大,并输出中奖信息。
实验目的:掌握方法(函数)的定义、调用、嵌套、递归
实验要求:各个子功能模块(方法)独立实现,并能够独立测试。
主要知识点:方法的定义、调用。见PPT或上课笔记
数组的定义、使用,见下列红色内容,务必看完红色内容再开始实验,并在实验课后将下列红色部分内容抄至课堂练习本上。
声明数组,然后创建数组对象的语法格式如下:
类型[ ] 数组名; 数组名=new 类型[元素个数]; //分三个步骤
或 类型[ ] 数组名=new 类型[元素个数]; 数组名={初值表}; //分两个步骤
或 类型[ ] 数组名= {初值表}; //分一个步骤
例如:创建存放6个整数的整型数组a,并将1,2,3,4 , 5, 6,几个整数放入数组a中。
int[] a; a=new[6]; a={ 1,2,3,4 , 5, 6}; //分三个步骤
或 int[] a=new int[6]; a={ 1,2,3,4 , 5, 6}; //分两个步骤
或 int[] a={ 1,2,3,4 , 5, 6}; //分一个步骤
数组长度为:数组名.length
例如 已知数组 int[] a={ 4,5,3,1 , 9, 8};
则 a.length为6,即数组有6个元素,数组的长度为6
模块1:显示模块(方法)
模块功能:显示指定(已知)数组中的信息。
定义一个方法display,该方法的功能是将指定(已知)的数组中所有非0的元素,逐个输出。
相关的知识点:方法的定义(见PPT或上课笔记)、数组的使用、for循环的使用
方法的算法如图:
分析:
方法头:方法的访问修饰符为static,该方法只是需要显示数组的元素,不需要任何结果,因此不需要返回值,即返回值类型为void,方法名称display,该方法需要显示的是指定(已知)的数组信息,即必须要知道显示的数组。因此方法参数为int[] a
方法体:
1.先使用console.writeline()语句,输出,号码为:
2.使用for循环,将已知数组a的各个元素取出,判断其是否为0?如果为0,则不输出;不为0,则将其输出。
3. 使用console.writeline()语句,换行
模块1(方法)的测试:
在完成了方法display的基础上,在main()函数中,定义一个数组int[] ceshi={9,8,7,6,5,4};
然后调用display方法,将数组ceshi的元素输出。
将数组元素改为ceshi={9,8,7,0,0,0},然后调用display方法,将数组ceshi的元素输出。比较前后两次调用的结果。
测试结果如图:
测试1,当ceshi={9,8,7,6,5,4}时,输出
测试2,当ceshi={9,8,7,0,0,0}时,输出
测试完成后,将mian()函数中的测试语句删除。
模块2,校验模块(方法)
模块功能:验证指定(已知)数组的合法性,数组中的数据是否有重复?是否有超出1-36范围的数据?如果数组合法,则返回true,否则返回false
相关的知识点:方法的定义(见PPT或上课笔记)
方法的大概流程如图:
分析:(???号部分的内容,留给大家自己思考)
方法头:访问修饰符应为???;该方法的结果是数组是否合法,合法则返回true,不合法则返回false,那么返回值的类型应为???;方法名称check(也可以自拟方法名);该方法是验证指定(已知)数组的合法性,即必须要知道验证的数组。因此方法参数为???
方法体:
1.先定义一个bool类型的临时变量result=true; //默认为结果合法
2.使用双重嵌套 for循环,第一层for循环用于取出已知数组a的某个元素a[i],第二层for循环用于取出数组的另一个元素a[j],比较两个元素,是否相同,如果相同,则证明数组中存在重复的数据,那么resule=false,说明该数组不合法。同时验证数组的数据范围是否在1-36范围内,若不在此范围内,则resule=false
For循环的参考代码如下:
3.在完成所有循环后,将result作为本方法的结果返回。
模块2(方法)的测试:
1.在完成了check方法的基础上,在main()函数中,定义一个数组int[] ceshi={9,8,7,6,5,4};
2.定义一个判断变量bool decide,并调用check方法验证数组ceshi的合法性,并将验证结果赋值给decide。
即decide = check(ceshi);
3.使用if语句,如果decide为true,则使用console.writeline()语句,输出“合法”
如果decide为false,则使用console.writeline()语句,输出“不合法”
修改数组ceshi的值为{9,8,7,6,5,5};和{9,8,7,6,5,37},分别测试其合法性
测试结果如图:
测试1,当ceshi={9,8,7,6,5,4}时 ,输出
测试2,当ceshi={9,8,7,6,5,5}或{9,8,7,6,5,37} 时,输出
测试完成后,将mian()函数中的测试语句删除。
模块3,选号模块(方法)
模块功能:将输入的整数存入数组a1,并将a1作为本模块的结果。
相关的知识点:方法的定义(见PPT或上课笔记)
方法的大概流程如图:
分析:(???号部分的内容,留给大家自己思考)
方法头:访问修饰符应为???;该方法的结果是得到一个存放整数的数组,那么返回值的类型应为???;方法名称select_number (也可以自拟方法名);该方法用于创建一个数组,不需要已知条件,那么方法的参数应为???
方法体:
1.创建一个元素个数为6的整型数组a(因为是36选6,只需要6个数字即可)。int[] a=new int[6];
2.使用while循环,如果输入数据不合法,即要求重复输入,如果合法,则return数组a(在循环语句中,return除了可以返回结果以外,还具有break的作用,即可用于跳出循环)
3.使用for循环,提示用户从键盘输入数据,并将输入的数据存放至数组a中。
4.调用模块2,校验模块(方法)check,校验数组a。如果校验结果为false,说明数组a中的元素不合法,那么要求用户重新输入。
5.重复步骤2,3,直至校验结果为true。将数组a作为本方法的结果,返回。
部分代码参考如下:
模块3(方法)的测试:
在完成了select_number方法的基础上,在main()函数中,定义一个数组int[] ceshi;
调用select_number方法,并将他的结果,赋值给数组ceshi;
调用display方法(模块1的方法),将数组ceshi的信息输出。
测试1:当输入1,2,3,4,5,5,时输出。
测试2,当输入38,1,2,3,4,5时输出
测试3,当输入8,7,6,5,4,3,时输出
测试完成后,将mian()函数中的测试语句删除。
模块4,随机数产生模块(方法)
模块功能:产生随机数存入数组b1,并将b1作为本模块的结果。
相关的知识点:方法的定义(见PPT或上课笔记)
方法的大概流程如图:
分析:(???号部分的内容,留给大家自己思考)
方法头:访问修饰符应为???;该方法的结果是得到一个存放随机整数的数组,那么返回值的类型应为???;方法名称random_number (也可以自拟方法名);该方法用于创建一个数组,不需要已知条件,那么方法的参数应为???
方法体:
1.创建一个元素个数为6的整型数组a(因为是36选6,只需要6个数字即可)。
2.创建一个随机种子备用。 Random bb = new Random();
3.使用while循环,如果产生的随机数不合法,即重复产生随机数,如果合法,则return数组a(在循环语句中,return除了可以返回结果以外,还具有break的作用,即可用于跳出循环)
4.使用for循环,使用随机种子bb的next(1,37)方法,产生的介于1-37之间的随机数逐个存放至数组a中。
5.调用模块2,校验模块(方法)check,校验数组a,如果校验结果为false,说明数组a中的元素不合法,那么重新产生随机数。
6.重复步骤2,3,直至校验结果为true。将数组a作为本方法的结果,返回。
步骤2至步骤6的代码参考如下:
模块4(方法)的测试:
在完成了random_number方法的基础上,在main()函数中,定义一个数组int[] ceshi;
调用random_number方法,并将他的结果,赋值给数组ceshi;
调用display方法(模块1的方法),将数组ceshi的信息输出。
测试界面1:
测试界面2:
注意:因为产生的是随机数数组,因此每次的测试结果是不一样的。
测试完成后,将mian()函数中的测试语句删除。
模块5,兑奖模块(方法)
模块功能:将选号模块得到的数组a1与随机数产生模块得到的数组b1进行比对,看有多少个数组元素是相同的,相同的数据则为已中奖的数据,相同数据越多,中奖级别越大。
相关的知识点:方法的定义(见PPT或上课笔记)、switch多分支选择语句、for循环嵌套、数组基本用法
方法的大概流程如图:
分析:(???号部分的内容,留给大家自己思考)
方法头:访问修饰符应为???;该方法的结果是使用console.writeline()语句输出中奖信息,那么返回值的类型应为???;方法名称open_lottery (也可以自拟方法名);该方法用于比对已知数组a和已经数组b中,相同元素的数量,那么前提条件是知道数组a和数组b,因此方法的参数应为???
方法体:
1.创建一个元素个数为6的整型数组C,用于存放数组a和数组b中相同的元素,(因为是进行比对的数组a和b都是6个元素的,因此数组C最多可能存放6个元素,即数组a与数组b所有元素都相同的情况)。
2.定义一个整型变量num,用于存储两个数组中相同元素的个数。
3.使用第一个for(int i=0;i<a.length;i++)循环逐个取出数组a中的元素,在第一个for循环内部,再使用一个for(int j=0;j<b.length;j++)循环逐个取出数组b中的元素,如果a[i]==b[j], 将该元素存放至c[num]中,再让num自增。,
4.循环结束后,对num进行分类判断,如果num==0,则输出:一个号码都没有中,你真衰!
如果num!=0,则进行switch多分支判断,
若num为1,则输出中了1个号码!
若num为2,则输出中了2个号码!
若num为3,则输出中了3个号码!三等奖!
若num为4,则输出中了4个号码!二等奖!
若num为5,则输出中了5个号码!一等奖!
若num为6,则输出中了6个号码!特等奖!
5.如果进行多分支判断后,调用display方法(模块1),将数组C的信息输出。
模块5(方法)的测试:
在完成了open_lottery方法的基础上,在main()函数中,定义两个个数组int[] ceshi1={1,2,3,4,5,6};和int[] ceshi2={1,2,3,4,5,6};
调用open_lottery方法,测试数组ceshi1和ceshi2的中奖情况。修改数组ceshi2的元素值,分别测试。
测试1:int[] ceshi1={1,2,3,4,5,6};和int[] ceshi2={1,2,3,4,5,6};
运行界面:
测试2:int[] ceshi1={1,2,3,4,5,6};和int[] ceshi2={11,2,3,4,5,6};
运行界面:
测试3:int[] ceshi1={1,2,3,4,5,6};和int[] ceshi2={11,12,3,4,5,6};
运行界面:
测试4:int[] ceshi1={1,2,3,4,5,6};和int[] ceshi2={11,12,13,4,5,6};
运行界面:
测试5:int[] ceshi1={1,2,3,4,5,6};和int[] ceshi2={11,12,13,14,5,6};
运行界面:
测试6:int[] ceshi1={1,2,3,4,5,6};和int[] ceshi2={11,12,13,14,15,6};
运行界面:
测试6:int[] ceshi1={1,2,3,4,5,6};和int[] ceshi2={11,12,13,14,15,16};
运行界面:
各模块功能的衔接
1. 在main()函数中,定义两个元素个数为6的整型数组select1和random1。先调用选号模块方法select_number,并将其结果赋值给select1。即手动选号存储在数组select1中
2. 使用console.writeline()语句输出提示语: 选号结果为:
3. 调用display方法将select1数组信息输出。
4. 调用随机数产生模块方法random_number,并将其结果赋值给random1, 即开奖的号码存储在数组select1中
5. 使用console.writeline()语句输出提示语: 本期的中奖号码为:
6. 调用display方法将random1数组信息输出。
7. 调用兑奖模块方法open_lottery,将中奖情况输出。
系统流程如图:
参考运行界面:
案例拓展1:(在已实现了彩票系统的基础上,尝试修改代码,实现以下功能)
在选号的过程中,可以进行人工选号和随机选号两种不同的方法,即修改选号模块Select_number方法,在进行选号时,先征求用户意见,如果用户需要手动选号,则按原来的方法,从键盘上输入6个数字….
如果用户选择随机选号,则调用random_number方法,将其产生的随机数数组,作为选号Select_number方法的结果。(注意:在主函数中,输出了用户选号结果后,请使用console.readline()语句,暂停输出界面一下,然后再进行开奖。否则会产生一个bug)。
计算机产生随机数的原理是根据时间的变化而产生的
参考运行界面如下:
测试1,手选
测试2,机选
PS: 天!我测试的时候居然能中特等奖?明天可以去买彩票了
保险起见,我再测试一次…
测试3,机选
PS: 明天还是老老实实上课,本本分分做人。取消买彩票计划….
案例拓展2:(在已实现了彩票系统的基础上,尝试修改代码,实现以下功能,使该系统每次输入数字时可以进行校验,系统开奖时,中奖数字是一个个产生,而不是产生一个数组)
1、 修改校验模块check方法,使其能够校验一个数字a的合法性,如果a已经存在已知数组a1中,或者,数字a是不在1-36区间内,则返回false。否则返回true。
方法的大概流程如图:
分析:(???号部分的内容,留给大家自己思考)
方法头:访问修饰符应为???;该方法的结果是校验数字a,在数组a1中是否合法,合法则返回true,不合法则返回false,那么返回值的类型应为???;方法名称check(也可以自拟方法名);该方法是验证指定(已知)数字a,在已知数组a1中的合法性,即必须要知道验证的数字a和数组a1。因此方法参数为???
方法体:
1.先定义一个bool类型的临时变量result=true; //默认为结果合法
2.先对已知整数a进行判断,如果a不在1-36的范围内,则直接判断数字a不合法,返回false;
3.如果a在1-36的范围内,使用for循环,逐个取出已知数组a1中的非0元素,与a进行比对,如果a与数组中的非0元素值相同,则说明a已经存在数组a1中,则返回false.
3.在完成所有循环后,将result作为本方法的结果返回。
模块2(方法)的测试:
1.在完成了check方法的基础上,在main()函数中,定义一个数组int[] ceshi={9,8,7,6,5,4}; 和一个整数int a=9;
2.定义一个判断变量bool decide,并调用check方法验证数组ceshi的合法性,并将验证结果赋值给decide。
3.使用if语句,如果decide为true,则使用console.writeline()语句,输出“合法”
如果decide为false,则使用console.writeline()语句,输出“不合法”
修改数组a的值为37,0,11,分别测试其合法性
测试结果如图:
测试1,当a=11时 ,输出
测试2,当a=37或者0 ,9时,输出
测试完成后,将mian()函数中的测试语句删除。
2、 修改模块4,随机数产生模块,使其每次产生一个数字,并输出,最后将所有的数字,存放进一个数组a中,并将a作为结果返回。
方法的大概流程如图:
分析:(???号部分的内容,留给大家自己思考)
方法头:访问修饰符应为???;该方法的结果是得到一个存放随机整数的数组,那么返回值的类型应为???;方法名称random_number (也可以自拟方法名);该方法用于创建一个数组,不需要已知条件,那么方法的参数应为???
方法体:
1.创建一个元素个数为6的整型数组a(因为是36选6,只需要6个数字即可)。
2.创建一个随机种子备用。 Random bb = new Random();
3.使用for循环,用于控制逐个访问数组元素
3.使用while循环,使用随机种子bb的next(1,37)方法,产生的介于1-37之间的随机数b,并调用模块2,校验模块(方法)check,校验随机数b的合法性,如果校验结果为false,说明随机数b不合法,那么重新产生随机数。如果随机数b的校验结果为true,说明b合法,将其存入数组a中,并输出b,跳出while循环。
4.重复步骤2,3,直至数组a全部存储了元素,将数组a作为本方法的结果,返回。
模块4(方法)的测试:
1. 在完成了方法random_number的基础上,在main()函数中,直接调用该方法,看能否产生随机数。
2. 使用display方法,将方法random_number返回的结果输出。
测试1:直接调用random_number方法,输出结果为
测试2:使用display方法,将方法random_number返回的结果输出。
其中前6个号码是random_number方法自己输出的,后6个号码是display输出的
测试完成后,将mian()函数中的测试语句删除。
3、 修改模块3,选号模块(方法)模块功能:提供两种选号方式:手动选号、随机选号。手动选号时,每选一个号,则对该号进行合法性校验
本模块不再提供具体的操作步骤,只给提示:
提示1:如果进行随机选号,则直接调用模块4,随机数产生模块。
提示2:如果进行手动选号,每次手动输入数字b后,则调用校验模块对数字b进行校验,如果合法,则将其存入数组a中。如果不合法,则提示用户重新输入,并再次校验….
提示3:最后将数组a作为结果返回
4、 将已经修改的几个模块,进行功能衔接,调试整个彩票系统的运行
案例拓展3:(在已实现了彩票系统的基础上,尝试修改代码,创建一个lottery类,将以上所有方法都放入该类中,并修改方法的访问修饰符为public。在主函数中调