Java —— 程序逻辑控制

news2024/11/18 6:19:59

目录

1. 顺序结构

2. 分支结构

2.1 if 语句

2.1.1 语法格式1

2.1.2 语法格式2

2.1.3 语法格式3

2.2 switch 语句

3. 循环结构

3.1 while循环

3.2 break与continue

3.3 for循环

4. 输入输出

4.1 输出到控制台

格式化字符串

4.2 从键盘输入

5. 练习


和C语言类似地, Java的程序逻辑控制也分为 顺序结构, 分支结构, 循环结构.

1. 顺序结构

顺序结构即 按照代码书写的顺序一行一行执行.

System.out.println("aaa");
System.out.println("bbb");
System.out.println("ccc");
运行结果:
aaa
bbb
ccc

如果调整代码的书写顺序, 则执行顺序也发生变化.

System.out.println("aaa");
System.out.println("ccc");
System.out.println("bbb");
运行结果:
aaa
ccc
bbb

2. 分支结构

2.1 if 语句

2.1.1 语法格式1

if (布尔表达式) {
    // 语句 
}

如果布尔表达式结果为true,执行if中的语句,否则不执行。

2.1.2 语法格式2

if (布尔表达式) {
    // 语句1
} else {
    // 语句2
}

如果布尔表达式结果为true,则执行if中语句,否则执行else中语句。

2.1.3 语法格式3

if (布尔表达式1) {
    // 语句1
} else if(布尔表达式2) {
    // 语句2
} else {
    // 语句3
}

表达式1成立,执行语句1,否则表达式2成立,执行语句2,否则执行语句3.

2.2 switch 语句

在C语言中也有了解过switch的有关语法, 那么在Java中switch的使用也是几乎一样的.
int a = 2;
switch (a) {
    case 2:
        System.out.println("two");
        break;
    case 1:
        System.out.println("one");
        break;
    default:
        System.out.println("没有匹配!");
        break;
}

执行流程:

1. 先计算switch后()中表达式的值

2. 和case依次比较,一旦有响应的匹配就执行该项下的语句,直到遇到break时结束

3. 当表达式的值没有与所列项匹配时,执行default

【注意事项】

  • 多个case后的常量值不可以重复
  • switch的括号内只能是以下类型的表达式:
    • 基本类型:byte、char、short、int,注意不能是long类型
    • 引用类型:String常量串、枚举类型
    • 不可以是long, float, double, boolean
  • break 不要遗漏, 否则会失去 "多分支选择" 的效果
int day = 1;
switch(day) {
    case 1:
        System.out.println("星期一");
        // break;
    case 2:
        System.out.println("星期二");
        break;
}
运行结果:
星期一
星期二
  • switch 不能表达复杂的条件
// 例如: 如果 num 的值在 10 到 20 之间, 就打印 hehe
// 这样的代码使用 if 很容易表达, 但是使用 switch 就无法表示.
if (num > 10 && num < 20) {
    System.out.println("hehe");    
}
  • switch 虽然支持嵌套, 但是很丑,一般不推荐~

3. 循环结构

Java中的循环结构和C语言一样, 也是三个.
for, while, do while.
从使用频率上, while会比for循环使用的更多一点.

3.1 while循环

//语法格式:
while(布尔表达式){
    //..
}
// 打印1-10之间的所有数字, 并求和
int i = 1;
int sum = 0;
while (i <= 10) {
    sum += i;
    i++;
}
System.out.println(sum);
//1-100的和
//1-100的奇数和
//1-100的偶数和
int i = 1;
int sum = 0;
int sumOdd = 0;
int sumEve = 0;
while (i <= 100) {
    if (i % 2 == 0) {
        sumEve += i;
    } else {
        sumOdd += i;
    }
    sum += i;
    i++;
}
System.out.println(sum);
System.out.println(sumOdd);
System.out.println(sumEve);
//计算5的阶乘
int i = 1;
int ret = 1;
while (i <= 5) {
    ret *= i;
    i++;
}
System.out.println(ret);
//计算 1! + 2! + 3! + 4! + 5!
int ret2 = 0;
int n = 1;
while (n <= 5) {
    int i = 1;
    int ret = 1;
    while (i <= n) {
        ret *= i;
        i++;
    }
    ret2 += ret;
    n++;
}
System.out.println(ret2);
//死循环
int a = 1;
while (true) {
    System.out.println("fasfa");
}

