蓝桥杯java基础

2. A+B问题II

时间限制:1.000S  空间限制:32MB

题目描述

计算a+b,但输入方式有所改变。

输入描述

第一行是一个整数N,表示后面会有N行a和b,通过空格隔开。

输出描述

对于输入的每对a和b,你需要在相应的行输出a、b的和。

如第二对a和b,对应的和也输出在第二行。

输入示例
2
2 4
9 21
输出示例
6
30
提示信息

注意,测试数据不仅仅一组。也就是说,会持续输入N以及后面的a和b

本节课会学习到下面知识:

  • for循环
  • while循环
  • 自增和自减
  • do while循环
  • 包装类型
  • 自动装箱和自动拆箱
  • 数据类型转换

题目分析

本题仍然是计算a+b,但是我们要通过输入一个整数n来控制输入a,b的次数。

⚠️ 题目 「提示」这里说明了,一组数据包括一个整数n和n行a和b, 但测试数据不仅仅一组,也就是说会有多个n的输入,直到人为终止。

既然是持续性的输入,说明在循环做输入n这个操作,那我们就需要使用到上一节中使用的while

连续输入n的代码如下:

// 多组数据,需要处理多次,使用while循环解决
while(sc.hasNext()) {}

for循环

当输入n之后,表示后面会有N行a和b的输入,while代表了循环,那怎么控制循环次数呢?

我们只想让这个循环执行n次,然后自动退出循环,那应该对n进行怎样的操作呢?

现实中,我们想要把一件事情做n次,比如数n只羊,就是说第一只羊,第二只羊,第n只羊,这样数,那在编程中是同样的逻辑,只不过这次我们使用的是for循环

for语句的语法格式是:

for(初始化语句;条件判断;操作) {// 代码块
}

初次接触,或许不是很好理解,让我们使用计数的例子来类比,假设我们从1数到100

  • 初始化语句:我们计数通常从1开始,也就是说,我们最开始初始化了一个值1
  • 条件:判断值是否小于100,如果小于100,说明我们还没有计数完,需要继续计数,如果等于100,说明已经计数完毕,则结束计数
  • 操作:如果本次计数值小于100,将值加1
  • 重复步骤二,再次判断值是否小于100
  • 重复步骤三,计数值再加1

根据上面的表述,我们可以将之转换为for语言的逻辑

for(初始化值为1;判断是否小于100;计数值+1) {// 循环体代码
}

不过编程中初始化值一般都是从0开始,所以想要将循环体执行n次,Java的代码如下:

// int i = 0表示初始化值为0
// i < n用于判断,从0到n-1, 代码执行了n次,当i = n时退出循环
// i++表示i的值加1
for(int i = 0; i < n; i++) {}

每次循环,都需要接收输入的a和b,并根据a和b计算出结果,这个代码和上一题的类似,就不再赘述,代码如下:

for(int i = 0; i < n; i++) {int a = scanner.nextInt();int b = scanner.nextInt();System.out.println(a + b);
}

我们再来看一遍代码的执行流程:

  • 初始化语句int i = 0, 循环开始时会执行一次初始化语句,这里表示初始化一个变量的值为0
  • 条件判断i < n, 执行完初始化语句之后会进行条件判断,这里将i当前的值和n进行对比,想要让循环代码体执行n次,所需要计数的次数应该是0~n-1, 当还没有数到n时,则执行循环体的代码,当数到n时,n < n显然是错误的,就退出了循环,循环终止。
  • 当还没有数到n的时候,也就是i < n的条件为真,执行循环体,循环体的含义是输入a和b并输出两者的和
  • 循环体执行结束后,会执行i++, 表示当前的i值不符合条件,让变量i的值加1,进行下一轮判断
  • 重复步骤二、步骤三和步骤四

完整的代码如下:

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);while (scanner.hasNext()) {int n = scanner.nextInt();for(int i = 0; i < n; i++) {int a = scanner.nextInt();int b = scanner.nextInt();System.out.println(a + b);}}}
}

