黑马程序员-入学经典

时间:2023-02-12 16:04:43
package com.itheima;
/**
 * 10、 金额转换,阿拉伯数字转换成中国传统形式。
 * 例如:1010 0000 1010  
 *  转换为   壹仟零壹拾亿零壹仟零壹拾圆整
 * @author Administrator
 *
 */
public class Test10 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		String str = "101000001010";
		convertToChineseFormat(str);
	}
	/**
	 * 将字符串转换为中文格式
	 * @param str
	 */
	public static void convertToChineseFormat(String str){
		if(!str.matches("\\d+")){//正则判断是不是数字
			System.out.println("字符串" + str + "不是数字格式,无法转换!");
			return;//不是 则返回
		}
		while(str.startsWith("0")){	//将字符串最前面的0去掉
			str = str.substring(1, str.length());
		}
		char[] num = new char[]{'0','1','2','3','4','5','6','7','8','9'};
		char[] cnNum = new char[]{'零','壹','贰','叁','肆','伍','陆','柒','捌','玖'};
		for(int i=0; i<10; i++){//将字符串数字替换成中文数字,循环对应替换
			str = str.replace(num[i], cnNum[i]);
		}
		
		StringBuilder sb = new StringBuilder(str);//StringBuilder存放字符串,用于插入删除操作
		int index = str.length()-1;   //从第index个字符从后往前开始操作,操作一次,index--
		//存放金额单位
		String[] unit = {"","拾","佰","仟"};
		String[] unit4 = {"万","亿"};
		
		boolean flag = false;//判断前一个数是否为零的标记
		
		for(int i=0; i<str.length(); i++){//循环体内对sb进行操作
			
			//每4位插入万每8位插入亿,最低位先不设置单位
			if(i%4 == 0 && i != 0){
				//根据金额规则,单位万前面为4个零时,不插入万,并将index位置(最低位)的零删除
				if((i/4-1)%2 == 0 && index >= 3 && str.substring(index-3, index+1).equals("零零零零")){
					sb.deleteCharAt(index);
					index--;
					continue;
				}
				//否则在index+1位置插入相应的单位:万、亿
				sb.insert(index+1, unit4[(i/4-1)%2]);
			}
			//如果4位的最低位为零,删除最低位的零,将零标志置为true
			if(i%4 == 0 && str.charAt(index) == '零'){
				sb.deleteCharAt(index);
				flag = true;
				index--;
				continue;
			}
			//如果前一位为零并且这一位也为零,删除这一位的零
			if(flag && str.charAt(index) == '零'){
				sb.deleteCharAt(index);
				index--;
				continue;
			}
			//如果当前位为零,将零标志置为true
			if(str.charAt(index) == '零'){
				flag = true;
				index--;
				continue;
			}
			//当前位不为零,将零标志位置为false,插入金额单位
			flag = false;
			sb.insert(index+1, unit[i%4]);
			index--;
		}
		//完善金额表示形式
		sb.append("圆整");
		System.out.println(sb.toString());
	}
	
}


 

package com.itheima;

import java.util.Scanner;
import java.util.Stack;

/**
 * 9、 编写一个程序,它先将键盘上输入的一个字符串转换成十进制整数,
 * 然后打印出这个十进制整数对应的二进制形式。
 * 这个程序要考虑输入的字符串不能转换成一个十进制整数的情况,
 * 并对转换失败的原因要区分出是数字太大,还是其中包含有非数字字符的情况。
 * 提示:十进制数转二进制数的方式是用这个数除以2,余数就是二进制数的最低位,
 * 接着再用得到的商作为被除数去除以2,这次得到的余数就是次低位,如此循环,
 * 直到被除数为0为止。其实,只要明白了打印出一个十进制数的每一位的方式
 * (不断除以10,得到的余数就分别是个位,十位,百位),
 * 就很容易理解十进制数转二进制数的这种方式。
 * @author Administrator
 *
 */
public class Test9 {

	public static void main(String[] args) {
		//String param = "9876543210";
		System.out.println("请输入要转换的字符串:");
		Scanner input=new Scanner(System.in);
		String str=input.next();
		Integer num = 0;
		
		Stack<Integer> stack = new Stack<Integer>();//这里用栈存储方式比较合适

		try {
			num = Integer.valueOf(str);//将字符串变为Inetger类型 -2的31次方 到 2的31次方-1 之间,否则出现异常,处理结果为数字太多
			while (num > 0) {
				int b = num % 2;//得到余数
				stack.add(b);//添加到stack中。
				num=num/2;
			}
			toBinary(stack);//保存到stack中,余数先进后出
		} catch (Exception e) {
			boolean flag = false;//定义标识
			for (int i = 0; i < str.length(); i++) {
				char c = str.charAt(i);
				if (c < 48 || c > 57) {//不是0-9的數字
					flag = true;
					break;
				}
			}

			if (flag) {
				System.out.println("存在非数字字符。");
			} else {
		          e.printStackTrace();
				System.out.println("数字太大。");
			}
		}
	}

	public static void toBinary(Stack<Integer> stack) {
		StringBuffer sb = new StringBuffer();
		while (!stack.empty()) {
			sb.append(stack.pop());//出栈,同时删除,添加到StringBuffer对象中。
		}
		System.out.println("装换后的二进制为:"+ sb.toString());
	}
}


 

