面向零基础新手的 C# 基础知识 09-10

家里有个小孩真是麻烦。上午弄得我没法学习,没办法,只能用中午的时间来看上那么一集。

09

这集讲的是数组。

首先 Bob 说,数组的定义可以这样:

int [] nmb = new int [6];

定义了之后,就可以一个个赋值了,真方便!

nmb[0] = 1;
nmb[1] = 2;
nmb[2] = 4;
nmb[3] = 5;
nmb[4] = 0;
nmb[5] = 12450;

▲方便就有鬼了!这种定义方式会造成数组边界固定,并且好麻烦!

 

这时候,伟大的Bob出现了,他说了,我们可以这么做:

int [] nmb = new int [] {1,2,4,5,0,12450};

再说一句,课外练习中,这样的也是合法的:

int [] nmb = {1,2,4,5,0,12450}

▲按照这么做的话,数组的边界应该比较灵活了。

 

然后,如果我们想输出数组,也有两种方法:

 for (int i=0; i< sb.Length;i++ )
{
Console.WriteLine("12dora蓄力中,目前状态{0}",sb[i]);
}

解释:sb.Length是数组具有的属性,指数组长度。sb数组(Smart BiliDora)就是上面写出的nmb数组,这个For语句是我用TabTab敲出来的。本语句的作用是输出12dora的蓄力过程

而Bob说,还有更快的方法:

foreach( int dora in sb)

{

Console.WriteLine(dora);

}

这样代码更少,更能得出结果。

如果变量类型不同,也是同理。

 

数组还有一个很酷的功能,就是倒序排列,比如:

string motto = "放肆!把他给我丢出去!我是用我自己的方式守护这个网站!";
char [] dora = motto.ToCharArray();
Array.Reverse(dora);
foreach (char ra in dora)
{
Console.Write(ra);
}
Console.ReadLine();

解析:char 是变量类型,单字符(中文算一个)。ToCharArray();是字符串数组固有的方法,指把字符串转换成单字符数组。(AI2用循环做的哭了)Array.Reverse();是过程,专门用于数组反向排列。(AI2又哭了),然后输出就不用多说了吧。

 

10

本节课讲方法、函数等。30分钟,是有史以来最长的一课了。一开始,Bob给我们讲了一个例子:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Method
{
class Program
{
static void Main(string[] args)
{
wangsitu();
Console.ReadLine();
}
private static void wangsitu()
{
Console.WriteLine("诸葛村夫……你……你敢……");
}

}
}

▲小小的修改了一下

 

可见,定义方法需要用到

Private static void 函数名()

{

内容物;

}

这样的方法。

这是一个简单的例子,接下来,Bob打开了课程的Before.sin文件

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HelperMethods
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("The Name Game");

Console.Write("What's your first name? ");
string firstName = Console.ReadLine();

Console.Write("What's your last name? ");
string lastName = Console.ReadLine();

Console.Write("In what city were you born?");
string city = Console.ReadLine();

            char[] firstNameArray = firstName.ToCharArray();
            Array.Reverse(firstNameArray);

            char[] lastNameArray = lastName.ToCharArray();
            Array.Reverse(lastNameArray);

            char[] cityArray = city.ToCharArray();
            Array.Reverse(cityArray);

string result = "";

  foreach (char item in firstNameArray)
            {
                result += item;
            }

            result += " ";

            foreach (char item in lastNameArray)
            {
                result += item;
            }

            result += " ";

            foreach (char item in cityArray)
            {
                result += item;
            }

Console.WriteLine("Results: " + result);

Console.ReadLine();

▲仔细观察同色部分,就会发现一些问题。

对了,问题就是,代码重复率太高了。

有没有一种方法,可以简洁一点呢?

有啊。这里提供两种思路:

首先,本程序的思路是这样的:

输入姓名、城市;

反转姓名、城市;

输出姓名、城市;

那么,第一种方法就产生了:

定义过程:逆转(输入:字符串)

{反转字符;}

输入姓名、城市;

逆转(姓名);

逆转(城市);

输出姓名、城市;

Bob在视频中一开始用的不是这个方法,他大概是这样的:

定义过程:大逆转(输入:字符串)

{反转字符;输出字符;}

输入姓名、城市;

大逆转(姓名);

大逆转(城市);

后来,Bob建议,程序中的方法不要超过6行,所以,第二种由于“规模太大”,容易出错。

Bob输出的时候用了String.Format函数,意思是Format更加方便,可是我一点也没看出来啊?

另外,还有几个概念要讲一讲:

Bob以前一直没讲void是什么意思,这次也终于提到了:

void英文为“空”,定义在过程中,就是说该过程不需要返回值。我们把思维逆转过来看一下,是不是如果该过程需要返回值,就把void改一下就行了?

答案就是这样,如果需要返回值,就把void改成需要返回的值的类型就行了。

与ToCharArray相反,String也提供了Concat方法,操作出来是ToCharArray的逆过程。也就是说,把字符数组连接起来。再加上前面提到的部分,代码就大大简化了。

就好像这样:

定义输出为字符串的函数:小逆转(输入:字符串)

{

拆分字符串为字符;

反转字符;

返回 合并输出字符;

}

输入姓名、城市;

姓名=小逆转(姓名);

城市=小逆转(城市);

输出姓名、城市;

但是,最后Bob还有优化的方法,像这样:

在这里:

姓名=小逆转(姓名);

城市=小逆转(城市);

输出姓名、城市;

改为:

输出小逆转(姓名)、小逆转(城市);

最后的代码是这样的:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HelperMethods
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("The Name Game");
Console.Write("What's your first name? ");
string firstName = Console.ReadLine();
Console.Write("What's your last name? ");
string lastName = Console.ReadLine();
Console.Write("In what city were you born?");
string city = Console.ReadLine();
Console.WriteLine("Results: " + fanxiang(firstName) + fanxiang(lastName) + fanxiang(city));
Console.ReadLine();
}
private static string fanxiang(string name)
{
char[] zifuchuan = name.ToCharArray();
Array.Reverse(zifuchuan);
return String.Concat(zifuchuan);
}
}
}

改变太大了!

慢着!

还有事情没讲!

如果我们还想重组一下这个函数,把他的输入改成三个,可以吗?

可以啊。

只要复制一下,连名字都不用改。

这里,就进入了本节课的一个重点了。

为什么不用改名字?

其实,我们好好思考一下,如果要改名字,就违反了C#的大前提了。

比如:你有没有想过,Console.WriteLine("1");和Console.WriteLine(1);是不同的过程?

在你打下(的时候,按下 ↑ ↓ 键,你会发现好多个WriteLine。针对不同的数据类型,都出现了WriteLine相同的功能。这样就可以明白了,如果C#是根据名字来判断函数、过程的话,那我们就只能写WriteLinebystr、或者WriteLinebynum了。

Bob说,判断相同的函数是靠“函数签名”来的。也就是函数的输入类型等等。

大概就是这样,学While了。

点赞

发表回复

电子邮件地址不会被公开。必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据