商道如狼道 发表于 2025-3-21 04:30:32

蓝桥杯 Java 之输入输出

一、输入输出方式:Scanner vs BufferedReader
Scanner类



[*]简介:Scanner 是 Java 中一个非常方便的用于读取用户输入的类,它可以从多种输入源(如标准输入、文件等)读取基本数据类型和字符串。
1. Scanner的细节与利用场景
适用场景:小规模输入、简朴测试、需要快速开发的场景。
核心方法:
   nextInt():读取整数(以空格/回车分隔)。
nextDouble():读取双精度浮点数。
nextLine():读取整行(大概因前序输入残留换行符导致问题)。
陷阱示例:
   Scanner sc = new Scanner(System.in);
int a = sc.nextInt();      // 输入后按回车
String s = sc.nextLine();  // 这里会读取到残留的换行符,导致s为空!
解决方法:在nextInt()后添加sc.nextLine()清空缓冲区。
import java.util.Scanner;

public class ScannerExample {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        // 读取整数

        int num = scanner.nextInt();

        // 读取字符串

        String str = scanner.nextLine();

        System.out.println("输入的整数是: " + num);

        System.out.println("输入的字符串是: " + str);

        scanner.close();

    }

}


[*]优点:利用简朴,提供了丰富的方法来读取差别类型的数据,如 nextInt()、nextDouble()、nextLine() 等。
[*]缺点:读取服从相对较低,尤其是在处理处罚大量输入时。

BufferedReader类




[*]简介:BufferedReader 是一个字符缓冲输入流,它可以高效地读取字符数据。通常与 InputStreamReader 联合利用,将字节流转换为字符流。
[*]利用示例:
import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;



public class BufferedReaderExample {

    public static void main(String[] args) throws IOException {

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        // 读取一行字符串

        String line = reader.readLine();

        // 将字符串转换为整数

        int num = Integer.parseInt(line);

        System.out.println("输入的整数是: " + num);

        reader.close();

    }

}


[*]优点:读取服从高,适合处理处罚大量输入。
[*]缺点:利用相对复杂,需要手动处理处罚异常,且只能读取字符串,需要手动进行数据类型转换。
BufferedReader的高效原理
性能优势:通过缓冲减少底层IO操纵次数,适合大规模数据输入(如蓝桥杯中的1e5量级)。
常用代码模板:
   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine();               // 读取整行
String[] parts = line.split(" ");          // 按空格分割
int a = Integer.parseInt(parts);        // 转换为整数
多行输入处理处罚:
   while ((line = br.readLine()) != null) {   // 处理处罚到输入结束
    // 处理处罚每一行
}
3. 选择建议
比赛场景:优先利用BufferedReader,尤其当标题输入规模大时(如蓝桥杯填空题大概不卡时间,但编程题会)。
调试场景:可用Scanner快速验证逻辑。
二、数据类型

Java 是一种强类型语言,全部变量都必须先声明其数据类型。常见的数据类型可以分为两类:基本数据类型和引用数据类型。
基本数据类型



[*]整数类型:byte(8 位)、short(16 位)、int(32 位)、long(64 位)。
[*]浮点类型:float(32 位)、double(64 位)。
[*]字符类型:char(16 位)。
[*]布尔类型:boolean(true 或 false)。
2. 运算符的隐藏陷阱
整数除法:5 / 2 = 2,若需要小数效果,需逼迫类型转换:
double res = (double)5 / 2;  // 2.5
浮点数比力:避免直接利用==,需用误差判断:
double a = 0.1 + 0.2;
if (Math.abs(a - 0.3) < 1e-6) { ... }
自增运算符:i++与++i的区别(前者先取值后自增)。
引用数据类型



[*]类:如 String、Date 等。
[*]接口。
[*]数组。
三、 运算符

Java 中的运算符可以分为以下几类:
算术运算符




[*]+(加法)、-(减法)、*(乘法)、/(除法)、%(取模)。
赋值运算符




[*]=(赋值)、+=、-=、*=、/=、%= 等。
比力运算符




[*]==(相等)、!=(不相等)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)。
逻辑运算符




[*]&&(逻辑与)、||(逻辑或)、!(逻辑非)。
四、 练习:A+B 问题(多种输入方式)

利用 Scanner

import java.util.Scanner;



public class APlusBWithScanner {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        int a = scanner.nextInt();

