跟siki老师学C#第八天

siki师学C#第七天 今天我们要学习的内容是函数,也叫做方法。什么叫方法? 就是我们为了达到某个目的或者实现某项功能而设定的一系列步骤。为什么要使用方法呢? 我们在之前编写的控制台应用程序都是写在Main()方法中的,在控制台应用程序中,程序的执行是以Main()方法为程序入口的,也就是说无论你Main()方法写在哪里,只要你执行这个程序,程序就要找到Main()方法,找到才按Main()方法里面的顺序执行,如果找不 阅读详情

上一次我们学到方法的到时候说到一个参数可以是数组的情况

static void GetArray(int[] array)
{

}

这里是数组作为一个方法的参数,所以叫做数组参数,还有一个东西叫做参数数组:
在数组参数中,我们在用这个方法的时候需要把我们自己构造的这个数组传过去作为参数,而参数数组则不,它是在调用的时候把一组数据放在后面的括号里,传递过去之后,会自动地把这一组数据构造成数组并使用:

static void Array(int[] array)   //普通数组参数的方法
{

}
static void Array1(params int[] array)   //运用参数数组的方法
{

}

那么在使用的时候两种形式有什么不同呢?

Array(new int[5] { 0, 1, 2, 3, 4 });    //普通数组参数方法的使用,需要自己构造数组;
Array1(0, 1, 2, 3, 4);     //参数数组方法的使用,不需要自己构造方法,只要填入相应类型的值就可以自动构造出数组

我们在之前介绍复杂类型的时候说了枚举类型、数组和结构体,我们说的结构体就是只提到了在结构体中定义不同属性,那么既然结构体可以定义属性,那么它也可以定义方法,在结构体中定义的方法叫做结构方法,也叫做结构函数。

还是一样,我们为什么要使用结构函数呢?
我们为什么要使用结构体?因为使用结构体的话我们可以在结构体中定义若干个变量,声明一个结构体的时候,这若干个变量也都声明好了,不用我们一个一个声明了。那么这些变量需要操作,每一次操作我都要写一遍算法,那我为什么不把算法语句写在结构体中,直接调用结构体中的这个方法呢?
其实这就相当于另外写一个方法,对结构体中的变量进行操作,然后返回结果,只不过现在我们这个方法写在了结构体中而已。
我们来试试:(求直角三角形的斜边长)

struct GetBevel     //计算斜边的结构体
{
    public double x;
    public double y;

    public double GetBevels()
    {
        return Math.Sqrt(x*x+y*y);     //开平方的方法,返回值为double类型
    }
}

static void Main(string[] args)
{
    GetBevel getBevel;     //先实例化这个结构体
    getBevel.x = 3;     //给结构体的变量赋值
    getBevel.y = 4;
    Console.WriteLine("斜边长为:"+getBevel.GetBevels());    //调用结构体中的方法并获取返回值
    Console.ReadKey();
}

上面就是结构方法的用法,其实我们结构体用的相当少,结构体定义在某个命名空间下,只能这个命名空间里面的程序能用,我们一般用公共类来代替结构体,而结构方法我们也写在相应的类中,所以直接调用就好了。

接下来我们要学习的就是函数的重载。
什么叫方法或函数的重载呢?
我们知道在定义变量的时候变量名不能相同,否则编译器无法从多个同名变量中分辨出你要用的是哪个,但是方法可以,方法可以有相同的方法名,那么编译器如何去区分方法呢?
那就是方法参数,比如一个方法传递的参数是int类型的,而另一个同名函数传递的参数是double类型的,那么编译器就会根据调用时传递的参数类型去分辨到底调用的是哪个方法。
比如:
这里写图片描述
可以看到,我在上面写了两个GetBevel()方法,下面在调用的时候就显示“(共2个)”,这表示该方法共有两个重载。

static void Main(string[] args)
{
    GetBevel(3, 4);
    GetBevel(3.0, 4.0);
    Console.ReadKey();
}

我们看看运行结果:
这里写图片描述
分别调用了两个方法,这就是重载,同一个方法名带上不同的参数,就会调用不同的方法,这就是重载。