++和--

刚才我们使用了i++表示计数值i的数值+1,实际上除了i++,还有++i,它们之间有什么区别呢?

  • ++i 是前缀自增运算符,所谓前缀自增是指,它会先将变量增加 1,然后返回增加后的值,再将返回增加后的值参与别的运算

比如下面的代码

int i = 99;
int result = ++i;

result的值是99还是100呢?答案是100。

++i会先从原来的99自增加到100,然后将增加后的值赋值给变量result,所以result的值就是100

  • i++ 是后缀自增运算符,它会先返回变量的当前值,然后再将变量增加 1。
int i = 99;
int result = i++;

这里result的值就是99了,它会先将i原来的值赋值给result, 所以result的值就是99, 然后i再执行自增操作,i的值增加为100。

总结来说,就是++ii++的执行顺序不一样,前者是先自增后运算,后者是先运算后自增, 如果你想在表达式中使用变量的递增后的值,你可以使用 ++i。如果你想在表达式中使用变量的当前值,然后再将其递增,你可以使用 i++

除了自增之外,Java还提供递减的运算,i----i , 都是用来减少一个整数变量的值的操作, 它们之间的区别和递增一样,前自减会在修改变量的值后返回修改后的值,而后自减会在返回变量的当前值后再进行减少操作。

int i = 100;
int result = --i; // i 先减少为 99,然后赋值给 result
// 现在 i = 99, result = 99
int i = 100;
int result = i--; // 先赋值给 result,然后 i 减少为 99
// 现在 i = 99, result = 100

while循环重讲

刚才我们使用了for循环来解决问题,既然是循环,那能不能仍使用while循环来解决呢?

我们先来回顾上一节中学到的while基本语法:

while(条件) {// 当条件为真时,就会一直执行
}

与上面的for循环对比就会发现,while只有条件判断,而没有初始化语句和操作语句,所以要在while结构之外进行书写。

所以按照for循环的逻辑,我们可以这样写代码:

while (scanner.hasNext()) {int n = scanner.nextInt();int i = 0;while(i < n) {int a = scanner.nextInt();int b = scanner.nextInt();System.out.println(a + b)i++;}
}

这样这个循环才算是完整的,但是这样做引入了无关变量i, 又加了一个循环控制语句,有没有简化的办法呢?

由于我们先定义了变量n, 在输入N的时候,已经为这个变量n赋值了,相当于循环的次数已经被初始化了,想要让代码执行n次,我们可以“倒着数”,从n数到1,每次让n-1, 当n为0的时候退出循环,这样代码也执行了n次。

⚠️ 注意:Java中不允许将数字当作布尔值使用。

使用while的代码如下:

while (n-- > 0) {int a = scanner.nextInt();int b = scanner.nextInt();System.out.println(a + b)
}

想一想,为什么是n--,而不是--n呢?

如果是while(--n),则计算n的值,再进行条件判断,此时n的值已经是n-1了,从n-1到1, 循环只执行了n-1次,而如果是while(n--) 可以控制这个循环只执行n次,当n为0的时候就终止了。

完整的代码如下:

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);while (scanner.hasNext()) {int n = scanner.nextInt();while (n-- > 0) {int a = scanner.nextInt();int b = scanner.nextInt();System.out.println(a + b);}}}
}

延伸

do while

其实除了for循环while循环之外,还有一种循环结构,叫做do while, 它和 while 循环有些类似, 不过while循环要更常用一些,它的使用方法如下:

do {// 循环体(代码块)
} while (条件判断);

do while循环会先去执行循环体内的代码块,然后再检查条件判断,如果条件判断为真,则继续执行下一次循环迭代;如果 条件判断为假,则终止循环,这意味着,无论条件的值如何,我们都至少执行一次循环。

