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)标记(把()换成[])框起来更好看一些 已经帮你加上了
好久没来博主博客了,就来看看!~大家 相互访问
你以前来过吗?但——既然来了 交个朋友吧 哈哈