学习C#视频链接:http://www.bilibili.com/video/av1422127/
可以到官网查看安装包或百度下载
下载地址:https://www.visualstudio.com/zh-hans/(官网下载的很容易安装失败啊,还是按照下方的地址安装吧)
VisualStudio2015安装参考教程:
using System;using System.Collections.Generic;using System.Text;namespace Test{ class Program { static void Main(string[] args) { const string CITY = "布宜诺斯艾利斯";//常量,城市 const string NAME = "列奥波尔多·福图纳托·加尔铁里·卡斯特利";//常量,姓名 Console.WriteLine(NAME+"出生在"+CITY+"的一个工人家庭");//使用常量 Console.Write('hello word');//输出不换行 } }}
我们知道声明变量需要写出数据类型,我们今天要学习的是最常用的几种类型。
字符类型 char ,存储用 ” (单引号)括起来的一个字符,例如:
char sex='男';//存储性别
字符串类型 string ,存储用“”(双引号)括起来的一串字符,例如:
string address="北京市宣武区牛街北口";//存储地址
整数类型 int ,存储整数,例如:
int age=23;//存储年龄
双精度浮点型 double ,存储小数,例如:
double salary=7991.63;//存储工资
以上四种是最常用的数据类型,其他常用类型,我们会随着深入慢慢介绍。
需要注意的是,某种类型的变量,只能存储这种类型的数据,否则,可能会出错。
有时候真的需要把不同类型的值放在一起运算,比如这种:3.5+8 这时候怎么办呢?有下面2种情况:
自动类型转换:
(只能由精度低的自动转换为精度高的,不能由精度高的转为精度低的)
2种不同类型的数据运算,低精度类型会自动转换为较高精度的类型。
以3.5+8为例,显然数字8的精度较低(int),而3.5的精度较高(double),所以,8会自动转换为double型,即转换为3.5+8.0进行运算,结果为11.5。
请看这个例子:double d=2; 2的精度显然低于变量d的精度,所以2会自动转换为2.0然后赋值给d。
再看这个例子:int i=3.0;变量i的精度低于3.0,但是由于i已经声明为int型的变量,变量的值可以变,但变量的类型可不能变来变去的,所以这条命令会出错的。
强制类型转换:
无法自动转换为我们需要的类型,可以用强制类型转换,比如上例可以这样完成:
int i=(int)3.0;int i = 2.3;//double型的2.3赋值给int型变量i,double型精度高,无法自动转换为int类型,所以会出现编译错误。
数字前面的(int)表示转换的目标类型为int,3.0会被强制转换为3。
需要注意, double 型强制转换为int型将失去小数部分,比如(int)2.8,我们得到的将是2。
程序中的变量名、常量名、类名、方法名,都叫做标识符。C#有一套标识符的命名规则,如果命名时不遵守规则,就会出错。这套规则简单说有下面三条:
①标识符只能由英文字母、数字和下划线组成,不能包含空格和其他字符。
错误的标识符声明:
string $user; //错在使用了其他字符
②变量名不能用数字开头。
错误的标识符声明:
double 6h;//错在用数字开头
③不能用关键字当变量名。
错误的标识符声明:
char static ;//错在用关键字static做变量名
算术运算符中的加、减、乘、除。
加:+ 。加号有2个用途:当用加号连接两个数字时,会计算出这两个数字的和。比如:
Console.WriteLine(9+2.2);//输出11.2
另一种情况,当加号两边包含字符串的时候,会把两边的表达式连接成新的字符串。比如:
Console.WriteLine(9+"2.2");//输出92.2,因为"2.2"是字符串,所以9也被转换为"9",+起的作用是连接字符串
减:- 。减号的作用就是减法。比如:
Console.WriteLine(15-23);//输出-8
乘:* 。乘号的作用是求2数的乘积。比如:
Console.WriteLine(0.8*3);//输出2.4
除:/ 。除号的作用是求2数相除的商。比如:
Console.WriteLine(2/0.5);//输出4.0
但是,2个整数相除,结果仅保留整数部分,小数部分会被舍去。
Console.WriteLine(5/10);//输出0
C#中的取余运算符就是%。除号的作用是求2个数字相除的商,而取余运算符%的作用是求两个数字相除的余数。比如:
Console.WriteLine(19/5);//求19除以5的商,输出3Console.WriteLine(19%5);//求19除以5的余数,输出4(商3余4)
编程中,%常常用来检查一个数字是否能被另一个数字整除。比如下面的代码片段:
int number = 29;Console.WriteLine(number%2);//求number除以2的余数
如果输出0,表示没有余数,即number能够被2整除(是偶数);如果输出1,表示有余数,即number不能被2整除(是奇数)。
这一节学习两个特别的运算符++和–。
++,叫做自加运算符。比如你今年18岁,明年长了一岁,用代码写出来是这样:
int age=18;//今年18岁age=age+1;//明年,在今年的年龄上加1岁也可以写成这样:int age=18;//今年18岁age++;//明年,在今年的年龄上加1岁age++;与age=age+1;作用相同,都是变量的值+1。
–,叫做自减运算符。同理,你今年18岁,用了XX护肤水以后,明年变成17岁了,可以这样写:
int age=18;//今年18岁age--;//等同于 age=age-1;另外,age++;与age--;也可以写作++age;或--age;
但请注意:如果与其他运算在同一语句中,++写在变量前面或后面,算法不一样,请看下例:
Console.WriteLine(age++);作用等同于下面两句:Console.WriteLine(age);//先打印age=age+1;//后自加Console.WriteLine(++age);作用等同于下面两句:age=age+1;//先自加Console.WriteLine(age);//后打印
你看,运算顺序不一样吧,所以输出的结果也不会相同。
比较数字大小,或者比较数字相等的运算符是比较运算符。C#中的比较运算符有:
== //等于> //大于< //小于>= //大于等于<= //小于等于!= //不等于
注意:表示两个值相等的“等于”是由2个“=”组成的。
比较运算的结果,都是布尔类型( bool ),bool类型我们是第一次提到,它表示逻辑上的真(成立)与假(不成立)。真与假用关键字 true 和 false 表示。
using System;using System.Collections.Generic;using System.Text;namespace Test{ class Program { static void Main(string[] args) { double x = 3.5; int y = 3; Console.WriteLine((int)x==y);// 结果:true } }}
逻辑运算符用来连接多个 bool 类型表达式,实现多个条件的复合判断。C#中的逻辑运算符包括:逻辑非( ! )、逻辑与( && )、逻辑或( || )。
逻辑非用来对某一个 bool 类型表达式取反,即“真变假”或“假变真”。请看下面的代码:
Console.WriteLine(1 > 0);//条件表达式为true,输出TrueConsole.WriteLine(!(1 > 0));//用逻辑非对条件表达式取反,输出False
逻辑与用来判断 2 个 bool 类型表达式是否同时为 true 。请看下面的代码:
int x = 5, y = 2;//同时声明2个int型变量并赋值Console.WriteLine(x>3 && y>3);//判断x>3和y>3是否同时为true,由于y>3为false,所以整个表达式为false
只有当&&两边的表达式均为 true 时,整个表达式才为 true ;若任意一个表达式为 false ,整个表达式即为 false 。
逻辑或用来判断2个 bool 类型表达式中是否有一个为 true 。请看下面的代码:
int x = 5, y = 2;//同时声明2个int型变量并赋值Console.WriteLine(x>3 || y>3);//判断x>3和y>3是否有一个为true,由于x>3为true,所以整个表达式为true
只要||两边的表达式有一个为 true ,整个表达式即为 true ;若两边的表达式均为 false ,整个表达式为 false 。
对比一下,就是说: && 运算符,两边同真才算真,一边为假就算假; || 运算符,一边为真即为真,两边同假才是假。
前面,我们已经学过一个赋值运算符“=”,这次我们学习一下其他的赋值运算符:
加赋值“+=”:先加后赋值。请看下面的例子:
int x=5;x += 2;//这句等同于x=x+2;执行后,x的值为7
减赋值“-=”:先减后赋值。请看下面的例子:
int x=5;x -= 2;//这句等同于x=x-2;执行后,x的值为3
乘赋值“*=”:先乘后赋值。请看下面的例子:
int x=5;x *= 2;//这句等同于x=x*2;执行后,x的值为10
除赋值“/=”:先除后赋值。请看下面的例子:
int x=5;x /= 2;//这句等同于x=x/2;执行后,x的值为2
取余赋值“%=”:先取余后赋值。请看下面的例子:
int x=5;x %= 2;//这句等同于x=x%2;执行后,x的值为1
与其他运算符从左向右计算不同,赋值运算符从右向左计算。
前面我们学习了那么多运算符,如果编程中同时使用了多个运算符,到底哪一个会先运算呢?这就是优先级的问题。C#运算符的优先级请参考下面的顺序:
①括号。学数学的时候我们就知道,要先计算括号里面的内容。C#语言也是一样,如果有多层括号,要从里向外计算。括号优先级最高。
②一元运算符。有些运算符两边有2个操作数,比如2+3、6%5等等,这些叫做二元运算符。只有一个操作数的叫做一元运算符,它们的优先级高于二元运算符。一元运算符包括:++(自加) 、 –(自减) 、 !(逻辑非)。
③*(乘)、/(除)、%(取余)。
④+(加)、-(减)。
⑤>(大于)、<(小于)、>=(大于等于)、<=(小于等于)。
⑥==(等于)、!=(不等于)。
⑦&&(逻辑与)。
⑧||(逻辑或)。
⑨赋值运算符。包括:=、+=、-=、*=、/=、%=。
另外,还需要注意一点:优先级相同的运算符从左向右计算(赋值运算符相反)。
请看下面这段代码:
bool b = 20 - (15 - 8) * 2 > 10 && (2 % 2 * 2 + 2) > 2;Console.WriteLine(b);
分析:首先计算优先级最高的括号,(15-8)得到7,(2%2*2+2)则需要先计算%和*,后算+,结果是2,表达式就变成了:
bool b=20 - 7*2 >10 && 2>2;
接下来优先级最高的是7*2,然后是减法,变成:
bool b = 6 > 10 && 2 > 2;
继续计算两个大于号,得到:
bool b=false && false;
最后的结果当然是false
C#用流程图描述程序逻辑
流程图是程序步骤的图形化表示方法。流程图中包括如下符号:
以上图形中,流程线用来连接相邻的两个步骤;每一个程序都有且仅有一个开始和结束。
参考下面的流程图,完成代码。
using System;using System.Collections.Generic;using System.Text;namespace Test{ class Program { static void Main(string[] args) { double x = 13.9, y = 24.4; double sum = x + y; double avg = sum /2; Console.WriteLine(avg); } }}
C#中判断和分支
走到岔路口,需要选择方向。编写程序也会遇到判断和分支。请看下面的流程图,判断手机账户余额是否不足10元,如果不足给出提示:
在C#中,这个结构成为条件结构,通常用 if 关键字来实现:
using System;using System.Collections.Generic;using System.Text;namespace Test{ class Program { static void Main(string[] args) { double banlance = 9.78;//余额 if(balance < 10) { Console.WriteLine("余额不足,请充值); } } }}
前一节我们学习了 if 条件结构。条件结构可以有2个分支,比如下面的流程图,判断一个整数是奇数还是偶数:
每一个 if…else 结构都包含 1 个条件和 2 个分支,而程序会根据条件的真与假,选择执行其中的某一个分支。条件必须为 bool 类型的表达式。
程序开发中,往往需要先判断一个条件是否成立,再判断另一个条件。比如下面的例子:验证账号是否为“admin”,如果不是则提示错误;如果是,则验证密码是否为“bj2022”:
用C#实现如下:
如果,有多个条件,其中只有一个成立,应该怎样判断呢?比如小明考试,90分以上奖励一台手机,80-89分奖励一个滑板,60-79分奖励一个烧饼,60以下没有奖励,0-100的分数被划分为4档,需要做3次条件判断。如果用上一节学习的嵌套if结构完成,3层if的嵌套会使程序变得很复杂。本节我们使用多重 if 结构实现,它的基本语法为:
if…else 条件结构中,如果某个分支只包含一条命令,那么是可以省略大括号{}的。比如上一节的练习,可以简化为:
请注意,如果分支中包含2条以上的命令,是不能省略{}的。
C#提供了一种条件运算符,能够代替简单的 if…else 结构。这种条件运算符的语法如下:
条件表达式 ? 分支1 : 分支2
?: 就是条件运算符,可以看到它有3个操作数,所以又被称为三元运算符。
它的运算逻辑是:当条件表达式为 true 时,执行分支1;当条件表达式为 false 时,执行分支2。
下面的例子中,根据年龄的大小,输出“成年人”或“未成年人”:
if…else 之外,C#中还有一种 switch 条件结构,可以用来对变量进行多个分支的等值判断。
语法如下:
下面的代码,根据运算符完成了四则运算中的一项:
switch 中的(变量)只能是3种类型:整型(如 int )、字符型( char )、字符串类型( string )。
简单的说,循环是由循环体(需要重复执行的命令)和循环条件组成的。运行时,先判断循环条件,若条件为 true ,就执行循环体一次,然后再判断条件…当条件为 false 时,结束循环。上面的流程图,当变量 x 累加到 11 时,循环条件为 false ,循环就会结束。
C#中,可以用 while 循环结构来实现:
C#中, do…while 循环也是一种常用的循环结构。循环结构各部分运行顺序如下:
从上面的示意可以看出, do…while 循环第一次执行循环体是没有经过条件判断的,也就是说会无条件的执行一次循环体,此后的逻辑
顺序就与while循环相同了——先判断条件,条件为true再执行循环体一次。请看下面的例子:
我们已经学习了C#中最常用的三种循环结构,下面我们小小总结一下:
循环中可以应用 continue 关键字中止一次循环,直接进入下一次。请看下面的例子:
前面学习 switch 结构时,我们曾经遇到过 break 关键字, break 在 switch 结构的作用是“跳出 switch 结构”。
break 关键字还可以用在循环中,作用是“结束循环”。下面的循环代码中,当 x==3 的时候会执行 break :
利用 break 关键字和 true 关键字,我们可以用另一种方式编写循环,下面的代码是输出1-5的整数:
编程中有这样一种情形:我们需要存储多个同类型数据。比如,保存 1600 个学生的年龄。是否需要声明 1600 个 int 类型的变量?过了一年,学生们长了 1 岁,是否需要给每个变量重新赋值?这件事情,想想就怕怕。好在C#中有一种数组,专门存储一组相同类型的数据。数组的声明和初始化语法如下:
数据类型[ ] 数组名 = new 数据类型[长度];
注意:数组名像变量名一样要遵循标识符的命名规则;长度必须是整数
下面我们来比较变量和数组的声明与初始化,右边是在内存中为变量和数组分配空间的示意:
对比变量 x 和数组 y 就会发现,数组 y 中其实包含了 3 个 double 类型的变量,为什么是 3 个?因为初始化数组时在 [ ] 中声明的长度为 3 。既然都在数组 y 中,所以 3 个变量(应该叫数组元素)的名字都叫 y ,为了区分它们,按照顺序给它们加上索引 [0]、[1]、[2] 。请注意:数组的索引从 0 开始递增。那么,数组 y 中 3 个元素的名字就变成了 y[0]、y[1]、y[2] 。
最后再注意一点:
数组经过初始化以后,数组元素有默认的初始值, double 类型为 0.0 , int 类型为 0 , char 类型为 ‘a’ , bool 类型为 false , string 类型为 null 。
数组元素的赋值与普通变量相同。下面的示例中,我们声明了一个长度为 3 的 string 类型数组,逐个赋值,然后打印:
上例中,需要注意的是元素的索引,数组元素索引从 0 开始递增,所以长度为 3 的数组,其元素索引为 [0]、[1]、[2] 。
如何知道一个数组的长度呢? 数组.Length 属性会返回数组的长度(即数组元素的个数)。请看下面的例子:
代码中的 friends.Length 会返回 friends 数组的长度
上一节我们学习了数组的声明和初始化,以及数组元素的访问方法。其实,C#中数组元素有多种初始化方式,请看下例:
上一节我们还学习了数组的一个属性 Length , Length 能够返回数组的长度,利用它和数组元素的索引,我们可以循环访问每一元素。上一节中打印名字的代码,可以这样改进:
通过上例,我们看到,使用数组就能循环访问一组相同类型的变量了,是不是比使用单个变量要轻松呢?
看下方代码哪里错了:
using System;using System.Collections.Generic;using System.Text; namespace Test { class Program { static void Main(string[] args) { //声明整型数组,保存一组整数 int[] num = new int[] { 3,34,42,2,11,19,30,55,20}; //请完善代码,循环打印数组中的偶数 for(int i = 0 ; i<num.Length;i++ ){ if(num[i]%2 == 0){ Console.Write(num[i]+',');//这里不能用单引号,int类型和char类型相加了 // Console.Write(num[i]+",");//双引号才是正确的 } } } } }
for 循环使我们可以通过索引访问数组元素;而 foreach 循环则可以不依赖索引而读取每一个数组元素。下面的示例代码声明了一个整型数组,然后通过两种方法打印数组元素:
运行结果是相同的
使用 foreach 的语法:
查找算法的另一种应用,是检查一组数据中是否包含符合条件的元素,也就是要给出“有”或“没有”的结论。
要解决这种问题,首先要声明一个“开关变量”,用来记录查找的状态;通常,我们把开关变量初始化为 false ,表示没有找到,循环中如果发现了符合条件的元素,则给变量赋值为 true ,并结束查找。循环结束后,就可以判断开关变量: true 表示“有”, false 表示“没有”。
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Test{ class Program { static void Main(string[] args) { //声明整型数组,保存一组整数 int[] num = new int[] { 3, 34, 43, 2, 11, 19, 30, 55, 20 }; //请完善代码,判断数组中有没有7的整倍数 bool has7 = false;//要声明一个“开关变量” foreach (int x in num) { if (x % 7 == 0) { has7 = true;//如果发现了符合条件的元素,则给变量赋值为 true ,并结束查找 break; } } if (has7) Console.WriteLine("有7的整倍数"); else Console.WriteLine("没有7的整倍数"); } }}
二维数组,就是以数组作为元素的数组。挺拗口的,看看它跟一维数组的对比:
右边的 b 是二维数组,数组中包含 2 个 int 型一维数组:b[0]、b[1] 。而 b[0] 和 b[1] 中又分别包含 3 个 int 型变量:b[0,0]、b[0,1]、b[0,2]、b[1,0]、b[1,1]、b[1,2] 。
总结一下,二维数组这样声明:
int[,] arr = new int[2,3]; //包含2个一维数组,每个一维数组包含3个变量,总共2*3=6个数组元素
二维数组元素这样赋值和打印:
arr[1,0] = 28; //二维数组元素有2个索引,都是从0开始,以arr数组为例,元素索引从[0,0]到[1,2]Console.Write( arr[1,0] );
我们可以用二维数组管理相关的数据,比如有 4 名同学参加语文和数学两门考试,我们用二维数组存储他们的成绩,每位同学的 2 门课分数,存储在一个一维数组中:
输出分数最高的同学的姓名和分数
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Test{ class Program { static void Main(string[] args) { string[,] info = new string[8, 2] { { "吴松", "89" }, { "钱东宇", "90" }, { "伏晨", "98" }, { "陈陆", "56" }, { "周蕊", "60" }, { "林日鹏", "9" }, { "何昆", "93" }, { "关欣", "85" } }; string name = ""; string score = ""; for (int i = 0; i < info.GetLongLength(0); i++) { if (string.Compare(info[i, 1], score) > 0) { score = info[i, 1]; name = info[i, 0]; } } Console.WriteLine("分数最高的是" + name + ",分数是" + score); } }}
接收用户输入,并输出用户输入的内容
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Test{ class Program { static void Main(string[] args) { string name; Console.WriteLine("请输入姓名:"); name = Console.ReadLine(); Console.WriteLine("你好," + name); } }}
输入5位同学的姓名和分数,求平均分和总分
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Test{ class Program { static void Main(string[] args) { // 输入分数 求平均分 //声明数组 name string[] name = new string[5]; //声明数组score int[] score = new int[5]; //循环 for (int i = 0; i < name.Length; i++) { Console.Write("请输入" + (i + 1) + "同学的姓名:"); name[i] = Console.ReadLine(); Console.Write("请输入" + (i + 1) + "同学的分数:"); score[i] = int.Parse(Console.ReadLine());//用户输入的是string,这里需要强制转换为int } int sum = 0; int avg; for (int i = 0; i < score.Length; i++) { sum += score[i]; } avg = sum / score.Length; Console.Write("总分:{0},平均分{1}", sum, avg); } }}
int类型的接收语句:int.Parse(Console.WriteLine());(Ps:其他类型模仿)
添加/撤销断点:F9,或直接在左侧点击
调试:F5(第一次开始调试;第二次直接输出结果)
单步执行:F10(一直按F10,则逐步执行,方便查看结果)
停止调试:Shift+F5
注释快捷键:ctrl + k +c
取消注释快捷键:ctrl + k +u
导入命名空间:shift + alt +F10
联系客服