我的ASP.NET学习笔记010C#语言基础

cSharp_1_概述

名词描述

C#

是一门语言,语法与javascriptCC++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位数

注意:floatdouble不适合用于进行高精度且频繁的运算,否则在处理小数的位数限制的最后一位时会自动的四舍五入,造成精度的损失。

小数类型(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布尔类型

布尔类型只有两个值truefalse

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代表类型名称,比如doubleintbool

格式:

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代表类型名称,比如doubleintbool

格式:

XXX.TryParse(字符串,out 临时变量)

示例:

string strNum = "123";

decimal bTemp = 0;

decimal.TryParse(strNum, out bTemp);

Console.WriteLine(bTemp);

System.Convert类型转换工具

它为数据类型转换提供了一多种方法,可以将一个基本数据类型转换为另一种基本数据类型。

Convert的类型转换方法有包含:

ToBooleanToByteToCharToDateTimeToDecimalToDoubleToInt16ToUint32ToUint64等等。

示例:

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个字母来表示变量的类型,比如:intflt(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整除,并输出以下信息之一: 

  1. 能同时被3,5,7整除; 
  2. 能被其中两个数整除(要指出那两个数);
  3. 能被其中一个数整除(指出那一个); 
  4. 不能被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个整数abc,由键盘输入,输出其中最小的数。

要求:用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,求应发奖金总数。

要求:用ifswitch语句编写程序

第四题:

实现一个简单的四则运算计算器。

要求:参与运算的两个数值和运算的类型均从控制台输入,顺序为:第一个操作数、第二个操作数、运算类型;用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);

}

其中,ij都是参与循环判断的变量,两者在初始语句和步长语句中,以逗号分隔,每次循环的时候,都会同时执行 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#中的数组

数组中的数据类型

1C#中的数组之中的所有数据的类型必须是一致的,数组可以看成是多个相同类型的数据的组合,对这些数据进行统一的管理。

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);

}

关于charstring类型的关系

一个字符串可以被看做是一个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、随机产生91-100之间数据,存入一数组中,然后对该数组中的元素,进行从小到大的排序,并输出排序后的数组结果。

2、向已存在的数组的中间位置插入一个数字,这个数字由控制台手动输入,并输出插入数据之后的数组。

3、从数组中删除一个数字(如果存在则直接删除,并显示出删除数字之后的数组元素,如果不存在,则提示并要求重新输入)

 
   

4、输出杨辉三角的前10行,效果图如下。

 
   

静态方法

静态方法是属于面向对象的概念,目前在我们还不具备面向对象思维的情况下,我们可以将它理解为javascript里的function函数。也就是用于将一段代码封装起来,并且给它起一个名字,以方便在其他地方调用这段代码。

静态方法的定义格式:

public static 返回值的类型 方法名(参数列表)

{

//方法所包含的代码

return 返回值

}

其中:

public

(公共、公有)它的意思是允许该方法在其他的位置被调用。

static

(静态、静电) 表示这个方法是一个静态方法,也就是可以直接通过class的名字来调用的方法。

返回值类型

jsfunction可以返回一个值,在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 返回值

returnjs中的作用相同。

在没有返回值的情况下,可以省略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、在一个方法内部调用这个方法自身,以此形成循环。用这种循环来计算1100之间的整数之合。

递归

递归,就是在一个方法内部去调用方法自身,以此来实现循环。

注意事项:

在静态方法中调用外部的变量和方法时,被调用的变量或方法必须也是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

代表空字符串,注意:这个StringS是大写,Stringstring是两个不同的类。

插入字符串

就是指在字符串的指定位置插入一个新的字符串。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#中的数字函数

MathC#中代表数学运算相关的函数库。

求绝对值:

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);

次方:

运算结果是参数xy次方。

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、以中文格式显示当前时间日期,比如:“2016331日,星期四”

12、以自定格式显示当前时间日期,比如:“西元2016331天,礼拜4

13、假定一个人的寿命为86岁,今年19岁,显示他的生命倒计时还有“XX小时X秒”。

14、接上题,显示其寿命还剩下多少小时(自己百度)。

猜你喜欢

转载自www.cnblogs.com/yigegaozhongsheng/p/9426720.html