『零基础学Java语言-浙江大学-翁恺』第3周 循环

以下为个人学习笔记和习题整理
课程:零基础学Java语言-浙江大学-翁恺 @ 中国大学MOOC
https://www.icourse163.org/course/ZJU-1001541001

文章目录

  • 课堂笔记
    • while 循环
    • do-while 循环
    • 例子
      • 算平均数
      • 猜数游戏
  • 小测验
  • 编程题
    • 作业1. 奇偶个数(5分)
      • 解题代码
    • 作业2. 数字特征值(5分)
      • 解题代码

课堂笔记

while 循环

while (<循环条件>)
{
	<循环体语句>;
}
  • 先判断条件是否满足,然后再执行循环体,直到条件不满足为止。
  • 可能一次也不执行。

do-while 循环

do {
	<循环体语句>;
} while(<循环条件>); // 句末分号不可丢
  • 进入时不检查,执行完一轮后,再检查条件是否满足,如果满足则继续执行循环体。
  • 至少执行一次。

例子

算平均数

Scanner in = new Scanner(System.in);
int number;
int count = 0;
int sum = 0;

number = in.nextInt();

while(number != -1)	{
	sum += number;
	count ++;
	number = in.nextInt();
}

if (count > 0) {
	System.out.println((double)(sum)/count);
}
Scanner in = new Scanner(System.in);
int number;
int count = 0;
int sum = 0;

do {
	number = in.nextInt();
	if(number != -1) {
		sum += number;
		count ++;	
	}
} while (number != -1);

if (count > 0) {
	System.out.println((double)(sum)/count);
}

猜数游戏

Scanner in = new Scanner(System.in);
int number = (int)(Math.random()*100+1);
// 每次召唤 Math.random() 就得到一个 [0,1) 范围内的随机数
// [0,1)-->[0,100)-->[1,100]

int count = 0;
int a;

do {
	a = in.nextInt();
	count ++;
	if(a > number) {
		System.out.println("猜大了");
	} else if(a < number) {
		System.out.println("猜小了");
	}
} while (a != number);

System.out.println("恭喜你猜对啦!你一共猜了"+count+"次。");
  • 为什么方法正确的话,100以内的数最多猜7次就够了?

二分法:
对于某个数使用二分法的最少次数的公式为 2 n > k 2^n>k 2n>k,其中n为最少次数,k为一共有多少数。
因为 2 7 2^7 27是128,大于100,可以判断100以内只需要7次。

小测验

  1. 以下哪种运算能从变量x中取得它的个位数?
    A. x/10
    B. x%10
    C. x*10
    D. x=10

    B

  2. while循环的条件满足的时候循环继续,而do-while的条件满足的时候循环就结束了。

    ×

  3. 以下代码片段执行结束后,变量i的值是多少?

    int i = 1;
    do {
        i = i+5} while (i<17);
    

    21

编程题

作业1. 奇偶个数(5分)

  • 题目内容
    你的程序要读入一系列正整数数据,输入-1表示输入结束,-1本身不是输入的数据。程序输出读到的数据中的奇数和偶数的个数。
  • 输入格式
    一系列正整数,整数的范围是(0,100000)。如果输入-1则表示输入结束。
  • 输出格式
    两个整数,第一个整数表示读入数据中的奇数的个数,第二个整数表示读入数据中的偶数的个数。两个整数之间以空格分隔。
  • 输入样例
    9 3 4 2 5 7 -1
  • 输出样例
    4 2

解题代码

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);

		int number = in.nextInt(),
			odd = 0,
			even = 0;		
		
		while (number != -1) {
			if (number % 2 == 0)
			{
				even ++;
			}
			else
			{
				odd ++;
			}
			number = in.nextInt();
		}
		System.out.println(odd + " " + even);
	}

}

作业2. 数字特征值(5分)

  • 题目内容
    对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值。对于一个整数,从个位开始对每一位数字编号,个位是1号,十位是2号,以此类推。这个整数在第n位上的数字记作x,如果x和n的奇偶性相同,则记下一个1,否则记下一个0。按照整数的顺序把对应位的表示奇偶性的0和1都记录下来,就形成了一个二进制数字。比如,对于342315,这个二进制数字就是001101。

    这里的计算可以用下面的表格来表示:

    数字 3 4 2 3 1 5
    数位 6 5 4 3 2 1
    数字
    数位
    奇偶一致 0 0 1 1 0 1
    二进制位值 32 16 8 4 2 1

    按照二进制位值将1的位的位值加起来就得到了结果13。

    你的程序要读入一个非负整数,整数的范围是[0,100000],然后按照上述算法计算出表示奇偶性的那个二进制数字,输出它对应的十进制值。

    提示:将整数从右向左分解,数位每次加1,而二进制值每次乘2。

  • 输入格式
    一个非负整数,整数的范围是[0,1000000]。

  • 输出格式
    一个整数,表示计算结果。

  • 输入样例
    342315

  • 输出样例
    13

解题代码

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);

		int number = in.nextInt(),
			digit, // 个位数存储
			binary = 1, // 二进制位值,第一个循环时为1			
			count = 1, // 循环次数
			result = 0; // 结果值
		
		do {
			digit = number % 10; // 计算当前循环的个位数
			
			if ( digit % 2 == count % 2)
			{ // 个位数与循环次数的奇偶一致
				result += binary; // 则追加相应二进制位值
			}
			
			// 以下计算出下一个循环需要的参数
			number /= 10; // 抹去已计算的个位数
			binary *= 2; // 二进制位值每次乘2
			count ++; // 循环次数加1
		} while (number > 0); // 循环条件
		
		System.out.println(result);
	}

}

你可能感兴趣的:(自考笔记,#,04747Java语言程序设计)