家里有个小孩真是麻烦。上午弄得我没法学习,没办法,只能用中午的时间来看上那么一集。
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了。