C# 练习题 数组结构

排序问题

上午

复习

----------------------------------------------------

 1.复习:冒泡排序

 

 问题:有一组数据,排序之前: -1    10   - 20    -30

      要求按从小到大的顺序排序

 ---------------------------------------------------

 解答:

 1) 排序过程:

 

 第一轮:3次,最大值,冒到最后   10

 

         1) -1 10    不交换 -1    10   - 20    -30

         2)10  -20   交换   -1    -20   10     -30

         3)10 -30    交换   -1    -20   -30    10

-------------------------------------------------

  注:第一轮之后,数组变为: -1  -20   -30   10

-----------------------------------------------  

 第二轮:2次, -1    -20   -30 

          1)-1>-20      -20  -1     -30

          2) -1>--30     -20  -30    -1

------------------------------------------------    

   注:第一轮之后,数组变为: -20  -30   -1    10   

-----------------------------------------------

 

 第三轮: -20  -30            -1        10

       1) -20 > -30    -30  

 

           -30  -20   -1    10

-----------------------------------------------

   注:第三轮之后,数组变为: -30   -20   -1   10

-----------------------------------------------  

  2) 总结: 4个数按从小到大的顺序排序,双重for循环排序时:

 

  第1轮:3次

  第2轮:2次

  第3轮:1次

 

  

  //注:冒泡排序时,每经过一轮,都会找到那个大的数

    第一轮找到最大数,第二轮找到倒数第二个大的数,

    第三轮找到倒数第三个大的数

    ....所以,内层循环循环条件,不用每次都要比较到最后

    每次比较一轮后,找到了大数,下次时,就不需要再比较

    这个位置上的数字.所以 j < n.Length -1-i

 

  3) 核心代码:

  for ( int i = 0 ; i < n.Length-1 ; i++ )//1

  {   

     for( int j = 0 ; j < n.Length-1-i ; j++ )//1 2

     {

         if( n[j]>n[j+1] )

         {

             int temp = n[j];   

             n[j] = n[j+1];

             n[j+1] = n[j];

         }

     }                  

  }

 

 ---------------------------------------------------

 2.复习二维数组

 

 

 1) 定义: int[,]  score ;

      

 

 2) 初始化:  元素的个数和每个元素的值

 

   静态:  

       int[,]  score = { {50,60},{60,70},{59,40} }

   动态:new

       int[,]  score = new  int[3,2];

 

 3)特点:

 1.二维数组的表示:行和列  [行,列]   

 2. 二维数组中的每个元素描述由行和列配合描述

    数组名 [ 行的索引值,列的索引值]

 3. 二维数组的遍历

    //二维数组的行数

 

    for (int i = 0 ; i < n.GetLength(0) ; i++ )

    {   //二维数组的列数

        for( int j = 0 ; j <n.GetLength(1); j++ )

        {

             Console.WriteLine( score[i,j] );

        }

    }

  注: 数组名.GetLength(0)获取的是二维数组有多少行

      数组名.GetLength(1)获取的是二维数组有多少列

 

 

练习:定义一个3行3列的二维数组,

        并求这个二维数组对角线之和.

 

   代码详见:DAY06_01_Array02 工程中的 LianXi2.cs

 

 

  4) 标准的二维数组,使用场景:

     适合规则的多行多列的数据操作: 比如:

        三消类的游戏

        扫雷游戏

 

  

 

  ---------------------------------------------------

    

 网站验证码

 

   补充功能: 4个验证中不能有重复的字符

   说明:

 

   代码详见:DAY06_01_Array02 项目下:

             “网站验证码”  文件夹下的两个类:

             CodeHomeWork1.cs  --- 未处理重复

             CodeHomeWork2.cs  --- 处理重复的验证码了

     

  -----------------------------------------------------

下午

