005流程练习与项目一

while循环

005流程练习与项目一

do-while循环

005流程练习与项目一

附:String常用方法

005流程练习与项目一

嵌套循环练习

练习1:打印100以内所有质数

/*
方式一:
打印100以内所有质素
质数 == 素数
*/

class PrimeNumberTest01 {
	public static void main(String[] args){
		//程序起始时间
		long start = System.currentTimeMillis();
		//统计素数个数
		int sumNumber = 0;
		//用于判断,每次循环后是否是素数
		boolean isFlags = true;
		
		for(int i = 2; i <= 100000; i++){
			//for(int j = 2; j <= i-1; j++){
			//优化二
			for(int j = 2; j <= Math.sqrt(i); j++){
				//不是素数变为false
				if(i % j == 0){
					isFlags = false;
					//优化一
					break;
				}
			}
			//判断本次循环是否产生了素数
			if(isFlags == true){
				//System.out.println(i);
				sumNumber++;
			}
			//重置变量,重新循环判断
			isFlags = true;
		}

		long end = System.currentTimeMillis();
		System.out.println("程序运行时间:" + (end - start) + "\t100_000中有多少个素数:" + sumNumber);//未优化: 22159   优化一:2011  优化二:18

	}
}
/*
方式二:
打印100以内所有质数

*/
class PrimeNumberTest02 {
	public static void main(String[] args){
		long start = System.currentTimeMillis();
		int sumNumber = 0;
		label:for (int i = 2; i <= 100000; i++){
			for(int j = 2; j <= Math.sqrt(i); j++){
				if(i % j == 0){
					continue label;
				}
			}
			sumNumber++;
		}

		long end = System.currentTimeMillis();
		System.out.println("程序运行时长是:" + (end - start));
		System.out.println("质数的个数:" + sumNumber);
	}
}

练习2:猜数字游戏

/*
随机生成一个100以内的数,猜数字游戏:
从键盘输入数,如果大了提示,大了,如果小了,提示小了,如果对了,就不再猜了,并统计一共猜了多少次?
提示:随机数

*/
import java.util.Scanner;
import java.util.Random;
class GuessNumberTest01 {
	public static void main(String[] args){
		Random random = new Random();
		int randNumber = random.nextInt(100);
		int sum = 0;	
		//限制输入的最大数值

		for( ; ; ){
			int limits = 99;
			int perNumber;
			while(true){
				System.out.print("请猜点数(输入一个自然数最大取值为:" + limits + " ): ");
				//获得用户输入的值
				try{
					Scanner scanner = new Scanner(System.in);
					perNumber = scanner.nextInt();
					if(perNumber < 0 || perNumber > limits){
						System.out.println("输入的数字超出范围,请重试\n");
						continue;
					}else break;
				}catch(Exception e){
					System.out.println("输入违规,请重试\n");
				}
			}
			sum++;	
			if(perNumber == randNumber){
				System.out.println("猜中了");
				System.out.println("随机数是:" + randNumber);
				System.out.println("猜中的数是:" + perNumber);
				System.out.println("用时:" + sum + "次");
				break;
			}else if(perNumber > randNumber){
				System.out.println("猜大了");
			}else{
				System.out.println("猜小了");
			}
		}
	}
}

练习3:打印1-1000之内的完数

/*
一个数如果恰好等于它的因子之和,这个数就称为"完数"。(因子:除去这个数本身的约数)
例如6=1+2+3.编程 找出1000以内的所有完数

*/
class AriTest01 {
	public static void main(String[] args){
		for(int i = 1; i <= 1000; i++){
			int sum = 0;
			for(int j = 1; j < i; j++){
				if(i % j == 0){
					sum += j;
				}
			}
			if(sum == i){
				System.out.println(i);
			}
		}
	}
}

练习4:调和级数从第多少项开始值大于10

/*
求调和级数中从第多少项开始值大于10

1/1 + 1/2 + 1/3 + 1/4 + … 在数学上称为调和级数。
它是发散的,也就是说,只要加上足够多的项,就可以得到任意大的数字。
但是,它发散的很慢:
前1项和达到 1.0
前4项和才超过 2.0
前83项的和才超过 5.0
那么,请你计算一下,要加多少项,才能使得和达到或超过 10.0 呢?
请填写这个整数。

*/
class AriTest02{
	public static void main(String[] args){
		double sum = 0.0;
		int num = 1;
		for( ; ; ){
			sum += 1.0 / num;
			if(sum > 10.0){
				break;
			}
			num++;
		}
		System.out.println("数值为:" + sum);
		System.out.println("第 " + num + " 项,大于10");
	}
}

