实例20:从控制台接收输入字符(输入身份证号然后输出位数)
import java.util.Scanner;
public class Test3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的身份证号:");
String line = sc.nextLine();
System.out.println("原来你的身份证号是:" + line.length() + "位数字啊");
}
}
关键是用System类的输入流也就是类变量in,它可以接收用户的输入信息,并且是标准的输入流实例对象。
实例21:重定向输出流实现程序日志
设计过程:创建RedirectOutputStream类,编写该类的main()主方法,在该方法中保存System类的out成员变量为临时变量,然后创建一个新的文件输出流,并把这个类设置为System类新的输出流。在程序的关键位置输出调试信息,这些调试信息将通过新的输出流保存到日志文件中。最后恢复原有输出流并输出程序运行结束信息。
关键代码如下:
import java.io.FileNotFoundException;
import java.io.PrintStream;
public class RedirectOutputStream {
public static void main(String[] args) {
try {
PrintStream out = System.out;// 保存原有输出流
PrintStream ps = new PrintStream("./log.txt");// 创建文件输出流
System.setOut(ps);// 设置使用新的输出流
int age = 18;// 定义整型变量
System.out.println("年龄变量定义成功,初始值为18");
String sex = "女";
System.out.println("性别变量定义成功,初始值为女");
// 整合两个变量
String info = "这是个" + sex + "孩子,应该有" + age + "岁了";
System.out.println("整合两个变量为info字符串变量,其结果是:" + info);
System.setOut(out);
System.out.println("程序运行完毕,请查看日志文件");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
try {
PrintStream out = System.out;// 保存原有输出流
PrintStream ps = new PrintStream("./log.txt");// 创建文件输出流
System.setOut(ps);// 设置使用新的输出流
int age = 18;// 定义整型变量
System.out.println("年龄变量定义成功,初始值为18");
String sex = "女";
System.out.println("性别变量定义成功,初始值为女");
// 整合两个变量
String info = "这是个" + sex + "孩子,应该有" + age + "岁了";
System.out.println("整合两个变量为info字符串变量,其结果是:" + info);
System.setOut(out);
System.out.println("程序运行完毕,请查看日志文件");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
控制台运行结果
日志文件内
实例22:自动类型转换与强制类型转换
输出语句中分别输出所有变量累加值。注意每次累加值的数据类型,所有整数运算都被自动转换为int类型再进行运算,所有浮点数值都被自动转换为double类型运算。最后把高类型数据向低类型数据进行牵制类型转换,并注意运算结果是否丢失数据。
关键代码如下:
public class TypeConversion{
public static void main(String[] args) {
byte b = 127;
char c = 'W';
short s = 23561;
int i = 3333;
long l = 400000L;
float f = 3.14159F;
double d = 54.523;
//低类型向高类型自动转换
System.out.println("累加byte等于:"+b);
System.out.println("累加char等于:" +(b+c));
System.out.println("累加short等于:" +(b+c+s));
System.out.println("累加int等于:"+(b+c+s+i));
System.out.println("累加long等于:" +(b+c+s+i+l));
System.out.println("累加float等于:"+(b+c+s+i+l+f));
System.out.println("累加long等于:"+(b+c+s+i+l+f+d));
//高类型向低类型的强制转换
System.out.println("把long强制类型转换为int:"+(int)l);
//高类型向低类型转换会丢失数据
System.out.println("int--short:"+(short)l);
//实数到整数转换将舍弃小数部分
System.out.println("double--int:"+(int)d);
//整数到字符类型转换将获取对应编码的字符
System.out.println("short--char:"+(char)s);
}
}
实例25:更精确地使用浮点数
典型实例:货币运算。在计算机中所以数字都是使用二进制进行存储的,而二进制无法精确地表示所有的小数。
import java.math.BigDecimal;
public class AccuratelyFloat{
public static void main(String[] args) {
double money = 2;
double price = 1.1;
double result = money - price;
System.out.println("非精确计算");
System.out.println("剩余金额:"+result);
//精确浮点数的解决方法
BigDecimal money1 = new BigDecimal("2");
BigDecimal price1 = new BigDecimal("1.1");
BigDecimal result1 = money1.subtract(price1);
System.out.println("精确计算");
System.out.println("剩余金额:"+result1);
}
}
创建BigDecimal类的实例时,在构造方法中一定要使用数字字符串作为参数。如果直接使用浮点数或该类型的变量作为参数,那么构造方法接收的是经过二进制存储的浮点数。
实例31:用Switch语句根据消费金额计算折扣
设计过程:该方法首先假设一个用户消费总额的变量money,并初始化一个折扣变量rebate,然后经过运算来获得用户等级,对不同的等级给予不同的折扣优惠。
关键代码如下:
public class ProductPrice{
public static void main(String[] args) {
float money = 1206;//金额
float rebate = 0f;//折扣
if(money>200){
int grade = (int)money/200;//等级
switch(grade){//根据等级计算折扣比例
case 1:
rebate = 0.95f;
break;
case 2:
rebate = 0.90f;
break;
case 3:
rebate = 0.85f;
break;
case 4:
rebate = 0.83f;
break;
default:
rebate = 0.60f;
}
}
System.out.println("您的累计消费金额为:"+money);
System.out.println("您将享受"+rebate+"折优惠!");
}
}
实例37:for循环输出空心的菱形
public class Diamond{
public static void main(String[] args){
printHollowRhombus(10);
}
public static void printHollowRhombus(int size){
if(size % 2 == 0){//计算菱形大小
size++;
}
for(int i = 0; i < size/2 + 1;i++){
for(int j = size/2 + 1; j > i+1; j--){//输出左上角位置的空白
System.out.print(" ");
}
for(int j = 0; j < 2*i + 1; j++){
if(j==0||j==2*i){
System.out.print("*");//输出菱形上半部边缘
}else{
System.out.print(" ");//输出菱形上半部空心
}
}
System.out.println("");
}
for(int i = size/2 + 1; i < size; i++){
for(int j = 0; j < i - size/2; j++){
System.out.print(" ");输出菱形左下角空白
}
for(int j = 0; j < 2*size-1-2*i; j++){
if(j == 0||j == 2*(size-1-i)){
System.out.print("*");//输出菱形下半部边缘
//System.out.println("\n");
}else{
System.out.print(" ");//输出菱形下半部空心
}
}System.out.println("");
}
}
}