2009-08-17 8 views
1

Ceci est un laboratoire que je travaille pour un CSE 201. Le programme est censé lire des informations sur les étudiants et leurs scores à partir d'un fichier, et sortie le nom de chaque élève avec tous ses notes et le score total, plus le score moyen de la classe, et le nom et le score total des élèves ayant le score total le plus élevé et le plus bas.Java débutant (obtention de l'affectation de classe à compiler)

L'affectation exacte peut être vue here.

J'ai un peu de mal à le compiler, surtout avec la variable "students". Toute aide serait géniale.

/* 
* The program will read information about students and their 
* scores from a file, and output the name of each student with 
* all his/her scores and the total score, plus the average score 
* of the class, and the name and total score of the students with 
* the highest and lowest total score. 
*/ 

import java.util.Scanner; 

public class Lab7 
{ 
     public static void main(String[] args) 
     { 
       // Input file name 
       Scanner in = new Scanner(System.in); 
       String filename = getFileName(in); 

       // Input number of students 
       int Student[students] = getStudents(FileIOHelper.getNumberOfStudents(filename)); 

       // Input all students records and create Student array and 
       // integer array for total scores 
       int[] totalScores = new int[students.length]; 
       for(int i = 0; i < students.length; i++){ 
         for(int j = 1; j < 4; j++){ 
           totalScores[i] += students[i].getScore(j); 
         } 
       } 

       // Compute total scores and find students with lowest and 
     // highest total score 
       int maxIndex = 0, minIndex = 0; 
       for(int i = 0; i < students.length; i++){ 
         if(totalScores[i] > totalScores[maxIndex]){ 
           maxIndex = i; 
         }else if(totalScores[i] < totalScores[minIndex]){ 
           minIndex = i; 
         } 
       } 

       // Compute average total score 
       int average = 0; 
       for(int i = 0; i < totalScores.length; i++){ 
         average += totalScores[i]; 
       } 
       average /= students.length; 

       // Output results 
       outputResults(students, totalScores, maxIndex, minIndex, average); 

     } 

     // Given a Scanner in, this method prompts the user to enter 
     // a file name, inputs it, and returns it. 
     private static String getFileName(Scanner in) 
     { 
       System.out.print("Enter input file name: "); 
       return in.nextLine(); 
     } 

     // Given the number of students records n to input, this 
     // method creates an array of Student of the appropriate size, 
     // reads n student records using the FileIOHelper, and stores 
     // them in the array, and finally returns the Student array. 
     private static Student[] getStudents(int n) 
     { 
       Student[] student = new Student[n]; 
       for(int i = 0; i < student.length; i++){ 
         student[i] = FileIOHelper.getNextStudent(); 

       } 
       return student; 
     } 

     // Given an array of Student records, an array with the total scores, 
     // the indices in the arrays of the students with the highest and 
     // lowest total scores, and the average total score for the class, 
     // this method outputs a table of all the students appropriately 
     // formatted, plus the total number of students, the average score 
     // of the class, and the name and total score of the students with 
     // the highest and lowest total score. 
     private static void outputResults(
         Student[] students, int[] totalScores, 
         int maxIndex, int minIndex, int average 
     ) 
     { 
       System.out.println("\nName \t\tScore1 \tScore2 \tScore3 \tTotal"); 
       System.out.println("--------------------------------------------------------"); 
       for(int i = 0; i < students.length; i++){ 
         outputStudent(students[i], totalScores[i], average); 
         System.out.println(); 
       } 
       System.out.println("--------------------------------------------------------"); 
       outputNumberOfStudents(students.length); 
       outputAverage(average); 
       outputMaxStudent(students[maxIndex], totalScores[maxIndex]); 
       outputMinStudent(students[minIndex], totalScores[minIndex]); 
       System.out.println("--------------------------------------------------------"); 
     } 

     // Given a Student record, the total score for the student, 
     // and the average total score for all the students, this method 
     // outputs one line in the result table appropriately formatted. 
     private static void outputStudent(Student s, int total, int avg) 
     { 
       System.out.print(s.getName() + "\t"); 
       for(int i = 1; i < 4; i++){ 
         System.out.print(s.getScore(i) + "\t"); 
       } 
       System.out.print(total + "\t"); 
       if(total < avg){ 
         System.out.print("-"); 
       }else if(total > avg){ 
         System.out.print("+"); 
       }else{ 
         System.out.print("="); 
       } 
     } 

     // Given the number of students, this method outputs a message 
     // stating what the total number of students in the class is. 
     private static void outputNumberOfStudents(int n) 
     { 
       System.out.println("The total number of students in this class is: \t" + n); 
     } 

     // Given the average total score of all students, this method 
     // outputs a message stating what the average total score of 
     // the class is. 
     private static void outputAverage(int average) 
     { 
       System.out.println("The average total score of the class is: \t" + average); 
     } 

     // Given the Student with highest total score and the student's 
     // total score, this method outputs a message stating the name 
     // of the student and the highest score. 
     private static void outputMaxStudent(
         Student student, 
         int score 
     ) 
     { 
       System.out.println(student.getName() + " got the maximum total score of: \t" + score); 
     } 

     // Given the Student with lowest total score and the student's 
     // total score, this method outputs a message stating the name 
     // of the student and the lowest score. 
     private static void outputMinStudent(
         Student student, 
         int score 
     ) 
     { 
       System.out.println(student.getName() + " got the minimum total score of: \t" + score); 
     } 
} 
+3

Je ne vous vois pas déclarer des étudiants ..? – Nelson

+0

imprimer la sortie du compiler, il serait utile – OscarRyz

+0

