C# 阶段总结
数据类型--变量与常量--运算符与表达式--语句(if,for)--数组--函数--结构体
一、数据类型:
(一)内建类型
整型(int short long byte uint ushort ulong sbyte),浮点(double float decimal),布尔(bool),字符(char)。
对于整型和浮点型都有个ToString("格式化字符串"):
#——任意一个数字。有的话就显示,没有就不显示。
0——必须有一个数字,没有的话就补零。
.——小数点
,——千位分隔。
(二)常用的类
Math DateTime string
Math:
Math.Ceiling(double ):大于当前小数的最小整数。
Math.Floor(double):小于当前小数的最大整数。
Math.Round(double):四舍五入
DateTime:
Year,Month,Day,Hour,Minute,Second,MilliSecond,DayOfWeek,DayOfYear
AddYears(n),AddMonths(),AddDays().........
ToString("格式化字符串"):格式显示。
yyyy,yy——年份。MM,M——月份。dd,d——天。hh,h——时。mm,m——分。ss,s——秒。ms——毫秒
(三)自定义类型
struct
二、变量与常量:
(一)变量就是装数据容器。——U盘
定义:
数据类型 变量名[ = 值],变量名[ = 值],....;
int a,b; int a = 5,b;
变量的命名规则:
1.变量名只能由字母、数字、下划线组成
2.只能字母,下划线开头
3.不能与关键词重复。
赋值:
变量名=值;——注意:变量类型与等号右边的值类型相一致。不一致就需要进行类型转换。
类型转换:
1.自动转换:一般来说自动转换,只要不存在丢数据的可能性,计算就会自动转化。例如:double a = 3+5.0;
2.强制转换:只要存在丢数据的可能性,计算机就不给自动转化,需要手动强制转化。
Convert.Toxxx(); Convert.ToInt32();
double a = 3.14;
int b = (int)a;
取值:直接写变量名。
(二)常量:常量也是装数据的容器,但在运算过程中常量不能放在单等的左边。——一次性光盘
分类:字面常量,符号常量。
定义:const int PI = 3.14;
注意:常量在定义的时候必须要赋值。
取值:直接使用常量取值。
三、运算符:
算术,关系,逻辑,其它
(一)算术——7
+ - * / % ++ --
整数除整数还是整数。
(二)关系——6
== != > >= < <=
(三)逻辑——3
&& || !
(四)其它
1.复合运算符:+= -= *= /= %=
2.赋值: =
3.条件运算符:表达式1?表达式2:表达式3
四、语句:顺序、分支、循环:
(一)分支——if
if(表达式)
{
}
if(表达式)
{
}
else
{
}
if(表达式)
{
}
else if(表达式)
{
}
...
else
{
}
if(表达式)
{
if(表达式)
{
}
else
{
}
}
else
{
...
}
例子:
1.判断闰年,平年
int year; //输入 Console.Write("请输入一个年份:"); year = Convert.ToInt32(Console.ReadLine()); //运算 //能被400整除;或能被4整除,但不能被100整除。 if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) { Console.WriteLine("是闰年"); } else { Console.WriteLine("是平年"); }
2.一元二次方程根的情况
int a, b, c; //输入; Console.Write("请输入系数a:"); a = Convert.ToInt32(Console.ReadLine()); Console.Write("请输入系数b:"); b = Convert.ToInt32(Console.ReadLine()); Console.Write("请输入系数c:"); c = Convert.ToInt32(Console.ReadLine()); //运算输出 if (a == 0) { Console.WriteLine("不是一元二次方程"); } else { int d = b * b - 4 * a * c; if (d > 0) { Console.WriteLine("两个不等实根"); } else if (d == 0) { Console.WriteLine("两个相等实根"); } else { Console.WriteLine("无实根"); } }
3.男女体重与身高
string sex; int weight, height; //输入 Console.Write("性别(男,女):"); sex = Console.ReadLine(); Console.Write("身高(CM):"); height = Convert.ToInt32(Console.ReadLine()); Console.Write("体重(KG):"); weight = Convert.ToInt32(Console.ReadLine()); int biaoZhunTiZhong=0; //运算输出 if(sex == "男") { //求标准体重 biaoZhunTiZhong = height - 100; } else if(sex == "女") { //求标准体重 biaoZhunTiZhong = height - 110; } else { Console.WriteLine("性别不正确"); } //求体重差 int tiZhongCha = weight - biaoZhunTiZhong; if (tiZhongCha >= -3 && tiZhongCha <= 3) { Console.WriteLine("体重正常,继续保持!"); } else if (tiZhongCha < -3) { Console.WriteLine("偏瘦,注意增加营养"); } else { Console.WriteLine("偏胖,注意运动减肥"); }
4.判断日期是否正确。
int year = 0, month = 0, day = 0; //输入 Console.Write("请输入年:"); year = Convert.ToInt32(Console.ReadLine()); Console.Write("请输入月:"); month = Convert.ToInt32(Console.ReadLine()); Console.Write("请输入日:"); day = Convert.ToInt32(Console.ReadLine()); //判断运算输出 //判断年份是否正确 if(year < 0 || year>9999) { Console.WriteLine("年输入不正确"); } else { Console.WriteLine("年正确"); } //判断月份是否正确 if (month < 1 || month > 12) { Console.WriteLine("月输入不正确"); } else { Console.WriteLine("月正确"); } //判断天是否正确 if(month==1||month==3||month==5||month==7||month==8||month==10||month==12) { if(day < 1 || day>31) { Console.WriteLine("天输入错误,大月份最多是31天"); } else { Console.WriteLine("天正确"); } } else if (month == 4 || month == 6 || month == 9 || month == 11) { if (day < 1 || day > 30) { Console.WriteLine("天输入错误,小月份最多是30天"); } else { Console.WriteLine("天正确"); } } else if(month == 2) { //闰年与平年的判断 if(year%400==0 || year%4==0&&year%100!=0) { //闰年 if (day < 1 || day > 29) { Console.WriteLine("天输入错误,闰年2月份最多是29天"); } else { Console.WriteLine("天正确"); } } else { //平年 if (day < 1 || day > 28) { Console.WriteLine("天输入错误,平年2月份最多是28天"); } else { Console.WriteLine("天正确"); } } }
(二)循环
for(初始条件;循环条件;变量改变)
{
循环体
}
循环的四要素:
循环的嵌套:打印星号。
//一、 for (int i = 1; i <= 5; i++) { for (int m = 1; m <= 5 - i; m++) { Console.Write(" "); } for (int n = 1; n <= 2 * i - 1; n++) { Console.Write("*"); } Console.WriteLine(); } //二、 for (int i = 1; i <= 5; i++) { for (int m = 1; m <= 5 - i; m++) { Console.Write(" "); } for (int n = 1; n <= i; n++) { Console.Write("*"); } Console.WriteLine(); } //三、 for (int i = 1; i <= 5; i++) { for (int j = 1; j <= 6 - i; j++) { Console.Write("*"); } Console.WriteLine(); }
两类问题:迭代法,穷举法。
迭代法: 按照某种规律通过循环迭代求解。
求100以内数的和,求阶乘。
//求前100个数的和 int sum = 0; for (int i = 1; i <= 1000; i++) { sum = sum + i; } Console.WriteLine(sum); //求阶乘 5! = 5*4*3*2*1 = 5*4!; int jc = 1; for(int i=1;i<=5;i++) { jc = jc * i; } Console.WriteLine(jc);
1.求年龄:有5个小孩子排在一起,第一个比第二个小2岁,第二个比第三个小2岁,第三个比第四个小2岁,第5个16岁。求第一个多少岁?
int age = 16; //初始情况下,存的是第5个小孩子年龄,每次循环都会减2,分别代表第5,4,3,2,1个小孩子的年龄。 for (int i = 5; i >= 1; i--) { age = age - 2; } Console.WriteLine(age);
2.棋盘上放粮食
decimal a = 1, b = 0; for (int i=1;i<=64 ;i++ ) { a = a * 2; b = a + i; } Console.WriteLine("第64格应该放:"+b+"粒粮食"); decimal weight单=(decimal)0.00002; decimal weight总 = weight单 * b; Console.WriteLine("棋盘粮食一共重"+weight总+"kg");
3.折纸与珠峰的高度。
double h = 0.00015; for (int i = 1; i <= 26; i++) { h = h * 2; } Console.WriteLine(h);
4.落球问题。
5.猴子吃桃子
int count = 1; for(int i=6;i>=1;i--) { count = (count + 1) * 2; } Console.WriteLine(count);
6.兔子小兔子的问题。一对新生兔,到三个月开始生一对小兔,以后每个月都会生一对小兔,小兔不断长大也会生小兔。假设兔子不死,每次只能生一对(公母),问第24个月末有多少只兔子?
int tu1 = 1, tu2 = 1; //tu1是倒数第一个月的兔子数,tu2是倒数第二个月的兔子数 int tu=0;//要求的这个月的兔子数。 for (int i = 3; i <= 24; i++) { tu = tu1 + tu2; tu2 = tu1; tu1 = tu; } Console.WriteLine(tu);
穷举法:把所有的情况都走一遍,根据条件筛选。
求100以内与7相关的数。
for (int a=1;a<=100 ;a++ )
{
if(a%7==0||1%7==0||a/10==7)
{
Console.WriteLine("100以内与7有关的数是"+a);
}
1.买东西。小张过元旦发了100元的购物券,他要买香皂(5元),牙刷(2元),洗发水(20元)。要想把100元正好花完,如何买这三样东西?
for (int a = 0; a <= 20;a++ ) { for (int b = 0; b <= 50; b++) { for (int c = 0; c <= 5; c++) { if (a * 5 + b * 2 + c * 20 == 100) { Console.WriteLine("买"+a+"块肥皂,买"+b+"个牙刷,买"+c+"支牙膏,共花费100元"); } } } }
2.百鸡百钱。有100文钱,要买100只鸡回家。公鸡2文钱一只,母鸡1文钱一只,小鸡半文钱一只。如何买?
百马百石。有100石粮食,母匹大马驮2石,每匹中马驮1石,每两匹小马驹一起驮1石。要用100匹马驮完100石粮食,如何按排?
for (int gj = 0; gj <= 50; gj++) { for (int mj = 0; mj <= 100; mj++) { for (int xj = 0; xj <= 200; xj++) { if (gj * 2 + mj * 1 + xj * 0.5 == 100&&gj+mj+xj==100) { Console.WriteLine("买公鸡"+gj+"只,买母鸡"+mj+"只,买小鸡"+xj+"只"); } } } }
3.某侦察队接到一项紧急任务,要求在A、B、C、D、E、F六个队员中尽可能多地挑若干人,但有以下限制条件:
A和B两人中至少去一人; a+b>=1
A和D不能一起去; a+d<=1
A、E和F三人中要派两人去; a+e+f==2
B和C都去或都不去; b+c!=1
C和D两人中去一个; c+d==1
若D不去,则E也不去。 d+e==0||d==1
问应当让哪几个人去?
for(int a=0;a<=1;a++) //0不去,1去。 { for(int b=0;b<=1;b++) { for(int c=0;c<=1;c++) { for(int d=0;d<=1;d++) { for(int e=0;e<=1;e++) { for(int f=0;f<=1;f++) { if (a + b >= 1 && a + d <= 1 && a + e + f == 2 && b + c != 1 && c + d == 1 && (d + e == 0 || d == 1)) { Console.WriteLine("A="+a+";B="+b+";C="+c+";D="+d+";E="+e+";F="+f); } } } } } } }
4.求等式。
五、数组:
思想:解决大量同类数据存储和操作的问题。
特点:连续,同一类数据。
分类:一维数组,二维数组,多维数组。
一维数组:
定义:
数据类型[] 数组名 = new 数据类型[数组的长度] [{初始化}];
赋值:
数组名[下标] = 值;
可以与循环结合起来。
取值:
数组名[下标];
可以与循环结合起来。
例子:
1.球员打分
int[] a = new int[6]; Console.WriteLine("********球员训练记录********"); //输入 for (int i = 0; i < a.Length; i++) { Console.Write("请输入第"+(i+1)+"个球员的成绩:"); a[i] = Convert.ToInt32(Console.ReadLine()); } //输出每个球员的分 for(int j=0;j<a.Length;j++) { Console.WriteLine("第"+(j+1)+"位球员的分数是"+a[j]+"分。"); } //计算并显示总分和平均分。 int sum = 0; for(int i=0;i<a.Length;i++) { sum = sum + a[i]; } double avg = 0; avg = 1.0 * sum / a.Length; Console.WriteLine("总分是:" + sum + "。平均分是:" + avg + "。");
2.选班长
//30人投票,从5个候选人选一个出来。 int[] vote = new int[5]; for(int i=0;i<30;i++) { Console.Write("请第"+(i+1)+"位同学投票(0-4):"); int temp = Convert.ToInt32(Console.ReadLine()); if(temp <0 || temp >4) { Console.WriteLine("废票"); continue; } else { vote[temp]++; } } //计算最终得票。 int max = 0, maxSub = 0; for(int i=0;i<vote.Length;i++) { //把每位候选人的票数显示出来。 Console.WriteLine("第" + (i + 1) + "号候选人的票数是:" + vote[i]); //计算最大值。 if(vote[i] > max) { max = vote[i]; maxSub = i; } } //显示最终结果。 Console.WriteLine("最终投票结果为:"+(maxSub+1)+"号候选人当选,当选票数是"+max+"票。");
3.36选7
int[] a = new int[7]; Random rand = new Random(); for (int i = 0; i < 7; i++) //7--代表要生成7个不同的数 { //生成一个随机数。 int n = rand.Next(36); n++; //查重 bool chong = false; for(int j=0;j<a.Length;j++) { if(n == a[j]) { chong = true; break; } } //才能确定n合不合理 if(chong == false) { a[i] = n; } else { i--; }//if }//for //显示彩票号码 for(int k = 0;k<a.Length;k++) { Console.Write(a[k] + "\t"); }
3.青歌赛。
static void Main(string[] args) { int[] a = new int[10]; //亮分 ShuRu(a); //排序 PaiXu(a); //运算求平均 double avg = YunSuan(a); //输出显示 ShuChu(a, avg); } private static void ShuChu(int[] a, double avg) { Console.WriteLine("去掉两个最高分:" + a[0] + "和" + a[1]); Console.WriteLine("去掉两个最低分:" + a[a.Length - 1] + "和" + a[a.Length - 2]); Console.WriteLine("该选手最终得分为:" + avg); } private static double YunSuan(int[] a) { //求总分 int sum = 0; for (int i = 2; i <= a.Length - 3; i++) { sum += a[i]; } //求平均 double avg = (1.0 * sum) / (a.Length - 4); return avg; } private static void PaiXu(int[] a) { for (int i = 1; i <= a.Length - 1; i++) { for (int j = 1; j <= a.Length - i; j++) { if (a[j] > a[j - 1]) { int temp = a[j]; a[j] = a[j - 1]; a[j - 1] = temp; } } } } private static void ShuRu(int[] a) { for (int i = 0; i < a.Length; i++) { Console.Write("请第" + (i + 1) + "号评委亮分:"); a[i] = Convert.ToInt32(Console.ReadLine()); } }
二维数组:
定义:
数据类型[,] 数组名 = new 数组类型[行数,列数] [{初始化}];
赋值:
数组名[行下标,列下标] = 值;
取值:
数组名[行下标,列下标];
例子:
1.学生成绩。
int[,] a = new int[3, 4]; //输入 for(int i=0;i<3;i++) { //自动生成学号 a[i, 0] = i+1; //语文成绩 Console.Write("语文:"); a[i, 1] = Convert.ToInt32(Console.ReadLine()); //数学成绩 Console.Write("数学:"); a[i, 2] = Convert.ToInt32(Console.ReadLine()); //计算总分 a[i, 3] = a[i, 1] + a[i, 2]; } //显示 Console.WriteLine("学号\t语文\t数学\t总分"); for(int i=0;i<3;i++) { for(int j=0;j<4;j++) { Console.Write(a[i, j] + "\t"); } Console.WriteLine(); }
2.推箱子。
int[,] map = new int[10, 10] { {1,1,1,1,1,1,1,1,1,1}, {1,0,0,0,0,1,0,0,0,1}, {1,8,0,0,0,1,0,0,0,1}, {1,0,0,0,0,1,1,1,0,1}, {1,0,0,0,0,0,0,1,0,1}, {1,0,0,0,1,0,0,1,0,1}, {1,0,0,0,1,0,0,0,0,1}, {1,1,1,1,1,0,0,0,0,1}, {1,0,0,0,0,0,0,0,9,1}, {1,1,1,1,1,1,1,1,1,1} }; for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { if (map[i, j] == 1) { Console.Write("■"); } else if (map[i, j] == 0) { Console.Write(" "); } else if (map[i, j] == 2) { Console.Write("□"); } else if (map[i, j] == 9) { Console.Write("★"); } else if (map[i, j] == 8) { Console.Write("♀"); } } Console.WriteLine(); }
两个应用:二分法查找,冒泡排序。
二分法查找思想:前提是数组有序,每次找中间的值对比,否满足条件就扔一半。
使用最大下标max、最小下标min,中间值下标mid,控制查找的范围。 mid = (max+min)/2; max = mid+1; min = mid-1;
如果一直查到min>max就结束了,说明没有找到。
冒泡排序的思想:相邻两个数进行依次对比,互换。
两层循环,外层循环趟数,内层循环每趟的次数。
趟数:n-1
次数:n-i
for(int i=1;i<=n-1;i++)
{
for(int j=1;j<=n-i;j++)
{
if(a[j] > a[j-1])
{
互换。
}
}
}
六、函数:
什么是函数:能够完成某个独立功能模块就可称之为函数。
为什么要用函数:结构清晰,分工开发,代码重用。
四要素:函数名,形参,返回类型,函数体。
定义语法:
返回类型 函数名(形参列表)
{
函数体
}
调用:
函数名(实参列表);
数据类型 变量名 = 函数名(实参列表);
函数的传值与传址的问题。
1.内建类型,日期时间都是默认传值。 ——ref
2.数组,字符串默认都是传址。
函数的返回值。——return 值或变量;要保持return后面的类型与函数的返回类型要一致。
递归。自己调自己。
语法思想:
返回类型 函数名(参数)
{
1.结束递归的判断。
2.递归运算:函数名(参数);
}
七、结构体:
为什么要用结构体?自己定义的复合类型,更好地模拟生活中的各种对象。
定义
struct 结构体名
{
public 类型 子变量名;
public 类型 子变量名;
....
}
使用:
结构体名 结构体变量 = new 结构体名();
结构体变量.子变量 = 值;
结构体变量.子变量;
结构体数组:
结构体类型[] 数组名 = new 结构体类型[长度];
数组名[下标].子变量
如何使用循环来操作结构体数组。
例子:学生成绩统计。对战的小游戏。