C#练习(二)

1.创建一个控制台应用程序Exp08_01,求两个矩阵的乘积。假定一个矩阵A为3行4列,另一个矩阵B为4行3列,根据矩阵乘法的规则,其乘积C为一个3行3列的矩阵。(矩阵A和矩阵B可以在数组创建时直接初始化,但是最后要把A、B、C三个矩阵的值都输出显示出来)

namespace Exp08_01
{
    class Program
    {
        public static void Main(string[] args)
        {
            int[,] a = new int[3, 4] { { 1, 1, 1, 1 }, { 1, 1, 1, 1 }, { 1, 1, 1, 1 } };
            int[,] b = new int[4, 3] { { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1 }, { 1, 1, 1, } };
            int[,] c = new int[3, 3];

            for (int row = 0; row < a.GetLength(0); row++)
            {
                for (int column = 0; column < b.GetLength(1); column++)
                {
                    c[row, column] = 0;
                    for (int _column = 0; _column < a.GetLength(1); _column++)
                    {
                        c[row, column] += a[row, _column] * b[_column, row];
                    }
                }
            }

    
            Console.WriteLine("a矩阵为:");
            Program.PrintMatrix(a);
            Console.WriteLine("b矩阵为:");
            Program.PrintMatrix(b);
            Console.WriteLine("c矩阵为:");
            Program.PrintMatrix(c);

        }

        public static void PrintMatrix(int[,] array)
        {
            for (int row = 0; row < array.GetLength(0); row++)
            {
                int count=0;
                for (int column = 0; column < array.GetLength(1); column++)
                {
                    Console.Write(array[row,column]);
                    count++;
                    if(count==array.GetLength(1)){
                        Console.WriteLine();
                    }else{
                        Console.Write(" ");
                    }
                }
            }
        }
    }
}

多维数组 

//声明一个 int 变量的三维数组
int [ , , ] m;
//一个带有 5 行 2 列的数组
int[,] a = new int[5, 2] {{0,0}, {1,2}, {2,4}, {3,6}, {4,8} }

GetLength()

获取多维数组某一维度的长度(一上图中的二维数组a为例)

>>a.GetLength(0)
5
>>a.GetLength(1)
2

2.创建一个控制台应用程序Exp08_02,在程序中定义一个二维的整型交错数组int[][] arr,用来存放一个六行的杨辉三角。然后使用foreach语句把这个交错数组中保存的杨辉三角输出。

namespace Exp08_02
{
    class Program
    {
        static void Main(string[] args)
        {

            //一共六行
            const int N = 6;
            int[][] pascal = new int[N][];
            //初始化交错数组
            for (int i = 0; i < N; i++)
            {
                pascal[i] = new int[i + 1];
            }

            //杨辉三角的顶部赋值为1
            pascal[0][0] = 1;
            for (int i = 1; i < N; i++)
            {
                //每行的首位赋值为1
                pascal[i][0] = 1;
                pascal[i][i] = 1;
                //其余数字等于它正上方的数字和其前一位数字的和
                for (int j = 1; j < i; j++)
                {
                    pascal[i][j] = pascal[i - 1][j - 1] + pascal[i - 1][j];
                }
            }

            //输出
            for (int i = 0; i < N; i++)
            {
                for (int j = 0; j <= i; j++)
                {
                    Console.Write("{0,4}", pascal[i][j]);
                }
                Console.WriteLine();
            }

            Console.ReadLine();
        }

    }
}

C#交错数组

交错数组是数组的数组,其元素是一个数组对象

二维数组的声明

int[,] nums = { { 1, 2 }, { 3, 4} };

交错数组的声明

int[][] nums = { new int[]{1,2} , new{3,4} };

3. 创建一个控制台应用程序Exp08_03,使用冒泡排序算法对一维数组中的元素从小到大进行排序。(要求输出排序过程,即每一趟的排序结果)