la moitié ou plus des personnes sur SO seraient en désaccord, mais il aurait dû compiler tout le temps que vous l'avez écrit.Un bon IDE (comme Eclipse ou Netbeans) vous aurait montré où était l'erreur de syntaxe. Si vous êtes autorisé et avez le temps, entrez dans quelques outils. J'ai appris Java en utilisant un éditeur de texte et c'était une énorme perte de temps. –

Répondre

3

La taille de votre tableau ne peut pas être spécifiée sur le côté gauche.

La déclaration du tableau étudiant devrait ressembler à ceci:

int noOfStudents = FileIOHelper.getNumberOfStudents(filename); 
//create an array of students of the given length 
Student[] students = new Student[noOfStudents]; 
1

Cette partie semble être un problème:

// Input number of students 
int Student[students] = getStudents(FileIOHelper.getNumberOfStudents(filename)); 

Vous voulez probablement obtenir d'abord le nombre d'étudiants, utilisez cette variable appeler getStudents. De plus, si vous voulez que le tableau s'appelle étudiants, il ne devrait pas être entre parenthèses.

Student[] students = ..... 
1

La ligne où vous éprouvez des difficultés est la première ligne en haut de main():

int Student[students] = getStudents(FileIOHelper.getNumberOfStudents(filename)); 

Je recommande toujours la lecture à travers une ligne problématique avec le même état d'esprit comme un compilateur: il ne sait rien sauf ce que vous lui avez dit, de haut en bas, de gauche à droite.

Alors commençons par le début:

int 

Je sais ce qu'est un int est! Vous voulez en déclarer un! Impressionnant! Continuons ...

Student 

Que diable est un Student? Je ne vois pas n'importe où dans le code qui me dirait ce que c'est! En tant qu'être humain, je peux déduire que c'est supposé être le nom d'une classe, puisque les noms de classe sont toujours en majuscules dans Java, mais ce n'est pas déclaré, donc le compilateur ne peut pas être sûr. Est-il peut-être censé être le nom de cette classe (au lieu de Lab7)? Plus important encore, s'il s'agit d'une classe, vous venez de nommer deux types de données d'affilée: int et Student. Quel type avez-vous l'intention d'utiliser? Vraisemblablement, si vous voulez une liste de Student s, le int n'est pas pertinent du tout. Si vous voulez le numéro des étudiants, puis juste le int est pertinent.

Passant:

students 

Que diable est un students?Je ne vois pas encore n'importe où dans le code qui me dirait ce que c'est!

Retournons-nous un instant. Qu'est-ce que vous essayez vraiment de faire ici? Vous essayez d'obtenir un tableau de tous les étudiants dans le fichier. La fonction getStudents() atteint vraisemblablement cela. (Il est peut-être bogué, mais ce n'est pas notre problème pour le moment, nous l'appelons ici, donc nous supposerons que cela fonctionne.)

Mais comment êtes-vous censé connaître la taille de la matrice si vous ne l'avez pas encore lu? Idéalement, vous n'avez pas besoin de savoir! Vous pouvez simplement écrire:

Student[] 

Vous êtes instanciation le tableau dans getStudents(), et que vous avez correctement donné une taille. Ici, en main() vous le déclarez simplement, et aucune taille n'est nécessaire.

Bon, alors pouvez-vous écrire juste:

Student[] = getStudents(FileIOHelper.getNumberOfStudents(filename)); 

Non, parce que votre variable ne porte pas de nom. Que diriez-vous quelque chose comme ceci:

Student[] students = getStudents(FileIOHelper.getNumberOfStudents(filename)); 

Je pense que ce que vous aviez l'intention, mais depuis que vous êtes coincé quelque part le long de la façon dont il est important d'être en mesure d'obtenir « décollée » et marcher mentalement ce que le compilateur voit est un moyen utile de le faire.

+0

Cela n'est vrai qu'avec un langage fortement typé. –

+0

Um ... le long de la ligne "think like a compiler": qu'est-ce que le * heck * est un "int Student []" ?? –

+0

Cela aide, je suppose, à utiliser la bonne langue. Edité en conséquence. – VoteyDisciple

5

Tout d'abord, il est toujours utile de faire vraiment attention à l'erreur du compilateur. Les erreurs compiantes de Java sont très claires et utiles la plupart du temps, et vous disent exactement ce qui ne va pas une fois que vous avez appris à les comprendre. Et en général, il est beaucoup plus facile pour les gens ici sur le SO pour vous aider si vous inclure le texte d'une erreur plutôt que de dire «J'ai du mal à obtenir à compilateur »

Ceci est la première ligne de toute évidence mal:

int Student[students] = getStudents(FileIOHelper.getNumberOfStudents(filename)); 

Une déclaration de variable en Java consiste en (un peu simplifié):

  • le type de la variable
  • son nom
  • o ptionally une cession d'une valeur initiale

Dans la ligne ci-dessus, vous commencez avec le type int, mais la partie suivante Student[students] n'a pas de sens - il ressemble à une instanciation de tableau, certainement pas un nom. Ce que vous probablement est voulu dire:

Student[] students = getStudents(FileIOHelper.getNumberOfStudents(filename)); 

à savoir le type est Student[] (un tableau d'objets d'étudiants), le nom est « étudiants », et il est attribué la valeur de retour de la méthode getStudents(). Un int n'est impliqué nulle part (vous n'avez pas besoin de spécifier la taille du tableau ici, car il est créé à l'intérieur de la méthode getStudents()).

+0

J'étais à mi-chemin à taper la même réponse –

+0

Aussi connu sous le problème "Le plus rapide du pistolet dans l'Ouest" :) –

+0

Évidemment, ce n'était pas évident. ;-) –

Questions connexes