0

正しい出力を得るためにコードをフォーマットするのに少し問題があります。私はJavaの初心者なので、かなりばかげた間違いを犯したと思いますが、ここに行きます.

入力しているテキストファイルは次のとおりです。

John Smith  90
Barack Obama    95
Al Clark    80
Sue Taylor  55
Ann Miller  75
George Bush 58
John Miller 65

出力ファイルは次のようになります。

John Smith  90
Barack Obama    95
Al Clark    80
Sue Taylor  55
Ann Miller  75
George Bush 58
John Miller 65

Students with excellent grades:
John Smith  90
Barack Obama    95

Students with ok grades:
Al Clark    80
Ann Miller  75
John Miller 65

Students with failure grades:
Sue Taylor    55
George Bush  58


Lowest Grade: Sue Taylor 55 
Highest Grade: Barack Obama 95
Average of Grades: 74


Grades in descending order: 
John Smith 55 
Barack Obama    58 
Al Clark    65 
Sue Taylor  75 
Ann Miller  80 
George Bush 90 
John Miller 95 

私が探している出力はこれです:

出力ファイルは次のようになります。

John Smith  90
Barack Obama 95
Al Clark 80
Sue Taylor   55
Ann Miller   75
George Bush  58
John Miller  65


Students with excellent grades:
John Smith  90
Barack Obama 95


Students with ok grades:
Al Clark   80
Ann Miller   75
John Miller  65


Students with failure grades:
Sue Taylor    55
George Bush  58


Lowest Grade: Sue Taylor 55
Highest Grade: Barack Obama 95
Average of Grades: 74


Grades in descending order: 
Barack Obama 95
John Smith 90
Al Clark 80
Ann Miller 75
John Miller 65
George Bush 58
Sue Taylor 55

問題は次のとおりです。

  1. 名前 (最初と最後) と最小および最大の成績を印刷する必要があります。

  2. グレードの降順は明らかに昇順なので、修正する必要があります。

  3. また、最後に整理された降順リストの各グレードで印刷する名前 (最初と最後) も必要ですが、現在、名前はグレードと一致しません。


これが私のコードです:

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

public class Students
{
public static void main (String[] args) throws IOException
{   
    String first_name, last_name;
    int grade, total=0, count=0;
    int min, max;

    double average;

     int excellentTotal = 0;
     int okTotal = 0;
     int failureTotal = 0;

    Scanner fileInput = new Scanner(new File("students.txt"));
    Student st[] = new Student [100];
    while (fileInput.hasNext())
    {
        first_name = fileInput.next();
        last_name = fileInput.next();
        grade = fileInput.nextInt();    
        st[count] = new Student(first_name, last_name, grade);
        count++;
        total = total + grade; 
    }

    for (int i=0; i<count;i++)
    {
        System.out.println(st[i]);
    }

    System.out.println("\nStudents with excellent grades:");
    for (int i=0; i<count;i++)
    {
        if (st[i].grade > 89)
        {
            System.out.println(st[i]);
            excellentTotal += st[i].grade;
        }
    }

    System.out.println("\nStudents with ok grades:");
    for (int i=0; i<count;i++)
    {
        if (st[i].grade >=60 && st[i].grade <=89)
        {
            System.out.println(st[i]);
            okTotal += st[i].grade;
        }
    }

    System.out.println("\nStudents with failure grades:");
    for (int i=0; i<count;i++)
    {
        if (st[i].grade < 60)
        {
            System.out.println(st[i]);
            failureTotal += st[i].grade;
        }
    }       


    min = st[0].getGrade();
    max = st[0].getGrade();
    for (int i = 0; i < count; i++) 
    {
        if (max.grade < st[i].grade)
        {
            max = st[i];
        }
        if (min.st[i] > st[i].grade)
        {
            min = st[i].grade;
        }
        total = excellentTotal + okTotal + failureTotal;
    }

    System.out.println();
    System.out.println("Lowest Grade: " + min);
    System.out.println("Highest Grade: " + max);
    System.out.println("Average of Grades: " + total/count);

    int t, swap = 0;
    do 
    { 
        swap = 0; 
        for (int i=0; i<count-1; i++) 
        {
            if (st[i].getGrade()>st[i+1].getGrade()) 
            {
                t=st[i].grade; 
                st[i].grade=st[i+1].grade; 
                st[i+1].grade=t; 
                swap++;
            }
        } 
    }
    while (swap>0);

    System.out.println("\nGrades in descending order: ");

    for (int i=0; i<count;i++)
    {
         System.out.print (st[i] + " ");
         System.out.println ();
    }
}
static class Student
{
    private String fname, lname;
    private int grade;

    public Student(String fname, String lname, int grade)
    {
        this.fname = fname;
        this.lname = lname;
        this.grade = grade;
    }

    public int getGrade() 
    {
        return grade;
    }

    public void setGrade(int grade) 
    {
        this.grade = grade;
    }


    public String toString()
    {
        return fname + " " + lname + "\t" + grade;
    }


}
}
4

2 に答える 2

3

問題は次のとおりです。

  1. 名前 (最初と最後) と最小および最大の成績を印刷する必要があります。

Strings実際の最小値と最大値で行ったのと同じように、それぞれ最小値と最大値を持つ人の名前を含む2 つを保持します。

  1. グレードの降順は明らかに昇順なので、修正する必要があります。

配列が昇順になるように既に並べ替えられているようです(Arrays.sort()許可されている場合は参照してください)。したがって、前から後ろに印刷するのではなく、最後から印刷してみませんかあなたの配列の?これにより、降順で出力されます。

  1. また、最後に整理された降順リストの各学年で名前 (最初と最後) を印刷する必要もあります。

配列内の人物を切り替えるのではなく、配列内の各人物の成績を切り替えているため、成績が正しい人物と一致していません。

ここを参照してください:

t=st[i].grade; 
st[i].grade=st[i+1].grade; 
st[i+1].grade=t;

それぞれ成績が 50 と 75 のボブとサムの 2 人がいるとします。

ここにそれらは配列にあります:[Bob(50)][Sam(75)]

上記のコードを使用してそれらを交換すると、次のようになります。[Bob(75)][Sam(50)]

これを修正するための変更は簡単です。私はそれを理解するためにあなたに任せます。

于 2012-12-24T15:50:16.177 に答える
0

さて、私がすることの簡単で汚い例:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Students {

List<Student> students = new ArrayList<Student>();

public Students() {
    // create quick list, no reading from file, don't use arrays if you can help it
    students.add(new Student("a", 1));
    students.add(new Student("b", 2));
    students.add(new Student("c", 3));

    // sort list descending
    Collections.sort(students, new Comparator<Student>() {
        @Override
        public int compare(Student student1, Student student2) {
            return -1 * student1.grade.compareTo(student2.grade);
        }
    });
}

public void showDescending() {
    // just so the list that was sorted descending
    System.out.println(students);
}

public void showForRange(Integer minGrade, Integer maxGrade) {
    // show all students with grades between minGrade and maxGrade
    for (Student s : students) {
        if (s.grade >= minGrade && s.grade <= maxGrade) {
            System.out.println(s);
        }
    }
}

public class Student {
    String name;
    Integer grade;

    public Student(String name, Integer grade) {
        this.name = name;
        this.grade = grade;
    }

    // use toString to easily show name with grade for each student in list
    @Override
    public String toString() {
        return name + " " + grade;
    }

}

public static void main(String[] args) {
    Students s = new Students();
    s.showForRange(100, 90);
    s.showForRange(89, 80);
    s.showDescending();

}


}
于 2012-12-24T16:09:43.213 に答える