Java中常见逻辑控制和经典题目解析

前言❤️❤️

hello hello💕,这里是洋不写bug~😄,欢迎大家点赞👍👍,关注😍😍,收藏🌹🌹
在这篇文章中,会遇到一些在C语言中从来没有见过的东西,例如Scanner类,包的导入,其实不需要完全理解,记住怎么写就行,后面慢慢会理解
这篇文章会用一些经典的代码题的Java写法,从C语言过渡的同时也穿插一些新的知识点,帮助大家快速入门Java💪
在这里插入图片描述
🎇个人主页:洋不写bug的博客
🎇所属专栏:Java学习之旅,从入门到进阶
🎇铁汁们对于Java的各种常用核心语法(不太常用的也有😆),都可以在上面的Java专栏学习,专栏正在持续更新中🐵🐵,有问题可以写在评论区或者私信我哦~

1,条件语句

if else,switch语句等,都是条件语句,下面这段代码就使用了条件语句

public class Test1 {
    public static void main(String[] args) {
      int a = 10;
      if(a < 11){
          System.out.println("进入条件");
      }
    }
}

2,Java软性语法规则(看着美观)

写一个if else的语句时,在C语言中是这样的

int main() {
	int a = 10;
	if (a > 11) {
		printf("进入if");
	}
	else {
		printf("进入else");
	}
}

而在Java中是这样的:

public class Test1 {
    public static void main(String[] args) {
      int a = 10;
      if(a < 11){
          System.out.println("进入if");
      }else{
          System.out.println("进入else");
      }
    }
}

仔细看就会发现,Java中"{" 是不独占一行的,在整个编程圈子里,不独占一行的写法是很常见的(谷歌推行的一套C++编程规则中就推荐"{"不独占一行),后面写Java代码就用这种不独占一行的写法



同时在C语言的条件判断中,会出现这样一种写法,这是为了防止我们把"==“写成”=",这样写写错就很容易意识到:

int a = 10;
      if(10 == a){
          
      }

但在Java中完全不用这样写,因为IDEA可以推断出语法的错误这里少写一个=,就会直接报错
因为在C语言中,条件判断语句的括号内可以是int类型(bool类型是可以跟int类型相互转换的)
但在Java中里面必须是boolean类型(true或者false),因此这里就会报错,提示我们去修改。

在这里插入图片描述

3,经典题目

接下来会举出一些经典题目,会将知识点贯穿到题解中

1,判断输入整数的奇偶性

这里与C语言最不同的就是读取键盘输入数这一部分怎么来写,在C语言中我们使用scanf来读取输入的数字,在Java中则不同,需要使用Scanner来完成读取。

import java.util.Scanner;

public class Test1 {
    public static void main(String[] args) {
        System.out.println("请输入一个整数:");
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt();
        if(num % 2 == 0){
            System.out.println("偶数");
        }else{
            System.out.println("奇数");
        }
    }
}

import java.util.Scanner;

这个是Java中的一个包,在使用Scanner这个内置类时要导入这个包才能使用,一般在我们输入Scanner就会自动导入
如果没有导入的话,Scanner处就会爆红,把鼠标键,放在这里 ,按alt + enter键,会有许多选项,点击import class即可导入包

在这里插入图片描述

Scanner scanner = new Scanner(System.in);

Scanner是Java中的一个内置的类,而scanner就是对象(类 类型的一个变量)
这句话是创建一个Scanner对象(Java是面向对象的程序设计),这个对象的名称就是scanner(对象的名称叫什么都可以,这里用scanner为对象命名是为了在使用时能一下知道这个对象的作用)
而等号右边的部分是对这个对象scanner(变量)的初始化





int num = scanner.nextInt();

这里的 scanner.nextInt();指的是从控制台读取一个int类型的整数



注:这里的Scanner和System,包括new Scanner(),是不用自己全部敲完的,基本上只敲前两个字母,其他的就可以选择补全(按一下enter键)

在这里插入图片描述
在这里插入图片描述

总结:这段代码是入门必敲代码,大家一定要多练几次,掌握Java中从控制台读取数据的代码。

2,闰年的判断和闰年原理讲解

1,基础代码

这里也是用Scanner类的对象scanner来读取从控制台中输入的年份
然后先判断是不是整百年,如果是整百年的话,必须除以400能除尽才是闰年

import java.util.Scanner;

public class Test1 {
    public static void main(String[] args) {
        System.out.println("请输入一个年份:");
        Scanner scanner = new Scanner(System.in);
        int year = scanner.nextInt();
        if(year % 100 == 0){
            //是整百年
            if(year % 400 == 0){
                System.out.println(year + "是闰年");
            }else{
                System.out.println(year + "不是闰年");
            }
        }else{
            if(year % 4 == 0){
                System.out.println(year + "是闰年");
            }else{
                System.out.println(year + "不是闰年");
            }
        }
    }
}

