2017-07-31 10 views
0

このタイプの問題に対処する方法を知っていただければ幸いです。前もって感謝します。 ここに質問があります。Javaファイルio平均を計算して別のファイルに保存する

ファイルの最初の行には2つの整数が含まれています。 件名件数試験グレード

件数:ファイル内のレコード数を示します。 exam-grade:試験の成績を示します。 ファイルは生徒の名前とその成績順に表示されます。 サンプルファイル:test1.txtという は4つのレコードを格納します。これは、試験は80の外にあるファイルは、学生の名前や学年によって、次のとおりです。

4 80 
Mary 65.5 
Jack 43.25 
Harry 79.0 
Mike 32.5 

あなたは、次のメソッドの本体を開発する必要があります。

srcFileNameから各学生の成績を読み込み、公共の静的な無効READWRITE(文字列srcfileName、文字列dstFileName)

は、そのグレードのパーセントを計算し、もし生徒が合格したか失敗したことを示し、最後にクラスの平均を報告し、数生徒数、生徒数試験をリードし、結果をdstFileNameに保存します。 前のテストファイルの出力ファイルは次のようになります。ここ

Mary   81.88  passed 
Jack   54.06  passed 
Harry   98.75  passed 
Mike   40.63  failed 
class average:68.83 
passed: 3 
failed: 1 

が、私はそれのために書いたコードであり、

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

public class Lab10Quiz { 
    public static void main(String[] args) throws FileNotFoundException 
    { 
    // Test cases 
    readWrite("test1.txt", "out1.txt"); 
    readWrite("test2.txt", "out2.txt"); 
    } 

/** copies the content of the srcFileName into dstFileName, and add the average of the number to the end of the dstFileName 
    @param srcFileName : souce file name contains double numbers 
@param dstFileName : destination file name 
    */ 
    public static void readWrite(String srcFileName, String 
dstFileName) throws FileNotFoundException { 
// Your code goes here 
    File output = new File(dstFileName); 
    PrintWriter outPut = new PrintWriter(output); 

    double avg = 0; 
    int count = 0; 
    double tmp = 0; 

    Scanner in = new Scanner(new File(srcFileName)); 
    while (in.hasNextDouble()) { 
    tmp = in.nextDouble(); 
    avg += tmp; 
    outPut.println(tmp); 
    count ++; 
    } 
    avg = avg/count; 
    outPut.println("Average = " + avg); 
    outPut.close(); 
    } 
} 
+4

非常に興味深いです。また質問がありましたか? –

+0

あなたの入力行が異なるデータ型で構成されているため、それぞれをプロンプトするか、おそらくより良い方法は行を読んでから空白で分割することです。 –

+0

初心者のプログラマーとして、タスクは問題を解決するための素晴らしい方法です。私は最初にファイルを読んで、@ SkaryWombatのようなスペースを分割し、ファイル情報を何らかのタイプのデータ構造体( 'List'または' Array')に保存します。次に、データ構造をループして計算を行い、その情報を同様のデータ構造に保存します。私は最終的に、私のデータ構造の情報を使ってファイルに書き出します。 – Sedrick

答えて

0

このコードは、あなたが

double avg = 0; 
    int failCounter = 0; 

    String[] keywords = in.nextLine().split(" "); 
    int studentNumber = Integer.parseInt(keywords[0]); 
    double examValue = Double.parseDouble(keywords[1]); 

    for (int i = 0; i < studentNumber; i++) { 
     keywords = in.nextLine().split(" "); 
     String studentName = keywords[0]; 
     double studentMark = Double.parseDouble(keywords[1]); 
     double grade = calculateTotalGrade(studentMark, examValue); 
     failCounter += (hasFailed(grade) ? 1 : 0); 
     avg += grade; 
     outPut.println(String.format("%s \t\t %.2f \t\t %s", studentName, grade, hasFailed(grade) ? "failed" : "passed")); 
    } 
    avg = avg/studentNumber; 
    outPut.println("class average: " + avg); 
    outPut.println("passed: " + (studentNumber - failCounter)); 
    outPut.println("failed: " + failCounter); 

そして、私が欲しいものを実現しますいくつかのロジックを以下のメソッドに抽出しました。最も簡単な方法のための

  1. ルック:

    private static double calculateTotalGrade(double grade, double examValue) { 
        return grade * 100/examValue; 
    } 
    
    private static boolean hasFailed(double grade) { 
        return grade < 50; 
    } 
    

    が質問のこのタイプに取り組むためにどのように答えるために。この場合、有限反復のループは簡単でした。だから私はforループを使いました。

  2. カウンタは既に与えられています。再計算する必要はありません。
  3. コンピュータで作業している場合は、少しコードを書いてテストしてください。
  4. これ以上の質問をしてください。 (もしあなたがthis bookの最初の章を読むなら、これらの質問は簡単でしょう)
+0

ありがとうございました – john

関連する問題