方法

  

  方法又称为“函数”

  代码重用性,降低冗余度

 

  1.方法的定义

    static  void  Main(string[] args)

    {         

    }   

   --方法名: Main(),

       命名规则:Pascal,每个单单词首字母大写

 

   --方法返回值:void 空,没有任何返回值。除此之外

     还可以使用任意值类型,具体使用哪一种类型,根据

     方法完成的功能来定义。

       表示当执行了这个方法后,有没有

       相应的内容返回给调用者。

 

   --参数列表.

         当有多个参数时,多个参数之间使用,分隔

         这些参数构成参数列表。

         参数分别:形式参数 ,又称“形参”

                   实际参数,又称“实参”

       形式参数:指的是方法定义时,在方法名后面的小括号

           写的参数。当然,可以写也可以不写;

 

           static void  IsNarcNumber( int number )

           {  }

 

           上面的方法中就有一个参数,number,形式参数

 

      实际参数:指的是在其它的方法调用某一些方法时,

           调用时在方法名后面添加的有实际值的一些参数

           至于需要不需要传递参数,要根据方法定义时

           来决定的。

            int n = 60 ;

            IsNarcNumber( n );

 

  注:将实际参数传递给形式参数.在传递过程中,

       参数的类型和个数要匹配。否则会报错。

 

   练习:水仙花数 narcissistic number

   1000以内所有的水仙花数

   要求:写一个方法,该方法用于求1000以内所有水仙花数

   方法的名字:FindNarcNumber()

   方法的返回值:void  

       370    153     371   407

       370 = 3^3  +  7^3  +  0^3  = 370

 

  代码详见:DAY07_01_Method01 项目下 LianXi1.cs

--------------------------------------------------------

   练习2:

  

   在上面类中再来添加一个方法,基本形式:

   void   IsNarcNumber ( int number )

   ---该方法的返回值为 void

   ---方法有一个参数,参数为int类型,名为 number 。

   ---方法作用:用于判断指定的数字是否是水仙花数。

    

 

   --方法体:方法中一组大括号中间的代码块内容

     方法体中可以写一条语句,可以写多条语句,

     也可以一条也不写。

 

   --....

  2.方法的调用

 

        方法定义后,在合适的位置就可以去调用。

        调用时,如何调用呢?

       

            方法名( );    或

            方法名( 参数列表 );

  3.方法返回值

        当方法执行结束后,需不需要返回给调用者结果。

        如果不需要,定义方法返回值应该写成:void.

        如果需要,不能写void,得看具体情况。可以是:

        int  float  double 

 

  练习:定义一个工具类,工具类中有几个方法:

        完成两个数的四则运算,比如:有负责加法的方法

         int   Add( int a, int b )

        然后在主方法中调用该方法,并打印结果。

       

  代码详见:DAY07_01_Method01 项目下 CalculateUtil.cs

 

----------------------------------------------------

  练习:定义一个数组,并为数组元素赋值,然后

        找出数组中的最大值。要求:

 

        定义一个方法:int  GetMaxNumber(    )

        用于查找数组中最大的那个元素。

        找到之后,将这个元素的值返回。

                     

   思路:

       1.准备一个数组

       2.找出数组中的最大数

 

         1)定义 max 变量,为max 变量赋值

            假定整个数组的第一个元素就是最大值

            将第一个元素的值赋值给 max变量

                int max =  n[0]  ;

 

         2) 构建for循环,在循环体中完成:

                if语句,拿 max 先跟第一个元素判断,

                 如果这个元素比max要大,为max 重新赋值

                 不大,不赋值,继续max值与第二个元素判断

                如果第二个元素比max大,max重新赋值

                 不大,不赋值,继续max值与第三个元素...

            max 始终存储都是整个数组的最大值。

 

 

       3.返回最大数

  

  代码详见:DAY07_01_Method01 项目下 LianXi2.cs

 

----------------------------------------------------

 

  补充知识点:局部变量 与 全局变量

 

  代码详见:DAY07_01_Method01 项目下 :

                  VarDemo1.cs

                  VarDemo2.cs

 

  4.方法的重载

  5.out  ref   params

day07   周三作业

 

一. 代码题 

  定义三个方法:(必做)

  1) 写一个方法,求一个int和一个float数的和 

      float sum(int a,float b)

  2) 写一个方法,判断键盘输入的这个数是否是8的倍数

      bool  isEightNumber( int number)

  3) 写一个方法,用于求键盘输入的数字的阶乘

      long  GetFac(int number)

 

  4) 下午已经实现在数组中查找数组的最大值了,

     请继续完成功能,查找数组中的最小值。

 

 最后,要求:在Main()方法中调用并进行测试。

 

 