接下来说的这个东西有些扯淡,至少我看完两遍没懂它是什么意思,有什么作用。
那就是委托。
委托其实说的是一种类型,与int、string、char都一样,但是又很特殊,因为其他类型一般都是指向变量,但是委托却是指向方法。
比如:

int value=3;

int类型也就这样用了,暂时还玩不出什么新花样,但是委托,呵呵!

MyDelegate delegates;   //MyDelegate是自己定义的委托类型  delegates是委托变量
delegates = Add;    //Add是一个方法

你敢信?变量可以等于方法,可以等于方法。。我们之前顶多遇到过变量等于方法。。。的返回值,但是这里直接等于方法啊!!

别的类型的变量不可以,委托的就没问题。。真是醉了。
委托类型的变量等于一个方法后,这个变量就成了一个方法,我们可以用这个变量去直接调用这个方法,因为这个变量已经指向这个方法了,这就是委托的作用:把一个委托类型的变量指向一个方法。

说了委托的作用,那么委托类型是怎么定义的呢?
看个实例吧:

namespace CSharp学习第七课
{
    class Program
    {
        //delegate为关键字 定义好了一个委托类型OneDelegate
        delegate int OneDelegate(int num1,int num2);

        static int Add(int num1, int num2)
        {
            return num1 + num2;
        }

        static void Main(string[] args)
        {
            OneDelegate oneDelegate;    //用定义好的OneDelegate去声明一个该类型的变量oneDelegate
            oneDelegate = Add;   //变量等于方法
            int res = oneDelegate(3,4);    //变量直接调用它所指向的方法
            Console.WriteLine(res);
            Console.ReadKey();
        }
    }
}

最终结果:
这里写图片描述

我还是云里雾里的,反正先知道有委托这个东西就好了,以后能用到的话我们再通过实际应用来加深理解!

接下来我们说的就很常见了,而且上次我们遇到一个问题没有解决,现在也可以解决了,那就是函数的递归调用。
递归是相对于函数来说的,脱离了函数,递归也就无从谈起,因为函数实在返回值返回的地方做手脚的。

一般带有返回值的函数,我们最终返回的是结果,但是用了递归的话,返回值就不是最终结果的值了,而是返回该函数参与的运算,因为该运算写在方法里,所以出现了在方法里调用该方法的情况。这就叫函数的递归调用。
比如一个函数计算的是一个等于前两个数字之和:

static int Function(int num)
{
    return Function(num - 1) + Function(num - 2);
}

返回值里面又出现了该方法。
既然返回值调用了自身,那么这个递归循环什么时候才能终止呢?如果不给它条件的话,这就一个死循环,所以要给它终止条件。

static int Function(int num)
{
    if(num==0)
    {
        return 2;
    }
    if(num==1)
    {
        return 3;
    }
    return Function(num - 1) + Function(num - 2);
}

在主函数中我调用这个方法:

Function(40);

这个语句会将Function(40)的结果分解为许多Function(0)+Function(1)的形式相加,最终将2和3代入最终算式算出结果。

以现在CPU的运算速度,这个Function(40),还要花费一定的时间才能得到结果,因此递归的调用在运算时还是比较占用CPU的。

既然现在我们学习了递归调用了,那么我们来做一做之前的练习题吧:

兔子繁殖问题。设有一对新生的兔子,从第三个月开始他们每个月都生一对兔子,新生的兔子从第三个月开始又每个月生一对兔子。按此规律,并假定兔子没有死亡,20个月后共有多少对兔子?要求编写为控制台程序。

既然我们知道这里需要用递归来实现,那么我们就要想想算法,实际上算法不是很容易想的,像这里,至少我这麻瓜脑袋想了一天没想出来。
既然是用到递归,那么不可避免的是要用到公式的。所以我们想不出算法就去推导递归的公式。
第一个月:f(1)=1;
第二个月:f(2)=1;
第三个月:f(3)=2;
第四个月:f(4)=3;
第五个月:f(5)=5;
第六个月:f(6)=8;
可以推导出f(n)=f(n-1)+f(n-2)。
同样的,我们的递归必须有一个终止条件,既然是月份,那么计算肯定是从第一个月和第二个月开始,而公式的分解最终也就是需要f(1)和f(2)。
这样一来就很简单了:

