第一次在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;
}

点击下载类文件(tongji.zip)

标签: Java, 作品, 统计

已有 4 条评论

  1. [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&gt;0&amp;&amp;A[i]==A[i-1];i--){
    d+=1;
    }
    C[C.length-1]=d;
    return C;
    }
    [/code]

    1. yuheng chan yuheng chan

      谢谢帮忙!代码还要好好研究研究,先帮你改了一个错别字 还提醒下:在本博发代码用(code lang="java")

      代码写这里

      (/code)标记(把()换成[])框起来更好看一些 已经帮你加上了

  2. 好久没来博主博客了,就来看看!~大家 相互访问

    1. yuheng chan yuheng chan

      你以前来过吗?但——既然来了 交个朋友吧 哈哈

添加新评论