《疯狂Java讲义(第4版)》-----第4章【习题解答】

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《疯狂Java讲义(第4版)》-----第4章【习题解答】【练习1】九九乘法表
public class Multiplication_table {
public static void main(String[]args){
for(int i=1;i<=9;i++){
for(int j=1;j<=i;j++){
System.out.print(i+"X"+j+"="+(i*j));
if(j!=i) System.out.print(",");
}
System.out.println();
}
}
}
【练习2】打印由"*"⽣成的等腰三⾓形
import java.util.Scanner;
public class test {
public static void main(String[] args){
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
for(int i=1;i<=n;i++){
for(int j=1;j<=n-i;j++) System.out.print(" ");
for(int j=1;j<=2*i-1;j++) System.out.print("*");
System.out.println();
}
}
}
【练习3】⽤“*”打印⼀个圆
//本程序依据x^2+y^2=r^2这个圆公式进⾏画圆
import java.util.Scanner;
import ng.Math;
public class test{
public static void main(String[] args){
Scanner scan=new Scanner(System.in);
double r=scan.nextDouble();
for(double x=-r;x<=r;x+=2){ //此处i+=2,可以控制好更像圆,如果i++像椭圆
double y=Math.sqrt(Math.pow(r, 2)-Math.pow(x, 2));
for(double i=-r;i<=r;i++){
//对于x坐标,遍历⼀边-r到r所有值,如果和y坐标之差的绝对值在0.5的误差范围内,我们就认为此处i=y,应该⼤⾐呢出点
System.out.print((Math.abs(y-i)<=0.5 || Math.abs(-y-i)<=0.5)?'*':' ');
}
System.out.println();
}
}
}
输⼊输出样例:
【练习4】通过字节截取实现String的substring⽅法
⽅案⼀
看了⽹上的各类版本,都没有实现题⽬要求,下⾯代码可以实现题⽬要求,实现和String的substring完全⼀样的功能。

在eclipse下编译运⾏,输出结果是错误的,可以⽤命令⾏进⾏编译运⾏。

主要是因为汉字编码问题。

eclipse默认GBK编码,⽽汉字是Unicode编码。

public class test{
public static void main(String[] args){
System.out.println(substring("中国China",1,3));
}
//按照字节截取字符串实现和String的substring完全⼀样的功能
public static String substring(String str,int indexStart,int indexEnd){
byte[] bt=str.getBytes();
int[] cnt=new int[bt.length];
int num=0;
//标记每个字节对应原字符串中字符的下标
for(int i=0;i<bt.length;i++){
cnt[i]=num;
if(bt[i]<0){
cnt[i+1]=num;
i++;
}
num++;
}
int st=0,en=0;
//寻找原来以indexStart为下标的字符在bt字节数组中开始的字节下标
for(int i=0;i<bt.length;i++){
if(cnt[i]==indexStart){
st=i;
break;
}
}
//寻找原来以indexEnd为下标的字符在bt字节数组中结束的字节下标
for(int i=bt.length-1;i>=0;i--){
if(cnt[i]==indexEnd-1){
en=i;
break;
}
}
return new String(bt,st,en-st+1);//使⽤String的构造函数String(byte[] bytes, int offset, int length)
}
}
输出:
国C
⽅案⼆(主要代码)
String str = "中国abc";
byte[] by = str.getBytes();
byte[] dst = Arrays.copyOfRange(by,2,5);
System.out.println(new String(dst));
【练习5】输⼊⼀个浮点数,给出相应的⼈民币读法。

下⾯程序输⼊要求:整数部分8位及以内,⼩数部分2位及以内。