namespace CSharp学习第八课
{
    class Program
    {
        static int GetRabbit(int month)
        {

            if(month==1||month==2)
            {
                return 1;
            }
            return GetRabbit(month-1)+GetRabbit(month-2);
        }

        static void Main(string[] args)
        {
            Console.WriteLine(GetRabbit(20));
            Console.ReadKey();
        }
    }
}

因此我们可以总结:递归算法中公式是相当重要的!

总结:
1.参数数组的概念,用法以及与数组参数的区别;
2.什么叫结构函数以及结构函数的用法;
3.什么是函数的重载;
4.什么叫委托;
5.递归的用法以及递归最重要的关键点(公式);
6.用递归解决一般问题的思路;

以上就是学习的内容,C#第一阶段就学到这里,接下来要进行下一阶段的学习。对于博客中存在的错误,欢迎大家批评指正!感激不尽!!

siki师学C#第一天 说在前面的废话:很久以前就关注了泰课在线,因为是学习Unity3D的,所以在找视频教程的时候找到了siki师的《黑暗之光》教程,从那以后就很喜欢siki师的课程。(绝对不是在打广告!!) 后来心知肚明地告诉自己基础学得一塌糊涂,所以决定从最基本的开始抓起。好在siki师不仅有Unity3D的课程,也有C#基础教程,所以从那时起,我手里就捏着siki师的教程,可笑的是竟然没有下定决心学起,平白 阅读详情

相关推荐

siki师学C#第九天(满满的都是练习)

第一阶段的C#学习已经结束了,接下来就是一大堆的练习题,慢慢做吧。1,将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。static void Main(string[] args) { Console.WriteLine("请输入正整数:"); int num = Convert.ToInt32( Console.ReadLine()); Console.

StandFull的博客 2189

sikili安装文件

直接 java -jar执行即可,简单的截屏自动化测试工具

siki师学C#第三天(上)

今天我们来接着学习C#,内容大概为:控制台接收数据,还有几道练习题。什么叫控制台接收数据? 我们回想一下第二天的学习内容中,我们要求得小明、小红、小刚三个人的总成绩和三门科目的平均成绩,那么他们的成绩是怎么得到的呢?是我们在代码里面就给它赋值,然后它才进行一系列运算。这就涉及到了交互性,我们开发的软件、编写的程序是给客户用的,我们给客户提供的是一个完整的产品,而不是一个代码集,也就是说用户不会在代

StandFull的博客 2158

NGUI教学视频

分享一个SIKI师的NGUI教学视频 百度网盘: 链接:https://pan.baidu.com/s/1Q9pvMSe8GdcIMUFP6jTzIg 提取码:shdv

略懂PS的呆毛王的博客 543

C# 多线程 学习理解记录

主线程之外可以开启现场运行,而不影响主线程,比如开启线程任务后不影响窗口拖拽Task 和 Thread对比Thread th=new Thread(函数名称或匿名函数);Task.run(函数名称或匿名函数);底层一样,但是Task封装得更好,更容易管理在异步方法 的函数体里 await Task.run(函数名称或匿名函数);,会等待现场运行完该行代码add()函数装多个任务·然后。

qq_38239133的博客 1025

【Unity3D】自学之路2.0

推荐阅读。

CSDN博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 7万+

SIKI学习——C#初级教程03

1-流程控制

qq_42983775的博客 314

《UI框架_Siki师》(一)(共2篇)

因为原代码有所不同,所以自己撸一个,以便查看。

xingjiaming1的博客 7031

面试siki师失败

今天面试失败了,因为这两天都没怎么好好学习,也学不进去,所以说我就想当做分水岭,希望在写完之后我能重新认真的工 作,而不是去想那些乱七八糟的没用的东西. 应该是我对自己不自信?还是因为太多重视这次的考核了?我一直没用自己新学到的知识,而是采用原来的知识来学习,我想,这就是我的不足的,努力了那么久,却没有回报的感受是真的真的很难受啊,其实换皮没有成功的一个主要原因就是因为 AI蛇没有做好,回首

一叶子的博客哦 1万+

