第04课:控制台输入输出
本课目标:掌握Java控制台输出(println、printf)和使用Scanner类进行用户输入。
一、概念讲解
1.1 输出方法
┌────────────────────────────────────────────┐ │ System.out 输出方法 │ ├────────────────────────────────────────────┤ │ println() - 输出后换行 │ │ print() - 输出后不换行 │ │ printf() - 格式化输出(C语言风格) │ └────────────────────────────────────────────┘1.2 输入流程
┌──────────┐ 读取数据 ┌──────────┐ │ 用户输入 │ ──────────→ │ Scanner │ │ (键盘) │ │ 对象 │ └──────────┘ └────┬─────┘ │ ┌───────────┴───────────┐ │ 调用对应方法获取数据 │ │ nextInt() │ │ nextDouble() │ │ nextLine() │ │ next() │ └───────────────────────┘1.3 printf格式说明符
| 格式符 | 说明 | 示例 |
|---|---|---|
| %d | 整数 | printf(“%d”, 10) → 10 |
| %f | 浮点数 | printf(“%f”, 3.14) → 3.140000 |
| %s | 字符串 | printf(“%s”, “hello”) → hello |
| %c | 字符 | printf(“%c”, ‘A’) → A |
| %n | 平台相关换行 | 跨平台换行符 |
| %% | 输出%本身 | printf(“100%%”) → 100% |
1.4 printf精度控制
// 保留2位小数printf("%.2f",3.14159)// → 3.14// 宽度控制printf("%10d",42)// → " 42"(右对齐,占10位)printf("%-10d",42)// → "42 "(左对齐)二、语法格式
2.1 Scanner使用步骤
// 第1步:导入Scanner类importjava.util.Scanner;// 第2步:创建Scanner对象Scannerscanner=newScanner(System.in);// 第3步:读取输入intnum=scanner.nextInt();// 读取整数doubled=scanner.nextDouble();// 读取浮点数Stringstr=scanner.nextLine();// 读取一整行Stringword=scanner.next();// 读取一个单词// 第4步:关闭Scanner(可选但建议)scanner.close();2.2 输出方法对比
System.out.println("Hello");// 输出Hello并换行System.out.print("Hello");// 输出Hello不换行System.out.print("World");// 接着输出World// 结果:HelloWorld(在同一行)// printf格式化System.out.printf("姓名: %s, 年龄: %d%n","张三",25);三、代码案例
案例1:用户信息输入
importjava.util.Scanner;publicclassUserInfo{publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System.in);System.out.println("===== 用户信息采集 =====\n");// 输入姓名System.out.print("请输入您的姓名: ");Stringname=scanner.nextLine();// 输入年龄System.out.print("请输入您的年龄: ");intage=scanner.nextInt();// 输入身高System.out.print("请输入您的身高(米): ");doubleheight=scanner.nextDouble();// 输入性别System.out.print("请输入您的性别(男/女): ");Stringgender=scanner.next();// 输出信息System.out.println("\n===== 您的信息 =====");System.out.println("姓名: "+name);System.out.println("年龄: "+age+"岁");System.out.println("身高: "+height+"米");System.out.println("性别: "+gender);// 使用printf格式化输出System.out.println("\n===== 格式化输出 =====");System.out.printf("姓名: %s%n",name);System.out.printf("年龄: %d岁%n",age);System.out.printf("身高: %.2f米%n",height);System.out.printf("性别: %s%n",gender);scanner.close();}}案例2:简易计算器
importjava.util.Scanner;publicclassSimpleCalculator{publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System.in);System.out.println("===== 简易计算器 =====\n");// 输入两个数System.out.print("请输入第一个数: ");doublenum1=scanner.nextDouble();System.out.print("请输入第二个数: ");doublenum2=scanner.nextDouble();// 计算并输出结果System.out.println("\n===== 计算结果 =====");System.out.printf("%.2f + %.2f = %.2f%n",num1,num2,num1+num2);System.out.printf("%.2f - %.2f = %.2f%n",num1,num2,num1-num2);System.out.printf("%.2f × %.2f = %.2f%n",num1,num2,num1*num2);if(num2!=0){System.out.printf("%.2f ÷ %.2f = %.2f%n",num1,num2,num1/num2);System.out.printf("%.2f %% %.2f = %.2f%n",num1,num2,num1%num2);}else{System.out.println("除数不能为0!");}scanner.close();}}案例3:成绩录入系统
importjava.util.Scanner;publicclassGradeSystem{publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System.in);System.out.println("===== 成绩录入系统 =====\n");// 输入学生信息System.out.print("请输入学生姓名: ");Stringname=scanner.nextLine();System.out.print("请输入语文成绩: ");doublechinese=scanner.nextDouble();System.out.print("请输入数学成绩: ");doublemath=scanner.nextDouble();System.out.print("请输入英语成绩: ");doubleenglish=scanner.nextDouble();// 计算doubletotal=chinese+math+english;doubleaverage=total/3;// 确定等级Stringlevel;if(average>=90){level="优秀";}elseif(average>=80){level="良好";}elseif(average>=70){level="中等";}elseif(average>=60){level="及格";}else{level="不及格";}// 输出报告System.out.println("\n===== 成绩报告 =====");System.out.printf("学生: %s%n",name);System.out.printf("语文: %.1f 分%n",chinese);System.out.printf("数学: %.1f 分%n",math);System.out.printf("英语: %.1f 分%n",english);System.out.printf("总分: %.1f 分%n",total);System.out.printf("平均: %.1f 分%n",average);System.out.printf("等级: %s%n",level);scanner.close();}}四、常见错误
错误1:Scanner缓冲区问题
importjava.util.Scanner;// 错误示例:nextInt()后直接用nextLine()Scannerscanner=newScanner(System.in);System.out.print("请输入年龄: ");intage=scanner.nextInt();// 读取整数,回车留在缓冲区System.out.print("请输入姓名: ");Stringname=scanner.nextLine();// 读取了回车,得到空字符串!System.out.println("姓名: "+name);// 输出空!// 正确写法1:在nextInt()后加一个nextLine()消耗回车scanner.nextInt();// 读取整数scanner.nextLine();// 消耗回车Stringname=scanner.nextLine();// 现在能正确读取// 正确写法2:全部使用nextLine(),手动解析StringageStr=scanner.nextLine();intage=Integer.parseInt(ageStr);错误2:输入类型不匹配
Scannerscanner=newScanner(System.in);System.out.print("请输入一个整数: ");// 如果用户输入 "abc"intnum=scanner.nextInt();// InputMismatchException!// 正确做法:先检查if(scanner.hasNextInt()){intnum=scanner.nextInt();}else{System.out.println("输入的不是整数!");scanner.next();// 消耗无效输入}错误3:忘记关闭Scanner
// 不推荐Scannerscanner=newScanner(System.in);// ... 使用scanner// 忘记关闭// 推荐写法Scannerscanner=newScanner(System.in);try{// ... 使用scanner}finally{scanner.close();}// 或者在程序结束时关闭scanner.close();五、课后练习
练习1(基础)
编写程序,输入圆的半径,输出圆的面积和周长。要求使用printf保留2位小数。
练习2(进阶)
编写程序,输入秒数,将其转换为"小时:分钟:秒"的格式。例如:输入3661,输出"1:1:1"。
练习3(思考题)
编写程序,输入一个四位数,输出其千位、百位、十位、个位数字,以及各位数字之和。
六、本课小结
| 知识点 | 要点 |
|---|---|
| println() | 输出内容并换行 |
| print() | 输出内容不换行 |
| printf() | 格式化输出,%d整数、%f浮点、%s字符串、%c字符、%n换行 |
| Scanner | 输入类,使用前需import |
| nextInt() | 读取整数 |
| nextDouble() | 读取浮点数 |
| nextLine() | 读取一整行 |
| next() | 读取一个单词 |
| 常见陷阱 | nextInt()后要用nextLine()消耗回车 |
本课程持续更新中,欢迎关注!