package com.itheima;
/**
 * 4、 请说明Java中字符'\'的含义,有什么作用?
 * @author Administrator
 *
 */
public class Test4 {
    public static void main(String[] args) {
		//  '\'表示转义符号
    	  //它和紧跟着它的那个字符构成转义字符,如“\n”(表示换行)、“\””(表示字符‘”’)等,所以在字符串中要表示字符'\'要用“\\”来表示。
    	  //转义字符的意义就是避免出现二义性,二义性是所有编程语言都不允许的。
    	
    	//例如这里打印  "A" 
    	System.out.println("\"A\"");
    	//例如这里输入一个制表符
    	System.out.println("你好\t我很好");
    
    /*	和其他符号搭配可以构成转义字符
        \b 退格键 
    	\f 换页 
    	\n 换行 
    	\r 回车 
    	\t 制表符 
    	\\ 反斜线 
     */
	}
}


 

package com.itheima;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;

/**
 * 7、 定义一个文件输入流,调用read(byte[] b) 方法将exercise.txt文件中的 所有内容打印出来(byte数组的大小限制为5)。
 * 
 * @author Administrator
 * 
 */
public class Test7 {
	public static void main(String[] args) {
		InputStream input = null;// 准备一个字节输入流对象
		try {
			input = new FileInputStream("src\\com\\itheima\\exercise.txt");// 实例一个输入流对象
			OutputStream out = System.out;// 得到输出流对象,控制台
		
			byte[] b = new byte[5];// 定义缓冲数组
			int len = 0;// 读取的字节数

			try {
				while ((len = input.read(b)) != -1) {
					out.write(b, 0, len);// 写入到流中,控制台
				   
				}

			} catch (FileNotFoundException e) {
				System.out.println("文件不存在");
			}

		} catch (IOException e) {

			System.out.println("文件读取失败");

		} finally {
			try {
				input.close();

			} catch (IOException e) {
				System.out.println("关闭输入流失败");
			}
		}
	}
}


 

package com.itheima;

/**
 * 8、 将字符串中进行反转。abcde --> edcba
 * 
 * @author Administrator
 * 
 */
public class Test8 {
	public static void main(String[] args) {
		String str = reverseString("abcde");// 接受反转的字符串
		System.out.println(str);// 打印输出
	}

	/**
	 * 反转字符串的方法
	 * 
	 * @param str
	 * @return
	 */
	public static String reverseString(String str) {
		char[] chs = str.toCharArray();// 将字符串变为字符数组
		// 循环遍历,开始指针自加,末尾指针自减
		for (int start = 0, end = chs.length - 1; start < end; start++, end--) {
			// 交换位置
			char temp = chs[start];
			chs[start] = chs[end];
			chs[end] = temp;
		}
		return new String(chs);// 重新把数组变为字符串
	}
}


 

package com.itheima;

import java.util.Arrays;
import java.util.Scanner;

public class Test10 {
	/**
	 * 10、 有100个人围成一个圈,从1开始报数, 报到14的这个人就要退出。 然后其他人重新开始,
	 * 从1报数,到14退出。问:最后剩下的是100人中的第几个人?
	 */
	private static int count = 0;// 定义出局的编号,默认从0开始

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);// 键盘录入
		System.out.println("请输入人数:");
		int totalPerson = scanner.nextInt();// 总人数
		System.out.println("请输入第几个人要退出:");
		int outNum = scanner.nextInt();// 第几个人要退出。
		judgePerson(totalPerson, outNum);// 调用判断人数的方法
	}

	/**
	 * 对人数进行判断
	 * 
	 * @param totalPerson
	 * @param outNum
	 */
	private static void judgePerson(int totalPerson, int outNum) {
		if (totalPerson == 1) {// 如果总人数是1,退出的就是这个人。
			System.out.println("最后剩下的人为" + totalPerson + "个");

		} else {// 否则调用退出的方法
			personExit(totalPerson, outNum);
		}
	}

	/**
	 * 退出方法
	 * 
	 * @param totalPerson
	 *            总人数
	 * @param outNum
	 *            第几个人要退出
	 */
	private static void personExit(int totalPerson, int outNum) {
		int[] arr = new int[totalPerson];// 实例一个数组,长度为总人数
		for (int j = 0; j < totalPerson; j++) {// 循环遍历
			for (int i = 0; i < outNum; i++) {
				count++;// 每数一个人,则编号加1
				if (j > 0) {// 这里j>0可以不用判断,因为上面已经判断过了。
					measure(j, arr);// 调用判断count是否存在的方法
				}
				if (count > totalPerson) {
					count = 1;// 若count大于总人重新赋值为1
					measure(j, arr);// 调用判断count是否存在的方法。
				}
			}
			arr[j] = count;// 将退出的人保存到数组中.
		}
		System.out.println("退出的顺序为:" + Arrays.toString(arr));
		System.out.println("最后剩下的人为:" + arr[totalPerson - 1]);// 最后剩下的人
	}

	/**
	 * 判断count是不是存在
	 * 
	 * @param n
	 * @param arr
	 */
	private static void measure(int n, int[] arr) {
		// 双重循环判断,因为要保证count的唯一。
		for (int s = 0; s < n; s++) {
			for (int w = 0; w < n; w++) {
				if (count == arr[w])
					count++;// 若存在则加1.
			}
		}
	}
}