


视频地址:

此文章为站内视频“ av28779788 ” P51~P91(方法、数组、数据类型)的学习笔记干货内容(P73 - 06:49的弹幕说“建议删除学员问答的部分”——这个专栏文集的这几篇笔记,就是这样的干货,有正片、有番外、有代码,但《2048》项目,祁老师会在后面继续更新,因而不在本文的内容中)
(32张图片,约)
旨在帮助后来的同学们快速了解c Sharp这门计算机编程语言,为“有计算机编程语言基础的同学”节省时间(弹幕里面那种多少天看到哪一集的,很有可能就是有计算机编程语言基础,并结合前面的笔记跳着看的那种人)。
(还恳请各位浏览者,不要去刷多少天看到哪一集的那种弹幕)
对于没有接触过计算机编程语言的同学,建议按顺序学习
第一篇:

第二篇:

之所以不按每个章节写专栏文章,是因为祁老师的这套课程是面向零基础的就业培训班,并不是严格按照PPT顺序讲,很多地方是跳着讲的。举个例子:
“2.5_方法”章节下 - “2.5.3_参数列表”的内容→链接到“2.7_数据类型”章节 - “2.7.5_应用”小节 - “三、 传参”这部分。
(这里是从第53集跳到了第82集,因为要理解这三种参数,需要先学习中间29集的知识点)
因此,本文不按集数写,而是按章节排版,有哪里不懂的可以直接跳转到标注集数的对应位置观看。
这三节相当于是“面向过程编程”到“面向对象编程”的过渡。(第92集正式进入“面向对象编程”)类比大学的课程进度,就是第二学期前半学期的内容。(因为你读大学的话,第一学期的《cSharp语言零基础入门》和第二学期的《cSharp语言基础》只是我们的“专业基础课”,除此之外还有一堆公共课,白天四个大节课也不全是都要排课……)
以下是最近三个章节的结构体系预览:

第二章第5节:方法

第二章第6节:数组

