练习题
我的实验题是第3(11%9+2)题:
实现Fibonacci数列功能,并进行测试(正常情况,异常情况,边界情况)。
功能设计
我设计的程序有三个功能:
- 退出程序
- 输入n,打印Fibonacci数列的前n项.
- 输入一个数,判断其是否是Fibonacci数列中的项.如果是,则打印出其实第几项;如果不是,则打印出“不是其中的项”的信息.
程序设计思路
1.主类:用于呈现欢迎用户的内容以及让用户输入他们想实现的功能,将这个值传递给Judge类进行判断.
2.Judge类,用于判断从主类中得到的功能的代号具体指向哪个功能,并进入功能类.
3.用两个功能类Function1,Function2分别实现两种功能:第一个功能即循环打印Fibonacci数列的第i项即可;第二项即将输入的数据与Fibonacci数列的每一项进行比较,如果与某一项相同则输出项数,如果那一项的值大于输入的值则停止比较,输出“找不到”.
4.两个功能的核心是求解Fibonacci数列的第n项.利用递归反复调用该类来实现.
实验代码
Test1.java
import java.util.Scanner;
public class Test1 {//此类用于实现欢迎及功能选择功能
public static void main(String[] args) {
String s="欢迎使用Fibonacci数列小程序!\n制作人:20165111朱思腾";
System.out.println(s);
for(int i=0;i<s.length();i++){
System.out.printf("-");
}//欢迎用户
System.out.print("\n本程序可以实现如下三个功能:\n0.退出程序\n1.输出Fibonacci数列的前n项.\n2.判断输入的数据x是否是" +
"Fibonacci数列中的项.\n请输入功能前的序号来执行相应功能:");//进行功能选择
Scanner reader=new Scanner(System.in);
int i=reader.nextInt();
Judge judge=new Judge();
judge.Judge(i);//将输入的功能序号传入Judge方法
}
}
Judge.java
import java.util.Scanner;
public class Judge {
void Judge(int i){//此类用于实现功能选择并将接下来所使用的值传给相应的Function(功能)类中.
if(i==0){//退出程序
System.out.println("程序已退出!欢迎下次使用!");
System.exit(0);
}
if(i==1){
System.out.print("现在正在使用功能1:输出Fibonacci数列的前n项.\n请输入n:");
Scanner reader=new Scanner(System.in);
int n=reader.nextInt();
Function1 run=new Function1();
run.Function(n);
}
else if(i==2){
System.out.print("现在正在使用功能2:判断输入的数据是否是Fibonacci数列中的项.\n请输入数据x:");
Scanner reader=new Scanner(System.in);
int x=reader.nextInt();
Function2 run=new Function2();
run.Function(x);
}
else {
System.out.println("无效的输入!");
}
}
}
Function1.java
import java.util.Scanner;
public class Function1 {//此类用于实现功能1
void Function(int n){
if(n<1){
System.out.println("错误!项数不能为负!");
}
else {
System.out.println("以下是Fibonacci数列的前" + n + "项");
for (int i = 1; i <= n; i++) {
Fibonacci fib = new Fibonacci();
int y = fib.Fibonacci(i);
System.out.print(y + " ");
}
}
}
}
Function2.java
import java.util.Scanner;
public class Function2 {//此类用于实现功能2
void Function(int x){
for(int i=1;;i++){
Fibonacci fib=new Fibonacci();
if(x==fib.Fibonacci(i)){
System.out.println("已找到!"+x+"是Fibonacci数列的第"+i+"项.");
break;
}
if(x<fib.Fibonacci(i+1)){
System.out.println(x+"不是Fibonacci数列中的项.");
break;
}
}
}
}
Fibonacci.java
import java.util.FormatFlagsConversionMismatchException;
public class Fibonacci {//此类用于计算Fibonacci数列中的第n项,
int Fibonacci(int n) {
if(n<0){
System.out.println("错误!Fibonacci数列的项数不能小于0.");
}
if (n == 1) {
return 1;
}
if (n == 2) {
return 2;
}
else {
Fibonacci fib = new Fibonacci();
return fib.Fibonacci(n - 1) + fib.Fibonacci(n - 2);
}
}
}
实验截图
1.正常情况测试
欢迎界面:
功能1:
功能2(正确):
功能2(错误):
2.异常情况测试
主要的异常情况是输入的功能代码不是0、1、2,以及功能1输入的项数不是大于1的数.
功能序号输入错误:
功能1输入的项数非法:
3.便捷情况测试
本程序没有边界情况需要测试.
实验思考
在C语言做类似实验的时候,当需要做输入的时候,我们会做一个输入的合法性检查。
//创建变量语句省略
ret=scanf("%d",&a);
if(ret!=1){
printf("输入不合法!");
fflush(stdin);
}
输入合法性检查如何在Java中实现呢?正在寻找方法并完善代码中!