        int b = scanner.nextInt();

        int sum = a + b;

        System.out.println(sum);

        scanner.close();

    }

} 利用 BufferedReader
import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;



public class APlusBWithBufferedReader {

    public static void main(String[] args) throws IOException {

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        String[] input = reader.readLine().split(" ");

        int a = Integer.parseInt(input);

        int b = Integer.parseInt(input);

        int sum = a + b;

        System.out.println(sum);

        reader.close();

    }

}
[*]练习:计算圆的面积(保留小数)
import java.text.DecimalFormat;

import java.util.Scanner;



public class CircleArea {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        double radius = scanner.nextDouble();

        double area = Math.PI * radius * radius;

        // 保留两位小数

        DecimalFormat df = new DecimalFormat("#.00");

        System.out.println(df.format(area));

        scanner.close();

    }

}
五、 比赛时常错误的点

输入输出方面




[*]Scanner 读取问题:nextLine() 方法会读取换行符,如果在 nextInt() 等方法后利用 nextLine(),大概会读取到上一次输入的换行符,导致效果不符合预期。可以在 nextInt() 后再调用一次 nextLine() 来斲丧换行符。
[*]BufferedReader 异常处理处罚:利用 BufferedReader 时需要处理处罚 IOException,如果忘记处理处罚会导致编译错误。
[*]输出格式:比赛中对输出格式要求严酷,如是否需要换行、保留几位小数等,肯定要按照标题要求输出。
数据类型方面




[*]数据溢出:利用整数类型时,如果数据超出了该类型的取值范围,会导致数据溢出,效果大概不符合预期。可以利用更大范围的数据类型,如 long。
[*]浮点精度问题:float 和 double 类型在进行准确计算时大概会出现精度问题,如比力两个浮点数是否相等时,不能直接利用 ==,可以利用一个很小的误差范围来判断。
运算符方面




[*]运算符优先级:差别运算符的优先级差别,大概会导致计算效果不符合预期。可以利用括号来明白运算次序。
四、比赛高频错误点与避坑指南
1. 输入输出类错误
未处理处罚多组输入:标题大概未明白阐明输入组数,需用while循环读取。

未关闭流(BufferedReader):固然蓝桥杯大概不扣分,但现实开发中需调用br.close()。

输入次序错误:如标题要求先输入字符串后输入数字,次序不可颠倒。

2. 数据溢出问题
int溢出:计算中心效果大概超出int范围,需改用long。
// 错误:1e9 * 3 = 3e9,超过int范围(2e9)
int a = 1000000000;
int b = a * 3;  // 溢出为负数!

// 正确:
long b = (long)a * 3;
3. 浮点数精度陷阱
累加误差:多次浮点运算大概导致误差累积,需用BigDecimal。
BigDecimal sum = new BigDecimal("0");
sum = sum.add(new BigDecimal("0.1")); // 准确计算

4. 输出格式错误
未保留末端换行:部分标题要求输出后换行,需用println而非print。

多余空格:如输出应为1 2,误写为1 2(多空格)。
五、比赛本事与知识扩展
1. 快速输入模板(比赛常用)
import java.io.*;

import java.util.*;



public class Main {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        StringTokenizer st = new StringTokenizer(br.readLine());

        int a = Integer.parseInt(st.nextToken());

        int b = Integer.parseInt(st.nextToken());

        System.out.println(a + b);

    }

} 2. 位运算加速本事
快速判断奇偶:(n & 1) == 1。

交换两数:a ^= b; b ^= a; a ^= b;(无需临时变量)。

3. 大数处理处罚
BigInteger:处理处罚超过long范围的整数。

BigDecimal:高精度浮点运算(如金融计算)。
六、总结与备赛建议
核心要点:

输入输出:优先掌握BufferedReader,理解其高效原理。

数据类型:鉴戒溢出和精度问题,必要时利用long或BigDecimal。

运算符:留意整数除法与浮点运算的差别。

备赛策略:

逐日一练:至少完成5道基础题,强化输入输出和数据类型处理处罚。

模拟比赛情况:利用在线判题系统(如蓝桥杯题库)熟悉时间压力。

错题复盘:记录每次练习中的错误,总结高频陷阱。

如果该文章对你有帮助,麻烦给个关注吧!




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 蓝桥杯 Java 之输入输出