我是靠谱客的博主 自由棉花糖,最近开发中收集的这篇文章主要介绍Java-day5 (while、do-while循环,循环的嵌套及家庭记账软件的实现),觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
While循环
i不属于while循环
do-while循环
死循环(不限制循环次数的结构):
while(true)
for(;;)
/*
结束循环的几种方式:
①:循环条件不封返回false
②:在循环体中,执行break
*/
//从键盘读入个数不确定的整数,
//并判断读入的正数和负数的个数,
//输入为0时结束程序。
import java.util.Scanner;
class forwhiletest{
public static void main(String[] args)
{
Scanner scan = new Scanner(System.in);
int postivenum = 0;
int negtivenum = 0;
while(true){
//必须在里面循环输入数字,在外面会卡住
System.out.println("请输入一个整数:");
int num = scan.nextInt();
if(num > 0){
postivenum ++;
}else if(num <0){
negtivenum ++;
}else{
break;
}
}
System.out.println("正数的个数是:"+postivenum);
System.out.println("正数的个数是:"+negtivenum);
}
}
循环的嵌套
循环的嵌套一般不会超过三层.
打印矩形
class printrectangle{
public static void main(String[] args)
{
for(int i = 1;i <= 9;i++){
for(int n = 1; n <= 9; n++){
System.out.print("*");
}
System.out.println();
}
}
}
我们可以打印出三角形,三角形行数是等于 星花 数的,所以我们是第几行我们就打印几个 星花 星花后面的直接打印空格。
打印三角形
class printtritangle{
public static void main(String[] args)
{
for(int i = 1;i <= 6;i++){
for(int j = 1; j <= 6; j++){
if (i>=j)
{
System.out.print("*");
}
else{
System.out.print(" ");
}
}
System.out.println();
}
}
}
但是上述方法不是最优。
class printtriangle {
public static void main(String[] args)
{
for(int i = 0;i <= 5;i++){
for(int j = 0;j <= i;j++){
System.out.print("*");
}
System.out.println();
}
}
}
倒三角
菱形
我们可以写出乘法表
class multiplicationtable
{
public static void main(String[] args) {
for(int i =1;i<=9;i++){
for(int j=1;j<=i;j++){
System.out.print(j+"*"+i+"="+(i*j) + "t");
}
System.out.println();
}
}
}
t 相当于tab,缩进
n 回车
r 换行
b 换成 一个黑点
有f 换成 口 字
打印100以内所有的质数
较差写法:
/*
打印100以内所有的质数
质数:除1以外只能被1和自身整除的数
因为质数只能被1和自身整除,所以他就不能被
2到这个数减1的数整除.
难点:找一个变量去判断在数字
是否被2到这个数减1的数整除.
如果这个变量改变了就不打印.
*/
class Primenumbertest {
public static void main(String[] args)
{
for(int i = 2;i <= 100;i++){//遍历100的值
boolean isflag = true; //标识i是否被j整除,一旦除尽,修改气质
for (int j = 2;j < i;j++ )//i被2到这个数减1的数整除
{
if(i % j == 0){//i被j除尽
isflag = false;//修改了isflag的值 所以从下次循环开始要重置isflag的值
}
}
if(isflag == true){
System.out.println("质数:"+i);
}
}
}
}
代码的优化:
/*
100000以内的所有质数的输出。实现方式一
质数:素数,只能被1和它本身整除的自然数。-->从2开始,到这个数-1结束为止,都不能被这个数本身整除。
*/
class PrimeNumberTest1 {
public static void main(String[] args) {
boolean isFlag = true;//标识i是否被j除尽,一旦除尽,修改其值
int count = 0;//记录质数的个数
//获取当前时间距离1970-01-01 00:00:00 的毫秒数
long start = System.currentTimeMillis();
for(int i = 2;i <= 100000;i++){//遍历100000以内的自然数
//优化二:对本身是质数的自然数是有效的。
//for(int j = 2;j < i;j++){
for(int j = 2;j <= Math.sqrt(i);j++){//j:被i去除,这里为什么改为根号?
/*如果一个数他能被1数整除那么就有另外一个相对应的2数也能去整除它。
比如100/25 (25就是1数)那么还存在一个4(2数)也能把100整除,所以4和25是
相对应的,这个节点在这个数的平方根哪里,因为根号的平方就等于他本身,
数轴上在这个数平方根的左边一定是有1数能把这个数整除,所以我们就用这个数
去除这个数平方根以内的数,我们就不用了去遍历所有的数,去看是否能把这个数
整除,从而达到缩小范围的要求,即优化了代码,如果你能被根号内的数整除那么一定不是质数*/
if(i % j == 0){ //i被j除尽
isFlag = false;
break;//优化一:只对本身非质数的自然数是有效的。
}
}
//
if(isFlag == true){
//System.out.println(i);
count++;
}
//重置isFlag
isFlag = true;
}
//获取当前时间距离1970-01-01 00:00:00 的毫秒数
long end = System.currentTimeMillis();
System.out.println("质数的个数为:" + count);
System.out.println("所花费的时间为:" + (end - start));//用时:原代码:17110 - 优化一:break:1546 - 优化二:13
}
}
特殊关键字的使用break、continue
关键字(被java付有特殊的含义)
两者对比
class BreakContinueTest {
public static void main(String[] args) {
label:for(int i = 1;i <= 4;i++){
for(int j = 1;j <= 10;j++){
if(j % 4 == 0){
//break;//默认跳出包裹此关键字最近的一层循环。//输出:四排123
//continue; //输出:四排123567910
//break label;//结束指定标识的一层循环结构 //输出:123
continue label;//结束指定标识的一层循环结构当次循环 //输出:123123123123因为是终止外层的本次循环所以换行也被终止了.
}
System.out.print(j);
}
System.out.println();
}
}
}
求质数个数改进:
class Primenumbertest1{
public static void main(String[] args)
{
int count = 0;
long start = System.currentTimeMillis();//获取当前时间距离1970-01-01 00:00:00 的毫秒数
label:for(int i = 2;i <= 100000;i++){
for (int j = 2;j <= Math.sqrt(i);j++)
{
if(i % j == 0){
continue label;//只要遇到不是质数直接结束外层循环进入下一个数的判断
}
}
count++;
}
System.out.println("质数的个数为:" + count);
long end = System.currentTimeMillis();
System.out.println("所花费的时间为:" + (end - start));
}
}
项目一:家庭记账软件
软件输入功能的代码封装:
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;
}
}
家庭收支软件各个功能的逐步实现
第一步设置界面及输入格式:
class FamilyAccount {
public static void main(String[] args)
{
while(true){
System.out.println("-------------家庭收支记账软件-------------n");
System.out.println(" 1 收支明细 ");
System.out.println(" 2 登记收入 ");
System.out.println(" 3 登记支出 ");
System.out.println(" 4 退 出");
System.out.print(" 请选择(1-4):");
//获取用户的选择:1-4
char selection = Utility.readMenuSelection();
switch(selection){
case '1':
System.out.println("1 收支明细 ");
break;
case '2':
System.out.println("2 登记收入 ");
break;
case '3':
System.out.println("3 登记支出 ");
break;
case '4':
System.out.println("4 退 出 ");
break;
}
}
}
}
执行效果:
设计四个具体功能:
①退出功能的实现:
case '4':
System.out.println("确认是否退出(Y/N): ");
char IsExit = Utility.readConfirmSelection();
if(IsExit == 'Y'){
break label; }
②收支明细功能的实现
class FamilyAccount {
public static void main(String[] args)
{
String details = "收支t账户金额t收支金额t说 明n";
int balance = 10000;//初始金额
label:while(true){
System.out.println("n-------------家庭收支记账软件-------------n");
System.out.println(" 1 收支明细 ");
System.out.println(" 2 登记收入 ");
System.out.println(" 3 登记支出 ");
System.out.println(" 4 退 出");
System.out.print(" 请选择(1-4):");
//获取用户的选择:1-4
char selection = Utility.readMenuSelection();
switch(selection){
case '1':
System.out.println("-----------------当前收支明细记录-----------------");
System.out.println(details);
System.out.println("--------------------------------------------------");
break;
case '2':
System.out.println("2 登记收入 ");
break;
case '3':
System.out.println("3 登记支出 ");
break;
case '4':
System.out.println("确认是否退出(Y/N): ");
char IsExit = Utility.readConfirmSelection();
if(IsExit == 'Y'){
break label;
}
}
}
}
}
执行结果:
③实现登记收入的功能
case '2':
System.out.println("本次登记金额:");
int money = Utility.readNumber();
System.out.println("本次收入说明:");
String info = Utility.readString();
//处理balance(加收入)
balance += money;
//处理details
details += ("收入t" + balance + "tt" +money + "tt" + info+ "n");
System.out.println("---------------------登记完成---------------------");
break;
执行结果:
④实现登记支出功能:
case '3':
System.out.println("本次登记金额:");
int minusmoney = Utility.readNumber();
System.out.println("本次支出说明:");
String minusinfo = Utility.readString();
//处理balance(加收入)
if (balance >= minusmoney)
{
balance -= minusmoney;
//处理details
details += ("支出t" + balance + "tt" +minusmoney + "tt" + minusinfo+ "n");}
else{
System.out.println("透支了不能支出!");
}
System.out.println("---------------------登记完成---------------------");
break;
家庭记账软件最终代码
class FamilyAccount {
public static void main(String[] args)
{
String details = "收支t账户金额t收支金额t说 明n";
int balance = 10000;//初始余额
label:while(true){
System.out.println("n-------------家庭收支记账软件-------------n");
System.out.println(" 1 收支明细 ");
System.out.println(" 2 登记收入 ");
System.out.println(" 3 登记支出 ");
System.out.println(" 4 退 出");
System.out.print(" 请选择(1-4):");
//获取用户的选择:1-4
char selection = Utility.readMenuSelection();
switch(selection){
case '1':
System.out.println("-----------------当前收支明细记录-----------------");
System.out.println(details);
System.out.println("--------------------------------------------------");
break;
case '2':
System.out.println("本次登记金额:");
int addmoney = Utility.readNumber();
System.out.println("本次收入说明:");
String addinfo = Utility.readString();
//处理balance(加收入)
balance += addmoney;
//处理details
details += ("收入t" + balance + "tt" +addmoney + "tt" + addinfo+ "n");
System.out.println("---------------------登记完成---------------------");
break;
case '3':
System.out.println("本次登记金额:");
int minusmoney = Utility.readNumber();
System.out.println("本次支出说明:");
String minusinfo = Utility.readString();
//处理balance(加收入)
if (balance >= minusmoney)
{
balance -= minusmoney;
//处理details
details += ("支出t" + balance + "tt" +minusmoney + "tt" + minusinfo+ "n");}
else{
System.out.println("透支了不能支出!");
}
System.out.println("---------------------登记完成---------------------");
break;
case '4':
System.out.println("确认是否退出(Y/N): ");
char IsExit = Utility.readConfirmSelection();
if(IsExit == 'Y'){
break label;
}
}
}
}
}
执行结果:
最后
以上就是自由棉花糖为你收集整理的Java-day5 (while、do-while循环,循环的嵌套及家庭记账软件的实现)的全部内容,希望文章能够帮你解决Java-day5 (while、do-while循环,循环的嵌套及家庭记账软件的实现)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复