第四周课堂实践总结

课堂知识点总结

  • 数组边界值即为其中的最大最小值
  • 循环与递归
    • 循环语句
  1. for循环语句(循环体只有一条语句时,大括号最好不要省略)
  for(表达式1;表达式2;表达式3) {
      若干语句
  }
  1. while循环语句(循环体只有一条语句时,大括号最好不要省略)
 while(表达式) {
     若干语句
 }
  1. do-while循环语句
  do{
      若干语句
  }while(表达式);
  • 递归

递归算法是一种直接或间接地调用自身的算法。在编写程序时,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。递归用于解决形式相同,规模不同的问题,能用递归解决的问题都可以转化为循环。递归把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。用递归思想写出的程序往往十分简洁易懂。递归程序有两个要点:递归公式和结束条件。我们以求整数的阶乘为例:
image

  • 使用JDB调试java程序
  1. 在Linux Bash中输入 vim 类名。java编辑调试代码
  2. 使用javac -g -d bin src/类名.java对程序进行编译(注意javac中-g参数是为了产生各种调试信息,一定要加上,否则无法调试)
  3. 使用jdb -classpath .:./bin 类名对程序进行调试
  4. 开始调试:通过运行stop in 类名.main命令在main方法开始处设置断点
  5. 输入run命令来运行类名.class,程序会在main()的开始处停下
  6. 可以用locals命令查看变量,用step命令运行下一行代码
  7. 可以使用list来查看运行到了源代码的什么位置
  8. 可以使用print或eval命令来查看变量的值
  9. 可以通过stop at HelloJDB:12在第12行设个断点,然后运行cont就会一下子把循环运行完并停在第十二行
  10. 使用quit或exit可以退出JDB

课堂内容补做

  • 循环与递归

参考2016-2017-2 《Java 程序设计》课堂实践项目编程实现1!+2!+3!+... + N!的功能。N由命令行传入,比如类名为SumofRecur, java SumofRecur 8 给出1!+2!+3!+... + 8!的值,提交运行结果的截图(至少五张),注意测试正常,异常,边界情况, 比如java SumofRecur -8,java SumofRecur 0,java SumofRecur 你的学号后四位。

代码如下:

public class CLSumRecursion {
	public static void main(String args[]) {
		int sum = 0;
		if(args.length < 1) {
			System.out.println("Usage:java CLSumRecursion num1 num2 ...");
			System.exit(0);
		}
		int tmp[] = new int[args.length];
		for(int i=0;i<args.length;i++) {
			tmp[i] = Integer.parseInt(args[i]);
		}
                if(tmp[0]<=0) {
			System.out.println("Please check your input!");
			System.exit(0);
		}
		else {
			for(int j=1;j<=tmp[0];j++) {
			sum += fact(j);
			}
		}
		if(sum<=0) {
			System.out.println("Please check your input!");
			System.exit(0);
		}
		else
			System.out.println(sum);
	}
	public static int fact(int n) {		
		if(n == 0)
			return 1;
		else
			return n*fact(n-1);
	}
}

运行结果截图:
image

  • JDB调试上面程序:
    image
    image

教材习题

  • 第二章
  1. 编写一个应用程序,给出汉字“你” “我” “他”在Unicode表中的位置。
public class xiti2_1 {

	public static void main(String args[]) {

		char a = '你';

		char b = '我';

		char c = '他';

		System.out.println("汉字:"+a+"的位置:"+(int)a);

		System.out.println("汉字:"+b+"的位置:"+(int)b);

		System.out.println("汉字:"+c+"的位置:"+(int)c);

	}

}

image
2. 编写一个Java应用程序,输出全部的希腊字母。

public class xiti2_2{
       	public static void main(String[] args) {
	       	for (int j = 913; j < 930; j++) { //j代表每个字母的ASCII代码
		       	System.out.print((char)j+" "); //将ASCII代码转换成字符就是每个字母了
	       	}
	       	for (int j = 932; j < 938; j++) { //中间空了一个
		       	System.out.print((char)j+" ");
	       	}
	       	for (int j = 945; j < 970; j++) { //大小写中间空了好几个,都跳过了
		       	System.out.print((char)j+" ");
	       	}
       	}
}

image

  • 第三章
  1. 编写应用程序求1!+2!+...+10!。
public class xiti3_1 {
	public static void main(String args[]) {
		int sum = 0;
		int n = 10;
		for(int i = 1;i<=n;i++) {
			sum = sum+fact(i);
		}
		System.out.println(sum);
	}
       public static int fact(int i) {
		if(i == 0)
			return 1;
		else
			return i*fact(i-1);
	}
}

image

  1. 编写一个应用程序求100以内的全部素数。
public class xiti3_2 {
	public static void main(String args[]) {
		int i,j;
		for(i=2;i<=100;i++) {
			for(j=2;j<=i/2;j++) {
				if(i%j==0)
					break;
			}
		if(j>i/2)
			System.out.println(" "+i+"是素数");
		}
	}
}

image

  1. 分别用do-while和for循环计算1+1/2!+1/3!+1/4!+...的前20项和。
public class xiti3_3_1 {
	public static void main(String args[]) {
		double sum = 0;
		for(int i=1;i<=20;i++) {
			sum = sum+1.0/fact(i);
		}
		System.out.println(sum);
	}
	public static int fact(int n) {
		if(n==0) 
			return 1;
		else
			return n*fact(n-1);
	}
}
public class xiti3_3_2 {
	public static void main(String args[]) {
		double sum = 0;
		int i = 1;
		do {
			sum=sum+1.0/fact(i);
			i++;
		}while(i<=20);
		System.out.println(sum);
	}
	public static int fact(int n) {
		if(n==0)
			return 1;
		else
			return n*fact(n-1);
	}
}

image

  1. 一个数如果恰好等于它的因子之和,这个数就称为完数。编写应用程序求1000之内的所有完数。
public class xiti3_4 {
	public static void main(String args[]) {
		int i;
		for(i=1;i<=1000;i++) {
			if(wanshu(i)==1)
				System.out.println(i+"是完数");
			else
				continue;
		}
	}
	public static int wanshu(int i) {
		int sum = 0;
		for(int j=1;j<i;j++) {
			if(i%j==0)
				sum=sum+j;
		}
		if(sum==i)
			return 1;
		else
			return 0;
	}
}

image

  1. 编写应用程序,使用for循环语句计算8+88+888+...前10项之和。
public class xiti3_5 {
	public static void main(String args[]) {
		 long i=1,sum=0,a=8,item=a;
		     for(i=1;i<=10;i++)
		     {
			     sum=sum+item;   
			     item=item*10+a;
		     }
		  System.out.println(sum);
	}

}

image

  1. 编写应用程序,输出满足1+2+3+...+n<8888的最大正整数n。
public class xiti3_6 {
	public static void main(String args[]) {
		int sum = 0;
		int i = 1;
		while(sum<8888){
			sum=sum+i;
			i++;
		}
		System.out.println(i-1);
	}
}

image

posted @ 2018-03-25 10:19  20165330张羽昕  阅读(417)  评论(2编辑  收藏  举报