程序流程控制补充(循环)
前言
本次主要复习for循环、while循环、do-while循环。
一、For循环
1.1 for循环的使用
For循环的使用
- 循环结构的四个要素:
①初始化条件
②循环条件
③循环体
④迭代条件
- for循环的结构:
for(初始化条件;循环条件;迭代条件)[
循环体;
}
- 执行过程:① --> ② --> ③ --> ④ --> ② --> ③ --> …
1.2 for循环练习
import java.util.Scanner;
class ForTest {
public static void main(String[] args){
for(int i = 1;i <= 5;i++){
System.out.println("HelloWorld!");
}//这里的i是在for循环内定义的,旨在for循环大括号内有用,出了括号就
//无法调用了,所以下面可以重复定义i
//练习
int num = 1;
for(System.out.print('a'); num <= 3; System.out.print('c'),num++){
System.out.print('a');
}//输出结果:abcbcbc
System.out.println();//换行
//例题:遍历100以内的偶数,输出所有的偶数的和,输出偶数的个数
int sum = 0; //sum记录所有偶数的和
int count = 0; //count记录所有偶数的个数
for(int i = 0;i <= 100;i++){
if(i % 2 == 0){
System.out.println(i);
sum += i;
count++;
}
}
System.out.println("总和为:" + sum);
System.out.println("总个数为:" + count);
/*
例题2:编写程序从1循环到150,并在每行打印一个值,另外在每个3的
倍数行上打印出“foo”,在每个5的倍数行上打印“biz”,在每个7的、
倍数行上打印输出“baz”
*/
for(int i = 1;i <= 150;i++){
//每行打印一个值
System.out.print(i + "\t");
//每个3的倍数行上打印出“foo”
if(i % 3 == 0){
System.out.print("foo" + "\t");
}
//每个5的倍数行上打印“biz”
if(i % 5 == 0){
System.out.print("biz" + "\t");
}
//每个7的倍数行上打印“baz”
if(i % 7 == 0){
System.out.print("baz" + "");
}
//每输出完整的一个数字和字母之后换行
System.out.println();
}
/*
例题3:输入两个正整数m和n,求其最大公约数和最小公倍数。
比如:12和20的最大公约数是4,最小公倍数是60。
说明:break关键字的使用
*/
Scanner scan = new Scanner(System.in);
//输入两个正整数m和n
System.out.print("情输入正整数m:");
int m = scan.nextInt();
System.out.print("情输入正整数n:");
int n = scan.nextInt();
//求其最大公约数
/*
最大公约数,从m和n两者之间较小的开始(假设m == 12,n == 20),此时循环初始化条件为i == 12,
每次循环i都要减小1,直到i == 1为止,那么当i减小到两者的最大公约数的时候,输出最大公约数,循环停止
*/
int temp = (m < n)? m : n;
for(int i = temp;i > 0;i--){
if((m % i == 0) && (n % i == 0)){
System.out.println("最大公约数为:" + i);
break;//找到之后直接退出循环
}
}
//求最小公倍数,思路和求最大公约数同理,不再赘述
int temp1 = (m > n)? m : n;
for(int j = temp1;j <= (m * n);j++){
if((j % m == 0) && (j % n == 0)){
System.out.println("最小公倍数为:" + j);
break;//找到之后直接退出循环
}
}
//找到1000以内的完数
int sum = 0;
int count = 0;
for(int i = 1;i <= 1000;i++) {
for(int j = 1;j <= i/2;j++) {//此处自己写的是j < i,过于冗余
if(i % j == 0) {
sum += j;
}
}
if(sum == i) {
System.out.println(i + "是完数;");
count++;
}
//重置sum(这一步我给忘了,程序能运行,但不能不能正确运行)
sum = 0;
}
if(count == 0) {
System.out.println("没有完数");
}
System.out.println();
//控制台输出
/* i j i+j
***** 1 5 6
**** 2 4
*** 3 3
** 4 2
* 5 1
*/
for(int i = 1;i <= 5;i++) {
for(int j = 1;j <= 6-i;j++) {
System.out.print("*");
}
System.out.println();
}
}
}
二、while循环、do-while循环
2.1 while循环时使用
①初始化部分
while(②循环条件部分){
③循环体部分;
④迭代部分;
}
执行过程:
①-②-③-④-②-③-④-②-③-④-…-②
说明:
①注意不要忘记声明④迭代部分。否则,循环将不能结束,变成死循环。
②for循环和while循环可以相互转换
2.2 do-while循环
①初始化部分;
do{
③循环体部分
④迭代部分
}while(②循环条件部分);
执行过程:
①-③-④-②-③-④-②-③-④-…②
说明:
do-while循环至少执行一次循环体。
循环语句综合例题:
/*
从键盘读入个数不确定的整数,并判断读入的正数和负数的个数,输入
为0时结束程序。
(说明:最简单“无限” 循环格式:while(true) , for(;;),无限循环存在的原因是并不
知道循环多少次,需要根据循环体内部某些条件,来控制循环的结束。)
*/
import java.util.Scanner;
class CycleExer {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int countPositive = 0;//读入正数个数
int countNegative = 0;//读入负数个数
//首先接收一个数字
int num = scan.nextInt();
for(;;) {
//如果是0则直接结束程序,结束之前将正负个数输出
if(num == 0) {
System.out.println("正数的个数为:" + countPositive);
System.out.println("负数的个数为:" + countNegative);
System.exit(0);
}
//如果不是0,开始判断正负并计数
//上面已经判断过等于0的情况,所以这里只有大于、小于的情况了
if(num > 0) {
countPositive++;
}else {
countNegative++;
}
//继续接收数字
num = scan.nextInt();
}
}
}
三、嵌套循环
- 将一个循环放在另一个循环体内,就形成了嵌套循环。其中,for ,while ,do…while均可以作为外层循环或内层循环。
- 实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的
循环条件为false时,才会完全跳出内层循环,才可结束外层的当次循环,开
始下一次的循环。- 设外层循环次数为m次,内层为n次,则内层循环体实际上需要执行m*n次。
/*
输出九九乘法表
1 * 1 = 1
2 * 1 = 2 2 * 2 = 4
3 * 1 = 3 3 * 2 = 6 3 * 3 = 9
......
*/
//下面是具体思路
/*
首先外层循环控制输出的行数,内层循环控制输出列数,其实和输出 “ * ” 组成的图案一个样子,只是将 “ * ” 换成具体的表达式而已
*/
class MultiplicationTables {
public static void main(String[] args) {
//因为九九乘法表一共有九行,所以最外层控制输出九行
for(int i = 1;i <= 9;i++) {
//内层控制列数,第一次输出一列 1 * 1 = 1,第二列输出 2 * 1 = 2 2 * 2 = 4,惊讶地发现,每行输出的结果数量,是和
for(int j = 1;j <= i;j++) {
System.out.print(i + "*" + j + "=" + (i * j) + "\t");
}
System.out.println();//每一行的内容输出完之后就换行
}
}
}
输出结果:(我真厉害!一次成功啦啦啦~~)
四、特殊关键字:break,continue
4.1 break语句
- break语句用于终止某个语句块的执行;
- break语句出现在多层嵌套的语句块中时,可以通过标签指定要终止的是哪一层语句块。
//1.终止某个语句块
{
......
break;
......
}
//2.终止指定标签的语句块
label1 : {
label2 : {
label3 : {
......
break label2;//终止label2指定的语句块
......
}
}
}
break举例:
public class BreakTest{
public static void main(String[] args){
for(int i = 0;i < 10;i++){
if(i == 3){
break;
}
System.out.println("i = " + i);
}
System.out.println("Game Over!");
}
}
/*
输出结果:
i = 0
i = 1
i = 2
Game Over!
*/
4.2 continue语句
continue只能在循环中使用
continue用于跳过其所在循环语句块的一次执行(注意是一次),继续下一次循环
continue出现在多层嵌套循环中,可以通过标签指定要跳过的是哪一层循环
continue举例:
public class ContinueTest{
public static void main(String[] args){
for(int i = 0;i < 100;i++){
if(i % 10 == 0){
continue;
}
System.out.println(i);
}
}
}
/*
输出结果:输出0-99中除10以及10的倍数外的所有整数
0
1
2
...
9
11
...
19
21
...
4.3 附加特殊流程控制语句
return:
并非专门用于循环结束,它的功能时结束一个方法。当一个方法执行到一个return语句时,这个方法将被结束。
与break和continue不同的是,return直接结束整个方法,不管这个return处于多少层循环之内
五、总结
- break只能用于switch语句和循环语句中
- continue只能用于循环语句中
- 二者功能类似,但continue是终止本次循环,break是终止本层循环
- break、continue之后不嗯能够有其他的语句,因为程序永远不会执行其后的语句(换句话说,加也行,但是不执行,等于做无用功)
- 标号语句必须紧接在循环的头部。标号语句不能用在非循环语句前面
- 很多语言都有goto语句,goto语句可以随意将控制转移到程序中的任意一条语句上,然后执行它。但是程序容易出错。Java中的break和continue是不同于goto的