传智播客C#经典入门课堂笔记苏坤.docx
《传智播客C#经典入门课堂笔记苏坤.docx》由会员分享,可在线阅读,更多相关《传智播客C#经典入门课堂笔记苏坤.docx(31页珍藏版)》请在冰豆网上搜索。
传智播客C#经典入门课堂笔记苏坤
今天学习的第一句话:
Console.WriteLine(“你想显示的内容。
”);
第二句话:
Console.ReadKey();
当程序执行到Console.ReadKey();时,程序会停到这里,等待用户从键盘上键入一个键,用户键入这个键之后,程序才会继续执行。
在C#中,每一句话都必须以“分号”结束
C#中的注释,什么是注释呢?
对我程序进行的解释,注释是给人看的。
下面的一对指示可以折叠代码。
#region
内容
#endregion
MSIL:
微软中间语言MicrosoftIntermediateLanguage
CLR:
公共语言运行时CommonLanguageRuntime
CLS公共语言规范CommonLanguageSpecification
CTS:
通用类型系统CommonTypeSystem
JIT:
即时编译器JustInTime
第二天课程:
复习--
Console.WriteLine()
可以用CW加Tab键。
这样就能直接打出Console.WriteLine();
变量1:
变量:
变量代表着一块内存空间,我们可以通过变量名称向内存存\取数据。
有变量就不需要我们记忆复杂的内存地址。
向内存申请一块内存空间的语法:
数据类型变量名;
整数在我们C#中的数据类型叫int
Intnuber;
Double:
小数
Char:
字符型只能存储一个字符,并且存储的这个字符要求用单引号引起来
String类型:
字符串,就是把0个或1个或多个字符连接起来。
字符串要求用双引号引起来。
Decimal类型:
用来表示钱和货币,失精度
不至于丢失。
注意:
在C#开发环境中,直接写一个有小数点的数字,这个数字是double类型。
在一个小孩苏idan后面加个m\M,就告诉编译器这是个decimal类型
应该写成:
money=100.34m;
变量的命名规则:
1.必须以“字母”_或@符号开头、
2.后面可以跟任意“字母”,数字,下划线。
注意:
1.你起的变量名不要雨C#系统中的关键字重复。
2.在C#中,大小写是敏感的。
3.同一个变量名不允许重复定义(先这么认为,不严谨)。
●定义变量时,变量名要有意义
●C#变量名编码规范---Camel命名法:
⏹首个单词的首字母小写,其余单词的首字母大写。
●Pascal命名规范:
每一个单词第一个字母都大写。
●如果使用到英文单词的缩写,全部用大写。
在一个方法中,一般情况下变量只能定义一次(先这么认为),但可以多此赋值,再次赋值时,会把变量中原有的值给覆盖掉。
“+”在C#中有两种意义:
1.在数学中的加法运算:
两边参与加法运算的数据类型为数字类型,则“+
“表示数学上的加法意义。
2.是连接的意思:
两边参与加号运算的数据,有一个是字符类型,那么这个“+“好就是连接的意义。
在Console.WritLine(“”)中,第一个变量/
字符串中可以使用占位符。
占位符有{数字}组成,数字有0开始编号
第1个占位符:
{0}
第2个占位符:
{1}
第3个占位符:
{2}
………
Console.WriteLine();有多个参数时,输出都是第一个参数中的内容,从第二个参数开始都是用来替换第一个参数中的占位符的值,所以从第二个参数开始,要不要输出,就要看第一个参数中有没有相关的占位符。
例如:
Console.WriteLine(”{0}我叫”+name,”今年”+age+”岁了”);
输出结果是:
今年28岁了我叫张三
再学习一句话,用于让用户从键盘上输入一句话。
当程序执行到线面这句话,就会暂停,然后等待用户从键盘上输入一句,按回车程序将继续执行。
如果想得到用户输入的的内容,就需要定义一个string类型的变量,写在下面这句话前面,接收用户输入的内容。
Console.ReadLine();
接收用户输入的内容,必须定义一个字符串来进行接收。
Stringinput=Console.ReadLine();
转义字符:
什么时候用,当我们需要在字符串中输入一些特殊字符时,比如:
半角引号,换行,退格。
就需要使用转义字符。
转义字符是一个字符,他由一个\+一个字母来组成具有特殊意义的一个字符。
常用的转义字符:
\n换行
\bbackspace退格
\ttab键由多个空格组成的一个字符,具有行与行之间的对齐功能。
\\表示一个\
在字符串前面加一个@符号有两种意义:
1.字符串中如果有\,则不再理解为转义符。
2.使字符串可以换行
如果字符串前面加了@符号,在字符串上用连个双引号代表一个双引号。
C#中,有五个算术运算符:
+-*/%
他们二元运算符。
要求参与运算的两个操作数的类型必须相同,并且经过运算后的结果也与操作数的类型相同。
在算术表达式中,如果要改变计算的优先级,用小括号。
小括号可以无限制的套用,但一定要成对出现。
发生自动转换的条件:
1.参与运算(算术运算和赋值运算)的操作数和结果类型必须一致。
当不一致时,满足下面条件时,系统自动完成类型转换。
2.两种类型兼容
3.例如:
int和double兼容
4.目标类型大于源类型
5.例如:
double>int
自动转换中,转换是不会丢失进度的。
经常见到的就是,参与运算的两个操作数,一个是int,一个是double,那么int类型会自动转换乘double
如果一个操作数为double型,则整个表达式的运算结果为double类型。
当需要丢失精度的转换(如果从double3.14到int3的转换,会丢失0.14的精度)时,系统是不会帮我们自动转换的。
需要我们程序员来写代码完成转换。
(数据类型名)待转换的值;
注意:
下面的两种转换是错误的。
因为强制类型转换要求待转换的类型和目标类型必须都为数字。
//stringage=(int)Console.ReadLine;
//inta=(int)“33”;
Int变量=Convert.ToInt32(待转字符串);
上面语句的意义:
把待转字符串转换成int类型后赋给变量。
C#中的异常捕获如何完成:
Try
{
有可能出现错误的代码写在这里
}
Catch
{
出错后的处理
}
上面的程序如何执行:
如果try中的代码没有出错,则程序正常运行try中的内容后,不会执行catch中的内容。
如果try中的代码一旦出错,程序立即跳出catch中去执行代码,那么try的出错代码后面的代码不再执行。
Age++自加一有前加和后加
Age--自减一有前减和后减
例如:
Intage=18;
Intsum=age++-10;
上面代码age是后加。
所以在进行语句运算时,age++取age原值参与运算,所以sum=8
Intage=18;
Intsum=++age-10;
上面age是前加,所以在进行语法运算时—++age取age加一后的新值参与运算,所以sum=9
总之,不管是++age还是,进过运算后,agede值都进行了+1运算。
Intage=18;
Intsum=age++-10;
相当于:
Intage=18;
Intsum=age-10
Age=age+1
Intage=18;
Intsum=++age-10;
相当于:
Intage=18;
Age=age+1;
Intsum=age-10;
在C#中,一般情况下,一元运算符++--大于二元运算符+-。
复合运算符:
Age+=4理解为在Age的原值的基础上加4;
在C#中,有6个关系运算符,用于比较两个事物之间的关系。
<>==!
=>=<=
关于表达式:
由关系运算符连接起来的式子。
关系表达式的运算结果bool类型,bool类型只有连个值,一个是true,一个是false.
如果关于运算表达式成立,则这个表达式的值为true,否则为false。
逻辑运算符:
&&||!
逻辑与运算:
BoolisRight=表达式1&&表达式2
逻辑与连接的两个表达式,要能够求解成bool类型,一般情况都是关系表达式。
整个逻辑与运算的结束也是bool类型
表达式1
表达式2
逻辑与结果
True
True
True
True
false
false
false
True
False
false
false
False
两个表达式全为true,逻辑与才为true
逻辑或(或者):
BoolisRight=表达式1||表达式2
逻辑与连接的两个表达式,要能够求解成bool类型,一般情况都是关系表达式。
整个逻辑与运算的结束也是bool类型
表达式1
表达式2
逻辑或结果
True
True
True
True
false
True
false
True
True
false
false
False
有一个表达式为true,逻辑或就为true
逻辑非:
!
(取反)
这是一个一元运算符。
用法:
!
(布尔类型的表达式)
作用:
如果布尔类型的表达式为true,加!
号后,其整个式子的结果为false。
如果:
布尔类型的表达式为false,加!
号后,其整个式子的结果为true。
逻辑与与逻辑或的短路问题:
例如:
Inta=10;
Intb=5;
(1)Boolresult=++a>5&&++b>1;
(2)Boolresult=++a>5||++b>1;
当逻辑与第一为假时第二个不再检查真假,直接输出false。
第二个不再运算。
当逻辑或第一个为真时。
第二个表达式不再检查真假。
直接输出true。
第二个数不再运算。
If结构的基本语法:
If(条件)
1.语句;
执行过程:
首先判断条件的结果,如果条件为true,则执行语句。
如果条件为false,则跳过语句1.执行后面的语句。
注意:
1.if后面的括号中的条件,要能计算成一个bool类型的值。
3.默认情况下,if语句只能待一句话。
即和if语句有关系的语句,只有语句1.
执行过程:
如果条件为false,那么将跳过if所带的语句块中的所有语句。
要求:
我们在写程序时,哪怕if语句只带一句话,也要把他写在大括号中。
If-else结构
语法:
If(条件)
{语句1;}
Else
{语句2;}
执行过程:
如果条件为true,则执行if带的语句块1,并且跳过else带的语句块2.
如果条件为false,则跳过if带的语句块1,执行else带的语句块2.
上面两个语句块,根据条件结束为true或false,总要执行一个。
在if-elseif语句中。
只有当上一个条件不成立时,才会进入下一个if语句并进行if语句后面的条件判断。
一旦有一个if后面的条件为true,则执行if所带的语句(块),语句(块)执行完成后,程序跳出if-elseif结构。
如果所有的if条件都不成立,则如果最后有else则执行else所带的语句,否则什么都不执行。
注意:
代码自动排版对齐快捷键:
Ctrl+k+f
Else离它最近的if是一对
Switch-case语句:
语法:
Switch(表达式)
{
Case值1:
语句块1;
Break;
Case值2:
语句块2;
Break;
Default:
语句块3;
Break;
}
执行过程:
首先计算表达式,然后根据计算结果与匹配case后面的值,如果有匹配项,则执行匹配项后面的语句,知道break语句跳出switch-case。
如果所有的case值都不匹配,那么有default则执行default后面的语句,知道break结束。
如果没有default,则跳出switch-case,什么都不执行。
注意:
匹配时和default的位置没有关系,只和值有关系。
练习:
If-elseif与switch的比较
相同点:
都可以实现多分枝结构
不同点:
switch:
一般只能用于等值比较
If-elseif:
可以处理范围
While循环的语法:
While(条件)//循环体
{
要循环执行的N条程序;//循环体
}
执行过程:
先判断循环条件,如果条件为true,则转向2;如果条件为false,则转向3。
语法:
Do
{循环体;}
While(条件);
执行过程:
1执行循环体,执行完循环转向2
2判断条件是否成立,如果条件为true,则转向1。
如果条件为false,则转向3.
3跳出循环,循环结束。
假如循环条件一开始就不成立,对于while循环,一次都不会执行。
对于do-while的循环体一般至少会被执行一次。
While先判断,后执行。
Do-while先执行,后判断。
For循环:
语法:
For(表达式1;表达式2;表达式3;)
{
循环体;
}
For循环,一般用于已知循环次数的循环。
一般情况:
表达式1:
用于定义循环变量和对循环变量赋初值。
表达式2:
循环条件
表达式3:
用于改变循环变量的值。
执行过程:
第一步:
计算表达式1,转向第二部
第二步:
计算表达2(循环条件),如果表达式2的值为true转向第3部。
如果表达式2的值为false,转向第5步.
第三步:
执行循环体,转向第4步。
第四步:
执行表达式3.转向第4步。
第五步:
循环结束。
练习:
水仙花数是一个三位数,设cba.
A*a*a+b*b*b+c*c*c=cba
例如:
153=1*1*1+5*5*5+3*3*3
Break:
1)可以用于switch-case判断中,用于跳出switch
2)用在循环中,用于立即跳出(终止)循环。
注意:
用于循环中时,跳出的是break所在的循环。
Continue:
用于循环中,程序一旦执行到continue语句,立即结束本次循环(就是不再执行循环体中continue下面的语句了),直接进行下一次循环。
(do-while/while直接进行下一次循环条件的判断,如果条件成立,则再次进入循环。
对于for循环,先执行表达式3,再判断循环条件是否成功!
)
三元表达式:
表1?
表2:
表3:
执行过程:
首先计算表达式1,表达式1应该是一个能够计算成bool类型的值,如果表1的值为true,则表达式2的值作为整个表达式的值,如果表1的值为false,则表达式3的值作为整个表达式的值。
表达式2和表达式3的类型一定要相同(相兼容)。
例如:
a>b?
a:
b;
常量:
语法:
Const类型常量名=常量值
在定义时赋值,在其他地方不允许赋值。
枚举:
让我们定义一种枚举类型并且在定义这种类型时我们要指定这个类型的所有值。
语法:
Enum自己起的类型名称
{
值1,值2,值3。
。
。
。
值N
}
枚举的定义,一般和类定义在同一个级别。
这样,在同一个命名空间下的所有的所有的类就都可以使用这个枚举了。
(在方法中也可以,在类中也可以。
)
枚举的作用:
1)限制用户不能随意赋值,只能在定义枚举时例举的值中选择。
2)不需要死记没一个值是什么,只需要选择相应的值。
注意:
定义枚举时,值不能为int类型。
枚举类型的变量都可以强制转换成一个int类型。
枚举的值在定义时是有一个默认编号的,编号从0开始。
如何把一个字符串转换成枚举类型:
(自枚)(enum.parse(typeof(自枚),“待转换的字符串”));
为什么要用结构:
1)比如我们上课讲的为了存储一个人的信息,要声明一组变量。
当我们要存储N个人的信息时,就要声明N组变量,麻烦。
2)存储一个人信息的这几个变量间没有关系,容易记乱。
语法:
访问修饰符(目前用public)struct结构名
{
(必须加public)定义结构成员;
}
例如:
publicstructperson//定义一个名称叫person的结构。
{
Publicstringname;//结构成员
Publicgedersex;//结构成员
Publicintage;//结构成员
}
定义好一个结构后,就可以直接声明相应的变量了。
声明好变量后,通过变量名.成员名来访问结构的成员。
计算机中最小单位“位“,bit比特
就把8个二进制位分成一组,那么8个二进制位叫做字节byteB计算机能够处理的最小单位。
1KB=1024B
1MB=1024KB
1GB=1024MB
1TB=1024GB
Bps传输速度bitpersecond
数组:
可以帮我们一次声明多个同类型的变量。
这些变量在内存中是连续存储的。
数组声明语法:
数据类型【】数组名=new数据类型[数组长度];
例如:
int[]score=new[5];
就声明了一个长度为5的数组,数组叫score
通俗点说:
就是声明了一个数组,里面包含5个int类型的变量。
数组名叫score里面的5个int类型的变量叫做:
数组的元素
如何访问数组:
通过下标(索引)来访问数组。
比如,我们要向第0个元素赋一个3.可以这样写:
Score[0]=3;
Int类型数组一旦声明,里面的每一个元素被初始化成0通过数组名。
Length可以获得数组的长度
Console.Clear();清屏
Intsum=0;
Int[]score=newint[10];
//对数组中元素进行赋值
For(intI=0;i{
Console.WriteLine(“请输入第{0}个人的成绩:
”,i+1);
Score[i]=convert.ToInt32(Console.ReadLine());
//sum=sum+score[i];
}
//通过一个循环,求一个数组中所有元素的和。
For(intI=0;i{
Sum+=score[i];
}
Console.Clear();
Console.WriterLine(“{0}个人的平均成绩为:
{1}”,score.Length,sum/score.Length)
//输出数组中的每一个元素的值
For(intI=0;I{
Console.WriterLine(“第{0}个学生的成绩为{1}分”,i+1,score[i]);
}
冒泡排序:
让数组中的元素两两比较,(第i个与第i+1个比较),进过n(i-1)遍两两比较,数组中的元素能按照我们预期的规律排序。
要从大到小排序,我们进行两两比较的时候用<
10,20,30,40,50,60,70原始数据7个元素
20,30,40,50,60,70,10第一趟比较6次。
30,40,50,60,70,20,10第二趟比较5次。
40,50,60,70,30,20,10第三趟比较4次。
50,60,70,40,30,20,10第四趟比较3次。
60,70,50,40,30,20,10第五趟比较2次。
70,60,50,40,30,20,10第六趟比较1次。
也就是n个数需要排n-1趟
第t趟比较的次数为:
N-t次
For(inti=0;i{
For(intj=0;j{
If(>)
{
交换
}
}
}
方法:
功能:
用来复用代码的。
当我们在一个程序反复写的同样的代码。
那一般情况下,我们可以把需要重复写的代码定义在一个方法中。
用的时候只需要调用就行了。
定义方法的语法:
Public
[访问修饰符][static]返回值类型方法名([参数])
{
方法体;
}
注意:
1.方法一般情况下,方法一般要定义在类(class)中。
2.如果方法没有返回值,则返回值类型写void。
3.如果方法中没有参数,()不能省略。
方法的调用:
如果是静态方法(有static修饰的)则使用类名.方法名()
在类中调用本调用的方法,可以只写方法();
Return:
立即退出本方法
变量的作用域:
在方法中定义的变量称为局部变量,其作用域从定义开始,到其所在的大括号结束为止。
当被调用者想得到调用者的方法中的变量时,则可以让调用者通过参数的形式给被调用者。
例子:
Publicstaticvoidtest(intnumber)//形参
{
}
在方法名后面的括号内定义变量,叫做定义这个方法的参数。
这里定义的变量用于接收调用者传过来的数据。
注意:
如果一个方法一旦有参数,那么调用者就必须传参数,并且传参数的个数与对应位置上的类型必须一致。
当调用者想访问我们方法中的变量时,可以通过返回值返回。
例如:
Strings=console.ReadLine()
Inti=Convert.ToInt32(“22”)
为什么方法前面能够定义一个变量收到方法的值,是因为在方法中使用了返回值。
只要在方法中返回了值,那么在调用方法中,前面就应该用一个变量来接收方法的返回值。
注意:
一个方法只能有一个返回值。
一旦一个方法有返回值,那么在这个方法的体中就必须通过return语句返回一个值,并且这个值要与返回值的类型是相同的。
语法:
return值;
当形参是数组的时候,我们传数组名。
一个变量一旦定义在方法外,类的里面,就叫做类的字段。
这个变量就可以被本类的所有的方法所访问。
但是哟呵注意,静态方法只能访问静态字段。
由const修饰的常量不能定义静态的。
什么叫方法重载:
一般在同一个类中,方法名相同,并且方法的参数的个数不同或者对应位置上的类型不同,才能构成方法的重载。
通过参数来反值:
如上代码:
实现步骤:
1在方法的参数类型前加out,那么传参数的时候,也必须在number前加out表明这个参数不是传入的,而是用来传出值的。
2如果参数是以out形式传入的,那么在传入前可以不赋初值。
3在方法中对于由out修饰的参数,必须赋值,并且必须在使用前赋值。
练习:
写一个MyTryParse方法,要求用户传入一个字符串,如果这个字符串能转成int类型,则方法返回true,并且转换后的int类型数据通过方法的参数传出。
如果字符串不能转换成int类型,则方法返回false,那么out传出的参数将没有意义,在方法中随意赋个值就行了。
Out用于传出值;在方法中必须对out修饰的传出值进行赋值。
Ref可以理解成是双向的,既可以传入,又可以传出。
(像C语言中的指针)