争取实现自己的小目标:向Siki师要一张签名照 (17.09.14)

当看到siki师的招募令的时候,我整个人都感觉要爆了,当看到siki师也在北京的时候,真的十分开心,其实在我看师课程的一路上,我就有了一个小愿望,那就是见师一面,和他说一些话,同时问他要一张他的亲笔签名,要签上siki的那一种,就是那个黑不拉几的界面,上面有几行代码好像是网页传输的postback的那一种,其实燃爆还有几个其他的原因,一个是我现在就在北京,二个是而且看了很多siki师的视

一叶子的博客哦 5968

Siki师讲的AssetBundle

创建一个立方体,右下角new  AssetBundle属性值为player.assetbundle 编辑器中添加 Builde AssetBundle  在工程目录下创建   AssetsBundle文件夹,与Assets同目录 在Editor中编写脚本 using UnityEngine; using System.Collections; using UnityEditor; pu...

qq_35647121的博客 2018

siki师学C#第二天

今天我们学习的是C#中的一些符号,包括一些常用字符和运算符等。首先来看一个例子:string playerName = "马里奥"; int playerLevel = 10; int HP = 200; float EXP = 800.9f;Console.WriteLine("主角的名字为{0} 主角的等级为{1} 主角的血量为{2} 主角的经验值为{3}", playerName, playe

StandFull的博客 1351

siki师学C#第三天(下)

虽然是周末,学习还是不能停,美好的一天不能做几道练习题就糊弄过去了,接着往下学习。今天学习C#语句。 说到C#语句,我们就要先说流程控制。 什么是流程控制呢?流程控制就是我写出来的代码由我来决定它到底怎么运行,按什么顺序或条件。 那么,为什么要使用流程控制呢? 在前两天中我们写下的代码都是非常简单的代码,只要编译器从上往下逐行执行,就能得到我们想要的结果,但实际上,我们要实现一个功能,远比这

StandFull的博客 1361

siki师学C#第六天(练习部分)

十三道练习题,以我这麻瓜脑袋,估计又要有漏了。。。1.找出100到999之间的水仙花数,如153=1*1*1+5*5*5+3*3*3;for (int i = 100; i < 1000; i++) { int hundredNum = i / 100; int tenNum = (i / 10) % 10; int unitNum = i % 10; int sum

StandFull的博客 1645

siki师学C#第四天(学习部分)

上节课的最后我们介绍了if判断分支,我们接着介绍流程控制里面的分支: 除了之前说的if-else分支之外,我们还有另一个分支:switch-case分支。switch-case分支:int num = Convert.ToInt32(Console.ReadLine()); switch(num) { case 0: Console.WriteLine("您输入的数字是0"

StandFull的博客 890

SIKI学习——C#初级教程01

1-快捷键 双击Home键,可以把光标定义在代码的最前方 双击end键可以定位在代码的最后 按住Shift键光标从某一位置 到选中位置 delete删除后面的字符 插入模式光标正常 覆盖模式:选中Insert的情况 输入法:全角字符占两个字符 半角字符:一般编程用 2-标示符 首字符: 允许 a-z,A-Z,_,@ 不允许 0-9 后续字符: 允许 a-z,A-Z,0-9 不允许 @ 字母下划线...

qq_42983775的博客 726

《UI框架_Siki师》(二)(共2篇)

1.存储面板类型和面板预设路径的Json文本如下:   { "infoList": [ { "panelTypeString": "ItemMessage", "path": "UIPanel/ItemMessagePanel" }, { "panelTypeString": "Knapsack&quot

xingjiaming1的博客 764

siki师学C#第四天(练习部分)

学习了分支和循环以及跳出循环的方法,接下来十三道小练习奉上:1.编写一个程序,对输入的四个整数,求出最大值、最小值,并打印出来显示在控制台上;Console.WriteLine("请输入四个整数:"); int num1 = Convert.ToInt32(Console.ReadLine()); int num2 = Convert.ToInt32(Console.ReadLine()); int

StandFull的博客 1630
上一篇: 跟siki老师学C#第七天
下一篇: 跟siki老师学C#第九天(满满的都是练习)
博士装呗
博客等级 码龄11年 63粉丝 30原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值