C#入门笔记
using System; //引入命名空间
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MyApp01 //命名空间,组织和管理类
{
class Program //类,是C#的最小单元;
{
///
/// 文档注释用三个斜杠,
/// 写在类、方法或属性的前面
///
//Main方法,程序入口;关键字:小写字母组成,static静态的,void无返回值的
static void Main(string[] args)
{
/*这是一个多行注释
* 的使用符号,
* 可以包含多行
*/
Console.WriteLine("WriteLine打印后会换行01");//命名,以分号结束
Console.Write("Write打印后不换行02");//打印双引号里面的内容
Console.WriteLine("WriteLine打印后换行03");
Console.WriteLine("WriteLine打印后换行04");
//const 表明是一个常量;double 表明类型为“双精度浮点型”
//常量在声明时赋值,并且之后不能修改
const double PI = 3.1415926; //自定义常量PI,表示圆周率
Console.Write("半径为4的圆的周长为:");//字符串常量
Console.WriteLine(2*PI*4);//应用自定义常量PI
Console.Write("半径为4的圆的面积为:");
Console.WriteLine(PI*4*4);
const string CITY = "杭州";
Console.WriteLine(CITY + "是一个常量,城市名");
//声明变量的语法:数据类型 变量名;
int nianling=18;//声明变量,类型为int,变量名为age,并赋值
string hobby = "剑道";
Console.WriteLine("我的年龄是{0}岁" + " 我的爱好是{1}", nianling, hobby);
//算法:交换
string a = "milk";
string b = "coffee";
string temp;//声明一个中间变量,相当于空杯
Console.WriteLine("开始的a=" + a + " b=" + b);
temp = a; //将牛奶先倒入空杯
a = b; //将咖啡倒入牛奶杯
b = temp; //将之前空杯中的牛奶再倒入咖啡杯中
//完成了a和b的交换
Console.WriteLine("此时的a="+ a +" b="+ b);
//数据类型
//字符类型char,存储用' '单引号。
char sex = '男';
//字符串类型string,存储用" "双引号。
string name = "张三";
//整数类型int,存储整数。
int age = 23;
//双精度浮点型double,存储小数。
double salary = 27991.63;
//浮点型float,值后面加f;
float height = 1.75f;
//字符串中用{0}~{4}表示将会输出5个变量的值,而五个变量依次写在字符串后面。
Console.WriteLine("我叫{0},是{1}生,今年{2}岁,身高{3}米,薪水{4}元。", name, sex, age, height, salary);
/* 类型转换
* 自动类型转换:2中不同类型的数据运算,低精度类型会自动转换为较高精度的类型。
* 例如:3.5+8会转换为3.5+8.0
* 例如:double d=2; 2会自动转换为2.0
* 但是,int i=3.0;会出错,double型精度高,无法自动转换为int类型
* 强制类型转换:无法自动转换为需要的类型,可以强制类型转换
* 例如:int i=(int)3.6;这样3.6会被强制转换为3
*/
/* C#标识符的命名规则
* 程序中的变量名、常量名、类名、方法名,都叫做标识符。
* C#有一套标识符的命名规则:
* 标识符只能由英文字母、数字和下划线组成,不能包含空格和其他字符。
* 变量名不能用数字开头。
* 变量名不能用关键字。
*/
/* 算术运算符
* 加号有2个用途:
* 当用加号连接两个数字时,会计算出这两个数字的和。
* 当加号两边包含字符串的时候,会把两边的表达式连接成新的字符串。
*/
Console.WriteLine("(int)3.6+字符串2.2={0}", (int)3.6 + "2.2");//输出为32.2
//除号的作用是求2数相除的商。
Console.WriteLine("2除以0.5等于{0}", 2 / 0.5);//输出4.0
//2个整数相除,结果仅保留整数部分,小数部分会被舍去。
Console.WriteLine("5除以10等于{0}", 5 / 10);//输出0
//取余运算符%的作用是求两个数字相除的余数
Console.WriteLine("19除以5的商等于", 19 / 5);//输出3
Console.WriteLine("19除以5的余数", 19 % 5);//输出4(商3余4)
//编程中,%常常用来检查一个数字是否能被另一个数字整除。
int number = 29;
Console.WriteLine("求某数字除以2的余数为{0},输出1表示该数为奇数", number % 2);
//如果输出0,表示没有余数,即number能够被2整除(是偶数);
//如果输出1,表示有余数,即number不能被2整除(是奇数)。
//++,叫做自加运算符。
age++;//与age=age+1;作用相同,都是变量的值+1。也可以写作++age
Console.WriteLine("今年23岁,明年为{0}岁", age);
//--,叫做自减运算符。
age=23;
Console.WriteLine("今年23岁,去年为{0}岁", --age);
++age;
Console.WriteLine(age);
//如果与其他运算在同一语句中,++写在变量前面或后面,算法不一样,请看下例:
Console.WriteLine(age++);//输出值为age,并没有自加
/* 作用等同于下面两句:
Console.WriteLine(age);//先打印输出
age = age + 1;//后自加,只是赋值,不输出
*/
Console.WriteLine(++age);
/*作用等同于下面两句:
age = age + 1;//先自加
Console.WriteLine(age);//后打印输出
*/
/* 比较运算符
* 比较运算的结果,为布尔类型(bool),表示逻辑上的成立(true)与不成立(falase)。
* 全等于==; 不等于!=; 大于>; 小于<; 大于等于>=; 小于等于<=;
* 逻辑运算符
* 逻辑运算符用来连接多个 bool 类型表达式,实现多个条件的复合判断。
* 逻辑运算符包括:非( ! )、与( && )、或( || )。
* 逻辑非:用来对某一个 bool 类型表达式取反
* 逻辑与:用来判断 2 个 bool 类型表达式是否同时为true。
* 逻辑或:用来判断2个 bool 类型表达式中是否有一个为 true
* && 运算符,两边同真才算真,一边为假就算假;
* || 运算符,一边为真即为真,两边同假才是假。
*/
Console.WriteLine(true || false);//输出True
Console.WriteLine(true && false);//输出False
Console.WriteLine(!false);//输出True
/* 赋值运算符
加赋值“+=”:先加后赋值;x+=2等同于x=x+2
减赋值“-=”:先减后赋值;x-=2等同于x=x-2
乘赋值“*=”:先乘后赋值;x*=2等同于x=x*2
除赋值“/=”:先除后赋值;x/=2等同于x=x/2
取余赋值“%=”:先取余后赋值;x%=2等同于x=x%2
赋值运算符从右向左计算
* 运算符优先级
* ①括号。如果有多层括号,要从里向外计算。括号优先级最高。
* ②一元运算符。只有一个操作数的叫做一元运算符,它们的优先级高于二元运算符。一
* 元运算符包括:++(自加) 、 --(自减) 、 !(逻辑非)。
* ③*(乘)、/(除)、%(取余)。
* ④+(加)、-(减)。
* ⑤>(大于)、<(小于)、>=(大于等于)、<=(小于等于)。
* ⑥==(等于)、!=(不等于)。
* ⑦&&(逻辑与)。
* ⑧||(逻辑或)。
* ⑨赋值运算符。包括:=、+=、-=、*=、/=、%=。
* 优先级相同的运算符从左向右计算(赋值运算符相反)。
*/
//if...else 结构包含一个条件和两个分支:
//条件是 bool 类型表达式,写在 if 后面的圆括号里;
//分支写在 2 个 {} 里。
int num = 20;//待判断的数字
if (num % 2 == 0)//条件,bool类型
{//分支一
Console.WriteLine(num + "是偶数");
}
else
{//分支二
Console.WriteLine(num + "是奇数");
}
///////////////////////////////////////////////////////
//多重 if 结构包含多个条件,每个条件对应一个分支。
double money = 60000.00;
if (money >= 10000.00)
//大括号是为了表明if里面有哪些语句
{
if (money < 50000.00)
//若某分支只包含一条命令,那么可以省略大括号{}。
//若分支中包含2条以上的命令,是不能省略{}的。
Console.WriteLine("送一袋大米");
else if (money < 100000.00)
Console.WriteLine("送一套茶具");
else if (money >= 100000.00)
Console.WriteLine("送一台微波炉");
}
else
Console.WriteLine("没有礼品");
/* 条件运算符
* 条件表达式 ? 分支1 : 分支2
* ?就是条件运算符,有3个操作数,称为三元运算符。
* 运算逻辑是:当条件表达式为 true 时,执行分支1;为 false 时,执行分支2。
*/
int year = 2018;
string text = year % 4 == 0 ? "闰年" : "平年";
Console.WriteLine("今年是{0}", text);
/* switch条件结构
* 用来对变量进行多个分支的等值判断。
* (变量)与每一个 case 后面的常量进行等值比较,如果相等,就执行对应的分支。
* 执行分支以后, break 关键字会使 switch 结构中止,不会再判断后面的常量。
* 如果变量与所有的常量都不相同,则执行 default 后面的分支。
* switch 中的(变量)只能是3种类型:
* 整型(如 int )、字符型( char )、字符串类型( string )。
*/
string job = "处长";
switch (job)
{
//break 在switch结构的作用是“跳出 switch 结构”。
case "局长": Console.WriteLine("发双黄月饼"); break;
case "处长": Console.WriteLine("发蛋黄月饼"); break;
case "科长": Console.WriteLine("发枣泥月饼"); break;
default:
Console.WriteLine("发五仁月饼"); break;
}
/* while循环
* 1.通常有一个计数变量,循环开始前声明并初始化这个变量;
* 2.需要有循环条件,当条件为true时,执行一次循环体,为false时,结束循环。
* 3.循环体里面需要有计数变量的自加语句,否则循环可能无法退出(即“死循环”)。
*/
int y = 1;//循环计数变量,并初始化变量值
while (true)//循环条件,永远为true
{//循环体
Console.Write(y + " ");
y++;//计数变量的自加语句
if (y > 7) //结束循环的条件
break; //结束循环
}
int x = 1;
int sum = 0;//求和,初始化为0
while (x <= 100)
{
if(x%2 != 0)//条件为不能被2整除的数字
sum += x;//将一个数字累加到sum
x++;//变量自加
}
Console.WriteLine();//用来换行
Console.WriteLine("1-100的奇数和:{0}",sum);
//do...while范例:
do
{
x++;//变成了102
Console.WriteLine(x + " ");
}
while (x > 102 && x <= 104);
/* for循环
* 适合于“已知循环次数”的循环
* for(①变量声明和赋值;②循环条件;④变量自加)
* {③循环体}
* for 循环 ( ; ; ) 两个分号是不能缺少的。
* while循环: 先判断条件,后执行循环体。
* 适用:每次均需先验证条件,比如读取每行数据前检查是否有数据。
* do...while循环:先执行一次循环体,再判断条件。
* 适用:第一次执行无需验证,比如输入密码,若错误则重新输入。
* for循环: 与循环次数有关的元素都放在(;;)里面。
* 适用:已知循环次数的。比如连续播放三次铃声。
* 循环结构之continue
* 当程序执行到continue;的时候,会立即停止本次循环体,直接进入下一次循环。
* 使用 continue 关键字,在循环中剔除一些特殊的数据。
*/
for (int z = 1; z <= 10; z++)
{
if (z == 3 || z == 8) //剔除3和8
continue;
Console.Write(z + "_");
}
Console.WriteLine("换行");
//循环结构之嵌套循环
//决定每一行的循环次数,是内层的变量
//嵌套循环至少包含2层循环,
//外层循环体执行一次,内层循环体执行n次(n是内层循环的次数)
//内层体被执行的总次数 = 内层循环次数 * 外层循环次数。
for (int m = 1; m <= 7; m++)
{
for (int n = 1; n <= m; n++)
{
Console.Write(n+"内层");
}
Console.WriteLine(" ——外层");//换行
}
//从左上到右下的对角线的特点是:行数==列数
//从右上到左下的对角线的特点是:行数 + 列数 == 8
for (int i = 1; i <= 7; i++)//循环7行
{
for (int j = 1; j <= 7; j++)//循环7列
{
if (i == j || i + j == 8)//对角线打印O
{
Console.Write("O");
}
else
{
Console.Write(".");//其他位置打印
}
}
Console.WriteLine();//换行
}
//声明数组和赋值
//数据类型[] 数组名 = new 数据类型[长度];
//数据类型[] 数组名 = new 数据类型[]{初始值1,初始值2,...初始值3};
//数组元素用索引来区分,索引从 0 开始递增。
//数组.Length 属性会返回数组的长度(即数组元素的个数)
//数组经过初始化以后,数组元素有默认的初始值:
//double 类型为 0.0 , int 类型为 0 , char 类型为 'a' , bool 类型为 false , string 类型为 null 。
string[] friends = new string[2];
friends[0] = "钢铁侠";
friends[1] = "叮当猫";
Console.WriteLine("我有{0}个好朋友!",friends.Length);
/* C#中数组元素有多种初始化方式:
* char[]a = new char[3];
* char[]b = new char[]{"A","B","C"};
* char[]c = {"A","B","C"};
* char[]d = new char[3]{"A","B","C"};
*/
string[] jobs = new string[] { "经理", "项目主管", "技术总监", "财务主管" };
for (int i = 0; i < jobs.Length; i++)
{
Console.WriteLine(jobs[i]);
}
/* 算法——查找(一)
* 循环访问一组数据,从中找出符合条件的数据,这样的算法叫做查找。
* 写查找的算法,一是写循环访问每一个数据,二是对每一个数据进行验证。
* 即写 2 个“条件”:循环条件和筛选条件。
* 步骤:
* 1、循环条件:使用循环访问数组中的每一个元素(必须能遍历每一个)
* 2、筛选条件:在循环体中设置筛选条件,打印符合条件的元素
*/
int[] nums = new int[] { 3, 34, 42, 2, 11, 19, 30, 55, 20 };
for (int i = 0; i < nums.Length; i++)//循环访问所有数字
{
if (nums[i] % 2 == 0)//筛选出偶数
Console.Write(nums[i] + ",");
}
/* 算法——查找(二)
* 查找有没有符合条件的数据
* 一组数据中只要有一个符合条件,就可以认为“有符合条件的数据”;
* 但只有一组数据中每一个都不符合条件,才能认为“没有符合条件的数据”
* 一个相等即为"有",全都不等才是"无"。
*/
int[] score = { 85, 76, 98, 100, 62, 60 };
bool hasNopass = false;//记录是否有不及格的,默认没有
for (int i = 0; i < score.Length; i++)
{
if (score[i] < 60)//找到符合条件的元素:有不及格的
{
hasNopass = true;//记录为有
break;
}
}
if (hasNopass)//如果为true,说明找到过;如果为false,说明没有找到
Console.WriteLine("有人不及格");
else
Console.WriteLine("都及格啦!");
/*foreach关键字
* for 循环使我们可以通过索引访问数组元素;
* foreach 循环则可以不依赖索引而读取每一个数组元素。
* 语法:
* foreach(数据类型 迭代变量名 in 数组名)
* {
* 使用迭代变量 //只能读不能赋值
* }
*/
//查找其中有没有7的整倍数
int[] numbers = new int[] { 3, 34, 43, 2, 11, 19, 30, 55, 20 };
bool has7 = false; ////记录有没有7的整倍数,假设没有
foreach (int k in numbers) //遍历每一个数字
{
if (k % 7 == 0) //设置筛选条件,查找7的整倍数
{
has7 = true; //找到后,记录为true
break;//跳出foreach,结束查找
}
}
if (has7)//判断结果并输出
Console.WriteLine("有7的整倍数");
else
Console.WriteLine("没有7的整倍数");
/* 二维数组的声明和访问
* 包含2个一维数组,每个一维数组包含3个变量,总共2*3=6个数组元素
* 二维数组元素有2个索引,都是从0开始,以arr数组为例,元素索引从[0,0]到[1,2]
*/
//[4,2]表示包含4个一维数组,每个一维数组包含2个变量
int[,] arr = new int[4, 2] { { 89,86}, { 67,45}, { 64,92}, { 82,100} };
Console.WriteLine("同学们的分数是:");
//GetLongLength(0)返回数组中一维数组的个数
for (int i = 0; i < arr.GetLongLength(0); i++)
{
Console.WriteLine("语文:{0},数学{1}",arr[i,0],arr[i,1]);
}
string name;
Console.Write("请输入您的名字:");
name = Console.ReadLine();
Console.WriteLine("你好,{0}!",name);
//算法-求最大值
int[] num = new int[] {89, 90, 98, 56, 60, 91, 93, 85};
string[] name = new string[]{"张三","李四","伏晨","陈璐","周蕊","林日彭","何坤","关欣"};
int max;//最大值
max = num[0];//初始化为第一个元素
int index = 0;
for (int i = 1; i < num.Length; i++)
{
if (num[i] > max)//若发现比max更大的值则赋值给max
{
max = num[i];
index = i;
}
}
Console.WriteLine("分数最高的是{0},分数是{1}",name[index],max);
//求平均分,查找高于平均分的同学
int[] num = new int[] {90, 65, 88, 70, 46, 81, 100, 68};
string[] name = new string[]{"景珍","钱东宇","成蓉","陈璐","龙玉民","单江开","田武山","王三明"};
int sum ;
sum = 0;
int avg ;
avg = 0;
for (int i = 0; i < num.Length; i++)
{
sum += num[i];
avg = sum/num.Length;
}
Console.WriteLine("平均分是{0},高于平均分的有:",avg);
for (int i = 0; i < num.Length; i++)
{
if (num[i]>avg)
Console.Write(name[i]+" ");
}
Console.ReadKey();
}
}
}