本节通过程序设计实例,来进一步掌握Java结构化编程方法。
例12:输入一月份,求该月的天数。
分析:不同的月份有不同的天数,这需要判断后才能确定。把月份归为三类,30天的月份有4、6、9、11月份,28或29天(由年份再确定)的月份是2月份,其余皆为31天。这是一个多分支判断的问题,可用if或switch语句解决,根据月份判断天数部分用switch语句代码更简捷。
[Monthdays.java]
import java.util.Scanner;
class Monthdays{
public static void main(String[] args){
int month,days;
Scanner sc = new Scanner(System.in);
System.out.print("Month? ");
month = sc.nextInt();
if(month<1 || month>12){//若输入数据非月份数
System.out.println("error data");
System.exit(0);//退出运行
}
switch(month){
case 4: case 6: case 9: case 11: days = 30;break;
case 2://2月份需要输入年份进一步判断
System.out.print("Year? ");
int year = sc.nextInt();
if(year%400==0 || year%4==0 && year%100!=0)
days = 29;
else days = 28;
break;
default: days = 31;
}
System.out.println("days: "+days);
}
}
程序运行中途要强制退出,可以用“System.exit(0);”语句。本例中若输入的年份数据是不合理的数据,程序输出error data后,便退出结束运行。
例13:输入一个自然数,判断该数是否为素数。
分析:先确认什么样的数为素数。根据数学定义知,一个自然数除了1和本身之外没有其他的因子,该数便为素数。2专门规定为素数,且是最小的素数。对于自然数n,我们只要用2到n-1去测试,如果它们中没有一个是n的因子,n就为素数,否则n不是素数。
[PrimeTest.java]
import java.util.Scanner;
class PrimeTest{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.print("number? ");
int n = sc.nextInt();//n为被测数
int i; //i为1和本身外可能的因子
for(i=2;i
if(n%i == 0)break; //i是n的因子,n非素数
if(i == n) //所有可能的因子全非n的因子
System.out.println( n + " is a prime number." );
else
System.out.println(n + " is not a prime number");
}
}
例14:求所有三位素数。
分析:本题是上题的拓展。不是判断某一个数,而是判断所有三位数。这就需要用一个循环变量遍历三位数,因为所有的三位偶数都非素数,所以可直接遍历三位奇数。对于确定的三位数判断其是否为素数的方法同上。
[PrimeNumbers.java]
class PrimeNumbers{
public static void main(String[] args){
int i,n;
for( n = 101; n<1000; n+=2 ){//n遍历所有三位奇数
for( i=2; i
if( n%i == 0 )break;
if( i==n )System.out.print( n + "\t");
}
}
}
程序运行结果:
101103107109113127131137139149
151157163167173179181191193197
…
983991997
例15:输出如下菲波那契数列的前20项,并求其和。
1,1,2,3,5,8,13……
分析:菲波那契数列的前两项均为1,以后的每一项都是前两项之和。这是一个重复求和处理的问题,可用循环解决。循环次数是所要求的项数18。对所有项求和的问题可以设置一个累加器变量sum,初值为前两项之和,后在循环中每求得一新项,即将该项加进sum。
[Fei.java]
class Fei{
public static void main(String[] args){
int a,b,c,sum;
a = b = 1; //a,b为前两项,均为1
sum = a + b;//累加器变量,设初值
System.out.print( a + "\t" + b );
for( int i=1; i<=18; i++ ){
c=a+b;//生成的新项置放在变量c中
System.out.print("\t" + c);
sum += c;
a = b; //前两项后移一个数
b = c;
}
System.out.println("\tsum=" + sum);
}
}
程序运行结果:
11235813213455
891442333776109871597258441816765
sum=17710
本讲介绍了Java语言的结构化编程,在main方法中的代码段总是由三种基本结构组成:顺序结构、分支结构和循环结构。分支结构通常用if或switch语句实现,循环结构常用while、do-while或for语句实现。在循环结构中可以继承包含循环,这即是循环嵌套,也称为多重循环,我们可用多重循环解决比较复杂的问题。break语句可以安排在switch和三种循环语句中,它总是会终止当前的语句。continue语句可以放在循环语句中,它只是结束当前循环,而并不会终止循环。
至此,我们已初入Java之门,可以解决一些基本的数据处理问题了。
思考与练习
1. 求150内的奇数之和。
2. 输入一个自然数,求N!。
3. 用循环嵌套的方法输出如下图案:
(1)(2)
** * * * *
* ** * * *
* * ** * *
* * * ** *
* * * * **
(3)(4)
* * * * * * * * **
* * * * * * * * * *
* * * * ** * * * *
* * ** * * * * * *
** * * * * * * * *