0

任务是创建一个程序,该程序将从标准输入(包含整数列表的文件)读取到数组中,然后找到这些整数的平均值、最大值、最小值、中值和标准差。首先,这是代码:

import java.io.*;
import java.util.*;


public class DescriptiveStats
{

protected List<Integer> scores = new ArrayList<Integer>();

public DescriptiveStats()
{
    // default constructor
}


public void main(String[] args) throws IOException
{

    try{
        Scanner sc = new Scanner(new FileReader("students.txt"));
        while(sc.hasNextInt())
        {
            scores.add(sc.nextInt());
        }
        sc.close();
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }

    DescriptiveStats stat = new DescriptiveStats();
    System.out.println("Min = " + stat.getMin(scores[]));
    System.out.println("Max = " + stat.getMax(scores[]));
    System.out.println("Median = " + stat.getMedian(scores[]));
    System.out.println("Mean = " + stat.getMean(scores[]));
    int Mean = stat.getMean(scores[]);
    System.out.println("Standard Deviation = " + stat.getStandardDev(scores[], Mean));
}


public int getMin(int []lst)
{
    int min = lst[0];
    for(int i=0;i<lst.length;i++)
    {                                      
        if(min>lst[i])
        min=lst[i];
    }
    return min;
}

public int getMax(int []lst)
{
    int max = lst[0];
    for(int i=0;i<lst.length;i++)
    {
        if(max<lst[i])
        max=lst[i];
    }
    return max;
}

public int getMedian(int [] lst)
{
    Arrays.sort(lst);
    int middle = lst.length/2;
    if(lst.length%2==1)
    {
        return lst[middle];
    }
    return (lst[middle-1] + lst[middle]);
}

public int getMean(int [] lst)
{
    Arrays.sort(lst);
    int mean = 0;
    int sum = 0;
    int count = 0;
    for(int i=0;i>lst.length;i++)
    {
        sum = sum + lst[i];
        count++;
    }
    mean = sum/count;
    return mean;
}

public int getStandardDev(int [] lst, int m)
{
    int mean = m;
    int [] array = lst;
    int total = 0;
    for(int i =0; i < array.length; i++)
    {
        int result = array[i]-mean;
        int [] all = Math.pow(result, 2);

    }
    total = result/array.length;
    int standev = Math.sqrt(total);
    return standev;
}

}

我的特殊问题归结为:我不知道我是否正确读取了文件。我遵循了从书籍到网站的许多说明,这似乎是扫描仪的正确公式,但找不到该文件。我尝试了三种不同的 IDE(BlueJ、Eclipse、Netbeans)都无济于事。

其次,我创建了将数组列表作为输入的方法,并在“public void main(string[] args)”方法中调用它们。我很确定我可以做到这一点,但它不会编译,我不确定我错过了什么。

最后,我想确保我的标准差方法是正确的。我不指望任何人能解决所有这些问题,但这些都是我卡住的地方,任何帮助都将不胜感激。谢谢!

4

4 回答 4

3

首先要做的是让你的程序编译和运行(正确与否)。然后您可以简单地打印它读取的值并测试它们是否与数据文件中的值相同。

要让您的程序运行,您首先需要将 main() 方法声明为static. 此外,由于您正在捕获 IOException(顺便说一句,这是个好主意!),您不需要声明main抛出异常。最后,由于您正在尝试读取 内部的数据main,因此您无法访问该scores字段,因为它是一个实例变量并且您还没有实例DescriptiveStats。此外,由于您将数组作为参数传递给分析函数,因此它不需要是实例变量。试试这个:

