java 动手动脑
一.随机生成10个数,填充一个数组,然后用消息框显示数组内容,接着计算数组元素的和,将结果也显示在消息框中。
1.程序设计思想:
2.程序流程图:
3.程序源代码:
import java.util.Random;
import javax.swing.JOptionPane;
public class suijishu {
public static void main(String[] args) {
String output= "10个100以内的随机数为:\n";
int sum=0;
int s[] = new int[10];
Random n = new Random();
for(int i=0;i<=9;i++)
{
s[i]=n.nextInt(101);
output += " "+s[i];
sum += s[i];
}
output +="\n\n十个数的和是:"+sum;
JOptionPane.showMessageDialog(null,output,"结果",
JOptionPane.PLAIN_MESSAGE);
}
}
4.程序截图:
二.阅读QiPan.java示例程序了解如何利用二维数组和循环语句绘制五子棋盘。
1.代码:
import java.io.*;
public class QiPan
{
//定义一个二维数组来充当棋盘
private String[][] board;
//定义棋盘的大小
private static int BOARD_SIZE = 15;
public void initBoard()
{
//初始化棋盘数组
board = new String[BOARD_SIZE][BOARD_SIZE];
//把每个元素赋为"╋",用于在控制台画出棋盘
for (int i = 0 ; i < BOARD_SIZE ; i++)
{
for ( int j = 0 ; j < BOARD_SIZE ; j++)
{
board[i][j] = "╋";
}
}
}
//在控制台输出棋盘的方法
public void printBoard()
{
//打印每个数组元素
for (int i = 0 ; i < BOARD_SIZE ; i++)
{
for ( int j = 0 ; j < BOARD_SIZE ; j++)
{
//打印数组元素后不换行
System.out.print(board[i][j]);
}
//每打印完一行数组元素后输出一个换行符
System.out.print("\n");
}
}
public static void main(String[] args)throws Exception
{
QiPan gb = new QiPan();
gb.initBoard();
gb.printBoard();
//这是用于获取键盘输入的方法
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String inputStr = null;
System.out.println("请输入您下棋的座标,应以x,y的格式:");
//br.readLine():每当在键盘上输入一行内容按回车,刚输入的内容将被br读取到。
while ((inputStr = br.readLine()) != null)
{
//将用户输入的字符串以逗号(,)作为分隔符,分隔成2个字符串
String[] posStrArr = inputStr.split(",");
//将2个字符串转换成用户下棋的座标
int xPos = Integer.parseInt(posStrArr[0]);
int yPos = Integer.parseInt(posStrArr[1]);
//把对应的数组元素赋为"●"。
gb.board[xPos - 1][yPos - 1] = "●";
/*
电脑随机生成2个整数,作为电脑下棋的座标,赋给board数组。
还涉及
1.座标的有效性,只能是数字,不能超出棋盘范围
2.如果下的棋的点,不能重复下棋。
3.每次下棋后,需要扫描谁赢了
*/
gb.printBoard();
System.out.println("请输入您下棋的座标,应以x,y的格式:");
}
}
}
2.
三.请编写一个程序将一个整数转换为汉字读法字符串。比如“1123”转换为“一千一百二十三”
1.源程序:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class zhuanhuan {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
char b[]={'零','一','二','三','四','五','六','七','八','九'};
char c[]={'十','百','千','万','亿'};
System.out.println("请输入一个数:");
BufferedReader number=new BufferedReader(new InputStreamReader(System.in));
String num=number.readLine();
//int Point=num.indexOf(".");
char[] a=num.toCharArray();
String output="";
int n=a.length,j=0;
//System.out.println(n);
for(int i=0;i<n;i++){
j=n-i;
int d=a[i]-'0';
if(j==1)
output+=b[d];
else{
output+=b[d];
output+=c[j-2];
}
}
System.out.print(output);
}
}
2.程序截图:
四.能否将数字表示的金额改为“汉字表达? 比如将“¥123.52”转换为“壹佰贰拾叁元伍角贰分”
1.源代码
import java.util.*;
public class renminbi {
/**
* 此功能将一个浮点数转换成人民币读法字符串
* 1 0000 0000
* 亿 万 元
* @param args
* @author 风云 185843144
*/
//定义一个字符串数组
private String[] hanArr={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
private String[] unitArr={"拾","佰","仟"};
private String[] unitArr1={"元","万","亿"};
private String[] divide(double num){
long zheng = (long)num;//整数部分
long xiao = (int)((num-zheng)*100);//小数部分
if((int)((num-zheng)*100)>=0&&(int)((num-zheng)*100)<10){
return new String[]{zheng + "","0"+String.valueOf(xiao)};//把整数转换为字符串
}else{
return new String[]{zheng + "",String.valueOf(xiao)};//把整数转换为字符串
}
}
private String toHanStr(String numStr){
String result="";//结果
int numLen = numStr.length();//数字字符串的长度
//四位数开始
if(numLen<=4){
for (int i = 0;i<numLen;i++){
int num = numStr.charAt(i)-48;//将char型数字减去48 得到int型数字
if(num!=0){
if(i!=numLen-1){
result+=hanArr[num]+unitArr[numLen-2-i];//如果不是最后一位数则加上单位"拾","佰","仟"
}else{
result+=hanArr[num];
}
}else{
if(i<numLen-1&&(numStr.charAt(i+1)-48!=0)){
result+=hanArr[0];
}
}
}
if(result!=""){
result+=unitArr1[0];
}
}else{//四位数结束
// 8位数开始
if(numLen<=8){
String qianW="";//定义一个千万以获取前四位的结果的字符串
String endF="";//定义一个千位的字符串以获取后四位的结果
for (int i = 0;i<numLen-4;i++){//取前四位
int num = numStr.charAt(i)-48;//将char型数字减去48 得到int型数字
if(num!=0){
if(i!=numLen-5){
qianW+=hanArr[num]+unitArr[numLen-6-i];//如果不是最后一位数则加上单位"拾","佰","仟"
}else{
qianW+=hanArr[num];
}
}else{
if(i<numLen-1&&(numStr.charAt(i+1)-48!=0)){
qianW+=hanArr[0];
}
}
}
if(qianW!=""){
qianW+=unitArr1[1];
}
result+=qianW;
//取后四位数
for(int j=numLen-4;j<numLen;j++){
int num = numStr.charAt(j)-48;//将char型数字减去48 得到int型数字
if(num!=0){
if(j!=numLen-1){
endF+=hanArr[num]+unitArr[numLen-2-j];//如果不是最后一位数则加上单位"拾","佰","仟"
}else{
endF+=hanArr[num];
}
}else{
if(j<numLen-1&&(numStr.charAt(j+1)-48!=0)){
endF+=hanArr[0];
}
}
}
if(endF!=""){
endF+=unitArr1[0];
}
result+=endF;
}else{
//8位结束
//12位数开始
if(numLen<=12){
String yiW="";//定义一个以获取亿位前四位的结果的字符串
String qianW="";//定义一个千万以获取前四位的结果的字符串
String endF="";//定义一个千位的字符串以获取后四位的结果
for (int k = 0;k<numLen-8;k++){//取前四位
int num = numStr.charAt(k)-48;//将char型数字减去48 得到int型数字
if(num!=0){
if(k!=numLen-9){
yiW+=hanArr[num]+unitArr[numLen-10-k];//如果不是最后一位数则加上单位"拾","佰","仟"
}else{
yiW+=hanArr[num];
}
}else{
if(k<numLen-9&&(numStr.charAt(k+1)-48!=0)){
yiW+=hanArr[0];
}
}
}//前四位结束
if(yiW!=""){
yiW+=unitArr1[2];
}
result+=yiW;
for (int i = numLen-8;i<numLen-4;i++){//取中间四位
int num = numStr.charAt(i)-48;//将char型数字减去48 得到int型数字
if(num!=0){
if(i!=numLen-5){
qianW+=hanArr[num]+unitArr[numLen-6-i];//如果不是最后一位数则加上单位"拾","佰","仟"
}else{
qianW+=hanArr[num];
}
}else{
if(i<numLen-5&&(numStr.charAt(i+1)-48!=0)){
qianW+=hanArr[0];
}
}
}//中间四位结束
if(qianW!=""){
qianW+=unitArr1[1];
}
result+=qianW;
//取后四位数
for(int j=numLen-4;j<numLen;j++){
int num = numStr.charAt(j)-48;//将char型数字减去48 得到int型数字
if(num!=0){
if(j!=numLen-1){
endF+=hanArr[num]+unitArr[numLen-2-j];//如果不是最后一位数则加上单位"拾","佰","仟"
}else{
endF+=hanArr[num];
}
}else{
if(j<numLen-1&&(numStr.charAt(j+1)-48!=0)){
endF+=hanArr[0];
}
}
}
if(endF!=""){
endF+=unitArr1[0];
}
result+=endF;
}else{//12位结束
System.out.println("本程序只能转换仟亿位(含)以下的数");
}
}
}
//返回结果
return result;
}
//小数部分
private String toHanStrXiao(String numStr){
String resultXiao="";
if(numStr.charAt(0)-48==0){
if(numStr.charAt(1)-48==0){
resultXiao="";
}else{
resultXiao=hanArr[(numStr.charAt(1)-48)]+"分";
}
}else{
if(numStr.charAt(1)-48!=0){
resultXiao=hanArr[(numStr.charAt(0)-48)]+"角"+hanArr[(numStr.charAt(1)-48)]+"分";
}else{
resultXiao=hanArr[(numStr.charAt(0)-48)]+"角";
}
}
return resultXiao;
}
public static void main(String[] args) {
System.out.print("请输入金额:");
Scanner input = new Scanner(System.in);
double numDouble=input.nextDouble();
renminbi nr = new renminbi();
String[] num = nr.divide(numDouble);
String result=nr.toHanStr(num[0])+nr.toHanStrXiao(num[1]);
System.out.println(result);
}
}
2.运行结果:
五.
作业四:前面几讲介绍过JDK所提供的BigInteger能完成大数计算,如果不用它,直接使用数组表达大数,你能实现相同的功能吗?
要求:
(1)用你的大数类实现加和减两个功能
(2)阅读BigInteger类源码,弄清楚它是使用什么算法实现加减乘除四种运算的?
(3)通过互联网查找大数运算的相关资料,给你的大数类添加乘、除、求阶乘等其它功能。
下面看看BigInteger有哪些重点的属性,主要的有下面三个:
(1)final int signum
signum属性是为了区分:正负数和0的标志位,JDK注释里面已经说的很明白了:
The signum of this BigInteger: -1 for negative, 0 for zero, or 1 for positive. Note that the BigInteger zero must have a signum of 0. This is necessary to ensures that there is exactly one representation for each BigInteger value.
(2)final int[] mag
mag是magnitude的缩写形式,mag数组是存储BigInteger数值大小的,采用big-endian的顺序,也就是高位字节存入低地址,低位字节存入高地址,依次排列的方式。JDK原文注释如下:
The magnitude of this BigInteger, in big-endian order: the zeroth element of this array is the most-significant int of the magnitude. The magnitude must be "minimal" in that the most-significant int (mag[0]) must be non-zero. This is necessary to ensure that there is exactly one representation for each BigInteger value. Note that this implies that the BigInteger zero has a zero-length mag array.
(3)final static long LONG_MASK = 0xffffffffL;
This mask is used to obtain the value of an int as if it were unsigned。