while循环
do-while循环
附:String常用方法
嵌套循环练习
练习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;
}
}