public static void main(String[] args) {
    List<Integer> scores = new ArrayList<Integer>();
    try{
        Scanner sc = new Scanner(new FileReader("students.txt"));
        while(sc.hasNextInt())
        {
            scores.add(sc.nextInt());
        }
        sc.close();
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
    // etc.
}
于 2011-09-07T18:36:26.810 回答
0

如果您想知道程序尝试从哪里读取文件,请使用以下命令:

File students = new File("students.txt");
System.out.println("Reading data from :" + students.getAbsolutePath());
Scanner sc = new Scanner(new FileReader(students));
...
于 2011-09-07T18:31:37.503 回答
0

你把文件“students'txt”放在哪里了。如果它与“DescriptiveStats”类不在同一位置,JVM 将无法找到该文件。因此,请确保该文件与该类位于同一路径中,或者如果您想从其他地方获取它,请指定正确的路径。

来到第二点。您绝对可以从 main() 函数调用这些方法。你得到的编译器错误是什么?

感谢您尝试使用不同的 IDE 所付出的努力。但这与IDE无关。

于 2011-09-07T18:34:29.767 回答
0

好的,所以我根据人们的建议进行了一些更改。我取消了硬编码文件,并将其替换为标准输入。现在,我真正的重点是:-确保我将数组列表与方法正确结合使用,-确保我能够正确地将它们应用于标准偏差这是我的新代码:

import java.io.*;
import java.util.*;
/**
 * Read from a standard input a series of exam scores,    
 * then compute the min, max, avg, med, & stand deviation.
 */
public class DescriptiveStats
{

public DescriptiveStats()
{
    // default constructor
}


public static void main(String[] args) throws IOException
{
    ArrayList<Integer> scores = new ArrayList<Integer>();
    try{
        Scanner input = new Scanner(System.in);
        while(input.hasNextInt())
        {
            scores.add(input.nextInt());
        }
        input.close();
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }

    DescriptiveStats stat = new DescriptiveStats();
    System.out.println("Min = " + stat.getMin(scores));
    System.out.println("Max = " + stat.getMax(scores));
    System.out.println("Median = " + stat.getMedian(scores));
    System.out.println("Mean = " + stat.getMean(scores));
    int Mean = stat.getMean(scores);
    //System.out.println("Standard Deviation = " + stat.getStandardDev(scores, Mean));
}


public int getMin(ArrayList<Integer> lst)
{
    int min = 0;
    int d = 0;
    for(int i=0;i<lst.size();i++)
    {                         
        d = lst.get(i);
        if(min>d)
        {
            min=d;
        }
    }
    return min;
}

public int getMax(ArrayList<Integer> lst)
{
    int max = lst.get(0);
    for(int i=0;i<lst.size();i++)
    {
        if(max<lst.get(i))
        max=lst.get(i);
    }
    return max;
}

public int getMedian(ArrayList<Integer> lst)
{
    Collections.sort(lst);
    int middle = lst.size()/2;
    if(lst.size()%2==1)
    {
        return lst.get(middle);
    }
    return (lst.get(middle-1) + lst.get(middle));
}


public int getMean(ArrayList<Integer> lst)
{
    Collections.sort(lst);
    int mean = 0;
    int sum = 0;
    int count = 0;
    for(int i=0;i>lst.size();i++)
    {
        sum = sum + lst.get(i);
        count++;
    }
    mean = sum/count;
    return mean;
}
/**
public int getStandardDev(ArrayList lst, int m)
{
    int mean = m;
    int [] array = lst;
    int total = 0;
    for(int i =0; i < array.length; i++)
    {
        int result = array[i]-mean;
        int [] all = Math.pow(result, 2);

    }
    total = result/array.length;
    int standev = Math.sqrt(total);
    return standev;
}**/

}

如您所见,标准差方法及其在主要方法中的引用被制成注释。我还没有尝试将它们转换为数组列表,因为我不确定我对其他人做了正确的事情。

最后,当我运行我拥有的东西时,编译器不会返回任何错误。相反,它只是挂起,可能已经崩溃。我不确定为什么。当我在 BlueJ 中使用 'void main(String[] args' 选项时,我提交了文本文件的名称(它位于项目目录中。主目录中甚至还有一个,以防万一这是被引用的内容。

谢谢你们。

于 2011-09-08T02:33:04.230 回答