文章目录

  • 一.看程序,写结果
  • num++和num=num++区别
  • 展示for循环内部顺序
  • 二.编程题
  • 1.编程一个程序,计算今天是今年的第几天.
  • 2.猴子吃桃问题。
  • 3.青蛙出井问题。
  • 4.输出2--100之间的质数
  • 5.设计一个对银行账户余额操作的程序
  • 6.按要求设计家庭记账程序(参考图片)
  • 三、总结不会的
  • 6 num=num++;输出的num=0,为什么?
  • 3.一只青蛙在一口11米深的井底向上爬,白天向上爬3米,晚上向下滑2米,总共需要几天可以爬出.


一.看程序,写结果

  1. = 为赋值运算符 == 为比较运算符
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

  1. && 和||
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

  1. 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);//循环次数
    }
}
  1. 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);
    }
}