练习5:打印菱形

/*
打印如下的图形:菱形1
    * 
   * * 
  * * * 
 * * * * 
* * * * * 
 * * * * 
  * * * 
   * * 
    * 

*/

class PrintTest01{
	public static void main(String[] args){
		for(int i = 1; i <= 5; i++){
			for(int j = 4; j >= i; j--){
				System.out.print(" ");
			}

			for(int k = 1; k <= i; k++){
				System.out.print("* ");
			}

			System.out.println();
		}

		for(int i = 1; i <= 4; i++){

			for(int a = 1; a <= i; a++){
				System.out.print(" ");
			}

			for(int b = 4; b >= i; b--){
				System.out.print("* ");
			}
			System.out.println();
		}
	}
}

练习6:输出十三位条形码

/*
生成13位条形码
Ean-13码规则:第十三位数字是前十二位数字经过计算得到的校验码。
例如:690123456789
计算其校验码的过程为:
① 前十二位的奇数位和6+0+2+4+6+8=26
② 前十二位的偶数位和9+1+3+5+7+9=34
③ 将奇数和与偶数和的三倍相加26+34*3=128
④ 取结果的个位数:128的个位数为8
⑤ 用10减去这个个位数10-8=2
所以校验码为2
(注:如果取结果的个位数为0,那么校验码不是为10(10-0=10),而是0)
实现上述代码的功能,计算验证码,输入12位条码,返回带验证码的条码。
例:输入:692223361219输出:6922233612192


*/
import java.util.Scanner;
class AriTest03 {
	public static void main(String[] args){
		//用户做终值
		String perValue = "";
		//临时值
		String value = "";
		label1:while(true){
			try{
				System.out.print("请输入一个十二位数字:");
				Scanner scanner = new Scanner(System.in);//重点:不得将调用Scanner类写在try外面
				value = scanner.next();
				if(value.length() <= 11 || value.length() > 12){
					System.out.println("输入超出范围");
					continue label1;
				}
			}catch(Exception e){
				System.out.println("输入的数字违规\n");
				continue label1;
			}

			//检查输入的是否为数字
			label2:for(int i = 0; i < 12; i++){
				char numi = value.charAt(i);
				boolean isFlag = true;//标记,判断输入的是否为数字
				for(int j = 0; j < 10; j++){
					if(numi == '\u0030' + j){
						perValue = perValue + numi;//判断后,将数字存入字符串中
						continue label2;	
					}
				}
				if(isFlag){
					System.out.println("输入的值非数字\n");
					continue label1;
				}
			}


			//获得:① 前十二位的奇数位和6+0+2+4+6+8=26  ② 前十二位的偶数位和9+1+3+5+7+9=34
			int oddNumber = 0;
			int evenNumber = 0;
			for(int i = 0; i < 12; i++){
				String tempi = perValue.substring(i,i+1);
				int numi = Integer.parseInt(tempi);
				if((i+1) % 2 != 0){
					oddNumber += numi;
				}else{
					evenNumber += numi;
				}

			}


			//③ 将奇数和与偶数和的三倍相加26+34*3=128  ④ 取结果的个位数:128的个位数为8
			//⑤ 用10减去这个个位数10-8=2

			int result1 = oddNumber + evenNumber * 3;
			int result2 = (10 - (result1 % 10)) % 10;

			System.out.println(perValue);
			System.out.println(oddNumber);
			System.out.println(evenNumber);


			System.out.println("十三位条形码:" + perValue + result2);
			break;



		}
		

	}
}

练习7:判断身体健康

/*
开发一款软件,根据公式(身高-108)*2=体重,可以有10斤左右的浮动。来观察测试者体重是否合适。
*/
import java.util.Scanner;
class AriTest04 {
	public static void main(String[] args){
		Scanner scanner = new Scanner(System.in);
		System.out.print("请输入身高(cm):");
		int height = scanner.nextInt();

		System.out.print("请输入体重(斤):");
		int weight = scanner.nextInt();

		int standard = (height - 108) * 2;
		if(weight >= standard - 10 && weight <= standard + 10){
			System.out.println("当前身体健康");
		}else if(weight <= standard - 10){
			System.out.println("太瘦了");
		}else{
			System.out.println("太胖了");
		}
		

	}
}

