先抒发一下现在心情:好高兴奥!
IDE:eclipse+JDK+ADT插件
语言:java(javaAPI 很多函数都应经封装好了,使用起来很方便)
软件使用环境:Android智能手机
声明:基于兼容性的考虑,我使用Android1.6,所以只要是Android1.6以上版本的手机都可以安装该软件。
借着这个假期自己写了个计算器。之前也写过一些项目:像是和同学一块参加过齐鲁软件大赛,上学期和以同学一块写了个数独游戏,自己也试着写过类似QQ的聊天工具。但是这次是我自己一个人完成的这个项目——类似windows自带的计算器。一个人写了两千行左右的代码,感觉实在是爽啊!之所以选择计算器,首先是计算器的逻辑功能从代码的角度上而言我觉着比较简单,再者就是计算器的业务逻辑比较熟悉。
windows自带的计算器的功能基本上都实现了,但是对于一组数据进行操作的功能我没有写(Sta相关功能),不是不能实现,只是觉着对于手机而言,从布局上来讲像这样的功能没有必要实现,从布局上也不适用。<——鉴于软件的完整性,这部分内容我还是写上了>
本次开发的不足之处:1、之前看过一些有关设计模式的知识,但是到了真正开发的时候好像有关设计模式知识在脑袋里没有一点了,好像完全没有用到,是不是因为自己接触的大项目太少了呢?还是使用集成开发环境的问题呢(集成开发环境的集成性)?2、虽然功能完成了,但是写的代码不好,没有通用性。3、整体把握项目的能力很差,和我同学一块做数独游戏的时候,他总能从整天上来把握项目。我这次也尝试着这样做,想要把想要实现的功能大体顺一遍,但是想着想着脑袋就感觉很是大了,又觉着对于要实现的功能没有什么难度,以至于最后写的代码我感觉通用性不是很好。
现在展示一下我觉着比较有用,比较有用的算法:
/*
* 计算按位与AND
* 返回十进制长整形
* */
private long CalculateAnd (double onee, double twoo){
String consequence = "";
long one = (long)onee;
long two = (long)twoo;
String oneStr = Long.toBinaryString(one);
String twoStr = Long.toBinaryString(two);
int lengthOne = oneStr.length();
int lengthTwo = twoStr.length();
int lenOneTwo = (lengthOne>lengthTwo?lengthTwo:lengthOne);
char[] consequent = new char[lenOneTwo];
if (lengthOne>lengthTwo) {
oneStr = oneStr.substring(lengthOne-lengthTwo);
}else {
twoStr = twoStr.substring(lengthTwo-lengthOne);
}
char oneChar,twoChar;
for (int i = 0; i < lenOneTwo; i++) {
oneChar = oneStr.charAt(i);
twoChar = twoStr.charAt(i);
if (oneChar=='1' && twoChar=='1') {
consequent[i] = '1';
}else {
consequent[i] = '0';
}
}
consequence = new String(consequent);
long consequentLong = Long.parseLong(consequence, 2);
return consequentLong;
}
/*
* 计算按位或Or
* 返回十进制长整形
* */
private long CalculateOr (double onee, double twoo){
String consequence = "";
String cutString = "";
long one = (long)onee;
long two = (long)twoo;
String oneStr = Long.toBinaryString(one);
String twoStr = Long.toBinaryString(two);
int lengthOne = oneStr.length();
int lengthTwo = twoStr.length();
int lenOneTwo = (lengthOne>lengthTwo?lengthTwo:lengthOne);
char[] consequent = new char[lenOneTwo];
if (lengthOne>lengthTwo) {
cutString = oneStr.substring(0, lengthOne-lengthTwo);
oneStr = oneStr.substring(lengthOne-lengthTwo);
}else if(lengthOne<lengthTwo){
cutString = twoStr.substring(0, lengthTwo-lengthOne);
twoStr = twoStr.substring(lengthTwo-lengthOne);
}
char oneChar,twoChar;
for (int i = 0; i < lenOneTwo; i++) {
oneChar = oneStr.charAt(i);
twoChar = twoStr.charAt(i);
if (oneChar=='0' && twoChar=='0') {
consequent[i] = '0';
}else {
consequent[i] = '1';
}
}
consequence = new String(consequent);
consequence = cutString.concat(consequence);
long consequentLong = Long.parseLong(consequence, 2);
return consequentLong;
}
/*
* 计算按位异或Xor
* 返回十进制长整形
* */
private long CalculateXor (double onee, double twoo){
String consequence = "";
String cutString = "";
long one = (long)onee;
long two = (long)twoo;
String oneStr = Long.toBinaryString(one);
String twoStr = Long.toBinaryString(two);
int lengthOne = oneStr.length();
int lengthTwo = twoStr.length();
int lenOneTwo = (lengthOne>lengthTwo?lengthTwo:lengthOne);
char[] consequent = new char[lenOneTwo];
if (lengthOne>lengthTwo) {
cutString = oneStr.substring(0, lengthOne-lengthTwo);
oneStr = oneStr.substring(lengthOne-lengthTwo);
}else if(lengthOne<lengthTwo){
cutString = twoStr.substring(0, lengthTwo-lengthOne);
twoStr = twoStr.substring(lengthTwo-lengthOne);
}
char oneChar,twoChar;
for (int i = 0; i < lenOneTwo; i++) {
oneChar = oneStr.charAt(i);
twoChar = twoStr.charAt(i);
if ((oneChar=='1' && twoChar=='0') || (oneChar=='0' && twoChar=='1')) {
consequent[i] = '1';
}else {
consequent[i] = '0';
}
}
consequence = new String(consequent);
consequence = cutString.concat(consequence);
long consequentLong = Long.parseLong(consequence, 2);
return consequentLong;
}
/*
* 计算某个数的n次方
* */
private double power(double one, int n){
double asOfResult = 1;
for (int i = 0; i < n; i++) {
asOfResult = asOfResult*one;
}
return asOfResult;
}
/*
* 普通形式表示与科学计数法表示数据的相互转换
* */
private String indexNumberReal() {
int count = 0, count1 = 0;
String content = (result.getText()).toString();
int lengthContent = content.length();
if (!content.equals("") && !content.equals("除数不能为零!") && !content.equals("(")) {
double middle = Double.valueOf(content);
for (int i = 0; i < lengthContent; i++) {
if (content.charAt(i)!='e') {
count++;
}else {
break;
}
}
if (lengthContent==count) {//字符串不包含字符‘e’
if (middle>0) {
if (middle>=10) {
while (middle>=10) {
middle = middle/10;
count1++;//>10时的数量级
}
content = middle + "e" + "+" + count1;
}else if(middle<1){
while (middle<1) {
middle = middle*10;
count1++;
}
content = middle + "e" + "-" + count1;
}else {
content = middle + "e" + "+" + count1;
}
}else if (middle<0) {
if (middle<=-10) {
while (middle<=-10) {
middle = middle/10;
count1++;
}
content = middle + "e" + "+" + count1;
}else if (middle>-1) {
while (middle>-1) {
middle = middle*10;
count1++;
}
content = middle + "e" + "-" + count1;
}else {
content = middle + "e" + "+" + count1;
}
}
}else {//字符串中含有‘e’,例:xxe+index
String index = "";//n
String number = "";//xx
char sign = '-';
int n = 0;//是index的起始位置的前一位置
for (int i = 0; i < lengthContent; i++) {
if (content.charAt(i)=='-' || content.charAt(i)=='+') {
sign = content.charAt(i);
n = i;
}else {
continue;
}
}
index = content.substring(n+1, lengthContent);
int indexInt = Integer.valueOf(index);
for (int i = 0; i < lengthContent; i++) {
if (content.charAt(i)!='e') {
number = number + content.charAt(i);
}else {
break;
}
}
double contentDouble = Double.valueOf(number);
if (sign=='+') {
contentDouble = contentDouble*power(10, indexInt);
}else {
contentDouble = contentDouble*(1/power(10, indexInt));
}
content = Double.toString(contentDouble);
}
}
return content;
}
/*
*用于不同进制的数据显示在文本框中
*将一个十进制数据转换为不同进制下的字符串返回
* */
private String decimalTootherRadix(long one){
String oneStr = "";
if (check == 16) {
oneStr = Long.toHexString(one);
}else if (check == 8) {
oneStr = Long.toOctalString(one);
}else if (check == 2) {
oneStr = Long.toBinaryString(one);
}
return oneStr;
}
/*
* 用于不同进制之间的字符串的转换
* */
private void differenceRadixTranslate(long translate){
String hexDecimal, octalDecimal, binaryDecimal;
if (check == 10) {
result.setText(translate+"");
}else if (check == 16) {
hexDecimal = Long.toHexString(translate);
result.setText(hexDecimal);
}else if (check == 8){
octalDecimal = Long.toOctalString(translate);
result.setText(octalDecimal);
} else if (check == 2) {
binaryDecimal = Long.toBinaryString(translate);
result.setText(binaryDecimal);
}
}
本来想要上传一些软件开发截图的,但是好像截图的图片格式不能上传,无奈之下,我还是给想要了解本软件的朋友简单介绍一下吧!
对于该款软件,主要有两部分:1、计算器的标准型;2、计算器的科学型
开发是我遇到的难点:
1、对数据的处理,由于对于winXP自带的计算器不只包括十进制之间的计算,还包括十六进制、八进制以及二进制,所以在计算之前首先应该对取到的数据进行处理;
2、数据的实时性,对数据进行计算,所需要的数据应该具有实时性,对进行计算的数据要实时进行更新;
下面说说windows自带的计算器的计算手则:
windows标准型计算器功能键使用说明
Backspace 删除当前显示数字的最后一位
CE 清除显示数字
C 清除当前的计算
MC 清除内存中的所有数字
MR 重调用存内存中的数字。该数字保留在内存中
MS 将显示数字保存在内存中
M+ 将显示的数字与内存中已有的任何数字相加,但不显示这些数字的和
0 1 2 3 4 5 6 7 8 9 输入数字
+/- 改变显示数字的正负符号
. 插入小数点
/ 除法
* 乘法
- 减法
+ 加法
sqrt 计算显示数字的平方根
% 按百分比的形式显示乘积结果。输入一个数,单击“*”,输入第二个数,然后单击“%”。
例:1000 * 25 % 将显示为 250。
也可执行带百分数的运算,输入一个数,单击运算符(“+”、“-”、“*”或“/”),输入第二个数,单击“%”,然后单击“=”。
例:1000 + 25%(指的是 1000 的 25%)= 1250
1000 - 25% = 750
1/x 计算显示数字的倒数
= 对上两个数字执行任意运算。若要重复上一次的运算,请再次单击“=”
例:50+10 按一次“=”号显示60,再按显示70,依次重复加10运算。
windows科学型计算器功能键使用说明
十六进制 四字(可显示16位数) 双字8(可显示8位数)单字(可显示4位数)字节(可显示2位数)
八进制 (四种位宽显示方式切换)
二进制 (四种位宽显示方式切换)
十进制 角度 弧度 梯度 三种显示方式切换 弧度在十进制模式下将三角函数输入设置为弧度。
Inv 设置“sin”、“cos”、“tan”、“PI”、“x^y”、“x^2”、“x^3”、“ln”、“log”、“Ave”、“Sum”和“s”的反函数。完成一次计算后自动关闭反函数功能,等价的键盘操作为i.
In 计算自然对数(以 e 为底)。若要计算 e 的 x 次方(其中 x 是当前数字),请使用“Inv”+“ln”。
log 计算常用对数(以 10 为底)。若要计算 10 的 x 次方,请使用“Inv”+“log”。
Hyp设置“sin”、“cos”和“tan”的双曲函数。完成一次计算后自动关闭双曲函数功能。
Sta 显示“统计框”对话框并激活“Ave”、“Sum”、“s”和“Dat”。
Dat 在“统计框”对话框内输入显示的数字。只有先单击“Sta”,该按钮才可用。
STA(STAT)打开统计学功能,详细用法:
按下“Sta”按纽,就会弹出统计框,我们要使用统计功能,首先要录入统计数据。假如我们要录入数据为10、20、30、40。我们首先通过计算器键盘输入10,然后按“Dat”按纽,数据10就会输入到统计框中,其它数据照同样方式录入,这时10、20、30、40全部出现在统计框窗口中,如果求和按“Sum”按纽,按下“Ave”按纽就可以得到平均值。
标准差即标准偏差
Sum 计算“统计框”对话框中显示数值的总和。若要计算平方和(即10的平方+20的平方+30的平方+40的平方=3000),请使用“Inv”+“Sum”
Ave 计算“统计框”对话框中显示数值的平均值。若要计算平均方值(即3000/4=750),请使用“Inv”+“Ave”
s 计算总体参数为 –1 的标准偏差。若要计算总体参数为 n 的标准偏差,请使用“Inv”+“s”。
Sum求和
Inv+sum:平方和
Ave:平均值
Inv+ave:平均方值
S:标准偏差(总体参数为-1)(样本标准差)
Inv+s:标准偏差(总体参数为n)(总体标准差)
MC 清除内存中的所有数字
MR 重调用存内存中的数字。该数字保留在内存中
MS 将显示数字保存在内存中
M+ 将显示的数字与内存中已有的任何数字相加,但不显示这些数字的和
pi 近30位π值3.141592653589732384626433832795显示
1. And, Or, Not, Xor: 最基本的与或非和异或操作,不作解释。
2. Lsh, Rsh:全称是Left Shift和Right Shift,也就是左移和右移操作,你需要输入你要移动的位数(不能大于最大位数)
3. RoL, RoR:全称是Rotate Left和Rotate Right,对于RoL来讲,就是向左移动一位,并将移出的那位补到最右边那位上,RoR类似。
Mod求模(即整数相除求余数),
OR 计算按位 OR。逻辑运算符在执行任何按位运算时将截断数字的小数部分。Or按位或,
Lsh 左移。若要右移,请使用“Inv”+“Lsh”。在单击该按钮后,必须指定(以二进制形式)要将显示区中的数字左移或右移多少位,然后单击“=”。逻辑运算符在执行任何按位运算时将截断数字的小数部分。
= 对上两个数字执行任意运算。若要重复上一次的运算,请再次单击“=”
And 计算按位 AND。逻辑运算符在执行任何按位运算时将截断数字的小数部分。And按位与,
Xor按位异或,
Not按位取反,
int取整,注意是直接抹去小数部分,不是四舍五入。
A B C D E F 十六进制用符号,将此符号置于计算器的显示区。表示10 11 12 13 14 15 这六个数字
A–F 在数值中输入选中字母。只有在十六进制模式为开启状态时该按钮才可用。