namespace Exp08_03
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] nums = { 4, 5, 2, 10, 7, 1, 8, 3, 6, 9 };
            int temp;

            //冒泡排序本质上每次是将无序范围内的最大值放入末尾的有序范围内
            //进行i轮冒泡
            for (int i = 0; i < nums.Length - 1; i++)
            {
                //每次范围-i
                for (int j = 0; j < nums.Length - 1 - i; j++)
                {
                    //前大于后交换位子
                    if (nums[j] > nums[j + 1])
                    {
                        temp = nums[j];
                        nums[j] = nums[j + 1];
                        nums[j + 1] = temp;
                    }
                }

                for (int k = 0; k < nums.Length; k++)
                {
                    Console.Write(nums[k]+" ");
                }
                Console.WriteLine();
            }
        }
    }
}

冒泡排序:把数组中最小的那个往上冒,冒的过程就是和他相邻的元素交换 

算法步骤

  • 两两比较相邻的元素。若前者比后者大,则交换他们的位置。
  • 本次排序完成后,得到最后的元素会无序部分中是最大的数,有序部分中最小的树,有序段长度+1,无需段长度-1。
  • 针对所有的无序段元素重复以上的步骤。
  • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

 

4.本题实现一个模拟学生根据铃声上下课的程序。该程序中,主要通过委托和事件实现对应的效果。因此包含了一个委托RingEvent,一个上课铃类SchoolRing,在该类中发布委托,并实现打铃操作。一个学生类Student,该类订阅了上课铃类SchoolRing的委托事件,并有对应的事件处理方法SchoolJow。

具体代码如下:

using System;

namespace Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            SchoolRing sr = new SchoolRing();//创建学校铃声类
            Students student = new Students();//创建学生实例
            student.SubscribeToRing(sr);//订阅铃声
           //Console.Write("请输入打铃参数(1:表示打上课铃;2:表示打下课铃):");
            sr.Jow(Convert.ToInt32(Console.ReadLine()));//打铃动作
            Console.ReadLine();
        }
    }

    /* 在这里你要声明一个委托类型RingEvent,该委托类型只有一个int参数ringKind表示铃声种类(1:表示上课铃声;2表示下课铃声),无返回值。*/
      //你的代码写在这里 
      /*委托类型定义结束*/

    public class SchoolRing  //发布者类:上课铃类SchoolRing
    {
        /* 在这里你要声明一个与委托类型RingEvent相关的事件OnBellSound,用于调用所有订阅者的事件处理程序*/
        //你的代码写在这里 
        /*事件定义结束*/

        /*下面定义了一个打铃的方法,在该方法里如果参数是1,输出"上课铃声响了,"注意:不换行,是2,输出"下课铃声响了,",注意:不换行。如果参数是其它数字,则输出"这个铃声参数不正确!"并换行。
         然后如果事件变量不为空,则触发事件,即通过该事件关联的委托回调事件处理程序*/
        public void Jow(int ringKind)  //打铃
        {
            //你的代码写在这里 
        }
    }

    public class Students  //订阅者类:学生类
    {
        /*学生订阅铃声的委托事件,也就是把事件处理方法放到上课铃声类的委托变量里。*/
        public void SubscribeToRing(SchoolRing schoolRing)  //学生们订阅铃声这个委托事件
        {
            //你的代码写在这里
        }

        /*下面定义了事件处理程序,该程序根据参数做出不同反应,如果参数是1,
         输出"同学们开始认真学习!",并换行,是2,输出"同学们开始课间休息!"并换行 */
        public void SchoolJow(int ringKind)  //事件处理程序
        {
            //你的代码写在这里 
        }

        public void CancelSubscribe(SchoolRing schoolRing)//取消订阅铃声动作
        {
            schoolRing.OnBellSound -= SchoolJow;
        }
    }
}
using System;