2,小科普,闰年的原理

可能有的铁汁会比较奇怪,为什么要分为100年整,和非100年整来计算呢
其实原理是这样的:

  • 年 => 地球绕太阳公转一圈的时间
  • 天 => 地球自转一圈的时间
  • 但是一年并不是完全等于365天,而是会多一点点,一年等于365.XXXXXXXX天,每算一年,都会存在一些误差,因此人们就引入闰年来修正误差

    经过计算,4年加一天,差不多能把误差给补上,但是也不是恰好就能补齐,还会多出来一块,人们又想了一个办法,恰好在整百年(不能被400整除的整百年)的时候,少补一次就行了,这样误差就会非常非常小。

    3,浮点数的误差导致的判断错误

    下面这段代码我们上来直接看会觉得最后打印相等,但是结果却是不相等

    public class Test1 {
        public static void main(String[] args) {
            double a = 0.1;
            double b = 0.2;
            System.out.println(0.3);
            System.out.println(a + b);
            if(a + b == 0.3){
                System.out.println("相等");
            }else{
                System.out.println("不相等");
            }
        }
    }
    

    在这里插入图片描述

    在数据类型博客在1.4部分中提到了浮点数不能精确表示,链接在下面,铁汁们感兴趣可以看一下:
    数据类型讲解
    并且a+b误差还会变大,因此很容易出现条件判断不能成立的情况。因此,一般不是直接比较浮点数是否相等,而是做减法,判断差值是否在误差的范围之内。




    这里的判断相等允许在一定的误差范围内,来看是否相等,但是,如果这个误差范围太小的话,判断出来还是不相等。

    public class Test1 {
        public static void main(String[] args) {
            double gap = 0.0000000001;
            double a = 0.1;
            double b = 0.2;
            if((a + b - 0.3) > -gap && (a + b - 0.3) < gap){
                System.out.println("相等");
            }else{
                System.out.println("不相等");
            }
        }
    }
    

    注:这里判断的相等,不是严格的相等,而是在误差范围内的相等,因此,在一些精确要求高的场景,还是要慎用浮点数,

    4,输出文字“星期几”(switch语句)

    用户输入一个从1到7的数字,读取后输出是星期几

    import java.util.Scanner;
    
    public class Test1 {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入一个 1-7 之间的整数:");
            int day = scanner.nextInt();
            switch (day){
                case 1:
                    System.out.println("星期一");
                    break;
                case 2:
                    System.out.println("星期二");
                    break;
                case 3:
                    System.out.println("星期三");
                    break;
                case 4:
                    System.out.println("星期四");
                    break;
                case 5:
                    System.out.println("星期五");
                    break;
                case 6:
                    System.out.println("星期六");
                    break;
                case 7:
                    System.out.println("星期日");
                default:
                    System.out.println("您输入的值有误!");
            }
        }
    }
    

    注:switch,case语句,switch括号里面,变量/常量的类型,如果是数字类型的话只能是:byte,char,short,int
    注意不能是long类型(因为case的数量一般比较少的时候才用switch语句,如果超过21亿的话,那代码就太复杂了,还不如用if语句来写)




    switch括号里还可以是引用类型:String字符串,示例如下:
    注:读取整数用scanner.nextInt,读取字符串则使用的是scanner.next

    import java.util.Scanner;
    
    public class Test1 {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入一个单词:");
            String word = scanner.next();
            switch (word) {
                case "dog":
                    System.out.println("小狗");
                    break;
                case "cat":
                    System.out.println("小猫");
                    break;
                case "bird":
                    System.out.println("小鸟");
                    break;
                default:
                    System.out.println("输入错误");
            }
        }
    }
    

    5,阶乘计算(while)

    跟C语言中的基本相同,唯一的不同点就是C语言中的while条件语句括号里可以按0和非0的逻辑来判断是否相同,但是在Java中括号里面必须是布尔类型(true或false),这个需要逐渐习惯。

    public class Test1 {
        public static void main(String[] args) {
          int result = 1;
          int i = 1;
          while(i <= 5){
              result *= i;
              i++;
          }
            System.out.println(result);
        }
    }
    

    6,计算1-5的阶乘的和

    1! + 2! + 3! + 4! + 5!

    1,基础代码(低内聚)

    这里很简单,就是两层循环,外面表示从1到5,里面表示计算阶乘。
    补充:continue和break,break是跳出整个循环,continue是跳出本次循环,进入下次循环,这里C语言已经学过,就不再过多阐述了

        public static void main(String[] args) {
            int sum = 0;
            int n = 1;
            while(n <= 5){
                int factorResult = 1;//表示阶乘的结果
                int i = 1;//外面每一轮都将i更新为1
                while(i <= n){
                    factorResult *= i;
                    i++;
                }
                sum += factorResult;
                n++;
            }
            System.out.println(sum);
        }
    }
    

    2,局部变量的作用域,生命周期

    这段代码中的所有变量都是局部变量,在Java中,根本就没有“全局变量”这一说,因为所有代码都是封装在类的结构中的(后面博客会提到,现在无需理解)

  • 作用域:变量可以在那些代码中被使用
  • 生命周期:变量创建的时机和销毁的时机(执行到变量定义得代码变量被创建,出了变量所在的代码块变量就会被销毁)
  • 3,for循环写法(高内聚)

    在刚刚写的while循环循环中,我们可以看到,
    int i = 1;
    i <= n;
    i++;
    这三个式子是分开来写的,这就是“低内聚”。

  • 高内聚:把有关联关系的代码,尽可能的集中放在一起
  • 低内聚:把有关联关系的代码,放的非常分散,到处都有。

  • 这就像我们在家里,把衣服放在一个柜子里,书放在一个柜子里,这样找东西特别清楚(高内聚),但要是衣服和书混起来放,那就特别乱,找东西也很难找。(低内聚)
    代码也是这样,高内聚比低内聚要好,这样代码读起来清楚,可维护性也强。

    对比下面for循环写法(高内聚)和while循环写法(低内聚)的代码,会发现for循环的要比while循环清楚很多。日常写代码时,尽量使用高内聚

    public class Test1 {
        public static void main(String[] args) {
          int sum = 0;
          for(int n = 1;n <= 5;n++){
              int result = 1;
              for(int i = 1;i <= n;i++){
                  result *= i;
              }
              sum += result;
          }
            System.out.println(sum);
        }
    }
    

    7,判断输入的一个数是否是素数

    下面这个写法是初学Java的时候一个很不错的写法
    注意sqrt方法是Math类的,写的时候在前面加上Math(不理解的话现在先记住这样写,后面学过类后就理解了)

    import java.util.Scanner;
    
    public class Test1 {
        public static void main(String[] args) {
            System.out.println("请输入一个整数");
            Scanner scanner = new Scanner(System.in);
            int n = scanner.nextInt();
            //针对特殊情况的判定
            if(n == 0 || n == 1){
                System.out.println(n + "不是素数");
                return;
            }
            //从2开始,一直判断到n的算术平方根,也就是根号n
            int i = 2;
            //使用Math类中的数学方法来计算
            double tmp = Math.sqrt(n);
            //这个for第一个分号前这里空着不写,会默认是用前面的条件
            for(;i < tmp;i++){
                if(n % i == 0){
                    System.out.println(n + "不是素数");
                    break;
                }
            }
            if(i >= tmp){
                System.out.println(n + "是素数");
            }
        }
    }
    

    8,输出0-999之间的水仙花数

    水仙花数:是指一个三位数,其各位数的立方和刚好等于其本身,如:153 = 1^3 + 5^3 + 3^3 ,故153就是一个水仙花数。

    写出代码的关键就是取出来三位数的个位,十位,百位的每一位数。

    public class Test1 {
        public static void main(String[] args) {
            for(int i = 100;i <= 999;i++){
                int a = i % 10;//取出个位数
                int b = (i / 10) % 10;//取出十位数
                int c = i / 100;//取出百位数
                if(a * a * a + b * b * b + c * c * c == i){
                    System.out.println(i + "是水仙花数");
                }
            }
        }
    }
    
  • 取出个位数就是用三位数直接除以10,余数就是个位数。
  • 取出十位数就是先用三位数除上一个10,将三位数的个位舍掉,变成一个两位数,此时再对10求余,就求出了个位数。
  • 取出百位数就是直接让三位数除以100,自动约去小数部分,就取出了百位数。
  • 4,更改IDEA编码界面背景

    先打开File栏目,点击Settings打开设置

    在这里插入图片描述

    再点击Appearance,在Theme中来选择背景主体是白色还是黑色(这里建议改成黑的,比较护眼)

    在这里插入图片描述

    接着继续在Appearance中下滑,在Background image中可以选择本地的图片来作为IDEA编码背景板的图片(可以是跑车之类的,激励我们学习!)

    在这里插入图片描述

    结语💕💕

    这些代码的关键在于适应C和Java的不同,同时储备一些写代码的逻辑,🥳🥳大家都学废了吗?完结撒花~ 🎉🎉🎉

    在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值