2014-01-05 47 views
0

我创建了这个代码来平均测试分数,但是我把每个学生test1,test2,test3等放在一个数组中。现在,我怎样才能得到考试成绩的总平均一次检查(。当然Q1为数组索引0,但他们是8级不同的Q1的我如何获得它们的平均?)文件读取平均

import java.io.File; 
import java.io.IOException; 
import java.util.*; 

public class Project3 { 

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



     ReadFile r = new ReadFile(); 
     r.openFile(); 
     r.readFile(); 
     r.closeFile(); 

-

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

public class Grades { 

    private Formatter x; 
    //Formatter variable- output string to file 


    public void openFile(){ 
     //method to open file 
     try{ 
      x = new Formatter("grades.txt"); 


     } 
     catch(Exception e){ 
      System.out.println("Could not find file."); 
     } 
    } 

     public void addRecords(){ 
     x.format("%d",8); 
     x.format(" %s %s, %d, %d, %d, %d, %d, %d, %d", " Thui", "Bhu", 100, 90, 80, 100, 89, 99, 88); 
     x.format(" %s %s, %d, %d, %d, %d, %d, %d, %d", "\n ArianaB", "Smith", 90, 90, 100, 100, 99, 100, 95); 
     x.format(" %s %s, %d, %d, %d, %d, %d, %d, %d", "\n Emily", "Gonzales", 100, 90, 100, 70, 78, 78, 80); 
     x.format(" %s %s, %d, %d, %d, %d, %d, %d, %d", "\n Jenifer", "L", 80, 90, 90, 100, 89, 99, 85); 
     x.format(" %s %s, %d, %d, %d, %d, %d, %d, %d", "\n Maria", "Jones", 65, 72, 77, 68, 62, 70, 65); 
     x.format(" %s %s, %d, %d, %d, %d, %d, %d, %d", "\n Bill", "Gates", 60, 54, 38, 62, 65, 60, 50); 
     x.format(" %s %s, %d, %d, %d, %d, %d, %d, %d", "\n Escobar", "Morris", 83, 77, 88, 76, 79, 72, 76 ); 
     x.format(" %s %s, %d, %d, %d, %d, %d, %d, %d", "\n Anne", "Latner", 80, 90, 85, 95, 90, 95, 90 ); 


     } 
     public void closeFile(){ 
      x.close(); 
     } 
     // 



} 

-

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

import java.util.*; 
public class ReadFile { 

private Scanner x; 

