文章目录
goto
注:上期练习题在文章最后
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _02_goto
{
internal class Program
{
static void Main(string[] args)
{
//goto 可以控制代码的执行顺序
//1.给代码合适的位置,打一个标记,标记的名字是自定义的,一般标记的位置比代码少一个缩进
inputSex:
Console.WriteLine("请输入性别");
string sex =Console.ReadLine();
if (sex=="男")
{
Console.WriteLine("爷们");
}else if (sex == "女")
{
Console.WriteLine("不是爷们");
}
else
{
Console.WriteLine("输入错误,请重新输入");
//2.使用goto 标记的名字,可以让代码重新回到标记的位置进行执行
goto inputSex;
}
//一般使用goto进行内容的校验,并让用户重新输入,但是goto会造成代码的可读性变差
//,所以尽量少用
}
}
}
switch
快捷键:switch + tab
switch 中文意思 开关
**用处:**适用于多个值进行判断,或者等值条件的判断
**执行过程:**根据switch括号里面的变量值,选择与之对应的case语句,如果没有case语句,则执行default后面的语句
格式:
- switch (变量):变量,只要变量存在,即可进入条件语句
- {}:代码块,与case的实例匹配的部分才能输入
- case:值 实例,后面的值是和switch()里面的变量进行匹配
- default:默认 和else相似,当case的实例 都不满足条件,会执行default
注意:
- break(中断,打断) 不能省略
- case后面的值可以无序,但不能重复
- 多个case可以共用一段代码
- default可要可不要(都匹配不上,就执行default里面的代码)
- case后面跟的具体的数据,要和switch()内的变量的值的类型完全一致
if和switch的异同点:
- 相同点: 都可以用于分支判断
- 不同点: if结构适用于某个变量处于某个连续区间的情况,switch结构只用于处理等值条件的判断
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _03_switch
{
internal class Program
{
static void Main(string[] args)
{
//需求: 用户输入1 打印星期一 输入2 打印星期二 3 打印星期三..........
int day = int.Parse(Console.ReadLine());
//用if实现
if (day==1)
{
Console.WriteLine("星期一");
}else if (day==2)
{
Console.WriteLine("星期二");
}else if (day==3)
{
Console.WriteLine("星期三");
}....
//用switch实现
switch (day)
{
case 1:
Console.WriteLine("星期一");
break;
case 2:
Console.WriteLine("星期二");
break;
case 3:
Console.WriteLine("星期三");
break;
case 4:
Console.WriteLine("星期四");
break;
case 9:
Console.WriteLine("星期五");
break;
case 6:
Console.WriteLine("星期六");
break;
case 0:
Console.WriteLine("星期日");
break;
default:
Console.WriteLine("输入有误");
break;
}
// 用户输入月份 打印季节
// 气象划分法。在气象部门,通常以阳历3~5月为春季,6~8月为夏季,9~11月为秋季
//12月~来年2月为冬季,并且常常把1、4、7、10月作为冬、春、夏、秋季的代表月份
//这样写会导致语法臃肿
int mouth = int.Parse(Console.ReadLine());
switch (mouth)
{
case 3:
Console.WriteLine("春季");
break;
case 4:
Console.WriteLine("春季");
break;
case 5:
Console.WriteLine("春季");
break;
case 6:
Console.WriteLine("夏季");
break;
case 7:
Console.WriteLine("夏季");
break;
case 8:
Console.WriteLine("夏季");
break;
}
//多个case可以共用一段代码
int mouth = int.Parse(Console.ReadLine());
switch (mouth)
{
case 3:
case 4:
case 5:
Console.WriteLine("春季");
break;
case 6:
case 7:
case 8:
Console.WriteLine("夏季");
break;
case 9:
case 10:
case 11:
Console.WriteLine("秋季");
break;
}
}
}
}
循环结构
循环四要素:初始条件 判断条件 循环语句 迭代变量
for循环
语法:
for循环语法格式:
for(声明一个循环控制变量;循环执行的条件;循环控制变量修改){
循环体(需要重复执行的代码块)
}
执行顺序:
①先执行初始条件 int i = 0;(初始条件只执行一次)
②再执行判断条件 i < 5; 成立:执行③ 不成立:⑤
③执行{循环语句}
④执行迭代变量 i++,然后执行②
⑤退出for循环
注意点:
①初始条件可以写到for上边,但是第一个 ; 不能省略
②迭代变量可以写到循环语句的后面,但第二个 ; 不能省略
③for执行完,变量 i 的值为判断条件的值
注意死循环
一定要保证循环有终止条件(没有终止条件的循环,称之为死循环)
- for(int i=0;i<5;i–){} 迭代变量使用不当造成死循环
- for(int i=0;i<5;){} 没有迭代变量造成死循环
- for(int i=0;i==i;i++){} 判断条件使用不当,造成死循环
单层for循环
//循环结构:重复执行某段代码若干次
//需求:在控制台打印5次"吴亦凡"
Console.WriteLine("吴亦凡");
Console.WriteLine("吴亦凡");
Console.WriteLine("吴亦凡");
Console.WriteLine("吴亦凡");
Console.WriteLine("吴亦凡");
//如上需求: 我们就可以使用for循环
//for循环语法格式:
// for (声明一个循环控制变量; 循环执行的条件; 循环控制变量修改)
// {
// 循环体(需要重复执行的代码块)
// }
//循环四元素:初始条件 判断条件 循环语句 迭代变量
//int i = 0; 初始条件,声明一个i,用于记录循环执行的次数(只有第一次循环的时候执行)
//i < 5; 判断条件(循环继续执行的条件) 条件成立,则继续执行{}里面的代码块,条件不成立,就终止执行
//{}循环语句:(循环体,需要重复执行的代码块)
//i++ 迭代变量(累加语句)执行一次循环体,就会修改一次 i++ ====> i=i+1;
for (int i = 0; i < 5; i++)
{
Console.WriteLine("搬砖");
}
int i = 0;
for (; i < 3;)
{
Console.WriteLine(i);
i++;
}
for循环练习
- 控制台打印1-100之间的整数
- 打印10-1
- 打印1-100之间的偶数
- 求1 - 100所有数字的和
- 让用户输入一个100以内的数 打印1 - 100之间所有的数,用户输入的数除外
- 循环输入某同学结业考试的5门课成绩,并计算平均分
//1.控制台打印1 - 100之间的整数
for (int i = 0; i < 100; i++)
{
Console.WriteLine(i + 1);
}
for (int i = 1; i < 101; i++)
{
Console.WriteLine(i);
}
for (int i = 1; i <= 100; i++)
{
Console.WriteLine(i);
}
//2.打印10 - 1
for (int i = 10; i > 0; i--)
{
Console.WriteLine(i);
}
//3.打印1 - 100之间的偶数
for (int i = 1; i < 101; i++)
{
if (i % 2 == 0)
{
Console.WriteLine(i);
}
}
//打印1 - 100之间的奇数
for (int i = 1; i < 101; i++)
{
if (i % 2 != 0)
{
Console.WriteLine(i);
}
}
//4.求1 - 100所有数字的和;
int sum = 0;
for (int i = 1; i < 101; i++)
{
//sum = sum + i;
sum += i;
}
Console.WriteLine(sum);
//求1 - 100之间所有的偶数的和
int sum = 0;
for (int i = 1; i < 101; i++)
{
if (i % 2 == 0)
{
//sum = sum + i;
sum += i;
}
}
Console.WriteLine(sum);
//5.让用户输入一个100以内的数 打印1 - 100之间所有的数,用户输入的数除外
Console.WriteLine("请输入1-100之间的整数");
int x = int.Parse(Console.ReadLine());
for (int i = 1; i < 101; i++)
{
if (i != x)
{
Console.WriteLine(i);
}
}
//6.循环输入某同学结业考试的5门课成绩,并计算平均分
Console.WriteLine("请输入五次成绩");
int sum = 0;
for (int i = 1; i < 6; i++)
{
Console.WriteLine($"请输入第{i}次成绩");
int num = int.Parse(Console.ReadLine());
sum += num;
}
Console.WriteLine(sum / 5);
双层for循环
//把内层循环看做是外层循环的循环体
//外层循环执行一次,内层循环就执行全部
for (int i = 0; i < 3; i++) {
Console.WriteLine("内层循环开始");
for (int j = 0; j < 3; j++)
{
Console.WriteLine($"i=={i}-------j=={j}");
}
Console.WriteLine("内层循环结束");
}
/*
* 总结:
* 注意:多层循环的变量名不能重复,内层循环可以使用外层循环的变量
* 但是外层循环不能使用内层循环的变量
* 执行过程:外层循环执行一次,内层循环执行全部
*/
while循环
语法:
while循环格式:
while (布尔值或者布尔表达式)
{
布尔值或者布尔表达式成立时执行的代码块(循环体)
}
//while循环初始化语句在while外面
int j = 0;
while (j<3) //j<3 判断语句 也就是while循环执行的条件,条件不满足则停止循环
{
//{} 除了迭代变量 之外都是循环体
Console.WriteLine(j);
j++;//迭代变量
}
do-while
int j = 10;
while (j<10)
{
Console.WriteLine(j);
j++;
} //因为j=10<10,所以while不会执行
do
{
Console.WriteLine(j);
j++;
} while (j<10);//而do whlie则会执行一次
while和的区别
- while执行流程:
- 判断循环执行的条件,若值为true,则执行循环体,改变初始变量(迭代变量)
- 重复执行第一步,直到循环条件的值为false,停止循环
- do-while执行流程:
- 首先执行循环体,改变迭代变量
- 判断循环条件,若值为true,则执行循环体,改变初始变量(迭代变量),
- 依次重复,直到循环条件为fasle,停止循环
do-while 最少执行一次,while条件不成立的话,一次都不会执行
使用场景:
三个循环的使用场景:
-
for 最常用的循环,用于循环的次数明确且固定
-
while 循环的次数不固定,但是有明确的目标
-
dowhile 和while相似,至少执行一次
while 循环练习
- 搬砖30次,每次搬砖2个,一共搬砖多少个
- 目标是搬砖500个,第一次搬砖1个,后面因为更加熟练,每次递增一倍,1、2、4、8、16…,搬砖500个需要多少次
//while循环版本
//记录现在一共搬了多少个
int sum = 0;
//记录搬了多少次
int count = 0;
//记录当前一次能搬几个
int number = 1;
while (sum < 500)//条件为:小于500
{
//开始搬砖(总个数加上当前搬得个数)
sum += number;
//熟练度增加,每次递增一倍
number = number * 2;
number *= 2;
count++;
}
Console.WriteLine(count);
//for循环版本
int count = 0;
int numer = 1;
for (int sum = 0; sum < 500;)
{
count++;
sum += numer;
numer *= 2;
}
Console.WriteLine(count);
//for循环变形
int sum = 0;
for (int count = 0; count < 30; count++)
{
sum += 2;
}
Console.WriteLine(sum););
continue,break,return
continue:跳过本次循环,继续下次循环(作用:终止本次循环)
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
if (j == 2 || j == 4)
{
continue;//跳出本次循环,继续下一次循环(作用:终止本次循环)
}
Console.WriteLine(j);
}
}
break:终止当前循环(作用:跳出循环(一层))
return:跳出整个方法
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
if (j == 2)
{
break;//终止当前循环(作用:跳出当前这一层循环)
}
Console.WriteLine(j);
}
}
总结
//总结: 为什么要使用终止循环的关键字?
//是为了达到性能优化的目的
//比如:我们要找到某些数字中第一个满足条件的值,就可以在找到第一个的时候结束循环
//找到925-1226中第一个能被3和5整数的值
for (int i = 925; i <=1226; i++)
{
if (i % 3 == 0 && i % 5 == 0)
{
Console.WriteLine(i);
break;
}
}
本期练习题
- int a = 3; int b = 5;实现交换a和b的值,如果不使用中间变量又该如何实现?
- 请键入一个年份 year 和月份 month ,请算出这个月有多少天?
ps:闰月:非整百年能被4整除,整百年能被400整除。否则是平年(闰年2月29天 平年2月28天) - 输出 1-100 中能被 3 整除的数
- 水仙花数(一个三位数,其各位数字立方和等于该数本身,如:153)
- 打印99乘法表
上期练习题答案
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _01_昨天作业
{
internal class Program
{
static void Main(string[] args)
{
//1.从控制台输入一个数字,判断这个数字是否值奇数(单数); 偶数(双数)
int x = int.Parse(Console.ReadLine());
if (x % 2 == 0)
{
Console.WriteLine("偶数");
}
else
{
Console.WriteLine("奇数");
}
//2.输入24小时制的时间 0 - 24 如果超出“时间输入有误”
//11 - “上午11点” 14 - “下午2点” 6点前是“凌晨” 晚上10点后是“深夜
Console.WriteLine("请输入一个时间");
int time = int.Parse(Console.ReadLine());
if (time > 0 && time <= 24)
{
if (time > 0 && time <= 6)
{
Console.WriteLine($"现在的时间是凌晨{time}点");
}
else if (time > 6 && time < 12)
{
Console.WriteLine($"现在的时间是上午{time}点");
}
else if (time > 12 && time < 22)
{
Console.WriteLine($"现在的时间是下午{time - 12}点");
}
else if (time > 22 && time < 24)
{
Console.WriteLine($"现在的时间是深夜{time - 12}点");
}
}
else
{
Console.WriteLine("时间输入有误");
}
//3 无答案,本题主要考察运算符和()优先级
//4 输入一个圆的半径,求圆的面积(保留两位小数) 提示(Math.PI)
string r = Console.ReadLine(); // 注意:控制台接收的数据都是string类型 10==>"10"
double rd = double.Parse(r);
double s = Math.PI * rd * rd;
Console.WriteLine(s.ToString("F2"));
// 表示四舍五入保留几位小数
Console.WriteLine(Math.Round(s, 2));
//5.模拟超市商品打折-if 条件判断语句
//当商品满100元,则打9.5折,否则 按原价付款,最后输出商品应付金额
Console.WriteLine("请输入商品价格");
decimal price = decimal.Parse(Console.ReadLine());
if (price >= 100)
{
//m/M表示这个数值是decimal类型的数值
price *= 0.95m;
}
Console.WriteLine(price);
//6. 输入一个四位数,求千位、百位、十位、个位数分别为?
string numStr = Console.ReadLine(); //1234
int num = int.Parse(numStr);
//千位
Console.WriteLine(num % 10000 / 1000);//1
//百位
Console.WriteLine(num % 1000 / 100);//2
//十位
Console.WriteLine(num % 100 / 10);//3
//个位
Console.WriteLine(num % 10 / 1);//4
//7.随意发挥,太简单了,无答案
//8.输入三个数,求最大数,最小数,中间数(必须使用三目运算符)
int xx = int.Parse("10");
int yy = int.Parse("5");
int zz = int.Parse("15");
int t;
if (xx > yy)
{
t = xx; //t=10
xx = yy; //x =5
yy = t;// y = 10
}
if (xx > zz)
{
t = xx;
xx = zz;
zz = t;
}
if (yy > zz)
{
t = yy;
yy = zz;
zz = t;
}
//将排好的数据写入控制台
Console.WriteLine("排好的数为:xx=" + xx + " yy=" + yy + " zz=" + zz + "");
//9.昨天博客有
//10.输入一个年份判断是否是闰年
Console.WriteLine("请输入一个年份:");
int year = int.Parse(Console.ReadLine());
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
{
Console.WriteLine("{0}是闰年。", year);
}
else
{
Console.WriteLine("{0}不是闰年。", year);
}
// 11. int a = 2, b = 3;
// int c = (a++) * (--b);
// 求: a b c
int a1 = 2, b1 = 3;
int c = a1++;
int d = --b1;
Console.WriteLine(a1);
Console.WriteLine(b1);
//这题主要理解++ --放变量前后的运算顺序,
//如b=a++;a先执行赋值给b,然后再自增1
//而b=--a;则是先a自减1,然后再赋值给b
Console.WriteLine(c * d);
int cc = (a1++) * (--b1);
Console.WriteLine(cc);
}
}
}