标题:编写C#36选6彩票抽奖系统代码
取消只看楼主
叶子死灵
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2014-12-14
结帖率:0
已结贴  问题点数:20 回复次数:2 
编写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。在主函数中调
搜索更多相关主题的帖子: 合法性 彩票 元素 
2014-12-15 14:03
叶子死灵
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2014-12-14
得分:0 
回复 2楼 wp231957
就是不会才找大家帮帮忙了,我程序盲,正在努力看书
2014-12-15 14:18
叶子死灵
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2014-12-14
得分:0 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 彩票
{
    class caipiao
    {
        static public bool check(int[] a)                  //检查模块
        {
            for (int i = 0; i < 6; i++)
            {
                if (a[i] > 36 || a[i] < 0)
                    return false;
                for (int j = i - 1; j >= 0; j--)
                    if (a[i] == a[j])
                        return false;
            }
            return true;
        }
        static public void display(int[] a)            //显示模块
        {
            Console.Write("号码为:");
            foreach (int i in a)
            {
                Console.Write(i);
                Console.Write(' ');
            }
            Console.WriteLine();
        }

        static public int[] random_number()                //随机数生成模块
        {
            int[] a = new int[6];
            int i = 0;
            Random b = new Random();
            while (true)
            {
                while (i < 6)
                {
                    a[i++] = b.Next(1, 37);
                }
                if (caipiao.check(a))
                    return a;
                else
                    i = 0;
            }
        }

        static public void open_lottery(int[] a, int[] b)                //兑奖模块
        {
            int count = 0;
            int[] c = new int[6];
            for (int i = 0; i < 6; i++)
                for (int j = 0; j < 6; j++)
                    if (a[i] == b[j])
                    {
                        c[count] = a[i];
                        count++;
                        break;
                    }
            if (count == 0)
                Console.WriteLine("一个号码都没有中!");
            else
                if (count == 1)
                    Console.WriteLine("中了一个号码!\n号码为:{0}", c[0]);
                else
                    if (count == 2)
                        Console.WriteLine("中了两个号码!\n号码为:{0}、{1}", c[0], c[1]);
                    else
                        if (count == 3)
                            Console.WriteLine("中了三个号码!三等奖!\n号码为:{0}、{1}、{2}", c[0], c[1], c[2]);
                        else
                            if (count == 4)
                                Console.WriteLine("中了四个号码!二等奖!\n号码为:{0}、{1}、{2}、{3}", c[0], c[1], c[2], c[3]);
                            else
                                if (count == 5)
                                    Console.WriteLine("中了五个号码!一等奖!\n号码为:{0}、{1}、{2}、{3}、{4}", c[0], c[1], c[2], c[3], c[4]);
                                else
                                    Console.WriteLine("中了六个号码!特等奖!\n号码为:{0}、{1}、{2}、{3}、{4}、{5}", c[0], c[1], c[2], c[3], c[4], c[5]);
        }

        static public int[] select_number()                 //选号模块
        {
            int[] a = new int[6];
            string s;
            while (true)
            {
                Console.Write("请输入6个数(1~36,以空号分开):");
                s = Console.ReadLine();
                string[] s1 = s.Split(' ');
                for (int i = 0; i < 6; i++)
                {
                    if (!int.TryParse(s1[i], out a[i]))
                        break;
                }
                if (caipiao.check(a))
                    break;
                else
                    Console.WriteLine("输入有误,重新输入!\n");
            }
            return a;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            int[] select1 = new int[6];
            int[] random1 = new int[6];
            random1 = caipiao.random_number();
            select1 = caipiao.select_number();
            Console.WriteLine();
            Console.Write("你选择的号码是:");
            caipiao.display(select1);
            Console.WriteLine();
            Console.Write("开奖号码是:");
            caipiao.display(random1);
            Console.WriteLine();
            caipiao.open_lottery(select1, random1);
            Console.Read();

        }
    }
}

2014-12-15 22:50



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-439959-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033407 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved