循环控制
循环控制
1. 循环: 反复不停的做同1件事情.
a. 现实生活中的循环在反复不停的做什么事情?
b. 现实生活中的循环一定会有停止的那1刻.
2. 在代码中.我们会有这样的需求: 同1段代码反复不停的执行指定的次数.
a. 实现的方式
1) 简单粗暴的方式: 那就是复制粘贴
缺点: 代码冗余. 修改维护极度不方便.
2) 循环结构: 将1段代码进行反复不停的执行指定的次数.
代码简洁 并且 修改维护方便.
3. 循环结构
while循环结构 do-while循环结构 for循环结构
他们都是来将1段代码进行反复不停的执行指定的次数,唯一的区别仅仅是语法上的区别.
4. while循环结构.
a. 语法.
while(bool表达式)
{
需要被反复不停的执行的代码;
循环体;
}
int i = 0; //循环增量 用来记录循环的次数. while (i<5) { Console.WriteLine("我爱北京天安门"); i++; }
bool表达式: 比较表达式 逻辑表达式 bool类型的变量 bool类型的常量
b. 执行步骤.
第1步: 计算bool表达式的结果.
1.1 如果结果为true。就执行循环体.循环体执行完毕之后.跳回第1步继续执行.
1.2 如果结果为false。级结束while循环结构 继续往下执行.
简单的说下:
判断条件 如果为true 就执行循环体 执行完毕之后 再判断 直道条件为false的时候结束循环.
5. 我们在写循环的时候,一定要避免死循环.
如果1个循环是死循环 那么循环后面的代码永远不会被执行到.
6. 要写循环的话 你必须确定如下两点:
a. 那1段代码是需要被反复不停的执行的. 循环体.
b. 循环结束的条件. 没有特殊的理由千万不要写1个死循环.
------------------------------------------------------循环的常用算法---------------------------------------------------------------
1. 循环的应用之一: 循环体确定. 循环的次数也确定
实现的步骤:
a. 定义1个int类型的循环增量i 并赋默认值为0 该变量用来记录循环的次数.
b. while循环的条件写上 i<次数
c. 在循环体中一定要记得 将循环增量i的值自增.
eg:
int i = 0;
while(i<次数)
{
循环体;
i++;
}
为什么这么写我们的循环就可以执行指定的次数.
因为循环的条件表达式中 有循环增量i参与. 而i变量的值 每循环1次都会发生变化.
前面几次的变化循环条件的结果都是true 当最后1次变化的时候 循环条件的值就变为false了.
写循环的技巧:
如何确定循环体: 那你就试着写代码.要实现功能 不用循环该如何实现.
你在复制的代码 就是要被反复不停的执行的代码 就是你要找的循环体嘛.
一定要注意: 循环增量的值不要忘记更改. 如果不改循环增量的值 只要第1次循环可以进入 那么这个循环就是1个死循环.
2. 循环应用之二: 循环体确定 循环的次数不确定. 但是我清楚循环结束的条件.
实现的步骤.
a. 先写1次循环体.
b. 在写1个while循环 循环中放入我们的循环体. 循环的条件: 写上要再来1次的条件.
c. 在循环体中一定要改 参与 循环条件表达式的变量的值 否则如果第1次可以进入循环 那么这个循环就会是1个死循环.
eg:
循环体;
while(再次进入循环的条件)
{
循环体;
一定要记得更改参与循环条件表达式的变量的值.
}
//请写1个程序 要求输入用户名. 只要不是admin 要求用户重新输入. //接收用户输入用户名 的操作. 需要反复不停的执行, Console.WriteLine("请输入用户名:"); string userName = Console.ReadLine(); //需不需要继续输入? 当userName的值不为"admin"的时候 重新输入. while(userName!="admin")//== != { Console.WriteLine("请输入用户名:"); userName = Console.ReadLine(); } Console.WriteLine("OVER");
注意:对于这种循环. 我们清楚的是循环结束的条件. 但是我们在while后面写的是循环继续的条件. 写的是循环结束的反面的条件.
要么循环条件直接就写上反向的条件.
要么就把结束的条件写上 然后再反1下.
补充:
我们的建议是在循环之前 先写1次循环体 。
为什么我们要先写1次循环体呢? 是因为我们要保证我们的循环无论如何至少要执行1次.
那如果是这个目的的话 我们就可以简单1点.
在写条件的时候 保证这个条件第一次是成立的 可以进去执行循环体.
3. 循环应用之三: 遍历指定范围的数.
循环结构的作用:将同1段代码进行反复不停的执行指定的次数.
实现步骤.
要将n-m之间的每1个整数打印出来.
a. 定义1个循环增量i 并赋默认值为n;
b. while循环的条件是 i<=m
c. 在循环体中 循环增量i 就是我们想要遍历的数据.
切记: 要在循环体后面更改循环增量的值 i++;
int i = n;
while(i<=m)
{
循环增量i就是我们要遍历的数据;
i++;
}
//将100-200之间的整数打印出来. int i = 100; while (i < 201) { Console.WriteLine(i); i++; }
4. 循环应用之四: 找出指定范围中符合特定条件的数.
实现步骤.
a. 遍历这个范围中的每1个整数.
b. 判断遍历出来的这个数是不是符合特定条件的.
//请用户输入两个整数 1 20 那你就将两个数之间的整数打印出来. //如果第1个数比第2个数大 就提示错误. Console.WriteLine("请输入第1个数:"); int min = int.Parse(Console.ReadLine()); Console.WriteLine("请输入第2个数:"); int max = int.Parse(Console.ReadLine()); if (min > max) { Console.WriteLine("输入错误,第1个数不能比第2个数大."); } else { //我们将min-max中的每1个整数打印出来. int i = min; while (i <= max) { Console.WriteLine(i); i++; } }
eg: 请n-m之间的符合特定条件的数:
int i = n;
while(i<=m)
{
判断i是不是符合特定条件 如果符合打印出来.
i++;
}
5. 循环应用之五: 求累加和 平均值.
求1堆数的累加和.
先准备1个桶变量 用来存储累加和.
然后遍历这1堆数中的每1个数. 将遍历出来的数 往 桶中累加.
遍历完毕后 桶 变量中的数据 就是这堆数的累加和.
eg. 求n-m之间的所有的整数的累加和.
int sum = 0;
int i = n;
while(i<=m)
{
sum+=i;
i++:
}
循环完毕以后 sum中的值 就是n-m之间的整数的累加和.
//请写1个程序 算出1-10之间的所有的数的累加和. int sum = 0;//"桶变量" 用来存储累加和. int i = 1; while (i <= 10) { sum += i; i++; } Console.WriteLine(sum);
6.循环应用之六:求最大值和最小值.
找1堆数中的最大值:
a. 声明1个擂台变量.
b. 遍历这堆数中的每1个数. 将遍历出来的数和擂台变量中的数进行比较
如果比的过就上去.
c. 遍历完成以后,这个擂台变量中存储的就是这堆数中的最值.
//从控制台输入10个数 要把最大的那个数找出来. int i = 0; int max = int.MinValue; while (i < 10) { Console.WriteLine("请输入第{0}个数:",i+1); int num = int.Parse(Console.ReadLine()); if (num > max) { max = num; } i++; } Console.WriteLine(max);
7.循环应用之七: 穷举
1个1个的试.
//有1个数 这个数至少是2. 这个数除以2余数为1 除以3余数也为1 除以4余数1. int num = 2; while (num % 2 != 1 || num % 3 != 1 || num % 4 != 1) { num++; } Console.WriteLine(num);
8. 循环应用之八:计数
//请统计1-100之内有多个数 可以被8整除. int i = 1; int j = 0; while (i <= 100) { if (i % 8 == 0) { j++; } i++; } Console.WriteLine(j);
9. break关键字.
a. break可以用在switch-case中. 代表立即结束整个switch结构.
b. break还可以用在循环体中. 代表立即结束当前所在的循环. 如果循环体的后面还有代码的话 不会执行.
break的作用可以结束循环.
break的应用场合.
对于循环体确定,循环次数不确定,但是循环结束的条件确定的循环.
我们十分清楚的是 循环结束的条件. 但是在写条件的时候 要写循环继续的条件.
推荐的方式.
a. 先来1个"死"循环.
b. 在循环体中 判断循环是否应该结束.
int i = 0; while (i < 5) { Console.WriteLine(i); if (i == 2) { break; } Console.WriteLine("A"); i++; }
10. continue 是1个关键字. 用在循环体中.
在循环体中如果遇到continue 表示立即结束本次循环,准备进入下次循环,
如果后面还有循环体的代码 不会执行.
int i = 0; while (i < 5) { i++; if (i == 2) { continue; } Console.WriteLine(i); } Console.WriteLine("OVER");
---------------------------------------------------经典题目----------------------------------------------------
//请将1000-5000之间的符合条件的数打出来. //各位数之和等于5的整数. 1004 1+0+0+4 1013 // 1987/1000 1987%1000 /100 int i = 1000; while (i <= 5000) { //要判断i 的各位数之和是否等于5 int qian = i / 1000; int bai = i % 1000 / 100; int shi = i % 1000 % 100 / 10; int ge = i % 10; if (qian + bai + shi + ge == 5) { Console.WriteLine(i); } i++; }
//请用户从控制台输入用户名和密码 只要不是admin 888888 就重新输入. //当输入3次都没有输入正确的话 那么就不给输入了. //循环体: 接收用户的用户名和密码. 循环的次数:最多3次 结束的条件: 输入用户名和密码正确 string userName = ""; string pwd = ""; int i = 0; //用户名或密码不正确 并且 循环的次数小于3次 while ((userName != "admin" || pwd != "888888") && i<3) { Console.WriteLine("请输入用户名:"); userName = Console.ReadLine(); Console.WriteLine("请输入密码:"); pwd = Console.ReadLine(); i++; }