3.2 break与continue

break: 直接跳出循环, 即结束循环.
continue: 结束 本趟循环.
//找到1-100之间
//既能被3整除, 又能被5整除的所有数字.
int i = 1;
while (i <= 100) {
    if (i % 15 != 0) {
        i++;
        continue;
    }
    System.out.println(i);
    i++;
}

3.3 for循环

//基本语法
for(表达式①;布尔表达式②;表达式③){
    表达式④;
}
  • 表达式1: 用于初始化循环变量初始值设置,在循环最开始时执行,且只执行一次
  • 表达式2: 循环条件,满则循环继续,否则循环结束
  • 表达式3: 循环变量更新方式
//1. 打印 1 - 10 的数字
for (int i = 1; i <= 10; i++) {
    System.out.println(i);
}
//2. 计算 1 - 100 的和
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}
System.out.println("sum = " + sum);
执行结果:
5050
//3. 计算 5 的阶乘
int result = 1;
for (int i = 1; i <= 5; i++) {
    result *= i;
}
System.out.println("result = " + result);
//4. 计算 1! + 2! + 3! + 4! + 5!
int sum = 0;
for (int i = 1; i <= 5; i++) {
    int tmp = 1;
    for (int j = 1; j <= i; j++) {
        tmp *= j;
    }
    sum += tmp;
}
System.out.println("sum = " + sum);

4. 输入输出

接下来我们来介绍一下Java中的输入输出.
这一部分并不算特别重要, 但是在后续写代码的过程中有可能会用到.

4.1 输出到控制台

有三种方式:

System.out.println(msg); // 输出一个字符串, 带换行
System.out.print(msg); // 输出一个字符串, 不带换行
System.out.printf(format, msg); // 格式化输出
  • println 输出的内容自带 \n, print 不带 \n
  • printf 的格式化输出方式和 C 语言的 printf 是基本一致的.

格式化字符串

转换符

类型

举例

d

十进制整数

("%d", 100)

100

x

十六进制整数

("%x", 100)

64

o

八进制整数

("%o", 100)

144

f

定点浮点数

("%f", 100f)

100.000000

e

指数浮点数

("%e", 100f)

1.000000e+02

g

通用浮点数

("%g", 100f)

100.000

a

十六进制浮点数

("%a", 100)

0x1.9p6

s

字符串

("%s", 100)

100

c

字符

("%c", ‘1’)

1

b

布尔值

("%b", 100)

true

h

散列码

("%h", 100)

64

%

百分号

("%.2f%%", 2/7f)

0.29%

4.2 从键盘输入

在我们找工作的笔试过程中经常会需要我们自己来处理输入输出.

Java中的输入需要工具类Scanner, 也就是要导入util包java.util.Scanner

import java.util.Scanner; // 需要导入 util 包

类比代码int a = 10;通过类型定义变量.

Scanner scan = new Scanner(System.in);
System.in意为从键盘获取输入值.

那么接下来我们就可以通过scan这个变量通过.找到这里面要用的方法.

//比如
int age = sc.nextInt();

此时代码执行就会要求读一个整数.


完整代码如下:

public class Test {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.println("输入你的年龄:");
        int age = scan.nextInt();
        System.out.println("年龄:" + age);

        sc.close(); // 注意, 要记得调用关闭方法
    }
}


使用 Scanner 循环读取 N 个数字,并求取其平均值

Scanner sc = new Scanner(System.in);
int sum = 0;
int num = 0;
while (sc.hasNextInt()) {
    int tmp = sc.nextInt();
    sum += tmp;
    num++;
}
System.out.println("sum = " + sum);
System.out.println("avg = " + sum / num);
sc.close();
执行结果:
10
40.0
50.5
^Z
sum = 150.5
avg = 30.1

注意事项: 当循环输入多个数据的时候, 使用 ctrl + z 来结束输入 (Windows 上使用 ctrl + z, Linux / Mac 上使用 ctrl+ d).

5. 练习

1. 求一个整数,在内存当中存储时,二进制1的个数。

让该整数的每一位和1进行按位与操作, 而要让每一位都能和1按位与, 只需使用右移操作符即可.