项目一:家庭记账系统

/*
1. 创建FamilyAccount类及main方法
2. 在main方法中,参照主流程图,实现程序主体结构
3. 测试程序,确认可以正常执行第1和第4菜单选项

*/
class FamilyAccountTest01 {
	public static void main(String[] args){
		
		//定义初始值
		boolean isFlag = true;
		int balance = 10000;
		String details = "收支\t账户金额\t收支金额\t说 明\n";

		while(isFlag){
			System.out.println("-----------------家庭收支记账软件-----------------");
			System.out.println("                  1 收支明细");
			System.out.println("                  2 登记收入");
			System.out.println("                  3 登记支出");
			System.out.println("                  4 退    出\n");
			System.out.print("                  请选择(1-4):");

			char selection = Utility.readMenuSelection();
			System.out.println();

			switch(selection){
				case '1':
					System.out.println("-----------------当前收支明细记录-----------------");
					System.out.println(details);
					System.out.println("--------------------------------------------------\n");
					break;
				case '2':
					System.out.print("本次收入金额:");
					int addMoney = Utility.readNumber();
					System.out.print("本次收入说明:");
					String addDetails = Utility.readString();
					balance += addMoney;
					details += ("收入" + "\t" + balance + "\t\t" + addMoney + "\t\t" + addDetails + "\n");
					System.out.println();
					break;
				case '3':
					System.out.print("本次支出金额:");
					int minusMoney = Utility.readNumber();
					System.out.print("本次支出说明:");
					String minusDetails = Utility.readString();
					balance -= minusMoney;
					details += ("支出" + "\t" + balance + "\t\t" + minusMoney + "\t\t" + minusDetails + "\n");
					System.out.println();
					break;
				case '4':
					System.out.print("确认是否退出(Y/N):");
					char confirm = Utility.readConfirmSelection();
					if(confirm == 'Y'){
						isFlag = false;
				}
			}			
		}
	}
}
import java.util.Scanner;
/**
Utility工具类:
将不同的功能封装为方法,就是可以直接通过调用方法使用它的功能,而无需考虑具体的功能实现细节。
*/
public class Utility {
    private static Scanner scanner = new Scanner(System.in);
    /**
	用于界面菜单的选择。该方法读取键盘,如果用户键入’1’-’4’中的任意字符,则方法返回。返回值为用户键入字符。
	*/
	public static char readMenuSelection() {
        char c;
        for (; ; ) {
            String str = readKeyBoard(1);
            c = str.charAt(0);
            if (c != '1' && c != '2' && c != '3' && c != '4') {
                System.out.print("选择错误,请重新输入:");
            } else break;
        }
        return c;
    }
	/**
	用于收入和支出金额的输入。该方法从键盘读取一个不超过4位长度的整数,并将其作为方法的返回值。
	*/
    public static int readNumber() {
        int n;
        for (; ; ) {
            String str = readKeyBoard(4);
            try {
                n = Integer.parseInt(str);
                break;
            } catch (NumberFormatException e) {
                System.out.print("数字输入错误,请重新输入:");
            }
        }
        return n;
    }
	/**
	用于收入和支出说明的输入。该方法从键盘读取一个不超过8位长度的字符串,并将其作为方法的返回值。
	*/
    public static String readString() {
        String str = readKeyBoard(8);
        return str;
    }
	
	/**
	用于确认选择的输入。该方法从键盘读取‘Y’或’N’,并将其作为方法的返回值。
	*/
    public static char readConfirmSelection() {
        char c;
        for (; ; ) {
            String str = readKeyBoard(1).toUpperCase();
            c = str.charAt(0);
            if (c == 'Y' || c == 'N') {
                break;
            } else {
                System.out.print("选择错误,请重新输入:");
            }
        }
        return c;
    }
	
	
    private static String readKeyBoard(int limit) {
        String line = "";

        while (scanner.hasNext()) {
            line = scanner.nextLine();
            if (line.length() < 1 || line.length() > limit) {
                System.out.print("输入长度(不大于" + limit + ")错误,请重新输入:");
                continue;
            }
            break;
        }

        return line;
    }
}
上一篇:005. Java流程控制


下一篇:005-Java中的控制语句