第二章第7节:数据类型
(画框颜色是#66CCFF——“天依蓝”,不透明度100%。我在专科期间的主干课程《UI界面设计》课程的卜老师说,蓝色象征科技感,我感觉“天依蓝”就很合适)
(这个概念,在面向过程编程语言中的专业术语,称为“自定义函数”)
递归算法是在方法内部调用自身,也算本章节的内容。
2.5.1_什么是方法
第一个大的知识点:方法的概念(输入数据、处理数据、返回结果)

图4_方法的概念
第二个大的知识点:方法的语法

图5_方法的语法
2.5.2_方法的返回值

图6_2.5.2_返回值
2.5.3_方法的参数
(形式参数与实际参数,配合使用,对输入数据进行规范)

图7_2.5.3_方法的参数
2.5.4_如何定义方法
说白了就是为了做一个功能,封装了一段代码,在指定位置填写——修饰符、返回值类型、方法名、参数类型、方法体。

图8_2.5.4_如何定义方法
2.5.4的番外篇(SP 0)——年历的参考代码(第二章第5节这里,不教大家C#代码的使用方法):
namespace PrintYearCalendar
{
class Program
{
/*定义打印月历的方法(根据年份和月份,在控制台中显示月历)
* 1. (最终目标)在控制台中显示年历,没说哪一年,因为年份是参数
* ——调用12遍显示月历的方法
* 2. 在控制台中遍显示月历的方法(具体月份是参数)
* ——显示“表头”,提示:Console.WriteLine("日\t一\t二\t……");
* ——你得知道当月1号的星期数是多少,星期几就输出几个"\t",提示:Console.Write("\t");不换行
* ——计算当月天数,输出数字加\t
* ——本例题要求每逢周六换行
*
* 3. 根据年月日,计算星期几(老师提供)
* 4. 计算指定月份的天数(P45 - 00'00"),在“2.4.1_选择语句”小节下的“三、 switch-case”这部分,粘贴过来就行
* 5. 判断闰年的方法
* ——得做一个判断平年还是闰年的方法,因为2月区分闰年和平年,附赠闰年的条件(满足一个条件就是闰年)
* ——条件1:如果是一百的倍数,年份是400的倍数
* ——条件2:如果不是整百的年份,是4的倍数就行
* 在方法上面敲三下斜杠,会出现summary(概述),好处是在调用的时候会有提示*/
/// <summary>
/// 根据年月日,计算星期数的方法
/// </summary>
/// <param name="year">年份</param>
/// <param name="month">月份</param>
/// <param name="day">天</param>
/// <returns>星期数</returns>
private static int GetWeekByDay(int year, int month, int day)
{
DateTime dt = new DateTime(year, month, day);
return (int)dt.DayOfWeek;
}
private static bool IsLeapYear(int year)//在编程中,只有两种结果,一般使用布尔类型
{
/*if( (year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
return true;//闰年判断,区分整百年份与非整百年份
else
return false;*/
return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;//这种情况,可以简化代码为一行
}//从第五个方法(判断闰年的方法)开始写
private static int GetDaysByMonth(int year, int month)
{
if (month < 1 && month > 12) return 0;//用“短路”逻辑,做数据验证,满足条件就是不符合要求的数据,退出。
//使用return语句,减少代码嵌套——如果月份输入正确,才会执行switch-case语句
switch (month)
{
case 2:
/*if (IsLeapYear(year))
return 28;//想问原因的,去看“IsLeapYear()”的返回值
else
return 29;//这里就不需要break语句了*/
return IsLeapYear(year) ? 29 : 28;//可以使用三目运算符,简化代码为一行
case 4:
case 6:
case 9:
case 11:
return 30;
default:
return 31;
}
}
private static void PrintMonthCalendar(int year, int month)
{
//1. 显示表头
Console.WriteLine("{0}年{1}月", year, month);
Console.WriteLine("日\t一\t二\t三\t四\t五\t六");
//2. 根据当月1日的星期数,显示空白
int week = GetWeekByDay(year, month, 1);//对,年份和月份,就是数据中转
for (int i = 0; i < week; i++)
Console.WriteLine("\t");//C#技巧:大括号里面只有一行代码可以省略大括号
//3. 根据当月总天数,输出数字加\t
int days = GetDaysByMonth(year, month);
for (int i = 1; i <= days; i++)
{
Console.Write(i + "\t");
//4. 每逢周六换行
if (GetWeekByDay(year, month, i) == 6)
Console.WriteLine();//换行就行,不输出内容
}
}
private static void PrintYearCalendar(int year)
{
for (int i = 1; i <= 12; i++)
{
PrintMonthCalendar(year, i);
Console.WriteLine("\n");//月份之间要换行
}//对,就是调用12遍显示月历的方法
}
static void Main(string[] args)
{
Console.WriteLine("请输入年份(正整数):");
int year = int.Parse(Console.ReadLine());
PrintYearCalendar(year);
}
}
} 本人个人强烈建议大家去看原视频:
(主要是因为,我跟着祁老师敲了两节课,但运行效果不一样,不知道是不是Visual Studio软件版本的原因?单独开一个新项目运行,问题也没有解决,于是就没有放思维导图笔记里面了)
2.5.5_方法重载
说白了就是,对同一个方法名使用不同的实参类型,会自动调用不同的方法。

图9_2.5.5_方法重载
第二章第5节的番外篇(SP1):递归算法(知道在计算机编程语言中有这个东西就行,应付面试,别在实际项目中使用)

图10_第二章第5节SP:递归算法
数组索引,就是“程序员从零开始数数”的原因。
2.6.1_什么是数组

图11_2.6.1_什么是数组
2.6.2_定义数组
标志是中括号(别管是有几对,也别管有没有逗号)

图12_2.6.2_定义数组
2.6.3_初始化数组
一般使用“声明 + 初始化 + 赋值”,简化代码

图13_2.6.3_初始化数组
(SP3)根据年月日计算当天是本年的第几天的那个练习题的代码:
static void Main()
{
Console.WriteLine(GetTotalDays(2022,12,18));//直接赋值测试,不考虑用户界面
}
private static bool IsLeapYear(int year)
{
return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;//这种情况,可以简化代码为一行
}
private static int GetTotalDays(int year,int month,int day)//可以先写void,整理思路,返回值类型最后写
{
int[] daysOfMonths = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
//如果闰年,2月为29天
if (IsLeapYear(year)) daysOfMonths[1] = 29;
int days = day;
for (int i = 0; i < month - 1; i++)
{
days += daysOfMonths[i];
}//days += day;思路整理完成,void替换为int,然后添加返回语句
return days;
} 注意层次结构,运行之前,把Main()函数里面的三个数值改为其他客观存在的日期就行。
2.6.4_访问数组元素

图14_2.6.4_访问数组元素
2.6.5_常用方法及属性

图15_2.6.5_常用方法及属性
2.6.5的番外篇(SP4)——2016年9月7日(“2.C#基础06-xx”,对应P47~P56)的“每日一练”,双色球彩票生成器(从编程的角度来讲,可以通过买空某一期卡池,来让主办方亏钱,但从金融或行业稳定的角度来讲,你的这种做法会被地球人阻止。当然,我这么说是因为没有计算扣税,还有就是一等奖和二等奖是五百万封顶,你这么做拿不到16个五百万)

图16_双色球彩票的逻辑(逻辑上可以组织三千六百万块钱把某一期的卡池买空)
第65集是讲算法,第67集和68集讲代码(在现实世界拿得出三千六百万的人,理论上来说不会来学编程语言),图16中被折叠的代码如下:
namespace Day05CaiPiao
{
class Program
{
/*
* “每日一练”,
* 彩票生成器
*
* 1. 在控制台中购买彩票的方法int[7]
* ——请输入第n个红球号码
* ——要求一是取值范围,要求二是不重复
* ——//判断数组中是否存在指定元素
* bool result = Array.IndexOf(array, 0) >= 0;//结果为自然数,就是索引
*
* 2. 随机产生一注彩票的方法int[7]
* ——备注:本行语句放到方法外(与“static void Main()”同一个缩进级别),类内(static void Main()后面的大括号里面),不懂可以去复习“2.1_点NET简介”章节 - P26解释代码结构 - 6. 层次结构
* ——static Random random = new Random();
* ——random.Next(1, 34);写在方法体内部
* ——要求:产生6个不重复的随机整数,且从小到大排序(排序完成后,产生蓝球号码放末尾就行)
*
* 3. 两注彩票比较的方法,返回中奖等级
* ——要用中奖数量查表
*
* 4. 这三个方法写完之后,在主函数(Main(){})里面测试
*/
static void Main(string[] args)
{
int[] myTicket = BuyTicket();
Console.WriteLine("没有中奖不显示。");
int level;
int count = 0;
do
{
count++;
int[] randomTicket = CreateRandomTicket();
level = TicketEquals(myTicket, randomTicket);
if (level != 0)
Console.WriteLine("恭喜{0}等奖。累计{1}次,您可能已经支出了{2:c}元", level, count, count * 2);
}
while ((level != 1) && (count <= 1500));//由于控制台有行数上限,这里演示三等奖(5+1,固定给三千块),看一千五百次能否回本
//while (level != 1);//只填写这一个条件,就是看多少次中了那个1.1363%的一等奖,注意,是每次更新,就刷新一次卡池
}
private static int[] BuyTicket()//“int[]”表示返回一个整数数组
{//别数了,28行代码(不空行是25行代码)
int[] ticket = new int[7];//一注彩票
for (int i = 0; i < 6;)//输入的数据符合要求,才执行“i++”
{//6个红球,所以不能等与
Console.WriteLine("请输入第{0}个号码(1到33闭区间):", i + 1);//人类从一开始数数
int redNumber = int.Parse(Console.ReadLine());
if (redNumber < 1 || redNumber > 33)//判断范围
Console.WriteLine("请输入一个[1,33]之间的正整数。");
else if (Array.IndexOf(ticket, redNumber) >= 0)
Console.WriteLine("请不要重复输入");
else
ticket[i++] = redNumber;//不满足条件就不执行“i++”
}//一个for循环,搞定前六个数字
while (true)//第7个数字,输入的数值不合要求就是死循环
{
Console.WriteLine("请输入一个在1到16闭区间内的正整数:");
int blueNumber = int.Parse(Console.ReadLine());
if (blueNumber >= 1 && blueNumber <= 16)
{
ticket[6] = blueNumber;
break;//输入了一个符合要求的数字,就退出循环
}
else
Console.WriteLine("请输入一个[1,16]之间的正整数。");
}
return ticket;
}
static Random random = new Random();//本行语句放到方法外,类内
private static int[] CreateRandomTicket()//机选
{//别数了,十行代码
int[] ticket = new int[7];//一等奖的那一注彩票
for (int i = 0; i < 6;)//也是要输入的数据符合要求,才执行“i++”
{
int redNumber = random.Next(1, 34);
if (Array.IndexOf(ticket, redNumber) < 0)//要求是数字redNumber在数组中不存在
ticket[i++] = redNumber;//添加进数组,才进入下一次循环
}
ticket[6] = random.Next(1, 17);//蓝球号码单独生成
Array.Sort(ticket, 0, 6);//红球号码排序,这里使用了“Sort()”方法的某个重载
return ticket;
}
private static int TicketEquals(int[] myTicket, int[] randomTicket)
{//别数了,24行(不空行是21行代码)
int blueCount = myTicket[6] == randomTicket[6] ? 1 : 0;//相同返回1,蓝球没有中奖返回0
int redCount = 0;//红球中奖数量需要重新做一个变量
for (int i = 0; i < 6; i++)//这种情况可以省略大括号
if (Array.IndexOf(randomTicket, myTicket[i], 0, 6) >= 0)
redCount++;//我的第i个红球号码,在随机彩票中的红球号码中,存在就增加
int level;//判断中奖等级需要重新做一个变量
if (blueCount + redCount == 7)
level = 1;//一等奖是七个全对
else if (redCount == 6)
level = 2;//没中一等奖,判断二等奖,不考虑蓝球
else if (blueCount + redCount == 6)
level = 3;//三到五,是一共中几个
else if (blueCount + redCount == 5)
level = 4;
else if (blueCount + redCount == 4)
level = 5;
else if (blueCount == 1)
level = 6;//最后,只要蓝球中了,就不亏
else
level = 0;//没中奖
return level;
}
}
}
P66_复习课

图17_P66可跳过
排序算法

图18_这个排序算法,祁老师是放在一维数组这部分讲的
2.6.6_数组的分类
大致是一维数组、二维数组、交错数组,这三类,
一维数组就是前面讲的普通的数组;
二维数组可以看作是表格,有接触过Excel软件就很好理解;
交错数组是不规则的表格

图19_二维数组(《2048》项目已折叠)
顺便说一句,开头就说了——本文不涉及《2048》项目,祁老师在 P51~P91这部分提一嘴,是为了……埋伏笔,作为第一个月的主线项目(第四集说了,这套培训班是四个阶段四个月,完全可以当成是本科四年的浓缩版)。

图20_P77_交错数组.png
2.6.7_参数数组

图21_2.6.7_参数数组

图22_第二章第7节常识性的内容
2.7.1_数据类型

图23_2.7.1_数据类型
2.7.2_内存分配

图24_2.7.2_内存分配
2.7.3_局部变量

图25_2.7.3_局部变量(《2048》相关部分已折叠)
2.7.5_数据类型应用

图26_2.7.5_数据类型应用
2.7.6_拆装箱
与递归算法差不多,j讲这个知识点,主要是应付面试,在实际项目中可以忽略性能消耗。

图27_2.7.6_拆装箱
2.7.7_字符串类型

图28_string(字符串类型)

图29_StringBuilder(可变字符串)

图30_第二章第7节(数据类型)重点回顾
这部分没有纳入知识体系,而是放在了第二章第7节与第二章第8节之间。
类似于“Excel”的自定义序列,查看路径是
→“文件”选项卡,按“选项”弹出“Excel选项”对话框
→“高级”的最下面的“编辑自定义列表”按钮
→弹出“自定义序列”对话框。
在“枚举”下有“简单枚举”、“标志枚举”和“按位运算符”三个知识点。

图31_简单枚举

图32_标志枚举
gitee(开源中国)平台:
https://gitee.com/xrschool_cqlp_gov_cn/learning_notes_of_unity3d_tutorial/blob/f98f3c5dcdf94ac291bed58f02b2742da51397bf/cSharp%E7%B1%BB%E5%92%8C%E5%AF%B9%E8%B1%A1%E4%B9%8B%E5%89%8DP51%E5%88%B0P91.xmind
腾讯文档平台:
https://docs.qq.com/mind/DVFVSR1VrR1dEUERB
可下载与自由复制。