int n = -1;
int count = 0;
for (int i = 0; i < 32; i++) {
    if (((n >> i) & 1) != 0) {
        count++;
    }
}
System.out.println(count);
注意: 按照以上代码完成题目, 会有一个小问题.
不管是什么数字, 都得移动31次.
从这个角度来看, 是没有必要的. 比如判断数字1它本身的二进制位1的个数, 在第一位按位与, 接下来右移之后, 会发现后面的都是0了, 就多了很多不必要的操作.
所以就有了第二种写法.
int n = -1;
int count = 0;
while (n != 0) {
    if ((n & 1) != 0) {
        count++;
    }
    n = n >>> 1;
}
System.out.println(count);
接下来还有一个在算法层次的对代码的优化.
int n = -1;
int count = 0;
while (n != 0) {
    n = n & (n - 1);//每次 & 时都会让二进制位少一个1
    count++;
}
System.out.println(count);

2. 计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值

1. 从上述表达式可以分析出: 该表达式主要由100项,基数项为正,偶数项为负
2. 设置一个循环从1~100,给出表达式中的每一项:1.0/i { 注意此处不能使用1,否则结果全部为0 }
然后使用flag标记控制奇偶项,奇数项为正,偶数项为负
然后将所有的项相加即可
double sum = 0.0;
int flg = 1;
for (int i = 1; i <= 100; i++) {
    sum = sum + 1.0 / i * flg;
    flg = -flg;   
}
System.out.println(sum);

3. 水仙花数: 求出0~999之间的所有“水仙花数”并输出。(“水仙花数”是指一个三位数,其各位数字的立方和确好等于该数本身,如: 153=1^3+5^3+3^3 ,则153是一个“水仙花数”。)

    public static void main(String[] args) {
        for (int i = 1; i <= 999999; i++) {
            // 1. 算是几位数 -> 使用 count 存储
            int count = 0;
            int tmp = i;    // 为了求 i 是几位数, 所以让 tmp 来辅助求位数, 而不用 i
            int sum = 0;
            while (tmp != 0) {
                tmp /= 10;
                count++;
            }
            //count里面就存储了当前数字i是几位数

            // 2. 求每一位数字是几
            // 3. 把每一位数字是几, 位数的次幂算出来, 求和
            tmp = i;
            while (tmp != 0) {
                sum += Math.pow(tmp % 10, count);
                tmp /= 10;
            }
            //sum就存储了和
            if (sum == i) {
                System.out.println(i);
            }
        }
    }

4. 打印 X 图形

多组输入,一个整数(2~20),表示输出的行数,也表示组成“X”的反斜线和正斜线的长度。针对每行输入,输出用“*”组成的X形图案。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        while(scan.hasNextInt()) {
            int n = scan.nextInt();
            for(int i = 0; i < n; i++) {
                for(int j = 0; j < n; j++) {
                    if ((i == j) || (i + j ==  n - 1)) {
                        System.out.print("*");
                    } else {
                        System.out.print(" ");
                    }
                }
                System.out.println();
            }
        }
    }
}

5. 乘法口诀表: 输出n*n的乘法口诀表,n由用户输入。

for (int i = 1; i <= 9; i++) {
    for (int j = 1; j <= i; j++) {
        System.out.print(i + "*" + j + "=" + i * j + " ");
    }
    System.out.println();
}

6. 输出一个整数的每一位,如:123的每一位是3,2,1

int n = 123;
while (n != 0) {
    System.out.println(n % 10);
    n /= 10;
}

7. 模拟登录: 编写代码模拟三次密码输入的场景。 最多能输入三次密码,密码正确,提示“登录成功”,密码错误, 可以重新输入,最多输入三次。三次均错,则提示退出程序

Scanner scanner = new Scanner(System.in);
int count = 3;
while (count != 0) {
    System.out.println("请输入你的密码,共有" + count + "次机会!");
    String pass = scanner.nextLine();
    //if(pass == "123") {//equals
    if (pass.equals("123")) {//equals
        System.out.println("登录成功!");
        break;
    } else {
        System.out.println("登录失败!");
    }
    count--;
}

8. 二进制序列: 获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列.

int n = 7;
for (int i = 31; i >= 1; i -= 2) {
    System.out.print(((n >> i) & 1) + " ");
}//偶数
System.out.println();
for (int i = 30; i >= 0; i -= 2) {
    System.out.print(((n >> i) & 1) + " ");
}