int sum = 0;
int i = 11;
// 先去执行一次循环体中的代码,再去判断条件要不要执行
do {sum = sum + i; // 将 sum + i的值赋值给sumi++;      // i的值自增
} while (i <= 10);

在这个例子中,虽然不满足于i < =10的条件,但是仍然会执行一次循环体中的代码。

包装类型

上一节中,我们讲到几种基本数据类型,但是基本数据类型本身不是对象,因此Java内部将这些基础数据类型用“类”的形式包装起来,形成“包装类”,这些包装类内部提供了很多的方法方便我们使用,并且可以执行与对象有关的操作,下面就是常见的基本数据类型和其对应的包装类。

  • Integer: 包装int类型。

  • Long: 包装long类型。

  • Short: 包装short类型。

  • Byte: 包装byte类型。

  • Double: 包装double类型。

  • Float: 包装float类型.

  • Character: 包装char类型。

  • Boolean: 包装boolean类型。

可以看到大多数包装类型只是将数据类型的首字母大写(类的首字母必须大写),可以简单理解包装类型就是在“基本数据”类型外面包装了一层,使其变成了对象,并在上面增加了一点功能而已。

自动装箱和自动拆箱

而自动装箱和自动拆箱则是基本数据类型和对应的包装类型之间转换的一种应用,其实这个名称很形象,我们不是在“基本数据类型”上包装了一层形成“包装类”嘛,这个过程就叫自动装箱,而自动拆箱是把这个“包装”给拆掉,将包装类型对象转为对应的基本数据类型。

比如下面的示例:

int age = 10; // 基本数据类型10
Integer boxedAge = age; // Integer boxedAge声明了一个包装对象,直接将10赋予这个对象,系统会帮我们将 10 装箱后放入到 boxedAge

同样的:boxedAge是一个Integer对象,而age是一个基本数据类型的int类型,可以直接赋值,系统会我们自动拆箱。

Integer boxedAge = 10;
int age = boxedAge;

数据类型转换

我们已经知道,byte、short、int、long等几种数据类型都是整数类型,只不过能表示的范围不同,就好像都是瓶子,只不过容量的大小有差距,就像小容量的瓶子里的水可以倒入大容量的瓶子一样,当容量小的数据类型的变量与容量大的数据类型的变量做运算时,结果自动提升为容量大的数据类型,这也被称之为自动类型转换

byte b = 10;
short s = b; //byte可以转为short类型
int i = b; // byte可以转为 int类型
long l = b; // byte可以转为 long类型

不过大容量的瓶子却无法将全部的水都倒入小容量的瓶子,如果非要倒入,就必须使用到强制类型转换。强制类型转换需要使用强制类型转换运算符(圆括号中包含目标数据类型)来明确指定数据类型转换,不过这种做法可能会是的数据丢失精度。

int i = 100;
byte b = (byte)i; // 将 int类型的 i 转为 byte类型
System.out.println(b); //输出结果为100

总结

我们这节学习到了三种循环结构,分别是for/while/do-while,知道了for循环的执行流程以及对while循环有了更多认识,此外我们还学习到了++ii++的区别,不必纠结于使用哪个,只需要知道两者之间的区别,在具体的场景下你会根据它们之间的区别来选择合适的进行使用的。

 java代码实现:

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in); // 创建一个Scanner对象来读取输入while (sc.hasNext()) { // 循环读取输入直到没有下一个输入int n = sc.nextInt(); // 读取一个整数nfor (int i = 0; i < n; i++) { // 循环n次int a = sc.nextInt(); // 读取一个整数aint b = sc.nextInt(); // 读取一个整数bSystem.out.println(a + b); // 输出a和b的和}}}
}

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

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

相关文章

openssl快速生成自签名证书

系统&#xff1a;Centos 7.6 确保已安装openssl openssl version生成私钥文件 private.key &#xff08;文件名自定义&#xff09; openssl genpkey -algorithm RSA -out private.key -pkeyopt rsa_keygen_bits:2048-out private.key&#xff1a;生成的私钥文件-algorithm RS…