package assignment;
import java.util.Scanner;
/*
本程序实现整数部分8位及以内,⼩数部分2位及以内的浮点数⽤⼈民币读法表⽰
⽐如230432.25表⽰为贰拾叁万零肆佰叁拾贰元贰⾓伍分
算法思路:核⼼思想是解决四位数16种情况的每种⼈民币读法,这⾥说的四位数允许有前导0,
再按照前导0读与不读分为两种情况,故相当于共32种情况,解决好这32种情况,核⼼问题
已经解决!进⼀步,如果整数部分⼩于等于9999,则按照不读0的⽅法转换成⼈民币读法,如
果整数部分⼤于等于10000,则低四位按照读0,⾼四位按照不读0的⽅法转换成⼈民币⾼读法。

*/
public class test{
public final static String HAN="零壹贰叁肆伍陆柒捌玖拾";
public final static String UNIT="⼗百千";
public static void main(String[] args){
Scanner scan=new Scanner(System.in);
System.out.println("请输⼊⼀个浮点数: ");
String s=scan.next();
System.out.println("这个浮点数转换成⼈民币读为: ");
solve(s);
}
//四位数读0的情况,不⾜四位补0补够四位,形参⼀定是长度为4的字符串,不⾜四位,⽤前导0先补齐再作为形参
public static String read_0(String s){
char a=s.charAt(0);
char b=s.charAt(1);
char c=s.charAt(2);
char d=s.charAt(3);
if(s.equals("0000")) return "";//0000
else if(a=='0' && b=='0' && c=='0' && d!='0') return HAN.charAt(0)+""+HAN.charAt(d-'0');//0001
else if(a=='0' && b=='0' && c!='0' && d=='0') return HAN.charAt(0)+""+HAN.charAt(c-'0')+UNIT.charAt(0);//0010
else if(a=='0' && b=='0' && c!='0' && d!='0') return HAN.charAt(0)+""+HAN.charAt(c-'0')+UNIT.charAt(0)+HAN.charAt(d-'0');//0011
else if(a=='0' && b!='0' && c=='0' && d=='0') return HAN.charAt(0)+""+HAN.charAt(b-'0')+UNIT.charAt(1);//0100
else if(a=='0' && b!='0' && c=='0' && d!='0') return HAN.charAt(0)+""+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(0)+HAN.charAt(d-'0');//0101
else if(a=='0' && b!='0' && c!='0' && d=='0') return HAN.charAt(0)+""+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(c-'0')+UNIT.charAt(0);//0110
else if(a=='0' && b!='0' && c!='0' && d!='0') return HAN.charAt(0)+""+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(c-'0')+UNIT.charAt(0)+HAN.charAt(d-' 0');//0111
else if(a!='0' && b=='0' && c=='0' && d=='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2);//1000
else if(a!='0' && b=='0' && c=='0' && d!='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(0)+HAN.charAt(d-'0');//1001
else if(a!='0' && b=='0' && c!='0' && d=='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(0)+HAN.charAt(c-'0')+UNIT.charAt(0);//1010
else if(a!='0' && b=='0' && c!='0' && d!='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(0)+HAN.charAt(c-'0')+UNIT.charAt(0)+HAN.charAt(d-' 0');//1011
else if(a!='0' && b!='0' && c=='0' && d=='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(b-'0')+UNIT.charAt(1);//1100
else if(a!='0' && b!='0' && c=='0' && d!='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(0)+HAN.charAt(d-' 0');//1101
else if(a!='0' && b!='0' && c!='0' && d=='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(c-'0')+UNIT.charAt (0);//1110
else if(a!='0' && b!='0' && c!='0' && d!='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(c-'0')+UNIT.charAt( 0)+HAN.charAt(d-'0');//1111
else return "Error";//不是上述16种情况则返回错误信息
}
//四位数不读0的情况,不⾜四位补0补够四位,形参⼀定是长度为4的字符串,不⾜四位,⽤前导0先补齐再作为形参
public static String not_read_0(String s){
char a=s.charAt(0);
char b=s.charAt(1);
char b=s.charAt(1);
char c=s.charAt(2);
char d=s.charAt(3);
if(s.equals("0000")) return ""+HAN.charAt(0);//0000
else if(a=='0' && b=='0' && c=='0' && d!='0') return ""+HAN.charAt(d-'0');//0001
else if(a=='0' && b=='0' && c!='0' && d=='0') return ""+HAN.charAt(c-'0')+UNIT.charAt(0);//0010
else if(a=='0' && b=='0' && c!='0' && d!='0') return ""+HAN.charAt(c-'0')+UNIT.charAt(0)+HAN.charAt(d-'0');//0011
else if(a=='0' && b!='0' && c=='0' && d=='0') return ""+HAN.charAt(b-'0')+UNIT.charAt(1);//0100
else if(a=='0' && b!='0' && c=='0' && d!='0') return ""+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(0)+HAN.charAt(d-'0');//0101
else if(a=='0' && b!='0' && c!='0' && d=='0') return ""+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(c-'0')+UNIT.charAt(0);//0110
else if(a=='0' && b!='0' && c!='0' && d!='0') return ""+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(c-'0')+UNIT.charAt(0)+HAN.charAt(d-'0');//0111
else if(a!='0' && b=='0' && c=='0' && d=='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2);//1000
else if(a!='0' && b=='0' && c=='0' && d!='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(0)+HAN.charAt(d-'0');//1001
else if(a!='0' && b=='0' && c!='0' && d=='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(0)+HAN.charAt(c-'0')+UNIT.charAt(0);//1010
else if(a!='0' && b=='0' && c!='0' && d!='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(0)+HAN.charAt(c-'0')+UNIT.charAt(0)+HAN.charAt(d-' 0');//1011
else if(a!='0' && b!='0' && c=='0' && d=='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(b-'0')+UNIT.charAt(1);//1100
else if(a!='0' && b!='0' && c=='0' && d!='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(0)+HAN.charAt(d-' 0');//1101
else if(a!='0' && b!='0' && c!='0' && d=='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(c-'0')+UNIT.charAt (0);//1110
else if(a!='0' && b!='0' && c!='0' && d!='0') return ""+HAN.charAt(a-'0')+UNIT.charAt(2)+HAN.charAt(b-'0')+UNIT.charAt(1)+HAN.charAt(c-'0')+UNIT.charAt( 0)+HAN.charAt(d-'0');//1111
else return "Error";//不是上述16种情况则返回错误信息
}
//⼩数部分处理,⼩数最多两位,不⾜则补⾜两位,直接类似上⾯分情况傻⽠便捷式分类
public static String read_decimal(String s){
char a=s.charAt(0);
char b=s.charAt(1);
return HAN.charAt(a-'0')+"⾓"+HAN.charAt(b-'0')+"分";
}
//把浮点数劈出整数部分
public static String split_to_integer(String s){
int mark=s.length();//标记⼩数点位置
String integer="";
//寻找⼩数点位置
for(int i=0;i<s.length();i++){
if(s.charAt(i)=='.'){
mark=i;
break;
}
}
//分离出整数部分赋给integer
for(int i=0;i<mark;i++){
integer+=s.charAt(i);
}
return integer;
}
//把浮点数劈出⼩数部分
public static String split_to_decimal(String s){
int mark=s.length();//标记⼩数点位置
String decimal="";
//寻找⼩数点位置
for(int i=0;i<s.length();i++){
if(s.charAt(i)=='.'){
mark=i;
break;
}
}
}
//分离出⼩数部分给decimal
for(int i=mark+1;i<s.length();i++){
decimal+=s.charAt(i);
}
//⼩数部分规范化为2位
if(decimal.length()==0) decimal="00";
else if(decimal.length()==1) decimal+='0';
return decimal;
}
//获取整数⾼四位
public static String get_high_4(String s){
String high_4="";
if(s.length()<=4) return "";
else{
for(int i=0;i<s.length()-4;i++){
high_4+=s.charAt(i);
}
//⾼四位不⾜4位补⾜4位
int len=high_4.length();//⼀定要加上这⼀句,下⾯i的范围不能直接⽤high_4.length(),因为这是变的 for(int i=0;i<4-len;i++){
high_4='0'+high_4;
}
return high_4;
}
}
//获取整数低四位
public static String get_low_4(String s){
String low_4="";
if(s.length()>=4){
for(int i=s.length()-4;i<s.length();i++)
low_4+=s.charAt(i);
}
else{
for(int i=0;i<s.length();i++)
low_4+=s.charAt(i);
for(int i=0;i<4-s.length();i++)
low_4='0'+low_4;
}
return low_4;
}
//解决本问题,读出⼈民币汉语来
public static void solve(String s){
String integer="",high_4="",low_4="",decimal="",read_high_4="",read_low_4="",read_decim="";
integer=split_to_integer(s); //System.out.println(integer);
decimal=split_to_decimal(s);
read_decim=read_decimal(decimal);
low_4=get_low_4(integer); //System.out.println(low_4);
high_4=get_high_4(integer); //System.out.println(high_4);
if(high_4.equals("")){
read_low_4=not_read_0(low_4);
System.out.println(read_low_4+"元"+read_decim);
System.out.println(read_low_4+"元"+read_decim);
}
else{
read_low_4=read_0(low_4);
read_high_4=not_read_0(high_4);
System.out.println(read_high_4+"万"+read_low_4+"元"+read_decim); }
}
}。

相关文档
最新文档