for,while的应用
- 最下面附上一些练习题
- while循环
while 循环的语法如下:
while(循环继缞条件){
// 循环体
语句(组);
}
一些while循环,我们可以让他们成为一个“死循环”,如:while(true){}然后我们在循环体内可以进行while循环的退出。
- do-while循环
do{
// 循环体;
语句(组); } while(循环继续条件);
它首先执行循环体,然后计算循环继续条件。如果 计算结果为 true, 则重复执行循环体;如果为 false, 则终止 do-while 循环。while 循环与 do-while 循环的差别在于:计算循环继续条件和执行循环体的先后顺序不同。在do-while中,循环中的语句必须至少执行一次。
- for循环
for 循环语句是从关键字 for开始,然后是用双括号括住的循环控制结构体,如:
for(初始操作;循环继续条件;每次迭代后的操作){
//循环体
}
for循环的死循环可以写成
for(; ;){
//循环体
}
- 一个循环可以嵌套在另一个循环中,我们称它位嵌套循环
嵌套循环是由一个外层循环和一个或多个内层循环组成的。每当重复执行一次外层循环时将再次进人内部循环,然后重新开
5.17(显示金字塔)编写程序,提示用户输人一个在1到15之间的整数,然后显示一个金字塔形状的图案。
import java.util.*;
class Class15{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个数字:");
int num = scanner.nextInt();
for(int i=1;i<=num;i++){
for(int j=1;j<=num-i;j++){
System.out.print(" ");
}
for(int k=-(i-1);k<=i-1;k++){
System.out.print(Math.abs(k)+1+" ");
}
System.out.println();
}
}
}
此题用到了for循环以及它的嵌套循环,最重要的是对数字金字塔如何从中间分开,然后左右两边打印数字。利用绝对值的特性对数字进行打印。第一个for循环是打印每行的数字,第二个for循环是打印每行的空格数,最后一个for循环比较难,打印的是数字。因为绝对值中,比如输入7,它的最后一行应该是-7到7,但是-7到7中间会有一个零,所以得想办法将零去掉,最简单的就是让它从-6到6打印,最后再加1,不仅将零去掉,而且不影响它第七行的数字。
5.18(第二个和第三个))使用嵌套的循环语句,用四个独立的程序打印下面的图案:
/*
1 2 3 4 5 6
1 2 3 4 5
1 2 3 4
1 2 3
1 2
1
===============
1
2 1
3 2 1
4 3 2 1
5 4 3 2 1
6 5 4 3 2 1
*/
class Home15{
public static void main(String[] args){
for(int i=0;i<6;i++){
for(int j=6;j>6-i;j--){
System.out.print(" ");
}
for(int k=0;k<6-i;k++){
System.out.print(k+1+" ");
}
System.out.println();
}
System.out.println("===============");
int k=1;
for(int i=1;i<=6;i++){
for(int j=1;j<=6-i;j++){
System.out.print(" ");
}
for(;k>0&&k<=i;k--){
System.out.print(k+" ");
}
k = i+1;
System.out.println();
}
}
}
这两道题的前两个for循环都是为了控制每行的输出和每行空格的输出,最重要的都在第三个for循环上面。以第二个位例,我写这个题的时候,将for循环里面的k值再for循环的嵌套外面定义,为了不让第三个for循环里的迭代操作所影响,从题可以看出来,第一行是1,第二行是2 1 ,以此类推会发现每行对应着开始的数字是多少,所以会想到每行的k让它从每行所对应的数字开始递减,如,第二行开始,让k为2开始递减直至k<0时退出循环,这样就解决了递减的问题。
5.19(打印金字塔形的教字)编写一个嵌套的 for 循环,打印下面的输出
/*
1
1 2 1
1 2 4 2 1
1 2 4 8 4 2 1
1 2 4 8 16 8 4 2 1
1 2 4 8 16 32 16 8 4 2 1
1 2 4 8 16 32 64 32 16 8 4 2 1
1 2 4 8 16 32 64 128 64 32 16 8 4 2 1
利用绝对值
*/
class Home16{
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)));
}
System.out.println();
}
}
}
这道题和之前的题一样,最重要的还是在最后一个for循环的打印。从题中可以看出来每行数字都是2^(i-1),然后把中间看作是分割线,这样又会利用到绝对值。从第三个for循环来看,最大是2的7次方,但是有八行,所有我们可以将for循环里面的k定义为 -(i-1),比如,当i为8时,k=-7,所以下面的i-1-Math.abs(k)就可以控制幂了。
5.25 (计算Π)使用下面的数列可以近似计算Π(PI)
//模拟求∏
class Class16{
public static void main(String[] args){
double sum=0;
for(int i=1;i<=10000;i++){
sum += Math.pow(-1,i+1)/(2*i-1);
}
double PI = 4*sum;
System.out.println(PI);
}
}
利用for循环和Math.pow以及数学知识来计算Π的值
5.27(显示闰年)编写程序,显示从101到2100年期间所有的闰年,每行显示10个。数字之间用一个空格字符隔开,同时显示这期间闰年的数目
/*
显示从101年到2100年之间所有的闰年,每行显示10个
*/
class Home17{
public static void main(String[] args){
int count = 0;
for(int year = 101;year<=2100;year++){
if((year%4==0 || year%400==0) && year%10!=0){
count++;
System.out.print(year+" ");
if(count==10){
System.out.println();
count = 0;
}
}
}
}
}
判断闰年的方法是,年份对4取余等于0或年份对400取余等于0并且年份对10取余不能等于0;我们利用这个方法然后运用for循环和if语句的控制就能输出题目所说的要求的年份。
5.51 ( 最长的共同前緻)编写一个程序,提示用户输人两个字符串,显示两个字符串最长的共同前缀
/*
提示用户输入两行字符串,然后输出他们的共同前缀
*/
import java.util.*;
class Home19{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
String[] str1;
String[] str2;
String s="";
while(true){
System.out.print("请输入第一行字符串:");
String s1 = scanner.nextLine();
System.out.print("请输入第二行字符串:");
String s2 = scanner.nextLine();
str1 = s1.split(" ");
str2 = s2.split(" ");
if(!(str1[0].equals(str2[0]))){
System.out.println("没有相同前缀");
return;
}
for(int count =0;count<str1.length;count++){
if(str1[count].equals(str2[count])){
s +=str1[count];
}else{
System.out.print("共同前缀是:"+s+" ");
}
}
break;
}
}
}
本道题我用到了while循环和for循环以及字符串数组和里面的一些方法,首先用scanner.nextLine();方法将输入进来的两行字符串进行存储,然后用“切片”的方法也就是split(" ");方法将里面的空格去掉,最后将没有空格的字符串存入字符串数组中,接下来用for循环进行遍历一次比较两个字符串数组中是否有相同的前缀,如果开始比较就没有的话直接结束函数,否则一直往后比较,知道没有共同前缀为止。