9. 判定一个数字是否是素数

int n = 9;
int i = 2;
for (; i < n; i++) {
    if (n % i == 0) {
        System.out.println("不是素数!");
        break;
    }
}
if (i == n) {
    System.out.println("是素数!");
}
一个大于 n/2 的因数必然会有一个小于或等于 n/2 的对应因数。这是因为这个因数可以表示为 n 的另一个因数和 n/2 的乘积,我们可以将 n 分为两个相等的部分,其中一部分是小于或等于 n/2 的因数的倍数
int n = 11;
int i = 2;
for (; i <= n / 2; i++) {
    if (n % i == 0) {
        System.out.println("不是素数!");
        break;
    }
}
if (i > n / 2) {
    System.out.println("是素数!");
}
int n = 11;
int i = 2;
for (; i <= Math.sqrt(n); i++) {
    if (n % i == 0) {
        System.out.println("不是素数!");
        break;
    }
}
if (i > Math.sqrt(n)) {
    System.out.println("是素数!");
}

10. 打印 1 - 100 之间所有的素数

for (int n = 1; n <= 100; n++) {
    int i = 2;
    for (; i <= Math.sqrt(n); i++) {
        if (n % i == 0) {
        break;
        }
    }
    if (i > Math.sqrt(n)) {
        System.out.println(n + "是素数!");
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1113041.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通讯协议学习之路:USB协议协议理论

通讯协议之路主要分为两部分&#xff0c;第一部分从理论上面讲解各类协议的通讯原理以及通讯格式&#xff0c;第二部分从具体运用上讲解各类通讯协议的具体应用方法。 后续文章会同时发表在个人博客(jason1016.club)、CSDN&#xff1b;视频会发布在bilibili(UID:399951374) 1、…

服务CPU异常飙高问题分析和解决

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是「奇点」&#xff0c;江湖人称 singularity。刚工作几年&#xff0c;想和大家一同进步&#x1f91d;&#x1f91d; 一位上进心十足的【Java ToB端大厂…

R语言提取文字(字符串)中的内容--正则式(1)

科学研究中有时候咱们收集到的数据很乱&#xff0c;不能马上进行分析&#xff0c;如SEER数据&#xff0c;用过都知道&#xff0c;咱们需要对数据进行清洗&#xff0c;从数据中提取咱们需要的东西&#xff0c;才能进行分析&#xff0c;这时候有个有用的东西叫正则式&#xff0c;…

中文编程工具开发语言编程案例:会员VIP管理系统软件实例

中文编程工具开发语言编程案例&#xff1a;会员VIP管理系统软件实例 中文编程工具开发语言编程案例&#xff1a;会员VIP管理系统软件实例。 软件功能&#xff1a; 1、系统设置&#xff1a;参数设定&#xff0c;账号及权限设置&#xff0c;系统初始化&#xff0c;卡类型设置&a…

通讯协议学习之路:IrDA协议协议理论

通讯协议之路主要分为两部分&#xff0c;第一部分从理论上面讲解各类协议的通讯原理以及通讯格式&#xff0c;第二部分从具体运用上讲解各类通讯协议的具体应用方法。 后续文章会同时发表在个人博客(jason1016.club)、CSDN&#xff1b;视频会发布在bilibili(UID:399951374) 序、…

Flutter的Invalid use of a private type in a public API警告

文章目录 问题描述有问题的源码 问题原因解决方法 问题描述 自己在写Flutter 应用时发现了一个Invalid use of a private type in a public API警告。 发现很多官方的例子也有这个问题。 有问题的源码 有问题的源码如下&#xff1a; class MyTabPage extends StatefulWid…

window系统如何管理多版本node

何时需要切换node版本 如果你正在维护一个旧项目&#xff0c;同时也在进行新项目&#xff0c;两个项目所依赖的node版本害不同&#xff0c;那么你可以就需要经常切换node版本。项目中可能依赖于某些npm包&#xff0c;而这些包对特定版本的Node有要求。需要满足这些要求以确保依…

UE4 UltrDynamicSky与场景物体进行交互

找到材质 找到其最父类的材质 把这个拖过去连上即可

Nvm管理NodeJs版本

文章目录 Nvm管理NodeJs版本一、前言1.简介2.环境 二、正文1.卸载NodeJs2.安装Nvm3.配置国内镜像4.Nvm使用5.其它1&#xff09;报错12&#xff09;报错2 Nvm管理NodeJs版本 一、前言 1.简介 Node Version Manager&#xff08;nvm&#xff09;可通过命令行快速安装和使用不同…

【数据库】拼接字段 使用别名

拼接字段 使用别名 e . g . e.g. e.g. Vendors 表包含供应商名和电话信息&#xff0c;name 和 mobile&#xff1b;需要输出这两个属性的值的组合作为供应商的基本信息组合。 SELECT concat(name, _, mobile) FROM Vendors; -- 语句通过 MySQL 环境下测试&#xff0c;其他 DBMS…

【CMN】Components组件汇总

CMN 700由各种类型的设备组成&#xff0c;包括路由器模块、CHI节点和网桥。所需要的组件取决于系统的需求&#xff0c;有些组件是可选的&#xff0c;或者只有在满足某些需求时才会使用。CMN 700可以集成到一个完整的SoC系统中&#xff0c;该系统还包括其他这里未描述到的设备。…

4.6 IPv6

思维导图&#xff1a; 4.6 IPv6 **IPv6简介** - IP 是互联网的核心协议。 - IPv4 是20世纪70年代末期设计的&#xff0c;到2011年2月其地址耗尽。 - 2014-2015年间&#xff0c;我国逐步停止向新用户分配IPv4地址&#xff0c;开始全面部署IPv6。 - IPv6 目的&#xff1a;解决I…

JDK安装后Path和java_home环境变量

1.Path环境变量 1.1Path环境变量用于记住程序路径&#xff0c;方便在命令行窗口的任意目录启动程序 举例&#xff1a;在命令行窗口的任意目录下启动QQ Path环境部变量的位置在&#xff1a;我的电脑->属性->高级系统设置->高级->环境变量 2.2Path环境变量的原理 …

(1)(1.7) GY-US42声纳

文章目录 前言 1 连接方式 2 参数说明 前言 GY-US042v2 声纳是一款非常便宜的短程&#xff08;最多 4m&#xff09;测距仪&#xff0c;主要设计用于室内&#xff0c;但也成功用于室外的 Copter。与许多气压计相比&#xff0c;它能更稳定地控制 4m 以下的高度。 1 连接方式…

《动手学深度学习 Pytorch版》 9.5 机器翻译与数据集

机器翻译&#xff08;machine translation&#xff09;指的是将序列从一种语言自动翻译成另一种语言&#xff0c;基于神经网络的方法通常被称为神经机器翻译&#xff08;neural machine translation&#xff09;。 import os import torch from d2l import torch as d2l9.5.1 …

【Linux】nginx基础篇 -- 介绍及yum安装nginx

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

1024程序节特辑:一文读懂小程序支付流程

小程序支付流程 概述前置准备登录流程调用wx.login()向微信服务器发送请求 支付流程调用wx.requestPayment()部分后台处理逻辑支付功能要求 支付流程面试题 主页传送门&#xff1a;&#x1f4c0; 传送 概述 小程序支付是由微信支付推出的一种便捷支付方式&#xff0c;通过扫码…

快速实现 RPC 微服务:使用 go-micro 从零开始

大家好&#xff0c;我是木川 本文将演示如何从 0 到 1 使用 go-micro 框架实现 RPC 微服务&#xff0c;包括服务端和客户端&#xff0c;客户端发送一个名字到服务端&#xff0c;服务端返回问候语。 一、创建项目 创建项目目录&#xff0c;使用 go mod 初始化 mkdir goexamples …

前端课后作业

2023.10.20 1、用列表实现如下效果 2、用表格实现如下效果 3、用表单实现如下效果 &#xff08;学到16集完成&#xff09;

阿里云10M带宽服务器价格、下载和上传速度限制说明

阿里云服务器10M带宽价格表年付85折&#xff0c;10M带宽一年优惠价5355元&#xff0c;10M带宽下载速度1280KB/秒&#xff0c;即1.25M/秒&#xff0c;阿腾云atengyun.com分享腾讯云服务器10M公网带宽优惠价格、流量价格、上传速度和下载速度限制&#xff1a; 目录 云服务器10M…