探索设计模式的魅力:工厂方法模式

工厂方法模式是一种创建型设计模式&#xff0c;它提供了一种创建对象的接口&#xff0c;但将具体实例化对象的工作推迟到子类中完成。这样做的目的是创建对象时不用依赖于具体的类&#xff0c;而是依赖于抽象&#xff0c;这提高了系统的灵活性和可扩展性。 以下是工厂方法模式的…

MySQL 8.0中移除的功能(二)

PROCEDURE ANALYSE()​ 语法已被移除。客户端的 ​--ssl​ 和 ​--ssl-verify-server-cert​ 选项已被移除。使用 ​--ssl-modeREQUIRED​ 代替 ​--ssl1​ 或 ​--enable-ssl​。使用 ​--ssl-modeDISABLED​ 代替 ​--ssl0​、​--skip-ssl​ 或 ​--disable-ssl​。使用 ​-…

chatgpt的基本技术及其原理

ChatGPT是一种基于生成式预训练的语言模型&#xff0c;它的基本技术包括预训练和微调。下面我将为你解释这些技术及其原理。 1. 预训练&#xff08;Pre-training&#xff09;: ChatGPT的预训练阶段是在大规模的文本数据上进行的。模型通过对大量的互联网文本进行自监督学习来学…

学习视频一些杂乱的东西

文章目录 ref获取dom元素监听深层的某个属性? 可选链操作符 和 ?? 双问号表达式v-slot 语法糖作用域插槽动态插槽 初始化数组骚操作数字滚动 -> gsapstyle妙招新奇的原型链 object.createB站笔记链接JS相关设计模式ajaxsvgvue3scsswebpack内存泄漏 ref获取dom元素 直接给…

基于深度学习的实例分割的Web应用

基于深度学习的实例分割的Web应用 1. 项目简介1.1 模型部署1.2 Web应用 2. Web前端开发3. Web后端开发4. 总结 1. 项目简介 这是一个基于深度学习的实例分割Web应用的项目介绍。该项目使用PaddlePaddle框架&#xff0c;并以PaddleSeg训练的图像分割模型为例。 1.1 模型部署 …

【iOS】数据存储方式总结(持久化)沙盒结构

在iOS开发中&#xff0c;我们经常性地需要存储一些状态和数据&#xff0c;比如用户对于App的相关设置、需要在本地缓存的数据等等&#xff0c;本篇文章将介绍六个主要的数据存储方式 iOS中数据存储方式&#xff08;数据持久化&#xff09; 根据要存储的数据大小、存储数据以及…

案例:应用内字体大小调节

文章目录 介绍相关概念完整实例 代码结构解读保存默认大小获取字体大小修改字体大小 介绍 本篇Codelab将介绍如何使用基础组件Slider&#xff0c;通过拖动滑块调节应用内字体大小。要求完成以下功能&#xff1a; 实现两个页面的UX&#xff1a;主页面和字体大小调节页面。拖动…

算法训练营第34天|● 1005.K次取反后最大化的数组和 ● 134. 加油站● 135. 分发糖果

文档讲解&#xff1a;代码随想录 (programmercarl.com) 视频讲解&#xff1a;代码随想录的个人空间-代码随想录个人主页-哔哩哔哩视频 (bilibili.com) LeetCode 1005.K次取反后最大化的数组和 题目链接&#xff1a;1005. K 次取反后最大化的数组和 - 力扣&#xff08;LeetCode…

基于物联网设计的智能储物柜(4G+华为云IOT+微信小程序)

一、项目介绍 在游乐场、商场、景区等人流量较大的地方&#xff0c;往往存在用户需要临时存放物品的情况&#xff0c;例如行李箱、外套、购物袋等。为了满足用户的储物需求&#xff0c;并提供更加便捷的服务体验&#xff0c;当前设计了一款物联网智能储物柜。 该智能储物柜通…