二.写出下列程序的运行结果(必做)

 

 class  MethodDemo1

 {

    static  void   Main(string[] args)

    {

         int a = 10 ;

         Change( a );

         Console.WriteLine( a );

    }

    static void Change( int a )

    {

         a = 20 ;

    }  

 }

 

 (2)

 class  MethodDemo2

 {

    static void Main(string[] args)

    {

         int a = 10 ; //a是局部变量

          Change( a );

         Console.WriteLine( a );/10

    }

 

    static int Change( int  a )

    {

         a += 20 ; //a =a +20 =30

         return a;

    }  

 }

 

 (3)

 class  MethodDemo3

 {

    static void Main(string[] args)

    {

         int a = 10 ;

         a = Change( a );

         Console.WriteLine( a );

    }

    static int Change( int b )

    {

         b+=20 ;

         return b;

    }  

 }

 

三、编程题

 

 1.  考查:数组的应用 (必做)

      定义一个3行3列的二维数组,通过随机数为数组元素赋值

      随机数(0,10)之间。

      要求:找到数组中的最大数和最小数。

      提示:二维数组中查找最大数和最小数,和一维数组是

      一样的。也是定义max变量,然后构建双重for循环,

      在内层循环体中进行判断。

 

 2. 考查:数组的应用 (选做)

    定义一个方法,方法用于:

    在数组中指定位置插入指定的元素值

    

    int[] num = {1,-100,2,-200,3};

    int[] newNum = {*,*,*,*,*,* }

    请输入要插入元素的位置:2

    请输入要插入元素的值:  4

    

   1.定义一个新数组,新数组长度为原数组长度+1

   2.将num数组中所有元素复制到新数组中

     int[] newNum = {1,-100,2,-200,3,* }

   3.提示用户输入在哪个位置插入元素:2

     提示用户插入元素的值:1000

   4.最后遍历新数组:

          {  1,-100,2,-200, 3,  0 }

 

 

 四、拓展分析题。

  方法使用经验总结:

  当我们使用方法时会发现,要定义一个方法,完成某一个

  功能,方法的形式写起来可以有多种,如何找到复用性最

  高,且 可读性更强、质量更高的那个方法呢?

  一般遵循以下两个规则:

 

  1) 方法只负责完成功能,它表示一段功能代码块的封装,

      定义时,只需要给它合适的参数。使用时,调用者只要

      按照定义的形式传递合适的实际值即可。

 

  2) 在方法中,一般不要有打印输出等语句。如果真不能

      写 打印输出语句,那么如果在方法在计算出了相应

      结果,如何将结果告诉调用者呢?----利用返回值。

 

      也就是说,在定义方法时,根据方法完成的功能,尽量给

      方法合适的返回值,最好不要是空。

      这样的好处是:当调用者调用该方法时,只要传递类型

      相同,个数相同的参数,方法就可以帮助我们实现功能,

      至于传递的值是多少,其实方法不关心。

      方法做完操作之后,会将处理结果返回给调用者。

      如果调用者需要结果,则可以定义变量或做其它处理 。

      如果不需要,也不会影响程序的健壮性。

 

 

 下面在Test类中定义了三个方法,完成的功能都是计算两个

  数的和。根据方法的使用规则,请分析哪个方法综合是

  最合适的,然后在Main()方法中分别调用这几个方法,体会

  方法的使用。

 

 

 class  Test

 {

   static void Main(string[] args)

   {

 

 

   }

 

   static  void   Add1( int a, int b )

   {

        int  sum  = a + b ;

        Console.WriteLine( sum );

   }

 

   static  int   Add2( int a, int b )

   {

        return  a + b ;

   }

 

   static  int   Add3( )

   {

        int a = 10 ;

        int b = 20 ;

        int sum = a + b ;

        Console.WriteLine( sum ); ;

   }

 

 }

  

如何引入BigInteger

注:

如果对一个大的数字求阶乘,long类型接收的结果会变成0,

 原因:阶乘结果已经超过了long类型的最大范围。如何解决?

 引用 BigInteger 。

 第一步:右击当前项目下的“引用”---添加引用,

  在打开的对话框中搜索 Numerics 内容,然后将查找到的选中

  最后选择“确定”。

 第二步:在当前.cs文件的最上面,添加:using   System.Numerics;这句话。

 第三步:修改 GetFac()方法的返回值类型为:BigInteger,

  同时,修改这个方法中定义接收结果的sum变量的类型也是

  BigInteger类型。

  注:如果Main()方法中需要结果,应该将返回结果的类型也定义

  为 BigInteger类型。

 

posted @ 2019-09-10 19:49  Winward_King  阅读(1130)  评论(0编辑  收藏  举报