     public void openFile(){ 
    try{ 
     x = new Scanner (new File ("grades.txt")); 
    } 
    catch(Exception e){ 
     System.out.println("could not find file"); 
    }} 



public void createFile()throws IOException { 


    try{ 
     File file = new File("grades.txt"); 
     Scanner s = new Scanner(file); 




    while(s.hasNext()){ 

     { 

     double q1average = 0.0, q2average = 0.0, q3average = 0.0, q4average = 0.0; 
     double proji = 0.0, projii =0.0, projiii = 0.0; 
     double q1sum = 0.0, q2sum = 0.0, q3sum = 0.0, q4sum = 0.0; 
     double proji_sum = 0.0, projii_sum = 0.0, projiii_sum =0.0; 
     while(s.hasNext()) { 
      String[] split = s.nextLine().split(", "); 

      q1sum += Double.parseDouble(split[1]); // add all first grades 
      q1average++; 

      q2sum += Double.parseDouble(split[2]); // add all first grades 
      q2average++; 

      q3sum += Double.parseDouble(split[3]); // add all first grades 
      q3average++; 

      q4sum += Double.parseDouble(split[4]); // add all first grades 
      q4average++; 

      proji_sum += Double.parseDouble(split[5]); // add all first grades 
      proji++; 

      projii_sum += Double.parseDouble(split[6]); // add all first grades 
      projii++; 

      projiii_sum += Double.parseDouble(split[7]); // add all first grades 
      projiii++; 
      int maxq1 =0; 
      if(Double.parseDouble(split[1]) > maxq1) 
       maxq1 = (int) Double.parseDouble(split[1]); 
      System.out.println(maxq1); 
     } 

     double q1_average = (q1sum/q1average); 
     double q2_average = (q2sum/q2average); 
     double q3_average = (q3sum/q3average); 
     double q4_average = (q4sum/q4average); 
     double p1_average = (proji_sum/proji); 
     double p2_average = (projii_sum/projii); 
     double p3_average = (projiii_sum/projiii); 
    } 



    }}catch(Exception e){ 
     e.printStackTrace(); 
    } 



} 
public void closeFile(){ 
    x.close(); 
} 
} 
+1

而在代码是说数组? –

+0

你不是把每个学生都放在数组中,你把所有的数据放在数组中,(点)。 – solvator

+0

似乎是功课时间! –

回答

2

用同样的方法,你会得到在纸上平均:通过他们的总数添加所有的个人考试成绩和差距。因此,创建一个临时变量,然后在循环中将各个测试分数相加,除以循环后的学生总数。

+0

我怎样才能做到这一点只使用q1,q2等变量? – user3163493

+0

正如我所说的:为每个你想要的总和或平均值定义一个额外的变量。所以你可能有一个double avgQ1 = 0;然后你有:avgQ1 + = q1;在循环内。循环后,请执行avgQ1/= numStudents。您必须定义并计算您为此读入的学生人数。 –

+0

虽然在你的情况下,在第二个(你当前的)循环中做计算部分之前,你必须有另一个循环或其他阅读方式,并计算学生人数。 –

0

这将不是很好的方式,但它应该工作。所以,你的数组是split[],它存储了由,(逗号)分割的所有数据。所以,如果你发现,如果添加+8 index你的第一个学生q的(q1例如存储在split[1],所以+8,和第二Studentq1将存储在split[9]),你会得到你的第二个学生Q的。所以可以做这样的事情:

int std=0 
int q1=0,a=1; 
while(a<split.length){ 
q1+=Integer.parseInt(split[a]); 
a+=8; 
std++; 
} 
int result = q1/std; 

// This will count all students q1 and take average 

同样,你可以与他人q的。但正如我所说,这是样板代码。

+0

我试过了,我只是在100-200范围内的数字 – user3163493

+0

我编辑为()循环,它不会是一个++ – solvator

+0

相同的数字范围发生,他们给出8个不同的值 – user3163493

0

基本上你所拥有的是一个多维数组。您在多行(“列”)上有多个测试分数(“行”)。你需要把每条线放在某个地方,以便以后可以回忆它们。

您可以做一些简单的像这样:

double grades = 0.0; 
double sum = 0.0; 
while(s.hasNext()) { 
    String[] split = s.nextLine().split(", "); 

    sum += Double.parseDouble(split[1]); // add all first grades 
    grades++; 
} 
System.out.println(sum/grades); 

或者更复杂的东西:

List<ArrayList<String>> allGrades = new ArrayList<ArrayList<String>>(); 
while(s.hasNext()) { 
    allGrades.add(Arrays.asList(s.nextLine().split(", "))); 
} 

StringBuilder results = new StringBuilder(); 
int cols = allGrades.get(0).size(); 
for(int c = 1; ;) { // outer for every test 

    double sum = 0.0; 
    double count = 0.0; 
    double max = 0.0; 
    for(int r = 0; r < allGrades.size(); r++) { // inner for every person 
     count++; 
     double grade = Double.parseDouble(allGrades.get(r).get(c)); 
     sum += grade; 
     if(grade > max) { 
      max = grade; 
     } 
    } 

    results.append("[test "); 
    results.append(c); 
    results.append(": avg = "); 
    results.append(sum/count); 
    results.append(", max = "); 
    results.append(max); 
    results.append(']'); 

    if(++c < cols) { // fence post logic... 
     results.append(", "); 
    } else { 
     break; 
    } 
} 

System.out.println(results); 

或者,也许是这样的:

double[] avgs = new double[7]; 
double count = 0.0; 
while(s.hasNext()) { 
    String[] split = s.nextLine().split(", "); 

    for(int i = 0, k = 1; k < split.length; i++, k++) { 
     avgs[i] += Double.parseDouble(split[k]); 
    } 

    count++; 
} 

for(int i = 0; i < avgs.length; i++) { 
    System.out.println("test avg " + (i + 1) + ": " + (avgs[i]/count)); 
} 
+0

更简单的一个...我必须为每个测试做一个新的while循环吗? – user3163493

+0

不一定,您可以将结果存储在数组中。查看我添加的另一个片段。但总的来说,由于2D方面,你将有一个嵌套循环。无论是或者硬编码它就像你建议的那样。 – Radiodef

+0

如何建议去找出每个测试的最大值 – user3163493