cSharp_1_概述
名词描述
C#
是一门语言,语法与javascript、C、C++、java相近,这些语言都是比C语言的语系中发展而来。
.net framework
(Framework是框架的意思)asp.net软件的编译和运行平台,计算机必须安装了这个软件才可以运行我们编写的C#应用程序。不过windows7.0以后的操作系统都要自动安装了这个软件。
mono是由第三方团队开发的让C#程序代码运行于多平台的一个框架。相当于另一个.net framework
新建一个软件项目
在.net中程序软件是项目的形式的存在的,一个项目就是包含软件中所有的代码、图片、样式、等等所有资源文件的集合。
新建一个C#控制台应用程序项目
“文件”菜单 à 新建 à 项目 à 在弹出的“新建项目”窗口中依次选择 à visual C# à 控制台应用程序 à 添加项目名称 à 选择项目的存储位置 à 选择建立新的解决方案à 还是要添加到当前已经打开的解决方案中
完成“控制台应用程序”的创建之后。就可以在“解决方案”面板中看到当前项目的所有文件了。
Mian主函数
其中,program.cs文件中的main主函数就是程序的入口函数,包括其中的代码,会被自动执行,而写在mian主函数之外的代码则没不会被执行,除非在main中对其进行调用。
Main注意 M 大写
修饰为static
返回值为void或int
参数为字符串数组(C#中可选)
应用程序开始执行的地方
扩展名.cs
C#程序代码文件的扩展名就是.cs
编译执行源代码
F5:启动调试
Ctrl+F5:开始执行(不调试)
控制台输入输出语句
输出语句
控制台的相关操作都通过Console这个类完成,包括输入与输出操作
常用输出方法介绍
Console.Write(…)不换行输出
Console.WriteLine(…)换行输出,在输出内容的末尾加一个换行符
常用参数使用语法
Console.WriteLine("您传入的第一个参数为:"+ss); Console.WriteLine("您传入的第二个参数为:{0}", args[1]);
占位符
Console.WriteLine中的占位符写法{0}、{1},其概念就好像是在字符串中留一个填空题中的空,由后面的参数来填。
控制台输入
程序一般有零到多个输入,有些输入是执行时由用户输入的
使用Console.ReadXXX()系列的方法可以完成接收用户输入的操作
常用方法
Console.Read():一次返回一个字符(ASCII码)
Console.ReadLine():返回用户在控制台输入的一行字符串,按回车结束。
注释
单行注释 //
多行注释 /* */
通过快捷键来注释
选中需要注释的代码 à Ctrl+k Ctrl+c
通过快捷键来取消注释
选中需要取消注释的代码 à Ctrl+k Ctrl+u
练习:
1、在vs中创建一个控制台应用程序,用户手动输入男方姓名,输入女方姓名,输出信息“恭喜XX先生和XX女士,百年好和、白头偕老”。
2、在vs中创建一个控制台应用程序,模拟一个atm取款的功能,假设帐户原本有一千元,让用户输入一个数字,原帐户金额减去取款金额,将还剩多少钱显示出来。( C#中的字符串转整数 int.Parse(字符串)、声明整数类型是 int i = 1 ; )
C#中的数据类型
C#是一门强类型的编程语言,而javascript是一门弱类型的编程语言。
强类型语言是指该语言中的变量必须严格遵循类型的限制。就是说一个变量被声明之后,永远只能存储指定类型的数据。
C#中的整数类型
类型标识符 |
描述 |
可表示的数值范围 |
sbyte |
8位有符号整数 |
-128 ~ +127 |
Byte字节 (bit位代表一个二进数) |
8位无符号整数 |
0 ~ 255 |
Short短整型 |
16位有符号整数 |
-32768 ~ +32767 |
ushort |
16位无符号整数 |
0 ~ 65535 |
int 整型 |
32位有符号整数 |
-2147483648 ~ +2147483647 |
uint |
32位无符号整数 |
0 ~ 4294967295 |
long |
64位有符号整数 |
-9223372036854775805 ~ +9223372036854775807 |
ulong |
64位无符号整数 |
0 ~ 264-1 |
Char有时可以被当做整型来看待。
C#中变量的定义
C#中声明一个变量必须要同时声明这个变量的类型。
数据类型 变量名=变量值
比如:int i =10;
浮点类型
用于存储实数,浮点的数据类型包含两种:
单精度浮点型(float)
float类型是32位
取值范围:在+ 1.5×10-45 ~ 3.4×1038之间,精度为7位数。
双精度浮点型(double)
double类型是64位宽。
取值范围:为+5.0×10-324 ~ 1.7×10308之间,精度为15~16位数
注意:float和double不适合用于进行高精度且频繁的运算,否则在处理小数的位数限制的最后一位时会自动的四舍五入,造成精度的损失。
小数类型(decimal)
占16个字节(128位),主要为了满足高精度的金融、科学运算等领域。
小数类型数据的取值范围和精度如下:
取值范围在+ 1.0×10-28 ~ 7.9×1028之间,精度为29位数。
数值类型的表示方法
在C#中如果只写一个整数数字而不带代表的类型标识,那么这个整数数字会被自动自定为int类型。如果写一个带有小数的实数数字而不带代表的类型标识,那么这个实数数字会被自动自定为double类型。
可以用如下代码来证明:
Console.WriteLine((12).GetType().ToString()); Console.WriteLine((12.01).GetType().ToString());
通过类型标识符来定义数值的类型
123f 代表float类型数值123.0
518u 代表uint类型的数值518
36897123ul 代表ulong类型的数值36897123
22.1m 代表decimal类型的数值22.1
12.68 代表double类型的数值12.68
36 代表int类型的数值36
字符类型
在计算机中,一切数据最终都会被转换为二进制,字符也不例外,但是二进制只能用来存储数字,因此Char类型中存储的是一个字符在unicode码表中的位置编号。
字符类型的定义:
char 变量名 = ‘单个字符’ ;
注意:
1、 char类型的值必须用单引号括起来。
2、 单引号内的有效字符必须且只能是一个。
3、 值不能是单引号或反斜杠。
C#中的转义字符
Bool布尔类型
布尔类型只有两个值true和false
bool c = 5>6; c = true ; Console.WriteLine(c);
GetType()方法
用于获取一个变量或数值的类型,示例:
float i = 100f; Console.WriteLine(i.GetType().ToString());
Int16代表short
Int32代表int
Int64代表long
Singel代表flaot
引用类型
String字符串类型
用于保存字符和文本数据。String类型的值是包含在一对双引号之间的。
在c#中string 的本质是一个char类型的数组。
String可以直接被当成char类型的数组来用。
string i = "This is 665"; Console.WriteLine(i[1]);
Char类型的数组同样可以被转换为字符串
char[] cArr = {'H','e','l','l','o' }; string cStr = new string(cArr); Console.WriteLine(cStr);
逐字字符串@
逐字字符串@用以避免书写转义字符串,将字符串中的特殊符号当成字符来对待。
string cStr = @"this is \n 665"; Console.WriteLine(cStr);
其写法就是在字符串前面加上一个@符号。
Object类型
在C#中所有的对象、变量、类型,我们都可以称之为是object的子类。
对于任何一个变量、对象、类型,我们都可以将其存储在object类型的变量之中。
object obj = "this is \n 665"; obj = 123; obj = true; Console.WriteLine(obj);
练习:
编写程序实现下图效果:
使用合适的数据类型定义相关变量(255以下用byte、小数是float、身份证qq号可以用string)
输出输入的结果
C#中的类型转换
数据类型在一定条件下是可以相互转换的。
C#允许使用两种转换的方式:隐式转换和显式转换。
隐式转换
隐式转换是自动完成的、不需要用户手动声明就可以完成的转换过程。
这种转换一般是“向上转换”,即由占存储空间小的数据类型向占存储空间大的数据类型转换。
示例:
byte bNum = 255; short sNum = bNum; int iNum = sNum; long lNum = iNum; float fNum = lNum; double dNum = fNum; string strNum = ""+dNum; //用字符串与数值相加的时候,数值类型会自动的被隐式转换为string Console.WriteLine(strNum);
C#中变量的声明
变量只是一个容器,用于存储具体的数值,并且这个容器里的数值是可以变的。
声明变量的过程
数据类型 变量名;
比如:int iNum;
变量名 = 表达式;
比如:iNum = 5;
当然多数情况下我们将两步合为一步:
int iNum = 5;
同时定义多个同类型的变量
比如:
int a, b, c;
同时定义并赋值多个同类型的变量
比如:
int a=1, b=2, c=3;
显式类型转换
就是指必须由用户手动声明的转换过程。
强制类型转换
格式: (类型名称)表达式
将表达式的值的类型转换为类型名称所标识的类型。
示例:int i = (int)’a’;
注意:在强制类型转换的过程中有可能对原本的数值造损失。
decimal dd = 12.3456m; int iNum = (int)dd; Console.WriteLine(iNum);
数据类型之间的转换
toString()
toString()将其他类型的数据转换为字符串。
几乎所有能够用文字描述的数据都可以转换为字符串。
转换格式:
变量或值.toString();
示例:
true.ToString() intNum.ToString()
XXX.Parse(字符串)
将字符串转换为其他类型。XXX代表类型名称,比如double,int,bool等
格式:
XXX.Parse(字符串)
示例:
string strNum = "123"; short sNum = short.Parse(strNum); int iNum = int.Parse((123).ToString()); float fNum = float.Parse(strNum); double ddNum = double.Parse(strNum); decimal dcNum = decimal.Parse(strNum); long lNum = long.Parse(strNum);
XXX.TryParse(字符串)
将字符串转换为其他类型的数体,在转换的过程中需要一个已赋值的临时变量,如果转换成功则临时变量中存放的就是转换之后的值,否则临时变量中保持原值不变。XXX代表类型名称,比如double,int,bool等
格式:
XXX.TryParse(字符串,out 临时变量)
示例:
string strNum = "123"; decimal bTemp = 0; decimal.TryParse(strNum, out bTemp); Console.WriteLine(bTemp);
System.Convert类型转换工具
它为数据类型转换提供了一多种方法,可以将一个基本数据类型转换为另一种基本数据类型。
Convert的类型转换方法有包含:
ToBoolean、ToByte、ToChar、ToDateTime、ToDecimal、ToDouble、ToInt16、ToUint32、ToUint64等等。
示例:
char c = 'B'; int intNum = Convert.ToInt32(c); Console.WriteLine(intNum); char a = Convert.ToChar(intNum); Console.WriteLine(a); string strNum = intNum + "5"; short sNum = Convert.ToInt16(strNum); Console.WriteLine(sNum); float fNum = Convert.ToSingle(sNum); Console.WriteLine(fNum);
as类型转换
通常as 用于引用类型之间的转换,示例:
object obj = "今天星期五"; string sTime = obj as string; Console.WriteLine(sTime);
is关键字:判断变量或数值的类型
示例:
int sTime = 12345; if (sTime is int) Console.WriteLine("这是int"); else Console.WriteLine("不知道是什么");
练习:
1、 定义一个float类型的变量,并存入值123.31。(注意float类型数值的表示方法)
2、 定义一个char类型的变量cc,并存入字符c,将cc进行没类型转换并存入int类型变量i中,将i转换为字符串,并与字符串”51”连接并将结果存入string类型变量ss中,将ss转换为double类型并显示。
3、 将字符串”3.14”与char类型数值”7”都转换为double类型并相加。
4、 将字符串”15784456” 用convert转换为ushort类型,并在控制台中显示出其类型。
5、 从字符串”35624”,取出第三个数字,并显示出来。
运算符与表达式
C#中的变量
变量的命名规则:
1)、由字母、数字或下划线"_"组成。(中文也可以被看作是字母)
2)、必须由字母或下划线"_"开头,不能以数字开头
3)、不能是c#中的关键字 如:int、string、bool、Main、class等
4)、区分大小写 如:小写的a 和 大写的A 是两个变量
命名技巧:
1、驼峰命名法:当一个变量或函数、方法、类名由多个单词构成时,将每个单词的首字母大写,这我们就可以快速的区分单词之间的间隔。
2、在变量名的前面,我们可以用3个字母来表示变量的类型,比如:int、flt(float)、str(string)、dcm(decimal)、dat(dateTime)
3、接口一般以大写字母I 开头,bool类型一般以is开头。
位运算符
将十进制数字转换为二进制之后,再通过与、或、非等逻辑运算,对每个位上的二进制数字进行比较。
按位与&
示例:
int i = 11 & 7;
相当于:
1011
& 0111
------------
0011
其结果为二进制的11,也就是十进制3 。
按位或|
示例:
int i = 11 | 7;
相当于:
1011
I 0111
------------
1111
其结果为二进制的1111,也就是十进制15 。
位相等^
示例:
int i = 11 ^ 7;
相当于:
1011
^ 0111
------------
1100
其结果为二进制的1100,也就是十进制12 。
按位取反~
只操作一个数字,将该数字中为1的位变成0,为0的位变成 1
移位运算符
就是对二进制数,进行乘以10或除以10的操作。相当于给数字乘以十进制的2 。
int i = 11 <<1;
结果为22
三元运算符
由一个逻辑表达式来控制,逻辑表达式为true时返回第一个值,为false时返回第二个值。
格式: 逻辑表达式 ? 第一个值 : 第二个值 ;
示例:
string strResult = (11 <1)?"成立":"不成立";
运算符的优先级
1、括号:()、[]
2、一元运算符:!、+(正)、-(负)、++、--
3、乘除:*、/、%
4、加减:+(加)、-(减)
5、位移运算符:<<、>>
6、关系运算符:<、>、<=、>=、 ==、!=
7、位运算符:& | ^
8、逻辑运算符:&&、|| (先运算逻辑与,再运算逻辑或)
9、三元运算符:?:
10、赋值运算:=、+=、-=、*=、/=、%=、 (&=、|=、^=、~=)
关于除法的说明
运算结果的类型和参与运算的类型中最高的类型一致,影响最大的是除法,整数除以整数结果还是整数,例如10/3的结果是3,而不是3.333 。所以必须要先将两个数字转换为浮点或decimal类型,再相除。
表达式的概念
就是用运算符或者方法将变量连接起来进行运算,终得到一个确定的结果的运算式。
条件判断语句
if
switch单值判断
示例:
string strInput=Console.ReadLine(); switch (strInput) { case "a": Console.WriteLine("a级"); break; case "b": Console.WriteLine("b级"); break; default: //当上面所有的条件都不满足时执行这里 Console.WriteLine("XXXXXX"); break;
注意事项:
1 |
控制表达式的数据类型可以是sbyte、byte、short、uint、long、 ulong、char、string或枚举类型(后两种类型我们随后会讲到) |
2 |
每个case标签中的常量表达式必须属于或能隐式转换为控制表达式的类型 |
3 |
如果有两个或者两个以上case标签中的常量表达式值相同,编译时将会报错 |
4 |
switch语句中最多只能有一个default标签 |
5 |
要求每个标签项后使用break语句或跳转语句goto(稍后将会讲到) |
练习:
一、 请编写一个程序实现:输入一个长方形的长和宽,输出其长方形的面积
二、 输入一个华氏温度,要求输出摄氏温度;公式为:C=5/9(F-32);C表示摄氏温度,F表示华氏温度
三、 编写程序求圆的周长和面积,要求根据输入的圆的半径计算出圆的周长和面积(c:周长,s:面积,r:半径,π=3.14)
公式:c=2πr; s=πr2
四、 编写程序求长方体的体积和表面积,要求根据输入的长方体长、宽、高计算出长方体的体积和表面积(L:长,W:宽,H:高,V:体积,S:表面积)
公式:v=l*w*h; s=2(l*w+w*h+h*l);
五、 判断输入的年份是否为闰年,只需要满足下面条件之一即为闰年
a) 能被4整除,且不能被100整除
b) 能被400整除
1.编写小程序实现任意输入两个数,判断其大小并输出较大数!
2.编写小程序实现任意输入两个两位以上的整数,找出最后一位并且判断大小,输出判断结果!
3.编写小程序实现任意输入两个整数,第一个数要求是两位以上的整数,找出第一个数末尾那位数,用它除以第二个数,输出运算结果!
4.输出3的前面一个数字和后面一个数字!实际上就是将char类型的字符3转换为int类型,加一或减一之后再转回char类型。
5.编写小程序实现任意输入两个数,判断其大小;将大的一个数和10取模,将取摸的结果输出!
6.编写小程序实现任意输入两个数,判断其是否相等,如果相等,就输出“相等”,否则输出“不相等”!
7.编写小程序实现输入一个五位数,分别取出个位上的数、十位上的数、百位上的数、千位上的数、万位上的数,分别输出这五个数!
8.(思考题)任意输入一个三位整数,并且分别取出个位上的数,十位上的数,百位上的数;如果这三个数都不等于4并且取出的三位数之和等于8,则输出“恭喜你,中了八毛钱!”,如果不等8,则找出这三个数种最大的一个数,输出那个最大数和“下次继续努力吧!”这句活!
1.编写小程序实现任意输入两个数,求两个数的加、减、乘、除,并且分别输出结果。
2.编写小程序实现任意输入一个整数,输出该数字的最后一位。
3.编写小程序实现任意输入五个人的年龄,并求出平均年龄,并且输出。
4.编写小程序实现一种商品(数量,单价任意输入),输出总价.
5.在第四题的基础上实现三种商品的总价计算,输出应付多少钱。
1、使用三元操作符求三数的最大值。
2、使用三元操作符求三数的最小值。
3、输入一个四位数,分别求出个位,十位,百位,千位。
一、 输入一个五位以内的数字,输出该数字是几位数
二、 输入三条边,判断给定的三条边是否能组成三角形,如果能,再判断是等边三角形、等腰三角形还是普通三角形
三、 输入5个数字,判断这5个数字是否存在重复的数字,如果存在则输出yes,否则输出no
四、 编写一个小程序判断输入的正整数是否既是5又是7的整倍数.若是,则输出yes,否则输出no。
五、 编写一个小程序,有一函数如下
输入X 的值,输出对应Y 的值.
六、(思考题)编写一个小程序实现:输入一个整数,判断它能否被3,5,7整除,并输出以下信息之一:
- 能同时被3,5,7整除;
- 能被其中两个数整除(要指出那两个数);
- 能被其中一个数整除(指出那一个);
- 不能被3,5,7任一个整除。
1、输入一个时间(整数),时间在6~10点之间输出“上午好”,在11~13点之间输出 “中午好”,在14~18之间输出“下午好”,其他情况输出“休息时间”。
2、使用IF语句,判断四数的最大值 。
3、从键盘输入两个数,然后输入一个运算符号,使用if语句和switch语句判断输入的运算符号是"+、-、*、/、%"中的哪一个,然后对输入的两个数进行相应的计算。
4、判断任意年份是不是闰年。(条件:能被4整除却不能被100整除或者能被400整除的年份是闰年)
第一题:
有一个函数:
y = x (x<1)
y = 2x-1 (1<=x<10)
y = 3x-1 (x>=10)
写一程序,输入x,输出y值。
第二题:
有3个整数a、b、c,由键盘输入,输出其中最小的数。
要求:用if语句编写程序。
第三题:
企业发放的奖金根据利润提成。利润I小于或等于10万元的,奖金可提成10%;利润高于10万元,低于20万元(100000<I<=200000)时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%,200000<I<=400000时,低于20万的部分仍按上述办法提成(下同),高于20万元的部分按5%提成;400000<I<=600000时,高于40万的部分按3%提成;600000<I<=1000000时,高于60万的部分按1.5%提成;I>1000000时,超过100万元的部分按1%提成。从键盘输入当月利润I,求应发奖金总数。
要求:用if或switch语句编写程序
第四题:
实现一个简单的四则运算计算器。
要求:参与运算的两个数值和运算的类型均从控制台输入,顺序为:第一个操作数、第二个操作数、运算类型;用switch语句编写程序。
循环与数组
关于VS的一些操作说明
运行
F5 : 调试 à 启动调用
Ctrl + F5: 调试 à 开始执行(不调试)
调试
断点
我们启动调试的时候,程序的执行过程就会处于VS的控制和监督之下的,此时我们就可以用多种方式来观察的程序的运行状态。
所谓断点,就是让程序在执行到某行代码的时候暂停,让我们可以看到程序的状态。
F11逐语句执行
让程序一条一条的执行。
监视
在程序进入调试状态之后,会显示局部变量和监视窗口,在这些窗口中我们可以跟踪程序中出现的变量和对象的变化。
比如在监视窗口中,我们可以指定众多变量中需要监视的那个变量,并且可以对这个变量进行运算,或调用其属性与方法。
熟练的使用调试工具,能够极大的提高我们在编程时解决Bug的能力。
VS中的项目的管理
一个项目的构成
查看一个项目所包含的所有文件:
通过右击项目名称 à 在windows资源管理器中打开文件夹 à 就可以看到这个项目的文件了
其中:
文件:解决方案名称.sln与 解决方案名称.suo 就是我们的解决方案文件,我们可以把它理解为是项目中所有项目和文件的一个目录清单。通过双击打开这个文件,我们就可以在VS中打开整个解决方案及软件项目。
解决方案中可以包含多个软件项目。每多包含一个项目,sln文件所在文件夹中就会多一个子目录。
文件:项目名称.csproj (c sharp project)就是有指C#所编写的软件项目。
扩展名为cs的文件,就是我们所编写的c#类文件。
目录bin:用户存放用户编写的代码运行之后,编译的结果,也就是exe可执行文件与dll动态链接库就放在此处。
对于控制台应用程序和winform桌面应用程序来说,这个文件夹复制到其他地方里面的exe文件也是可以直接运行的。
目录obj:用于存放引用的类库文件,不需要用户手动去维护它。
目录properties :用于存放当前程序集的配置参数和信息。
在一个解决方案中创建多个项目
打开当前项目 à vs的“文件”菜单 à 添加 à 新建项目
启动项
在一个解决方案中允许包含多个项目。但一次只能执行一个项目。因此如果我们需要在解决方案中指定默认运行某一个项目的话,需要将这个项目设为启动项:
在项目名称右键菜单à设为启动项
运行非“启动项”的项目
在项目名称右键菜单 à 调试 à 启动新实例
在项目名称右键菜单 à 调试 à 进入并单步执行新实例(一开始就让程序一条一条的逐语句执行)
行号
显示行号:工具菜单 à 选项 à 文本编辑器 à 所有语句 à 打上“行号”前的对勾
选择一行代码:单击行号。
选择多行代码:在行号上拖动鼠标。
变量的重命名
Ctrl + r + r
改变指定变量位于多处的变量名
关于数据类型的补充说明
关于实数的运算
decimal deNum = 1.0m / 7.0m; double dbNum = 1.0 / 7.0; float fltNum = 1.0f / 7.0f; Console.WriteLine(deNum); Console.WriteLine(dbNum); Console.WriteLine(fltNum); 此例中可以看出三种精度的实数运算中的差异。 注意:整形除以整形还是整数,即使你将结果放入小数类型中。
变量的作用域
在方法、if判断、for循环等范围内定义的变量,只能在其所定义的大括号{}内部起作用,超出范围之后就无法再调用了。
我甚至可以用 { } 制造一个单纯的作用域。
{ int num = 5; }
循环
While循环
do while循环
至少会被执行一次
do { Console.WriteLine("这是一个循环"); string ss = Console.ReadLine(); if (ss == "stop") i = 2; } while (i == 1);
for循环
int ii = 0; for (int i = 1; i <= 100; i++) { ii += i; } Console.WriteLine(ii);
for循环的简略写法
简略写法下for循环可以直接被当成while来使用
int i = 0; for (; i < 10; ) { i++; Console.WriteLine(i); }
这个for循环中我们省略了“循环变量的定义”与“步长计算的部分”。
同时使用多个循环变量
for (int i =0, j=3 ; i < 10 || j<30 ; i++,j+=3 ) { Console.WriteLine("当前i的值是{0} j的值是{1}",i,j); }
其中,i和j都是参与循环判断的变量,两者在初始语句和步长语句中,以逗号分隔,每次循环的时候,都会同时执行 i++和j+=3的操作,并且判断i < 10 || j<30是否成立。
foreach遍历循环
用于对一个集合(比如:数组)中的每一项依次进行访问。
语法:
foreach(临时变量类型 临时变量名 in 集合)
{
循环体
}
其中,每次循环从“集合”中取出一项存入“临时变量”。
临时变量的类型必须与集合中取出的每一个元素的都要匹配。
break
中断循环,并且直接退出循环。
continue
跳过本次循环中余下的语句,而直接开始下一次循环。
goto
无规则跳转
当程序执行到goto语句时,就会直接跳转到指定的标号处。比如:
int[] iArr = new int[] {7,8,9,1,2,3,4,5,6,7,8,9 }; foreach (int item in iArr) { Console.WriteLine(item); goto sos; //跳转 } sos: ; //标号
注意:标号后面必须要跟一个冒号
一般情况下要避免使用goto语句,以免破坏程序的可读性和逻辑性。
C#中的数组
数组中的数据类型
1、C#中的数组之中的所有数据的类型必须是一致的,数组可以看成是多个相同类型的数据的组合,对这些数据进行统一的管理。
2、数组变量本身是属于引用类型的。
3、数组中包含的数据元素,可以是引用类型或者值类型。
声明数组
1、声明数组类型,也就是同时声明了数组中所有数据元素的数据类型。
int[] intArr; //声明一个int类型的数组 double[] dblArr; char[] chrArr; string[] strArr;
语法格式:
数据类型[] 数组的名称;
2、确定数组的长度,在C#中数组的长度是固定的。
int[] intArr; intArr = new int[5]; int[] intArr2 = new int[5];
3、数组元素的赋值
int[] intArr = new int[5]; intArr[0] = 2; intArr[1] = 2*4; intArr[2] = 4+intArr[1]; intArr[3] = 2/1; intArr[4] = 231%2; Console.WriteLine(intArr[4]);
数组的三要素
1、 C#中的数组之中的元素的数据类型必须是统一的。
2、 C#中的数组的长度必须是固定的。
3、 数组的下标必须是从0开始的。
数组的使用
数组的初始化与赋值
int[] intArr = new int[2]; //数组的初始化 intArr[0] = 2; intArr[1] = 2*4;
数组初始化的同时向数组中赋值
int[] intArr = new int[5]{ 1,45,3,4,5}; int[] intArr = new int[] { 1, 45, 3, 4, 5 }; int[] intArr ={ 1, 45, 3, 4, 5 };
数组的Length属性
代表数组的长度,能包含多少个数据元素。
int[] intArr ={ 1, 45, 3, 4, 5 }; Console.WriteLine(intArr.Length);
遍历数组
for循环 int[] intArr ={ 1, 45, 3, 4, 5 }; for (int i = 0; i < intArr.Length; i++) { Console.WriteLine(intArr[i]); } foreach循环 int[] intArr ={ 1, 45, 3, 4, 5 }; foreach (int temp in intArr) { Console.WriteLine(temp); }
多维数组
二维数组的声明
声明格式:
数据类型[,] 数组名;
比如:int[,] myArr;
初始化一个三行五列的数组
int[,] myArr; myArr = new int[3, 5];
方法二
int[][] myArr2 = new int[3][]; myArr2[0] = new int[5]; myArr2[1] = new int[5]; myArr2[2] = new int[5];
二维数组的赋值
int[,] myArr = new int[3, 5]; myArr[0, 0] = 15; //1行1列 myArr[0, 1] = 19; //1行2列 //.......... myArr[3, 5] = 50; //3行5列
方法二
int[][] myArr2 = new int[3][]; myArr2[0] = new int[5]; myArr2[1] = new int[5]; myArr2[2] = new int[5]; myArr2[0][0] = 1; myArr2[0][1] = 2; //........ myArr2[2][4] = 15; Console.WriteLine(myArr2[2][4]);
方法三
int[,] myArr3 = {{1,2,3},{4,5,6},{7,8,9} };
二维数组的遍历
int[,] myArr3 = {{1,2,3},{4,5,6},{7,8,9} }; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { Console.Write(myArr3[i,j] + "\t"); } Console.WriteLine(); }
三维数组的定义与遍历
int[,,] myArr3 = {{{1,2},{3,4}},{{5,6},{7,8}}}; for (int x = 0; x < 2; x++) { for (int y = 0; y < 2; y++) { for (int z = 0; z < 2; z++) { Console.Write(myArr3[x,y,z]+"\t"); } Console.WriteLine(); } Console.WriteLine("---第{0}页----",x); }
关于char与string类型的关系
一个字符串可以被看做是一个char类型的数组
将字符串做为char类型数组使用
string str = "hello"; char chr = str[1]; Console.WriteLine(chr);
char类型数组转变为字符串
char[] cArr = new char[] { 'a', 'p', 'p', 'l', 'e' }; string str = new string(cArr); Console.WriteLine(str);
数组练习
一、将”I Love C#!” 反序输出,输出结果为 “!#C evoL I”
二、
(1)、定义一个存储学员姓名的字符串数组,和一个存储学员分数的float 类型的二维数组(二维数组用于表示每位同学的语文、数学、英语成绩)。
定义并添加至少5位学生的数据之后,按如下格式将所有信息显示出来:
姓名 |
语文 |
数学 |
英语 |
小强 |
87 |
98 |
95 |
小白 |
65 |
65 |
84 |
小花 |
87 |
73 |
82 |
小黑 |
99 |
93 |
67 |
小王 |
43 |
93 |
74 |
(2)、依具上表中数据的求出每位同学的总分。
(3)、依具上表中数据的求出全班各科的平均分,显示如下:
姓名 |
语文 |
数学 |
英语 |
总分 |
小强 |
87 |
98 |
95 |
xx |
小白 |
65 |
65 |
84 |
xx |
小花 |
87 |
73 |
82 |
xx |
小黑 |
99 |
93 |
67 |
xx |
小王 |
43 |
93 |
74 |
xx |
平均分 |
xx |
xxx |
xx |
(4)、显示出语文成绩高于平均分的同学的名字。
冒泡排序
int[] nums = new int[9] { 1,13,-6,85,23,57,2,6,4}; for (int i = 0; i < nums.Length; i++) { for (int j = i; j < nums.Length; j++) { if (nums[i] < nums[j]) { int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } } Console.WriteLine(nums[i]); }
生成随机数
Random rad = new Random(); int i = rad.Next(0,100); Console.WriteLine(i);
练习:
1、随机产生9个1-100之间数据,存入一数组中,然后对该数组中的元素,进行从小到大的排序,并输出排序后的数组结果。
2、向已存在的数组的中间位置插入一个数字,这个数字由控制台手动输入,并输出插入数据之后的数组。
3、从数组中删除一个数字(如果存在则直接删除,并显示出删除数字之后的数组元素,如果不存在,则提示并要求重新输入)
4、输出杨辉三角的前10行,效果图如下。
静态方法
静态方法是属于面向对象的概念,目前在我们还不具备面向对象思维的情况下,我们可以将它理解为javascript里的function函数。也就是用于将一段代码封装起来,并且给它起一个名字,以方便在其他地方调用这段代码。
静态方法的定义格式:
public static 返回值的类型 方法名(参数列表)
{
//方法所包含的代码
return 返回值
}
其中:
public
(公共、公有)它的意思是允许该方法在其他的位置被调用。
static
(静态、静电) 表示这个方法是一个静态方法,也就是可以直接通过class的名字来调用的方法。
返回值类型
在js中function可以返回一个值,在C#的静态方法中同时可以返回一个值。
此处的“返回值的类型”就是指return之后的需要返回的值的数据类型。
其中,void代表没有返回值:示例:
public static void getName() { Console.WriteLine("大家好,我的名字叫宋小宝"); }
方法名
就是自定义的方法名称,在其他地方调用这个方法时就需要使用这个名称。
注意:方法名的后面必须有一必圆括号。
命名规则:必须以字母、’_’或 ’$’ 开头,也可以包含数字,但是不能以数字开头(C#的方法名允许使用汉字);
参数列表
就是方法运行的时候我需要提供并传入给方法的参数。
声明传入参数时,类型在前,名称在后,参数和参数之间使用逗号进行分割。
public static void getName(string userName , int age) { Console.WriteLine("大家好,我的名字叫{0}今年{1}岁",userName,age); }
return 返回值
return与js中的作用相同。
在没有返回值的情况下,可以省略return。
其作用:一是中断方法,也就是说后面的代码不会再被执行了。
public static void getName() { return; }
二是用于返回一值
public static int getArea(int w,int h) { return w*h; }
练习:
1、让程序重复要求用户输入一个圆的半径,然后显示圆的面积。计算圆面积的过程要封装到一个方法里面。
2、将计算工资的过程封装到一个静态方法中,工资=基本工资 - 迟到次数*30 – 旷工天数*日薪*3 – 请假天数*每天工资 。用这个静态方法,计算出至少三个人的工资。
3、编写一个方法,要求输入你的月工资、每月开支、房价,返回需要多少年多少月能买得到这个房子。
4、将判断闰年的过程封装到一个静态方法中,既可以被4整除又不能被100整除,然后让用户输入年份以判断。
5、在一个方法内部调用这个方法自身,以此形成循环。用这种循环来计算1到100之间的整数之合。
递归
递归,就是在一个方法内部去调用方法自身,以此来实现循环。
注意事项:
在静态方法中调用外部的变量和方法时,被调用的变量或方法必须也是static静态的。这是因为,和静态变量会在程序被启动的时候就创建。而非静态的方法或变量只有在执行的时候,才会被创建。
示例:
1、递归循环5次
static void Main(string[] args) { showMsg(); } static int times = 0; public static void showMsg() { times++; Console.WriteLine("这是一个递归方法"); if (times < 5) showMsg(); else return; }
递归的时候,需要用一个外部的变量来控制循环的次数。也就是超过次数就return 。
2、求1-100之间所有3的倍数。
static void Main(string[] args) { bei3(); } static int i = 0; public static void bei3() { i++; if (i < 100) { if (i % 3 == 0) Console.Write(i+"\t"); bei3(); } else { return; } }
3、用递归的方法输出1-200之间,个位为3的数字。
static void Main(string[] args) { bei3(); } static int i = 0; public static void bei3() { i++; if (i < 200) { if (i % 10 == 3) Console.Write(i+"\t"); bei3(); } else { return; } }
字符串操作与常用方法
字符串
字符串是引用类型的数据,并且在本质上字符串是不能被修改的,当我们在C#中改变一个字符变量的值时,实际上我们是在堆内存中创建了一个新字符串,然后让原来的变量名去引用这个新的字符串。
Length
字符串所包含的字符长度。
string ss = "hello everyBody"; Console.WriteLine(ss.Length);
String.Empty
代表空字符串,注意:这个String的S是大写,String与string是两个不同的类。
插入字符串
就是指在字符串的指定位置插入一个新的字符串。String类提供的insert()方法。
示例:
string ss = "hello !!!!"; ss = ss.Insert(6,"665"); Console.WriteLine(ss);
从字符串中移除指定字符
格式:
Remove(int startIndex)
从字符串中startIndex开始移除后面所有字符。
Remove(int startIndex,int count)
从字符串中startIndex开始移除后面count个数的字符。
示例:
string ss = "hello 665 !!!!"; ss = ss.Remove(6,3); Console.WriteLine(ss);
替换字符串
替换字符串是指将字符串中指定的内容用新的内容替换掉,它通过String类的Replace()方法实现该功能。该方法的示例如下:
string ss = "hello 665 !!!!"; ss = ss.Replace("hello","你好"); Console.WriteLine(ss);
连接字符串
将数组中的元素连接成一个字符串,且各个字符被指定的字符串隔。
string[] strArr = new string[3] { "小明","小白","小强"}; string afterJoin = String.Join("+",strArr); Console.WriteLine(afterJoin);
分隔字符串
将一个被指定的分隔符分隔为多个子字符串的string 进行分隔,并返回由子字符组成的字符串数组。
string str = "tom_jerry_jim_green_jake_rose"; string[] sArr = str.Split('_'); for (int i = 0; i < sArr.Length; i++) { Console.WriteLine(sArr[i]); }
填充字符串
String类提供了PadRight()和PadLeft()方法实现该功能。其中,PadRight()方法在字符串的右边填充字符。PadLeft()方法在字符串的左边填充字符。
string str = "12345"; str = str.PadLeft(10,'0'); Console.WriteLine(str);
这两个方法的第一个参数,是指填充后的字符串有多少个字符,不足的部分用第二个char类型参数补齐,如果省略第二个参数,则用空格来补齐。
在字符串中查找
在字符串在查找到第一个匹配的字符或字符串的位置。
string str = "that is 665"; int p = str.IndexOf("is"); Console.WriteLine(p); LastIndexOf()
从后向前寻找字符串中的匹配的子字符串,但其显示的位置还是按从左到右的方向数出来的。
string str = "665,that is 665"; int p = str.LastIndexOf("66"); Console.WriteLine(p);
字符串的其他一些方法
Equals(string value) 返回一个bool型,比较两个字符串是否相等,类似”==”
str.Equals("665")
Compareto(string value) 判断大小,(比较unicode码表中的位置)大返回1,小返回-1,相等返回0
string str = "xb";
Console.WriteLine(str.CompareTo("xa"));
ToLower() 全部转换为小写
ToUper() 全部转换为大写
Trim(); 去掉前后空格
字符串String.Format的格式化
拼接字符串
string ss = String.Format("今天星期{0},出去{1}", "六", "溜一溜"); //ss = "今天星期" + "六" + ",出去" + "溜一溜"; Console.WriteLine(ss);
IsNullOrEmpty()
用于判断一个字符串是null或者空字符。
string ss = ""; if (String.IsNullOrEmpty(ss)) Console.WriteLine("ss是空的");
IsNullOrWhiteSpace()
用于判断一个字符串是null、空格或者空字符。 string ss = " "; if (String.IsNullOrWhiteSpace(ss)) Console.WriteLine("ss是空的");
练习:
定义十个英文单词,放在一个string类型的字符串里面,对这些单词按照字母顺序进行排序。
提示:就是在冒泡排序中使用compareTo逐各进行比较。
C#中的数字函数
Math在C#中代表数学运算相关的函数库。
求绝对值:
int i = -123; Console.WriteLine(Math.Abs(i));
向上取整:
只要包含小数,就会进位。 decimal de = Math.Ceiling(123.001m); Console.WriteLine(de);
向下取整:
舍弃小数部分
decimal de = Math.Floor(123.999m); Console.WriteLine(de);
四舍五入取整:
decimal de = Math.Round(123.4m); Console.WriteLine(de);
次方:
运算结果是参数x的y次方。
Math.Pow(x,y); double de = Math.Pow(2,4); Console.WriteLine(de);
返回两个数中的最大/小值
int i = Math.Min(99,33); Console.WriteLine(i); 或 int i = Math.Min(99,33); Console.WriteLine(i);
开平方根
double i = Math.Sqrt(16); Console.WriteLine(i);
正弦余弦正切
double i = Math.Sin(0.5); double i = Math.Cos(0.5); double i = Math.Tan(0.5);
判断一个数值的正负
1代表正数,-1代表负数,0代表零。
double i = Math.Sign(0);
关于 toString()
string money = (123.456).ToString("n"); //结果是123.46 money = (123.456).ToString("C"); //显示数字和人民币符号 money = (123.456).ToString("e"); //结果科学计数法 money = (123.456).ToString("f8"); //显示8位小数 money = (123.456).ToString("p"); //转换为百分制 Console.WriteLine(money);
DateTime时间类型
Now返回当前时间与日期
示例:
Console.WriteLine(DateTime.Now );
只返回当前时间
string strTime = DateTime.Now.ToShortTimeString(); //时间没有秒数 strTime = DateTime.Now.ToLongTimeString(); //包含了秒数的时间 Console.WriteLine(strTime);
只返回当前日期
string strTime = DateTime.Now.ToShortDateString();
得到时间中的小时
DateTime dt = DateTime.Now; //定义一个时间类型的变量dt,并将当前时间赋值给它。 Console.WriteLine(dt.Hour);
得到时间中的各个单独的部分
DateTime dt = DateTime.Now; //定义一个时间类型的变量dt,并将当前时间赋值给它。 Console.WriteLine(dt.Hour); //小时 Console.WriteLine(dt.Minute); //分钟 Console.WriteLine(dt.Second); //秒 Console.WriteLine(dt.Year); //年 Console.WriteLine(dt.Month); //月份 Console.WriteLine(dt.Date); //时间中的日期部分 Console.WriteLine(dt.Day); //一个月的第几天 Console.WriteLine(dt.DayOfWeek); //星期几 Console.WriteLine(dt.DayOfYear); //一年中的第几天
创建指定时间的时间类型变量
DateTime dt = new DateTime(2016,3,23,9,30,8); DateTime dt2 = new DateTime(2016, 3, 28);
以中文格式显示时间变量中的日期部分
DateTime dt = new DateTime(2016,3,23,9,30,8); Console.WriteLine(dt.ToLongDateString());
为文件生成时间以作为文件名
DateTime dt = DateTime.Now;
Console.WriteLine(dt.ToFileTime());
关于时间的运算
DateTime dt = new DateTime(2016,3,23,9,30,8); dt = dt.AddYears(1); dt = dt.AddMonths(-1); dt = dt.AddDays(3); dt = dt.AddHours(1); dt = dt.AddMinutes(3); dt = dt.AddSeconds(3); Console.WriteLine(dt.ToLongDateString()+" "+dt.ToShortTimeString());
时间的比较
将两个dateTime类型变量进行比较,其差值为负返回-1, 相等返回0,差值为正返回1。
DateTime dt = new DateTime(2016,3,23,9,30,8); DateTime dt1 = new DateTime(2015, 3, 23, 9, 30, 8); int r = dt.CompareTo(dt1); Console.WriteLine(r);
比较两个时间是否相等
DateTime dt = new DateTime(2016,3,23,9,30,8); DateTime dt1 = new DateTime(2016, 3, 23, 9, 30, 8); bool r = dt.Equals(dt1); Console.WriteLine(r);
时间的显示格式
dt.GetDateTimeFormats('D')[0] //2016年3月23日 dt.GetDateTimeFormats('y')[0] //2016年3月 dt.GetDateTimeFormats('D')[1] //2016年3月23日,星期三 dt.GetDateTimeFormats('D')[2] //星期三,2016年3月23日 dt.GetDateTimeFormats('M')[0] // 3月23日 dt.GetDateTimeFormats('t')[0] // 15:11 dt.GetDateTimeFormats('f')[0] //2016年3月23日 15:11 String.Format("{0:d}",dt) //2016-3-23 String.Format("{0:D}",dt) //2016年3月23日 String.Format("{0:f}",dt) //2016年3月23日 15:11 String.Format("{0:F}",dt) //2016年3月23日 15:11:17 String.Format("{0:M}",dt) //3月23日 String.Format("{0:t}",dt) //15:11 String.Format("{0:T}",dt) //15:11:17 String.Format("{0:Y}",dt) //2016年3月
自定义时间的显示格式
DateTime dt = new DateTime(2016,3,23,9,30,8); Console.WriteLine( String.Format("{0:西元yyyy年MM月份dd天HH点mm分钟ss秒ffff毫秒}",dt) );
计算两个时间之间的差
DateTime dt = new DateTime(2016,3,23,9,30,8); DateTime dt1 = new DateTime(2016, 3, 20); TimeSpan span = dt.Subtract(dt1); //定义了一个时间差类型的变量用于存储dt减dt1的差 Console.WriteLine("两个时间相差{0}天{1}小时{2}秒",span.Days,span.Hours,span.Seconds);
得到某月有多少天
int days = DateTime.DaysInMonth(2016,2);
Char类型的常用方法
char cc = '2'; bool isType = char.IsDigit(cc); //用于判断一个字符的内容是否是数字。 Console.WriteLine("字符:{0}是数字为{1}", cc, isType); cc = 'X'; isType = char.IsLetter(cc); //用于判断一个字符的内容是否是字母。 Console.WriteLine("字符:{0}是字母为{1}", cc, isType); cc = '.'; isType = char.IsPunctuation(cc); //用于判断一个字符的内容是否是标点符号。 Console.WriteLine("字符:{0}是标点符号为{1}", cc, isType);
形参与实参
实参
实际参数,变量、常量、具有数值的表达式等等任何,任何包含了实际参数数值的量、常量、表达式我们需要可以称之为是实参。
形参
方法与函数中的传入参数,我们将其称之为是形参,形参的值是不固定的,传入什么值它就是什么值。
注意:值类型的变量作为参数传递到方法的形参里,并且该形参在方法中的值发生变化后,值类型原本的实参变量不会受到影响。
但是,引用类型的变量作为参数传递到方法的形参里,并且该形参在方法中的值发生变化后,引用类型原本的实参变量也会一起变化。
for (int i = 1; ; i++) { if (s > 50) break; if (i % 2 == 0) s += i; Console.WriteLine("i,s=" + i + "," + s); }
练习:
1、提示用户从控制台输入任一字符串,用户输入之后显示字符串的长度,如果长度大于5就显示字符串中的第5个和倒数第二个字符,长度小于5则提示用户长度不够。
2、现有字符串“你好,同学今年岁”,要求用户从控制台输入一个姓名和年龄,并分别用Insert()方法插入字符串中,形成类似“你好,张三同学今年19岁”这样的字符串并显示出来。
3、用remove()移除上例字符串中的“你好,”
4、用replace()将上例中的字符中的“同学”替换为“同志”。
5、现有字符串“小明/小强/小白/小花”,用split()方法将这四个人名分割并形成一个字符串类型数组。然后再用Join()方法连接这个数组中的元素形成“小明和小强和小白和小花”
6、让用户从键盘输入任一数字,数字的长度不能超过10个字符,长度不足10个字符的话,就用PadLeft()将不足的位数补足零,比如:输入2365,显示“0000002365”
7、现有字符串“问此间情为何物,只是一物降一物”,要求用IndexOf()找到“为何”与”降一物”的所在位置,然后用substring()截取中两个位置之间的所有字符。
8、提示用户输入密码,先用IsNullOrWhiteSpace()判断是否为空,再用Trim()去除用户输入时多余的空格,再用compareto()判断密码是否正确,正确密码为admin,然后显示用户是否输入正确。
9、”飞{0}连天射{1}鹿”,要求用户输入两个汉字符,并用string.format()填充到这句话之中,并替换相应的占位符。
10、提示用户输入任一实数,判断用户输入的是否为合法数字(最多只能有一个小数点,且不包含其他字符或字母、汉字等),如果不合法就要求用户重新输入,先对其求绝对值,再计算它的四次方,显示结果。然后再计算它的平方根并显示出来。
11、以中文格式显示当前时间日期,比如:“2016年3月31日,星期四”
12、以自定格式显示当前时间日期,比如:“西元2016历3月31天,礼拜4”
13、假定一个人的寿命为86岁,今年19岁,显示他的生命倒计时还有“X天X小时X秒”。
14、接上题,显示其寿命还剩下多少小时(自己百度)。