namespace Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            SchoolRing sr = new SchoolRing();//创建学校铃声类
            Students student = new Students();//创建学生实例
            student.SubscribeToRing(sr);//订阅铃声
           //Console.Write("请输入打铃参数(1:表示打上课铃;2:表示打下课铃):");
            sr.Jow(Convert.ToInt32(Console.ReadLine()));//打铃动作
            Console.ReadLine();
        }
    }

    /* 在这里你要声明一个委托类型RingEvent,该委托类型只有一个int参数ringKind表示铃声种类(1:表示上课铃声;2表示下课铃声),无返回值。*/
      //你的代码写在这里 
      public delegate void RingEvent(int ringKind);
      /*委托类型定义结束*/
    public class SchoolRing  //发布者类:上课铃类SchoolRing
    {
        /* 在这里你要声明一个与委托类型RingEvent相关的事件OnBellSound,用于调用所有订阅者的事件处理程序*/
        //你的代码写在这里 
        public event RingEvent OnBellSound;
        /*事件定义结束*/

        /*下面定义了一个打铃的方法,在该方法里如果参数是1,输出"上课铃声响了,"注意:不换行,是2,输出"下课铃声响了,",注意:不换行。如果参数是其它数字,则输出"这个铃声参数不正确!"并换行。
         然后如果事件变量不为空,则触发事件,即通过该事件关联的委托回调事件处理程序*/
        public void Jow(int ringKind)  //打铃
        {
            //你的代码写在这里 
            if(ringKind==1){
                Console.Write("上课铃声响了,");
            }else if(ringKind==2){
                Console.Write("下课铃声响了,");
            }else{
                Console.Write("这个铃声参数不正确!");
            }

            if(OnBellSound!=null){
                OnBellSound(ringKind);
            }
        }
    }

    public class Students  //订阅者类:学生类
    {
        /*学生订阅铃声的委托事件,也就是把事件处理方法放到上课铃声类的委托变量里。*/
        public void SubscribeToRing(SchoolRing schoolRing)  //学生们订阅铃声这个委托事件
        {
            //你的代码写在这里
            schoolRing.OnBellSound += SchoolJow;
        }

        /*下面定义了事件处理程序,该程序根据参数做出不同反应,如果参数是1,
         输出"同学们开始认真学习!",并换行,是2,输出"同学们开始课间休息!"并换行 */
        public void SchoolJow(int ringKind)  //事件处理程序
        {
            //你的代码写在这里 
            if(ringKind==1){
                Console.WriteLine("同学们开始认真学习!");
            }else if(ringKind==2){
                Console.WriteLine("同学们开始课间休息!");
            }
        }

        public void CancelSubscribe(SchoolRing schoolRing)//取消订阅铃声动作
        {
            schoolRing.OnBellSound -= SchoolJow;
        }
    }
}

C#事件

声明事件前,必须先声明该事件的委托类型,,使用delegate关键字

public delegate void BoilerLogHandler(string status);

 声明事件本身,使用event关键字

public event BoilerLogHandler BoilerEventLog;

示例

using System;

namespace DelegateDemo
{
    //定义猫叫委托
    public delegate void CatCallEventHandler();
    public class Cat
    {
        //定义猫叫事件
        public event CatCallEventHandler CatCall;
        public void OnCatCall()
        {
            Console.WriteLine("猫叫了一声");
            CatCall?.Invoke();
        }
    }
    public class Mouse
    {
        //定义老鼠跑掉方法
        public void MouseRun()
        {
            Console.WriteLine("老鼠跑了");
        }
    }
    public class People
    {
        //定义主人醒来方法
        public void WakeUp()
        {
            Console.WriteLine("主人醒了");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Cat cat = new Cat();
            Mouse m = new Mouse();
            People p = new People();
            //关联绑定 
            cat.CatCall += new CatCallEventHandler(m.MouseRun);
            cat.CatCall += new CatCallEventHandler(p.WakeUp);
            cat.OnCatCall();

            Console.ReadKey();
        }
    }
}

参考博客:https://www.cnblogs.com/zhaoyl9/p/12162697.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值