java小项目——统计器升级版
第一次在java中用面向对象写程序,写了一整个下午啊!!差不多四个小时啊,不过最终还是写完了。一开始我就为求频数的程序冥思苦想,这个程序想了好多天了,上上周就开始写,但只有一点进展;上周又想了一次,虽然想到了方法,但一直出错,还是没进展;今天我花了一两个小时想,分析了错误的原因,终于把它想出来了,并且敲出来的代码也没有错;然后我有花了些时间将新写好的功能整进原来的老统计器里,用面向对象的方法写的确简单得多,代码简洁了许多。
这个项目一共有三个类:Admin管理类、Ari算术类、V频数与频率类,当然名字都是我自己取的,管理类也就是主类是用来运行的,其他两个类用来调用,Ari类用来算中位数平均数之类的,只是一个数据;V类用来算频率与频数,是一个数组。
不过这个程序还有一个错误,那就是当输入的数字全是同一个数时,它就不会输出计算出的数据,而是提示:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6
at V.getFre(V.java:28)
at Admin.main(Admin.java:24)
显然是V类28行的“ while(A[i]==A[i+1]){ ”有问题,但不知道是什么问题,现在就不去管它了,因为如果一组数据全是同一数也不需要用到这个程序,虽然没错误更好,但也没什么关系,如果你知道错误的原因就在下面留言告诉我吧。
注:本问题已由“壁虎学子”(...我也是的啊...)帮助解决 虽然代码没看懂 但也知道了原因 于是就解决了 还是感谢这位“壁虎学子”吧... 错误原因太多 不想具体讲了 直接上代码 但编程时一定要注意多1与少1的问题 小学时小数点容易错 现在多1与少1容易出错 哈哈
另外,本程序可能还有其他错误,是关于输出数据的错误,比如说数组{1,1,2,2,3,3,}的中位数应该是2,它却输出成3或其它数字(举例子),所以请不要用它计算重要的数据,发现错误的你也可以在下面留言告诉我。
上代码了:
Admin.java
import java.util.*;
public class Admin {
public static void main(String[] args){
System.out.println("程序名:统计器");
Scanner in=new Scanner(System.in);
System.out.println("请定义数据的个数:");
int l=in.nextInt();
float[] Arr=new float[l];
for(int i=0;i<l;i++){
System.out.println("请输入数据"+(i+1)+":");
Arr[i]=in.nextFloat();
}
System.out.println("计算中......");
Ari ari=new Ari();
V v=new V();
float sum=ari.getSum(Arr);
float avg=ari.getAvg(Arr);
float med=ari.getMed(Arr);
float r=ari.getR(Arr);
float var=ari.getVar(Arr);
float[] A=V.getNum(Arr);
int[] B=V.getFre(Arr,A);
float[] C=V.getRat(B,Arr);
System.out.println("这组数据的总和是"+sum);
System.out.println("这组数据的平均数是"+avg);
System.out.println("这组数据的中位数是"+med);
System.out.println("这组数据的极差是"+r);
System.out.println("这组数据的方差是"+var);
System.out.println("--------------------------");
System.out.println("t数据t频数t频率");
for(int i=0;i<A.length;i++){
System.out.println("t"+A[i]+"t"+B[i]+"t"+C[i]);
}
}
public float getR(float[] A){//求极差
Arrays.sort(A);
this.r=A[A.length-1]-A[0];
return this.r;
}
public float getVar(float[] A){//求方差
this.sum=0;
this.l=A.length;
for(int i=0;i<A.length;i++){
this.sum+=A[i];
}
this.avg=this.sum/this.l;
float[] B=new float[A.length];
for(int i=0;i<A.length;i++){
B[i]=A[i]-this.avg;
}
float c=0;
for(int i=0;i<A.length;i++){
c+=B[i]*B[i];
}
this.var=c/A.length;
return this.var;
}
}
V.java (getFre类原来有问题的版本在“附:”里 此为暂时没问题的版本)
import java.util.Arrays;
public class V {
public static float[] getNum(float[] A){
Arrays.sort(A);
int a=1;//a是数组A一共有多少不同的数 例如本数组为7
for(int i=0;i<(A.length-1);i++){
if(A[i]!=A[i+1]){
a++;
}
}
float[] B=new float[a];
int c=0;
for(int i=0;i<A.length-1;i++){
if(A[i]!=A[i+1]){
B[c]=A[i];
c++;
}
}
B[a-1]=A[A.length-1];
return B;
}
public static int[] getFre(float[] A,float[] B){//此类修改过
Arrays.sort(A);
float[] D=new float[A.length+1];
for(int i=0;i<A.length-1;i++){
D[i]=A[i];
}
int[] C=new int[B.length];
int d=1;
for(int i=0,j=0;i<A.length-1;i++,j++){
while(D[i]==D[i+1]){
d+=1;
i++;
}
C[j]=d;
d=1;
}
for(int i=A.length-1;i>=0;i--){
if(i>0){
d+=1;
}else if(i<0){
break;
}
}
C[C.length-1]=d;
return C;
}
public static float[] getRat(int[] C,float[] A){
float[] D=new float[C.length];
for(int i=0;i<D.length;i++){
D[i]=(float)C[i]/A.length;
}
return D;
}
}
附:求频数与频率的测试程序
错误的getFre方法
test.java
import java.util.*;
public class tt {
public static void main (String[] args){
float[] A={1,2,6,2,3,5,1,3,2,6,85,2,1,2,3,5,1,22,2,2,6};
Arrays.sort(A);
int a=1;//a是数组A一共有多少不同的数 例如本数组为7
for(int i=0;i<(A.length-1);i++){
if(A[i]!=A[i+1]){
a++;
}
}
float[] B=new float[a];
/*
B数组是求每个不同的数
例如以下程序将每个不同的数1,2,3,5,6,22,42,85装入数组B的每个下标
*/
int b=0;
int c=0;
for(int i=0;i<A.length-1;i++){
if(A[i]!=A[i+1]){
B[c]=A[i];
c++;
}
}
B[a-1]=A[A.length-1];
int[] C=new int[a];
int d=1;
for(int i=0,j=0;i<A.length-1;i++,j++){
while(A[i]==A[i+1]){
d+=1;
i++;
}
C[j]=d;
d=1;
}
for(int i=A.length-1;A[i]==A[i-1];i--){
d+=1;
}
C[C.length-1]=d;
float[] D=new float[C.length];
for(int i=0;i<D.length;i++){
D[i]=(float)C[i]/A.length;
}
//测试
for(int i=0;i<B.length;i++){
System.out.print(B[i]+"t");
}
System.out.println("ge");
for(int i=0;i<+A.length;i++){
System.out.print(A[i]+"t");
}
System.out.println("ge");
for(int i=0;i<+C.length;i++){
System.out.print(C[i]+"t");
}
System.out.println("ge");
for(int i=0;i<+D.length;i++){
System.out.print(D[i]+"t");
}
}
}
getFre方法
public static int[] getFre(float[] A,float[] B){
int[] C=new int[B.length];
int d=1;
for(int i=0,j=0;i<A.length-1;i++,j++){
while(A[i]==A[i+1]){
d+=1;
i++;
}
C[j]=d;
d=1;
}
for(int i=A.length-1;A[i]==A[i-1];i--){
d+=1;
}
C[C.length-1]=d;
return C;
}
[code lang="java"]
public static int[] getFre(float[] A,float[] B){
int[] C=new int[B.length];
int d=1;
for(int i=0,j=0;i<A>=A.length-1){
break;
}
}
C[0]=d;//这是解决错误后的代码 这里不应该填J 因为j最大的值是按照A.length来的,而你C的长度是B的数组长度 所以才会出现ArrayIndexOutOfBoundsException错误 这个错误是说数组下标超越了边界 如:A a=new A[3]
你如果直接访问System.out.println(a[3]);就会报这个错误因为a的最大下标也只会是2。访问3很明显会错
d=1;
}
for(int i=A.length-1;i>0&&A[i]==A[i-1];i--){
d+=1;
}
C[C.length-1]=d;
return C;
}
[/code]
谢谢帮忙!代码还要好好研究研究,先帮你改了一个错别字 还提醒下:在本博发代码用(code lang="java")
代码写这里(/code)标记(把()换成[])框起来更好看一些 已经帮你加上了
好久没来博主博客了,就来看看!~大家 相互访问
你以前来过吗?但——既然来了 交个朋友吧 哈哈