上一次我总结了有关选择结构的 if 和 switch 语句的练习题,相比于今天要总结的循环结构要简单许多,因此这次总结会更加细致。
这里先总结一个解决for循环的方法:
- 先看行与行之间的规律。因为这个规律比较明显,所以我们一般将这个for循环写在最外层
- 其次观察每一行(列)有什么规律。如果每一行的规律不止一个,那就还是按规律比较明显的先写。(这时就是嵌套 for 循环,注意格式的缩进)。
- 最后跳出循环,完成剩下的程序性代码。
分析:图案1:按照步骤,我们先看行与行之间的规律——每一行都比上一行的数字多一个,总共是六行
其次观察每一行(列)的数字之间的规律——逐次加一,,最大数字为六,并且每个数字都要空一格
public class Home03_15{
public static void main(String[] args){
for(int j=1;j<=6;j++){ //行的规律:每一行的数字比上一行多一个
for(int i=1;i<=j;i++){ //列的规律:每个数字比上一个数字加一
System.out.print(i + " ");
}
System.out.println(); //每一行完后要进行换行
}
}
}
运行结果:
图案2:按照步骤:先看行与行之间的规律——每一行都比上一行的数字少一个,总共是六行
其次观察每一行(列)的数字之间的规律——逐次加一,,最大数字为六,并且每个数字都要空一格
public class Home03_15b{
public static void main(String[] args){
for(int j=6;j>=1;j--){
for(int i=1;i<=j;i++){
System.out.printf(i + " ");
}
System.out.println();
}
}
}
运行结果:
图案3:按照步骤,我们先看行与行之间的规律——每一行都比上一行的数字少一个,总共是六行。但是我们会发现这个图 有空白部分,其实那是空格。
其次观察每一行(列)的规律,首先是空格的规律,每一行的空格数都比上一行少一个,然后是数字,每一个数字都比前一个数字大一。
public class Home03_15c{
public static void main(String[] args){
for(int k=1;k<=6;k++){ //行,每一行的数字都比上一行多一个
for(int j=1;j<=(6-k);j++){ //空格,每一行的空格数都比上一行少一个
System.out.printf(" ");
}
for(int i=1;i<=k;i++){ //数字,每一个数字都比上一个数字大一
System.out.print(i);
}
System.out.println();
}
}
}
运行结果:
图案4:按照步骤,我们先看行与行之间的规律——每一行都比上一行的数字多一个,总共是六行。但是我们会发现这个图 有空白部分,其实那也是空格。
其次观察每一行(列)的规律,首先是空格的规律,每一行的空格数都比上一行少一个,然后是数字,每一个数字都比前一个数字大一。
public class Home03_15d{
public static void main(String[] args){
for(int k=1;k<=6;k++){ //行
for(int j=1;j<=(k-1);j++){ //空格
System.out.print(" ");
}
for(int i=1;i<=(7-k);i++){ //数字
System.out.print(i);
}
System.out.println();
}
}
}
运行结果:
分析:我们先观察这个图的规律,发现它是两边对称的,对于这种对称图形,我们一般会运用绝对值来确定它的范围,这样就能得到一个对称图形。
按照步骤, 因为我们把这个图分成了左右对称的两部分,所以还是每一行都比上一行多一个数字,还有空格。
其次观察每一行的数字(列),我们会发现每个数都是2的次方,2的0次方、2的1次方......最高是2的7次方,并且每一行的最高次幂都是这一行的行数-1.
class Home03_16{
public static void main(String[] args){
for(int i=1;i<=8;i++){ //行
for(int j=1;j<=8-i;j++){ //空格
System.out.print(" ");
}
for(int k=-(i-1);k<=i-1;k++){ //根据图形对称性及最高次幂
System.out.printf("%4.0f",Math.pow(2,i-1-Math.abs(k)));
} //4.0f是为了格式的整齐,Math.pow是指数,用绝对值表示图形对称
System.out.println(); //每一行之间进行换行
}
}
}
运行结果:
以上是有关图形的循环结构的习题,我们所遇到的问题肯定不止图形,更多的是代数,例如求和、求具有规律性的算法......所以下面就是一些有关代数的循环题。
分析:我们观察等式,发现等式最后一项分式已经告诉了我们每个分式分母的规律,2*项数-1。
那我们下来就要观察每个分式之间的规律,奇数项前面是负号偶数项前面是正号,正负交错。
import java.util.Scanner;
class Demo03_18{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
System.out.print("请输入一个数字:");
int imax=scanner.nextInt();
double sum=0;
double flag=1;
for(int i=1;i<=imax;i++){ //插入项数
sum+=flag/(2*i-1); //求出每个项,并且对所有项求和
flag=-flag; //变换每个项前面的符号,一正一负
}
double pi=sum*4;
System.out.println(pi);
}
}
运行结果:
分析:我们首先要知道用十进制怎么求出二进制,那就是用十进制一直除以2,直到商0,那么所有的余数就是二进制。那么这里就要用到while循环了。但是数字和数字相加还是一个数字,那怎么办呢?这就需要用到字符串,因为字符串和数字只能叠加,运用while循环之后,什么时候跳出循环呢?就是商0的时候,这时就要用到 if 语句了。
import java.util.Scanner;
class Demo03_23{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
System.out.print("请输入一个数字:");
int num=scanner.nextInt();
String binStr="";
while(true){
binStr=num%2+binStr;
num/=2;
if(num==0){
break;
}
}
System.out.println(binStr);
}
}
运行结果: