C#基础学习笔记(三)
1、异常捕获
程序语法上没有错误,但是程序运行的过程中会出现错误
我们在程序中经常会出现各种各样的异常,你如果想要你的程序变得坚强一些。
在你的代码中应该经常性的使用try-catch来进行异常捕获。
哪行代码有可能出现异常,你就踹它一脚。
语法:
try
{
可能会出现异常的代码;
....
...
...
}
//try和catch之间不能有其他的代码
catch
{
出现异常后要执行的代码;
}
执行过程:如果try中的代码没有出现异常,那么catch中的代码不会执行。
如果try中的代码出现了异常,那怕这行出现异常的代码后面还有一百行都不会执行了,
而是直接跳到catch中执行代码
bool b = true; int number = 0; //声明,赋一个初值就行,try中不一定可以进行赋值操作 Console.WriteLine("请输入一个数字"); //有时会输入一个字母之类的东西 try { //变量的作用域在try里边,要声明在外边 number = Convert.ToInt32(Console.ReadLine()); //赋值 //Console.WriteLine(number * 2); //使用 放在里边 } catch //在try-catch之前不能写代码 { Console.WriteLine("输入的内容不能转化为数字"); b = false; } //我们如果要执行下面这行代码,要满足某些条件 //让代码满足某些条件去执行的话,使用bool类型 if (b) { Console.WriteLine(number * 2); } |
2、变量的作用域
变量的作用域就是你能够使用到这个变量的范围。
变量的作用域一般从声明它的那个括号开始到那个括号所对应的结束的括号结束。
在这个范围内,我们可以访问并使用变量。超出这个范围就访问不到了
3、switch-case
用来处理多条件的定值的判断。
语法:
switch(变量或者表达式的值)
{
case 值1:要执行的代码;
break;
case 值2:要执行的代码;
break;
case 值3:要执行的代码;
break;
..........
default:要执行的代码;
break;
}
执行过程:程序执行到switch处,首先将括号中变量或者表达式的值计算出来,
然后拿着这个值依次跟每个case后面所带的值进行匹配,一旦匹配成功,则执行
该case所带的代码,执行完成后,遇到break。跳出switch-case结构。
如果,跟每个case所带的值都不匹配。就看当前这个switch-case结构中是否存在
default,如果有default,则执行default中的语句,如果没有default,则该switch-case结构
什么都不做。
例题(比较elseif switch的区别)
//李四的年终工作评定,如果定为A级,则工资涨500元, //如果定为B级,则工资涨200元, //如果定为C级,工资不变,如果定为D级工资降200元, //如果定为E级工资降500元. //设李四的原工资为5000,请用户输入李四的评级,然后显示李四来年的工资. bool b = true; double salary = 5000; Console.WriteLine("请输入对李四的年终评定"); string level = Console.ReadLine(); //输入ABCDE也有可能其他键 #region if else-if做法 if (level == "A") { salary += 500; } else if (level == "B") { salary += 200; } else if (level == "C") {
} else if (level == "D") { salary -= 200; } else if (level == "E") { salary -= 500; } else { Console.WriteLine("输入有误"); //直接运行会把这行和下一行同时输出,加判断 b = false; }
if (b) { Console.WriteLine("李四来年的工资{0}", salary); } //多条件的定值判断 #endregion #region switch做法 switch (level) { case "A": salary += 500; break; case "B": salary += 200; break; case "C": break; case "D": salary -= 200; break; case "E": salary -= 500; break; default: Console.WriteLine("输入有误,程序退出"); b = false; break; } if (b) { Console.WriteLine("李四来年的工资{0}", salary); //还是需要bool } #endregion |
switch练习:
//让用户输入姓名,然后显示出这个人上辈子是什么职业。 //(老杨, 老苏, 老邹, 老马, 老虎, 老牛, 老蒋, 小杨); Console.WriteLine("输入姓名,显示上辈子的职业"); string name = Console.ReadLine(); switch (name) { case "老杨": Console.WriteLine("卖包子"); break; case "老苏": Console.WriteLine("猎人"); break; case "老邹": Console.WriteLine("卖年糕"); break; case "老马": Console.WriteLine("卖元宵"); break; case "老虎": Console.WriteLine("卖猪头肉"); break; case "老牛": Console.WriteLine("卖榨菜"); break; case "老蒋": Console.WriteLine("花农"); break; case "老扬": Console.WriteLine("养猪"); break; default: Console.WriteLine("不认识"); break; } |
if-else if与switch的比较(S)
相同点:都可以实现多分支结构
不同点:
if-else if:可以处理范围
switch:一般 只能用于等值比较
三者的区别:
if有条件的执行一条语句
if-else有条件的执行一条或另一条语句
switch有条件的执行一组语句中的一条语句
练习(判断成绩):
//对学员的结业考试成绩评测(改成用Switch来做) //成绩 >= 90 :A //90 > 成绩 >= 80 :B //80 > 成绩 >= 70 :C //70 > 成绩 >= 60 :D //成绩 < 60 :E
Console.WriteLine("请输入学员的成绩"); int score = Convert.ToInt32(Console.ReadLine()); //0-100 switch (score / 10) //你要把范围变成一个定量 用除法 算出来的是int类型 { case 10: //可以简写表示case10要执行的代码和case9是一样的 case 9: Console.WriteLine("A"); break; case 8: Console.WriteLine("B"); break; case 7: Console.WriteLine("C"); break; case 6: Console.WriteLine("D"); break; default: Console.WriteLine("E"); break; } |
练习(判断年月,添加防止错误的部分)
//请用户输年份,再输入月份,输出该月的天数.(结合之前如何判断闰年来做) //再进行异常处理 Console.WriteLine("请输入年份"); try { int year = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("请输入月份"); try { int month = Convert.ToInt32(Console.ReadLine()); if (month >= 1 && month <= 12) { int day = 0; //存天数 switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: day = 31; break; case 2: //加判断 if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) { day = 29; } else { day = 28; } break; default: day = 30; break; } Console.WriteLine("{0}年{1}月有{2}天", year, month, day); } //if判断的括号 else { Console.WriteLine("输入的月份不符合要求,程序退出"); } } catch //月份的try { Console.WriteLine("月份输入错误"); }
} //try年份的括号 catch //年份的try { Console.WriteLine("年份输入错误"); } |
4、循环结构
while循环:
while(循环条件)
{
循环体;
}
执行过程:程序运行到while处,首先判断while所带的小括号内的循环条件是否成立,
如果成立的话,也就是返回一个true,则执行循环体,执行完一遍循环体后,再次回到
循环条件进行判断,如果依然成立,则继续执行循环体,如果不成立,则跳出while循环。
在while循环当中,一般总会有那么一行代码,能够改变循环条件,使之终有一天不再成立,
如果没有那么一行代码能够改变循环条件,也就是循环条件永远都成立,我们称之这种循环
叫做死循环。
最简单的最常用的死循环:
while(true)
{
}
特点:先判断,再执行,有可能一遍循环都不执行。
练习1:
//写100遍“下次考试一定要细心”. //循环体:Console.WriteLine("下次考试一定要细心"); //循环条件:打印的次数小于100遍 //需要定义一个循环变量用来记录循环次数 每循环一次,循环变量都要自身加1 int i = 0; while (i < 100) { Console.WriteLine("下次考试一定要细心\t{0}", i); i++; //每循环一次,i都要自身加1 } |
练习2:
#region 练习2 //求1-100之间所有整数的和 //循环体:累加的过程 //循环条件:i<=100 int i = 1; int sum = 0; //存储和 while (i <= 100) { sum += i; i++; } Console.WriteLine(sum);
#region 练习2-1 //1-100之间的偶数和 //加一个判断偶数的过程 int i = 1; int sum = 0; //存储和 while (i <= 100) { if (i % 2 == 0) //求奇数变为i % 2 != 0 { sum += i; //i++; //放在里边的时候上面的if不执行,会进入死循环,放在外面 } i++; } Console.WriteLine(sum); #endregion #endregion |
5、break
1)、可以跳出switch-case结构。
2)、可以跳出当前循环。
break一般不单独的使用,而是跟着if判断一起使用,表示,当满足某些条件的时候,就不再循环了。
例子:
#region 例1 int i = 1; while (i <= 10) { Console.WriteLine("Hello World"); i++; break; //打断while的循环 } #endregion #region 例2 循环的过程 int i = 1; int j = 1; while (i <= 10) { while (j <= 10) //j循环之后就是11,就不执行了 { Console.WriteLine("我是里边的while循环"); j++; break; //跳出的是当前的循环,输出的是交替的里外 } Console.WriteLine("我是外边的while循环"); i++; } //输出先10个里边和后10个外边 #endregion |
while循环练习:
#region 练习0 //要求用户输入用户名和密码 用户名只要不是admin 密码不是888888 //就提示用户一直重新输入 //循环体:提示用户输入用户名-接收-输入密码-接收-判断是否登录成功 //循环条件:用户名或者密码其中一个错误 string usrName = ""; string usrPwd = ""; while (usrName != "admin" || usrPwd != "888888") { Console.WriteLine("请输入用户名"); usrName = Console.ReadLine(); Console.WriteLine("请输入密码"); usrPwd = Console.ReadLine(); } Console.WriteLine("登录成功");
#endregion #region 练习1 //输入班级人数,然后依次输入学员成绩,计算班级学员的平均成绩和总成绩 //循环体:输入第一个学员成绩-计数器加一-第二个成绩 //提示输入学员成绩,接收,转为整型,累加到总成绩中 //循环条件:计数器加到输入的班级人数 //循环次数小于等于班级人数 int TotalNumber = 0; int i = 1; double TotalScore = 0; double EachScore; Console.WriteLine("请输入班级总人数"); TotalNumber = Convert.ToInt32(Console.ReadLine()); while (i <= TotalNumber) //小于等于 { //Console.WriteLine("输入学员成绩"); 可以改进 Console.WriteLine("请输入第{0}个学员的成绩", i); EachScore = Convert.ToDouble(Console.ReadLine()); //记住这样表示把每个人的成绩累加到总成绩当中 TotalScore += EachScore; i++; } Console.WriteLine("{0}个人的班级总成绩是{1},平均成绩是{2}", TotalNumber, TotalScore, TotalScore / TotalNumber); #endregion #region 练习2 //老师问学生,这道题你会做了吗? //如果学生答"会了(y)",则可以放学.如果学生不会做(n),则老师再讲一遍,再问学生是否会做了...... //直到学生会为止,才可以放学. //直到学生会或老师给他讲了3遍还不会,都要放学 //循环体:问会不会做题 - 回答n - 再来一遍 //循环条件:回答y或者讲10变 #region 我写的 Console.WriteLine("这道题会不会?(会)y/(不会)n"); string s = Console.ReadLine(); int i = 1;
if (s == "y") { Console.WriteLine("可以放学"); } else { while (s == "n" && i <= 10 ) { Console.WriteLine("这道题会不会?这是第{0}次回答,(会)y/(不会)n", i); s = Console.ReadLine(); i++; } Console.WriteLine("终于可以放学"); } #endregion #region 示例 //放学的两个条件 //1、会了 //2、讲完10遍 //循环体:老师不停的问,学生不停的回答,老师不停的得交奖 //循环条件:学生不会、讲的次数小于10遍 string answer = ""; int i = 0;
while (answer != "y" && i < 10) { Console.WriteLine("这是我第{0}次给你讲,你会了吗?y/n", i + 1); answer = Console.ReadLine(); //如果学生回答是,跳出循环 if (answer == "y") { Console.WriteLine("会了就放学了"); break; } i++; } #endregion #endregion #region 练习3 //2006年培养学员80000人,每年增长25%, //请问按此增长速度,到哪一年培训学员人数将达到20万人? //循环体:人数每年增加[email protected] //循环条件:人数>=20玩 double people = 80000; int year = 2006; while (people < 200000) { people *= 1.25; year++; } Console.WriteLine("到{0}年的时候人数达到20万人", year); #endregion #region 练习4 //提示用户输入y或者n //要求:只能输入y或者n,只要不是y或者n就要求用户一直重新输入 //循环体:一直输入 接收判断 //循环条件:不是输入的y/n string input = ""; while (input != "y" && input != "n") { Console.WriteLine("请输入y或者n"); input = Console.ReadLine(); }
#endregion #region 练习5 //提示用户输入用户名和密码 admin 888888 //账户密码不对就重新输入 //如果3次都不会对 则退出登录程序 //循环体:输入账户密码 接收 判断 //条件:账户或者密码不对 string usrName = ""; string usrPwd = ""; int i = 0; while ((usrName != "admin" || usrPwd != "888888") && i < 3) { //i可以放在外边 Console.WriteLine("请输入用户名"); usrName = Console.ReadLine(); Console.WriteLine("请输入密码"); usrPwd = Console.ReadLine(); i++;
} #endregion #region 练习6 //写两个循环 //第一个循环提示用户A输入用户名,要求A的用户名不能为空,只要为空,就要求A一直输入 //循环体:提示A输入用户名、接收、判断 //循环条件:用户名为空 string userNameA = ""; while (userNameA == "") { Console.WriteLine("请输入用户名,不能为空"); userNameA = Console.ReadLine(); } //第二个循环提示用户B输入用户名,要求8的用户名不能跟A的用户名相同并且不能为空 //只要为空,并且跟A的用户名相同,就一直提示用户B重新输入用户名 //循环体:提示输入、接收判断 //循环条件:用户名为空或者用户名和A 相同 Console.WriteLine("请输入用户名,不能为空并且不能和A相等"); string userNameB = Console.ReadLine(); while (userNameB == "" || userNameB == userNameA) { if (userNameB == "") { Console.WriteLine("用户不能为空,请重新输入"); userNameB = Console.ReadLine(); } else { Console.WriteLine("用户B不能跟A的用户名相同,请重新输入"); userNameB = Console.ReadLine(); } } #endregion Console.ReadKey(); |
6、do-while循环。
语法:
do
{
循环体;
}while(循环条件);
执行过程:程序首先会执行do中的循环体,执行完成后,去判断do-while循环的循环条件,
如果成立,则继续执行do中的循环体,如果不成立,则跳出do-while循环。
特点:先循环,再判断,最少执行一遍循环体。
while的特点:先判断,再执行,有可能一遍循环都不执行。
7、while与do-while区别
语法不同
初始值不满足循环条件时:
while循环一次都不执行
do-while循环会执行一次
练习
#region 例1 //明天小兰就要登台演出了,老师说再把明天的演出的歌曲唱一遍, //如果满意,小兰就可以回家了.否则就需要再练习一遍,直到老师满意为止.(y / n) //循环体:小兰唱 问老师满意吗?回答 //循环条件:老师不满意 Console.WriteLine("老师我唱的你满意吗?"); string answer = Console.ReadLine(); while (answer == "n") { Console.WriteLine("老师,我再唱一遍,你满意吗"); answer = Console.ReadLine(); } //遇见这种首先执行一遍循环体,拿着执行后的结果再去判断是否执行循环的循环。 //我们推荐使用do - while循环 #endregion #region 例1-1 string answer = ""; do { Console.WriteLine("老师我唱的你满意吗?y/n"); answer = Console.ReadLine(); } while (answer == "n"); Console.WriteLine("可以回家"); #endregion #region 练习1 //要求用户输入用户名和密码,只要不是admin、888888就一直提示用户名或密码错误,请重新输入。 string usrName = ""; string usrPwd = ""; do { Console.WriteLine("请输入用户名"); usrName = Console.ReadLine(); Console.WriteLine("请输入密码"); usrPwd = Console.ReadLine(); } while (usrName != "admin" || usrPwd != "888888"); Console.WriteLine("登录成功"); #endregion #region 练习2 //不断要求用户输入学生姓名,输入q结束. #region do-while string name = ""; do { Console.WriteLine("输入学生姓名,输入q结束"); name = Console.ReadLine(); } while (name != "q"); #endregion #region while string name = ""; while (name != "q") { Console.WriteLine("输入学生姓名,输入q结束"); name = Console.ReadLine(); } #endregion #endregion #region 练习3 //不断要求用户输入一个数字,然后打印这个数字的二倍,当用户输入q的时候程序退出。 //循环体:输入 打印二倍 要转换 //循环条件:输入不等于q string input = ""; while (input != "q") { Console.WriteLine("请输入一个数字"); 不能直接转化为int因为可能或有其他东西 //Convert.ToInt32(input) = Console.ReadLine(); input = Console.ReadLine(); if (input != "q") { try { int number = Convert.ToInt32(input); //这里会抱错用try Console.WriteLine("你输入的数字的2倍是{0}", number * 2); } catch {
Console.WriteLine("输入的字符串不能转化为输入,请重新输入"); } } else { Console.WriteLine("输入的是q,程序退出"); } } #endregion #region 练习4 选出最大值 //不断要求用户输入一个数字(假定用户输入的都是正整数), //当用户输入end的时候显示刚才输入的数字中的最大值 //循环体:输入 接收 转换 比较 //循环条件:输入不是end string input = ""; int max = 0; while (input != "end") { Console.WriteLine("输入一个数字,输入end显示最大值"); input = Console.ReadLine(); //会有乱七八糟的东西 if (input != "end") { try { int number = Convert.ToInt32(input); //让用户输入的每个数字都跟我假定的最大值比较,只要比我假定的最大值要大, //就把当前输入的这个数字赋值给我的最大值 if (number > max) { max = number; } } catch { Console.WriteLine("输入的字符串不能转成数字,请重新输入"); } } else { Console.WriteLine("你输入的数字中最大值是{0}", max); } } |