文章目录
- 一.看程序,写结果
- num++和num=num++区别
- 展示for循环内部顺序
- 二.编程题
- 1.编程一个程序,计算今天是今年的第几天.
- 2.猴子吃桃问题。
- 3.青蛙出井问题。
- 4.输出2--100之间的质数
- 5.设计一个对银行账户余额操作的程序
- 6.按要求设计家庭记账程序(参考图片)
- 三、总结不会的
- 6 num=num++;输出的num=0,为什么?
- 3.一只青蛙在一口11米深的井底向上爬,白天向上爬3米,晚上向下滑2米,总共需要几天可以爬出.
一.看程序,写结果
- = 为赋值运算符 == 为比较运算符
class Test4 {
public static void main (String [] args) {
boolean x=true;
boolean y=false;
short z=42;
if((z++==42)&&(y=true))
z++;
if((x=false)||(++z==45))
z++;
System.out.println(”z=”+z);
}
}
输出结果: z=42
- && 和||
class Test{
public static void main (String [] args) {
boolean x= true;
boolean y=false;
short z=20;
if((x==true)&&(y=true))
z++;
if((y==true)||(++z==22))
z++;
System. out .println( "z="+z);
}
}
输出结果: z=22
3.break跳出switch循环
class TestApp{
//跳出一层循环可以用break ,跳出方法可以用return
public static void main (String[] args){
for (int i=0; i<10;i++){
if(i==3)
break;
System.out.print (i);
}
}
}
输出结果: 0 1 2
- state模式:状态切换
class Test{
//state=true或false是赋值,不是判断,所以两个if都会运行
public static void main (String[] args){
boolean state=false;
int i=2;
if((++i>2)&&(state=true))
i++;
if((++i>4)||(state=false))
i++;
System.out .println (i);
}
}
输出结果: 6
class WhileTests{
public static void main (String [] args) {
int x=5;
while (++x<4) {
--x;
}
System.out.println( "x="+x);
}
}
输出结果: x=6
num++和num=num++区别
6.下面程序运行的结果正确的是: 0
//num++是个函数,num是个变量 ++在后面 先赋值后运算
public class Demo{
public static void main (String args[]) {
int num=0;
for (int i=0;i<100;i++) {
num=num++; //警告提示:num++没有被使用过
}
System.out.println("num="+num);
}
}
7.编译运行以下程序后,关于输出结果的说明正确的是( 9.0 )
public class Demo{
public static void main (String args[]) {
int x=4;
double r = ((x>4) ? 99.9:9)); //System. out. println("value is "+ double r = ((x>4) ? 99.9:9));//报错
System.out.println("value is"+r);
//9.0 自动转为doublel类型
}
}
8.下面的程序编译运行的结果是:
public class Demo{
public static void main (String args[]) {
int c =0;
System. out. println(c); //0
System. out. println(c++); //0
System. out. println(c);//1
}
}
9.下面程序运行的结果正确的是: 100 21
public class Demo{
public static void main (String args[]) {
int n = 100;
int m = 20;
if (m++ <= 20 || n == n++) //||运算,前面是true就不计算后面,直接输出
System. out. println (n); //100
System. out. println(m); //21
}
}
10.给定如下java代码,编译运行之后结果是: 0 1 2 外部i:3
class Demo{
public static void main(String args[]) {
int i;
for (i=0;i<3; i++) {
System.out.print (i) ;
}
System. out. print (i);//循环次数
}
}
- switch循环中 ,case语句后如果没有break,则会顺序执行下去。
class Demo{
public static void main(String[] args){
Demo.show(0); //15 default-->case 1-->case 4-->case 2 顺序相加
Demo.show(1); //14 case 1-->case 4-->case 2 顺序相加
}
public static void show(int i){
switch(i){
default:i+=2;
case 1:i+=1;
case 4:i+=8;
case 2:i+=4;
}
System.out.println("i="+i);
}
}
展示for循环内部顺序
程序运行结束,在控制台输出的结果为? //输出结果 a b d c b d c b
class Demo{
public static void main(String[] args){
int x = 1; 3
for(Demo.show('a'); Demo.show('b') && x<3; Demo.show('c')){
show('d');
x++;
//输出结果abdcbdcb
}
}
public static boolean show(char ch){
System.out.print(ch);
return true;
}
}
二.编程题
1.编程一个程序,计算今天是今年的第几天.
输入年 输入月 输入天
【第二个解题思路】
1、通过年份区分是闰年还是平年,平年 2 月 28 年,闰年 2 月 29 天。
2、1、3、5、7、8、10、12 月份为 31 天,其余月份为 30 天。
3、将每个月的天数相加即可,如果输入的是 12 月,则从 11 月往前累加到1月。
package day3;
import java.util.Scanner;
public class Demo2 {
public static void main(String[] args) {
/*
一年365天
一月30天
2022年2月2号是今年多少天? 2022-2022 * 365 + 2*30 + 2
*/
outer: while(true){
System.out.println("-----计算今天是今年第几天-----");
System.out.println(" 退出:0");
Scanner scanner = new Scanner(System.in);
System.out.println("输入年:");
int year = scanner.nextInt();
if(year == 0 || year != 2022) break outer;
System.out.println("输入月:");
int month = scanner.nextInt();
if(month == 0|| month>12) break outer;
System.out.println("输入日:");
int day = scanner.nextInt();
if(day == 0|| day>30) break outer;
int sum = --month* 30 + day;
System.out.println("今年是今天的第:"+sum+" 天");
}
}
}
package day3;
import java.util.Scanner;
public class Demo3 {
/*
编程一个程序,计算今天是今年的第几天.
输入年 输入月 输入天
**【解题思路】**
1、通过年份区分是闰年还是平年,平年 2 月 28 年,闰年 2 月 29 天。
2、1、3、5、7、8、10、12 月份为 31 天,其余月份为 30 天。
3、将每个月的天数相加即可,如果输入的是 12 月,则从 11 月往前累加到1月。
*/
/*平年二月28天*/
private static final int DAYS_28 = 28;
/*闰年二月29天*/
private static final int DAYS_29 = 29;
/*除了31天的月份其他均为30天*/
private static final int DAYS_30 = 30;
/*1、3、5、7、8、10、12月份31天*/
private static final int DAYS_31 = 31;
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("Please input year:");
int year = input.nextInt();
System.out.println("Please input month:");
int month = input.nextInt();
System.out.println("Please input day:");
int day = input.nextInt();
int daysInYear = getDaysInYear(year, month, day);
System.out.println("daysInYear:" + daysInYear);
}
/**
* get days in this year
*/
public static int getDaysInYear(int year, int month, int day) {
int totalDays = 0;
switch (month) {
// 12 月份加的是11月份的天数,依次类推
case 12:
totalDays += DAYS_30;
case 11:
totalDays += DAYS_31;
case 10:
totalDays += DAYS_30;
case 9:
totalDays += DAYS_31;
case 8:
totalDays += DAYS_31;
case 7:
totalDays += DAYS_30;
case 6:
totalDays += DAYS_31;
case 5:
totalDays += DAYS_30;
case 4:
totalDays += DAYS_31;
case 3:
// 判断是否是闰年
if (((year / 4 == 0) && (year / 100 != 0)) || (year / 400 == 0)) {
totalDays += DAYS_29;
} else {
totalDays += DAYS_28;
}
case 2:
totalDays += DAYS_31;
case 1: // 如果是1月份就加上输入的天数
totalDays += day;
}
return totalDays;
}
}
2.猴子吃桃问题。
猴子第一天摘下若干个桃子,当时就吃了一半,还不过瘾,就又吃了一个。第二天又将剩下的桃子吃掉一半,又多吃了一个。以后每天都吃前一天剩下的一半零一个。到第 10 天在想吃的时候就剩一个桃子了,求第一天共摘下来多少个桃子?
package day3;
public class Demo4 {
public static void main(String[] args) {
/*
猴子第一天摘下若干个桃子,当时就吃了一半,还不过瘾,就又吃了一个。 rest=sum/2-1 //rest:剩余苹果 sum:总数 第一天sum=rest
第二天又将剩下的桃子吃掉一半,又多吃了一个。 rest=rest/2-1
以后每天都吃前一天剩下的一半零一个。 rest= rest/2-1
.... ... =(rest+1)*2
到第 10 天在想吃的时候就剩一个桃子了,求第一天共摘下来多少个桃子?rest =1
*/
int rest = 1;
for (int i = 1; i < 10; i++) {
rest = (rest + 1) * 2;
System.out.print("第" + (10-i) + "天桃子为:"+rest+" 个\n");
}
}
}
3.青蛙出井问题。
一只青蛙在一口11米深的井底向上爬,白天向上爬3米,晚上向下滑2米,总共需要几天可以爬出.
package day3;
public class Demo7 {
public static void main(String[] args) {
int i=0;//井深
int j=0;//天数
for (; ; j++) {
i=i+3;
if(i>11){
break;
}
i=i-2;
}
System.out.println(j);
}
}
提示:不知道井多深的时候怎么办?
4.输出2–100之间的质数
(只能被1和本身整除的,再没有其他因数的数)
package day3;
public class Demo9 {
public static void main(String[] args) {
boolean flog;
for(int i=2;i<=100;i++){
for(int j =2;j<=i/2;j++){
if(i%j==0){
flog = false;
}
}
if(flog=true){
System.out.println(i+" ");
}
}
}
}
5.设计一个对银行账户余额操作的程序
假设账号: int account=666666
密码:int password=111111
余额:int balance=1000
进入程序输出选择操作选项:
1.存款,2.取款,3.查询余额
要求使用Scanner交互式操作.
存款,取款,查询均需要输入账号密码,验证没有问题即可操作.
可以多次重复操作
提示:存款就是余额加 ,取款就是余额减
package day3;
import java.util.Scanner;
public class Demo10 {
public static void main(String[] args) {
/*
假设账号: int account=666666
密码:int password=111111
余额:int balance=1000
进入程序输出选择操作选项:
1.存款,2.取款,3.查询余额
要求使用Scanner交互式操作.
存款,取款,查询均需要输入账号密码,验证没有问题即可操作.
可以多次重复操作
提示:存款就是余额加 ,取款就是余额减
*/
int money=0;//余额
//输入
Scanner scanner = new Scanner(System.in);
System.out.println("账户:");
String str1 = scanner.nextLine();
System.out.println("密码:");
int str2 = scanner.nextInt();
outer:while(true){
//验证
if((str1.equals("song"))&&(str2==123)){
//如果验证正确,进入系统
System.out.println("选择业务:\n");
System.out.println("1.存款 2.取款 3.查询余额 4.退出系统");
int str3 = scanner.nextInt();
switch (str3){
case 1:
System.out.println("输入存款金额:");
int sc1 = scanner.nextInt();
money = money + sc1;
System.out.println("余额:"+money);
break;
case 2:
System.out.println("输入取款金额:");
int sc2 = scanner.nextInt();
money -= sc2;
System.out.println("余额:"+money);
break;
case 3:
System.out.println("查询余额");
System.out.println("余额:"+money);
break;
case 4:
System.out.println("退出系统");
break outer;
default:
System.out.println("输入无效,重新输入!");
}
}else
System.out.println("输入账户或密码错误!");
}
}
}
6.按要求设计家庭记账程序(参考图片)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xXIm00aQ-1642337178675)(D:\非凡英才学习记录\2022-1-15_java第二章\练习\家庭记账软件.png)]
提示:先写选择功能的界面。再写功能循环 ,outer:while(true){ switch(){case:{ break;} 循环退出 :结束outer}
package day3;
import java.util.Scanner;
public class demo1 {
/*
设计家庭记账程序(参考图片)
*/
public static void main(String[] args) {
/*
死循环两种方式:
for(;;){}
while(true){}
*/
double money = 0;
String incomInfo = "金额 说明 余额\n";
String outInfo = "金额 说明 余额\n";
outer:while (true) {
System.out.println("-----家庭收支记账软件-----");
System.out.println("1 登记收入");
System.out.println("2 登记支出");
System.out.println("3 收支明细");
System.out.println("4 退出");
System.out.println("请选择业务:");
Scanner scanner = new Scanner(System.in);
int inStr = scanner.nextInt();
switch (inStr) {
case 1: {
System.out.println("输入要存入的钱数:");
double incom = scanner.nextDouble();
System.out.println("输入收入说明: ");
String str = scanner.next();
money = money + incom;
System.out.println("账户余额:"+money);
incomInfo = "收入:"+ incom +"收入说明:" + str + "账户余额:"+money+"\n";
break;
}
case 2: {
System.out.println("输入支出的钱数:");
double out = scanner.nextDouble();
System.out.println("输入支出说明:");
String str = scanner.next();
money -=out ;
System.out.println("账户余额:"+money);
outInfo ="支出:"+out + "支出说明:"+out+ "账户余额:" + money+"\n";
break;
}
case 3: {
System.out.println("-----收支明细-----\n");
System.out.println(incomInfo);
System.out.println(outInfo);
break;
}
case 4: {
break outer;
}
default:
System.out.println("无效输入!");
}
}
}
}
三、总结不会的
6 num=num++;输出的num=0,为什么?
为什么num= num++;输出结果是0?,原因详解
public class Demo{
public static void main (String args[]) {
int num=0;
for (int i=0;i<100;i++) {
num=num++; //运行后警告提示:num++没有被使用过
}
System.out.println("num="+num);
}
}
运行后警告提示:num++没有被使用过
原因:先了解num=num和num++分别在存储空间哪里运行?
main方法执行时,会分配虚拟内存空间——线程–栈
栈 分为多个种类,
对变量赋值时是在局部变量表中进行,操作时是在操作数栈中进行。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-psFJNdXQ-1642337178677)(C:\Users\16431\Desktop\捕获.PNG)]
而num = num++;因为++在后面,所以先赋值后运算。
然后理解为:
①:num = num; 在 局部变量栈中 操作,相当于 tnum = num;
②:num++; 在 操作数栈中 进行, num++;
③:num 值输出, 这里输出的是局部变量表中的 tnum,和操作数栈中num++无关。
为什么说输出的是局部变量表中的数值?
引入变量j,让j = num++;,这时 j 输出的结果是100,而 j 存储在局部变量表中,所以说明输出的结果是在局部变量表中存储的数值。
package day1;
public class Demo1 {
public static void main(String[] args) {
int j = 0;
for (int i=0;i<100;i++) {
j=num++; //警告提示:num++没有被使用过
}
System.out.println("num="+num);
}
}
3.一只青蛙在一口11米深的井底向上爬,白天向上爬3米,晚上向下滑2米,总共需要几天可以爬出.
public class Demo7 {
public static void main(String[] args) {
int i=0;//爬了多少
int j=0;//天数
for (; ; j++) {
i=i+3;
if(i>11){
break;
}
i=i-2;
}
System.out.println(j);
}
}