循环结构
顺序结构,从_上往下依次执行;选择结构,根据条件执行对应的内容
为什么要使用循环结构?
问题一:反复输入数字,判断输出对应是星期几。问题二:求1到100的累加和
主要内容:
while循环;do-while循环;for循环;循环嵌套;break语句;continue语句
while 循环
语法格式:
while(循环条件){
语句;
}
如果循环体只有一条语句,大括号可以省略。为避免死循环,小括号后面不要加分号
执行流程: 将小于5的整数打印输出。
int n=1;
while(n<5){
//輸出n的値
n++;
}
- n的值必须先进行初始化
- 循环变量n的值必须被改变(死循环)
执行流程分析:
![img_198a96772c91b6d19ae828875ef593ff.jpe](https://i-blog.csdnimg.cn/blog_migrate/cb5274e05a2518291b90f733dc583006.jpeg)
案例: 求1到5的累加和
package cn.mtianyan.flow2;
public class PlusDemo {
public static void main(String[] args) {
// 求1到5的累加和
// 1+2+3+4+5
int n = 1;
int sum = 0; //sum存放和变量
while (n <=5 ){
sum = sum +n;
n++; // 这句不能少
}
System.out.println("sum="+sum);
}
}
![img_766b36fefe33fd9c2c4e8a74f8a459a9.jpe](https://yqfile.alicdn.com/img_766b36fefe33fd9c2c4e8a74f8a459a9.jpeg)
执行过程:
![img_d7a780e17aa9c4be19a52e9004447a02.jpe](https://i-blog.csdnimg.cn/blog_migrate/29e461e55557cfa24ecfd49c08022fe4.jpeg)
求1+3+5+7+...+15
sum +=n;
n +=2; //替换n++ 可以实现跳值计算
案例: 循环输出26个英文字母,分两行输出
package cn.mtianyan.flow2;
public class CharDemo {
public static void main(String[] args) {
// 循环输出26个英文小写字母,分两行输出
char ch = 'a';
int count=1; // 13个字母时换行
while (ch <= 'z'){
System.out.print(ch+"");
if(count%13 == 0){
System.out.println();
}
count++;
ch++;
}
}
}
运行结果:
![img_2af5ebeeae82e720613a048e4d95d6cc.jpe](https://i-blog.csdnimg.cn/blog_migrate/6995ea7fcac58c9d8555b0ae7356c3ac.jpeg)
编程练习
使用while循环求1到5的平方和。效果图:
![img_a850fd0352defd95d79e8b42d045f5e1.jpe](https://i-blog.csdnimg.cn/blog_migrate/757f11b76519b8773ca6f8db76113578.jpeg)
任务
- 定义整型变量n作为循环变量,并初始化
- 定义整型变量sum存放和,并初始化
- 使用while循环求1到5的平方和
- 输出平方和
package cn.mtianyan.flow2;
public class LoopDemo {
public static void main(String[] args) {
int n = 1;
int sum = 0;
while (n<=5){
sum +=(n*n);
n++;
}
System.out.println("1到5的平方和为:"+sum);
}
}
运行结果:
![img_b20d999f7ea00000dce6f0d7421ba4cc.jpe](https://i-blog.csdnimg.cn/blog_migrate/e66e1fd6e1f03fd0ea798ef787eff154.jpeg)
do-while循环
语法格式
do{
语句;
} while(循环条件);
注意事项: do-while循环至少执行一次;循环条件后的分号不能丢
int n= 1;
do
{
//輸出n的値
n++;
} while(n< 5);
局部变量使用前必须被初始化
![img_ecf849944a059220a6b6ba6cd35253c4.jpe](https://i-blog.csdnimg.cn/blog_migrate/b196fe884113abb63dc7b2d3ea08229d.jpeg)
求1到5的累加和
package cn.mtianyan.flow2;
public class DoWhileDemo {
public static void main(String[] args) {
// 求1到5的累加和
int n=1;
int sum=0;
do {
sum +=(n*n);
n++;
}while (n<=5);
System.out.println("1到5的平方和为:"+sum);
}
}
运行结果:
![img_d5d3b62cf1e050e99f8bd728eae38b63.jpe](https://i-blog.csdnimg.cn/blog_migrate/d21f136e0267a9c194c330a07778c1e3.jpeg)
案例:猜字游戏
猜字游戏。要求猜一个介于1到10之间的数字。然后将猜测的值与实际值进行比较,并给出提示,以便能更接近实际值,直到猜中为止。
程序分析:
- 给定要猜测的数字
- 使用循环结构
- 循环进行的条件:猜测的数据和实际值不相等
- 循环体的内容:输入实际值,及进行判断
- 输出猜到的值
package cn.mtianyan.flow2;
import java.util.Scanner;
public class GuessDemo {
public static void main(String[] args) {
// 设置要猜的数
int number = 6;
int guess;
System.out.println("猜一个介于1到10之间的数");
do {
System.out.println("请输入您猜测的数:");
Scanner scanner = new Scanner(System.in);
guess = scanner.nextInt();
if(guess >number){
System.out.println("您猜大了");
}else{
System.out.println("您猜小了");
}
}while (number != guess);
System.out.println("您猜中了!答案为: "+number);
}
}
运行结果:
![img_8752c09c048b97052a33df15de720a90.jpe](https://i-blog.csdnimg.cn/blog_migrate/cfba39cb6c31fddad7c6d9188862df6e.jpeg)
将要猜的数设为随机数:
Math.random()得到[0,1)之间的随机数
// Math.random()*10+1 表示[0,10)+1:[1,11)之间的随机数。强制类型转换int之后就是1-10了
int number = (int) (Math.random()*10+1);
for循环应用及局部变量作用范围
int n=1;
while(n<5)
//輸出n的値
n++;
for循环语法格式:
for(表达式1;表达式2;表达式3)
{
语句;
}
for(int n=1;n<5;n++)
{
//输出语句;
}
分号不可省略,可以省略表达式1,2,3。
使用for循环,求1到5的累加和。
package cn.mtianyan.flow2;
public class ForDemo {
public static void main(String[] args) {
int sum=0;
for (int n=1;n<=5;n++){
sum +=n;
}
// System.out.println(n); // 局部变量的作用范围
System.out.println("sum="+sum);
}
}
运行结果:
![img_ddaaf4cecc0781c7af5f2965b47875f5.jpe](https://i-blog.csdnimg.cn/blog_migrate/a9b4673f7dd71de6ff4e99d721de0e05.jpeg)
int n= 1;在循环体中只执行一次
![img_775ad1fc42207e968127f74ee54a5f22.jpe](https://i-blog.csdnimg.cn/blog_migrate/351e1262b9243cdef6570c2c896fc27f.jpeg)
局部变量,主方法中定义的都是局部变量。局部变量只在定义它的大括号内有效!
for循环的注意事项
三个表达式都是可以省略
for(表达式1;表达式2;表达式3)
{
语句;
}
将10以下的整数打印输出:
package cn.mtianyan.flow2;
public class ForDemo1 {
public static void main(String[] args) {
for (int i=0;i<=10;i++){
System.out.print(i+" ");
// 循环结束时i值为11
}
}
}
运行结果:
![img_7cb8fbffd113ac996ab81f44d0f4bee7.jpe](https://i-blog.csdnimg.cn/blog_migrate/8fd7b4d93bfa2060f3ab5da175f01463.jpeg)
省略表达式:
package cn.mtianyan.flow2;
public class ForDemo1 {
public static void main(String[] args) {
int i=0;
// for(;;){
while(true){
System.out.print(i+" ");
// 循环结束时i值为11
if(i>=10){
break;
}
i++;
}
}
}
循环输入数字1-10并输出,如果输入0则跳出循环:
package cn.mtianyan.flow2;
import java.util.Scanner;
public class InputZeroBreak {
public static void main(String[] args) {
System.out.println("请输入你需要打印的数字,输入0时退出");
Scanner scanner = new Scanner(System.in);
int n;
while(true){
n = scanner.nextInt();
if(n==0){
System.out.println("接收到0输入,已退出");
break;
}
System.out.println("n="+n);
}
}
}
运行结果:
![img_87db8e548096b4975681c77ef8137902.jpe](https://i-blog.csdnimg.cn/blog_migrate/b8a5800deaaf6b2a13a4146bddf7d6f0.jpeg)
package cn.mtianyan.flow2;
public class ForExercise {
public static void main(String[] args) {
int i;
int j;
for (i=0,j=1;j<5;j+=3){
i = i+j;
}
System.out.println("i="+i);
System.out.println("j="+j);
}
}
运行结果:
![img_5762c5b2b53918f578dd1ba85f9e1c67.jpe](https://i-blog.csdnimg.cn/blog_migrate/6f09f49a1e0c016f7595703ac5badae9.jpeg)
请注意记住执行顺序如下:
![img_a064db3498c9b6d72d61001d15951fa8.jpe](https://i-blog.csdnimg.cn/blog_migrate/c625dc11a23ddc5d2673e3aced243f6c.jpeg)
编程练习
编写一个程序,求出200到300之间的数,且满足条件:它们三个数字之积为42 ,三个数字之和为12。
效果图:
![img_0c700f41926fe8952eac79184a98d224.jpe](https://i-blog.csdnimg.cn/blog_migrate/b52f2f46e6cd4c102eba182921fd8b51.jpeg)
任务
- 循环遍历 200到300之间的整数
- 分别取出个位、十位和百位上的数
- 求三个数字的和与积
- 判断三个数字的积是否为42 ,三个数字的和是否为12 ,如果满足条件则输出该数
package cn.mtianyan.flow2;
public class LoopDemoExercise {
public static void main(String[] args) {
for (int i=200;i<=300;i++){
// 个位 十位 百位
int hundreds = i / 100;
int ten = (i-hundreds*100)/ 10;
int single = i-hundreds*100-ten*10;
if(hundreds*ten*single == 42 && (hundreds+ten+single)==12){
System.out.println(i);
}
}
}
}
运行结果:
![img_f8d8bd200dc87bfe51a53f80b59e900d.jpe](https://i-blog.csdnimg.cn/blog_migrate/6608525566e0e9bf47e21f94da424437.jpeg)
嵌套的while循环应用
while(循环条件)
{
while(循环条件){
}
}
一个循环内部还有另外一个循环,二重循环;允许多层循环嵌套; 外层循环和内层循环。循环嵌套可以混搭。
do{
......
while(循环条件){
......
}
}while(循环条件);
for(表达式1;表达式2;表达式3)
{
......
for(表达式1;表达式2;表达式3){
......
}
......
}
例: 使用嵌套while循环输出4行4列的星号
package cn.mtianyan.flow2;
public class StarDemo {
public static void main(String[] args) {
int i=1; // 外重循环的循环变量
int j=1; // 内重循环的循环变量
System.out.println("输出4行4列的星号");
while (i <= 4) {
while (j <= 4) {
System.out.print("*");
j++;
}
System.out.println();
i++;
}
}
}
![img_e40a698befb38056d58690621bcd03b9.jpe](https://i-blog.csdnimg.cn/blog_migrate/012bf0c2a16b2253b5c00a3a64f511da.jpeg)
程序运行流程分析:
![img_44ccf2c8d387279deeba8a557ac7dbcd.jpe](https://i-blog.csdnimg.cn/blog_migrate/ad44ee29ecaa290f3f1a05d098d2bff7.jpeg)
可以看到内层的j执行完自己的第一轮之后,下次的i符合条件,j执行的轮中,i已经无法满足条件了。因此要在每一个大轮中重置内层的循环变量。
package cn.mtianyan.flow2;
public class StarDemo {
public static void main(String[] args) {
int i=1; // 外重循环的循环变量
int j; // 内重循环的循环变量
System.out.println("输出4行10列的星号");
// 外层控制有几行,内层控制每行有几列
while (i <= 4) {
j=1;
while (j <= 10) {
System.out.print("*");
j++;
}
System.out.println();
i++;
}
}
}
运行结果:
![img_acc1f47f1f4f03e5ebad839bbeabebff.jpe](https://i-blog.csdnimg.cn/blog_migrate/914ecb63241ce4d07b4fbfc802930be8.jpeg)
![img_61a6ab49512d2ea7780067ed2b98f2f5.jpe](https://i-blog.csdnimg.cn/blog_migrate/33e2d5263ebd29e5a55b7011f7bf2622.jpeg)
![img_eb43675bbefe1428b5c680833a1ce1c2.jpe](https://i-blog.csdnimg.cn/blog_migrate/dbdb67ef5a07ea0009d4baeca59a5174.jpeg)
程序进阶: 输出三角形怎么处理?
程序每行输出多少个是由内层控制的,因此对于内层进行改造。
改为与外层联动n<=4 改为n<=m
第一次时输出一个星,输出两个星;
while (j <= i)
运行结果:
![img_bd3e1dbd12617cbdea38835a1b314ce3.jpe](https://i-blog.csdnimg.cn/blog_migrate/8e04261e917ac790e4743182df323432.jpeg)
package cn.mtianyan.flow2;
public class StarDemoFor {
public static void main(String[] args) {
int i;
int j;
for(i=1;i<=4;i++){
for(j=3;i<=j;j--){
System.out.print("-");
}
for(j=1;j<=i;j++){
System.out.print("*");
}
for(j=1;j<i;j++){
System.out.print("*");
}
System.out.println();
}
}
}
运行结果:
![img_3b0589a8c54a09b55ad9166a80bef710.jpe](https://i-blog.csdnimg.cn/blog_migrate/7bdf2d9f42c040680ea13d353306867e.jpeg)
阶乘的累加和
求1!+2!+3!+...+ 10!
嵌套循环,外层循环进行和运算,内层进行阶乘运算。
package cn.mtianyan.flow2;
public class FactorialDemo {
public static void main(String[] args) {
int s,sum=0;
for (int i=1;i<=4;i++){
s = 1; // s值每个循环内重新置1
for (int j=1;j<=i;j++){
s = s*j; // s存放阶乘计算的结果
}
sum +=s;
}
System.out.println("1!+2!+3!+4!="+sum);
}
}
![img_98d55e394e5692a6149d6b10227627f5.jpe](https://i-blog.csdnimg.cn/blog_migrate/a52ddb9e695633637fd46113f0e7fa7f.jpeg)
for (int i=1;i<=10;i++)
![img_0ca3aff46bc8fb0963a7a75bffe50bfa.jpe](https://i-blog.csdnimg.cn/blog_migrate/3d97aecbfdd240e10092b55f25879900.jpeg)
for (int i=1;i<=50;i++)
![img_875aaba8c30e26cd6a39d0ca64493c89.jpe](https://i-blog.csdnimg.cn/blog_migrate/dc75d5f64cc15eb7d337312844ac1e9b.jpeg)
可以看到此时int已经装不下了,发生了溢出,因此我们该使用长整型。
long s,sum=0;
而长整型还无法容纳的数据。
package cn.mtianyan.flow2;
import java.math.BigInteger;
public class FactorialDemo {
public static void main(String[] args) {
BigInteger sum = new BigInteger("1");
BigInteger s;
for (int i=1;i<=50;i++){
s = new BigInteger("1"); // s值每个循环内重新置1
for (int j=1;j<=i;j++){
BigInteger num = new BigInteger(String.valueOf(j));
s = s.multiply(num);
}
sum = sum.add(s);
}
System.out.println("1!+2!+3!+50!="+sum);
}
}
![img_f654ef9fba64e97e383db242dcb0a991.jpe](https://i-blog.csdnimg.cn/blog_migrate/b27bc14041acbf0ab85fd977e94e072e.jpeg)
编程练习
用星号输出一个梯形,如下图所示: ( 使用嵌套for循环完成)
![img_7ff1c988af033c9a703af761c7b6bf8d.jpe](https://i-blog.csdnimg.cn/blog_migrate/ffac3453e869cd900939046c33188905.jpeg)
任务:
- 外重循环控制输出行数
- 第一个内重循环控制输出的空格数,依次递减
注意:由于星号和空格在屏幕上所占的空间不同,所以可以适当调整空格的输出,比如毎次
循环都输出两个空格.这样输出来的图形会更加接近梯形
- 第二个内重循环控制毎行输出的星号数
- 输出完一行的星号和空格后换行
package cn.mtianyan.flow2;
public class StarDemoExercise {
public static void main(String[] args) {
// 输出五行
for(int i=1;i<=5;i++){
for (int j=4;i<=j;j--){
System.out.print("-");
}
for (int j=1;j<=i+1;j++){
System.out.print("*");
}
for (int j=1;j<=i;j++){
System.out.print("*");
}
System.out.println();
}
}
}
![img_64261d61b5a6d1c3e63d33f82efe7595.jpe](https://i-blog.csdnimg.cn/blog_migrate/2d24abcad013b2410e1e7e7b1b2b11a9.jpeg)
这里分为三部分画出。
package cn.mtianyan.flow2;
public class StarExercise2 {
public static void main(String[] args) {
for(int i=1;i<=5;i++){
for (int j=4;i<=j;j--){
System.out.print("-");
}
for (int j=1;j<=(2*i+1);j++){
System.out.print("*");
}
System.out.println();
}
}
}
![img_c99c8915bee3629488edf2e4ee45cc14.jpe](https://i-blog.csdnimg.cn/blog_migrate/962480e094371b3a707a80fb8ec05566.jpeg)
分两部分画出,则需要看出行号和该行星星之间的关系。
break语句
break语句可以结束当前循环的执行
执行完break语句后,循环体中位于break语句后面的语句就不会被执行
在多重循环中, break语句只向外跳一层
public static void main(String[]args){
Scanner sc=new Scanner(System.in);
int n;
while(true){
n= sc.nextInt();
if(n == 0)break;
System.out.println(n);
}
}
多重循环:
public static void main(String[] args){
int k = 0;
for(int i=1;i<5;i++){
for(int j=1;j<5;j++){
k=i+j;
if(j==3)break;
}
}
System.out.println("k="+k);
}
![img_b0d675dac0292dcb3ce7b676239532a6.jpe](https://i-blog.csdnimg.cn/blog_migrate/c909253dc01c1660f46b562f6ee1e02e.jpeg)
![img_e25c0f7cf5a0b72af1aed18ffb596edb.jpe](https://i-blog.csdnimg.cn/blog_migrate/c12ce642e71240330c6a0bfb75df0ac1.jpeg)
注意写表查看值得变化情况,脑补脑力不足很费劲。
break语句的使用;break语句的作用:跳出当前循环结构;break语句一旦被执行, 循环体中break语句后面的代码将不再被执行
注意: break语句是跳出当前循环.只跳出了内层循环,不会影响到外层循环的继续执行
continue语句
continue语句只能用在循环里
continue语句可以结束当前循环的执行,但是要继续下一次循环的执行
求1+3+5+7+9
public static void main(String[] args){
int sum=0;
for(int i=1;i<=9;i++){
if( i%2 == 0)continue;
sum =sum+i;
}
System.out.println("sum="+sum);
}
循环变量每次加2就可以实现。使用continue语句的情况如下
public static void main(String[] args){
int sum=0;
for(int i=1;i<=9;i++){
if(i%2 == 0)continue; // 偶数不加进sum
sum=sum+i;
}
System.out.println("sum="+sum);
}
![img_ffbb062c9011070e57fd1bcea1d47d61.jpe](https://i-blog.csdnimg.cn/blog_migrate/5261585dffb9de33833dd729e8ae19f4.jpeg)
双重循环问题:
public static void main(String[] args){
int k=0;
for(int i=1;i<=5;i++){
for(int j=1; j<5; j++){
if(j%2 == 0)continue;
k=k+j;
}
}
System.out.println("k="+k);
}
自己分析输出结果:
![img_115f28827fabf400b6cd3bcf48f63c92.jpe](https://i-blog.csdnimg.cn/blog_migrate/eca13508d071b053c35578c15ed4688e.jpeg)
只能在循环体内和switch语句体内使用break;
程序Debug
![img_3fb35cdd89336714bce408d915879dcb.jpe](https://i-blog.csdnimg.cn/blog_migrate/a22d370f346af0962ff663d9daa41def.jpeg)
调试的作用:
让程序员能看清程序每一步的效果,在需要查看结果的时候,使用debug查看实际结果是否与预期结果一致。
阶乘中s=1;的重置操作很容易遗漏。调试例子(1到5的累加和)
package cn.mtianyan.flow2;
public class ForDemo {
public static void main(String[] args) {
int sum=0;
for (int n=1;n<=5;n++){
sum +=n;
}
System.out.println("sum="+sum);
}
}
断点,让程序停到这
![img_0e5d787c0df73158519966492560415d.jpe](https://i-blog.csdnimg.cn/blog_migrate/b072a4463c51aacce1b53ac62e45c090.jpeg)
设置断点,让程序停在这。此时开始运行调试。
![img_49474e164d1c6f8892df3913d463a930.jpe](https://i-blog.csdnimg.cn/blog_migrate/7843ebbc14068546e34955ca6dbce12a.jpeg)
右键点debug,而不是run。
![img_d8fd2a2bff7832d7158887c1cbf8bc7e.jpe](https://i-blog.csdnimg.cn/blog_migrate/8229f75d8ec5c62f03e78f7dc6036fc1.jpeg)
然后我们开始单步调试。
![img_db66891d568cfcce386ac6382741cc96.jpe](https://i-blog.csdnimg.cn/blog_migrate/6b6e370d6d3140892a437fc84f6713a4.jpeg)
step over 是单步调试, Step into 是进入函数内部,使用step over可以看到sum 和 n 一直在变化。
Debug多断点调试
![img_30a6bd689e7bfb932499660e96ef2c3c.jpe](https://i-blog.csdnimg.cn/blog_migrate/e1552364e4e6576196913d10a89ae3c0.jpeg)
多个断点时从当前断点之间执行完,跳到下个断点停住。注意: 对于for循环来说,一个断点可以当做循环次数个断点,直到循环结束,才会到下一个断点。
快捷键,各个平台不一样,自己根据英文名来找自己的快捷键。
流程控制总结
流程控制语句:顺序、选择、循环
选择语句
- if语句
- if-else语句
- 多重if-else语句
- 嵌套if-else语句
- switch语句(常量表达式,整型字符型)
循环结构
- while循环
- do-while循环
- for循环
- 嵌套循环(任意的组)
- break语句和continue语句(break使用在switch和循环结构当中,continue语句只能使用在循环结构当中)
break是结束当前循环的执行,continue是结束当前循环的执行,会继续下一次循环执行。多重循环这两个都只跳出一层。
如何进行调试? 单步 继续执行到下个断点
如何存储相同数据类型的多个数据呢?数组将为我们解决这个问题。
在下集中,将为大家带来一维数组的使用,增强型for循环,以及冒泡排序!