git提交报错:remote: Please remove the file from history and try again.

1. 报错信息 remote: error: File: fba7046b22fd74b77425aa3e4eae0ea992d44998 500.28 MB, exceeds 100.00 MB. remote: Please remove the file from history and try again. git rev-list --objects --all | grep fba7046b22fd74b77425aa3e4eae0ea992d44998 2. 分析原因 e…

打架识别摄像机

随着社会治安问题的增加&#xff0c;打架事件在公共场所频繁发生&#xff0c;给社会治安带来了一定程度的威胁。因此&#xff0c;为了提高公共场所的安全性&#xff0c;可以利用现代科技&#xff0c;如人工智能和摄像技术&#xff0c;开发一种打架识别摄像机。 这种摄像机可以通…

基于 IDEA 进行 Maven 工程构建

一、构建概念和构建过程 项目构建是指将源代码、依赖库和资源文件等转换成可执行或可部署的应用程序的过程&#xff0c;在这个过程中包括编译源代码、链接依赖库、打包和部署等多个步骤。 项目构建是软件开发过程中至关重要的一部分&#xff0c;它能够大大提高软件开发效率&…

【Docker】CentOS stream 上安装 Docker 环境详细指南

文章目录 1. 定义2. 优势3. 安装1&#xff09;Linux 上安装&#xff08;强烈推荐&#xff09;2&#xff09;Windows 和 MAC 上安装 4. 验证1&#xff09;查看版本2&#xff09;运行 Hello World 总结 Docker 是一种轻量级的容器化技术&#xff0c;提供了一种在不同环境中快速、…

Maven普通工程和web工程创建

文章目录 创建项目前设置maven工程前设置工作创建项目前--》设置utf-8配置maven参数Maven普通工程和web工程创建Maven简单工程第一步&#xff1a;File–New–Project 第二步&#xff1a;选择maven然后下一步&#xff1a;填写后询选择finish初始化maven工程目录简介maven简单工程…

vue3 | 自定义遮罩层组件

组件模板 <template><Teleport to"body" :disabled"!appendToBody"><div v-bind"$attrs" v-show"modelValue" class"maskLayer-overlay" :style"{ background }"><div class"maskLaye…

python中字符串常用的操作

在Python中&#xff0c;字符串是一种不可变的序列类型&#xff0c;它支持许多常用的操作。以下是一些常见的字符串操作&#xff1a; 字符串拼接&#xff1a; 使用 运算符可以将两个字符串拼接在一起。 str1 "Hello" str2 "World" result str1 "…

Rust-借用检查

Rust语言的核心特点是&#xff1a;在没有放弃对内存的直接控制力的情况下&#xff0c;实现了内存安全。 所谓对内存的直接控制能力&#xff0c;前文已经有所展示&#xff1a;可以自行决定内存布局&#xff0c;包括在栈上分配内存&#xff0c;还是在堆上分配内存&#xff1b;支…

使用vue快速开发一个带弹窗的Chrome插件

vue-chrome-extension-quickstart 说在前面 &#x1f388;平时我们使用Chrome插件通常都只是用来编写简单的js注入脚本&#xff0c;大家有没有遇到过需要插件在页面上注入一个弹窗呢&#xff1f;比如我们希望可以通过快捷键快速唤起ChatGPT面板或者快速唤起一个翻译面板&#x…

使用 Jaxb xml转JavaBean

1、什么是JAXB JAXB&#xff08;Java Architecture for XML Binding) 是一个业界的标准&#xff0c;是用于 XML 绑定的 Java 体系结构&#xff08;JAXB&#xff09;是允许将 Java 类映射到 XML 表示形式的软件框架。 JAXB 支持将 Java 对象编组为 XML&#xff0c;然后将 XML 解…