1

コードにいくつか問題があります。これがプログラムの全体的な目標です。

あなたの教授の 1 人が、あなたがプログラミングの専門知識を身に付けていると聞いて、採点に役立てるために使用できる単一のプログラムを作成するように依頼しました。教授は 3 つの 50 点の試験と 1 つの 100 点の最終試験を行います。あなたのプログラムは、学生の名前、Firstname Lastname (つまり、Bob Smith)、学生の 3 つの試験の点数、および 1 つの最終的な試験の点数 (すべて整数) として入力するようにユーザーに要求します。クラスのサイズは学期ごとに異なりますが、100 が上限です (定数として宣言します)。

計算を行ったり出力を表示したりする前に、すべての生徒の情報を読み込みます。3 つの試験の点数が 0 ~ 50 点で、最終が 0 ~ 100 点であることを確認してください。必要に応じて簡単に更新できるように、最小値と最大値を定数として宣言しました。無効な場合は、エラー メッセージを表示し、ユーザーがその無効なスコアを再入力できるようにします。すべての学生情報が読み込まれたら、各学生の名前を LASTNAME、FIRSTNAME (すべて大文字) の形式で表示し、学生の試験のパーセンテージ (すべての試験の合計と最終 / 可能な合計) を小数第 1 位まで表示し、学生の最終成績を表示します。

これは私が持っているものです:

import java.util.*;
import java.text.*;


public class Proj4 {
public static void main(String[] args){
Scanner s= new Scanner(System.in);
String input;
String again = "y";
final int MAX_STUDENTS = 100;
final int MIN_EXAM = 0;
final int MAX_EXAM = 50;
final int MIN_FINAL = 0;
final int MAX_FINAL = 100;

String[] names = new String[MAX_STUDENTS];
int [] exams = new int[MAX_STUDENTS * 4];
int student = 1;

do
{
        System.out.print("PLease enter the name of student " + student + ": " );
        for (int k = 0; k < 1; k++) {
            names[k] = s.nextLine().toUpperCase();
        }
        for ( int i = 0; i < 4; i++){
            if(i==3){
                System.out.print("Please enter score for Final Exam: ");
                exams[i] = s.nextInt();
            }
            else{
            System.out.print("Please enter score for Exam " + (i+1) + ": ");
            exams[i] = s.nextInt(); 

                if((exams[0]<MIN_EXAM||exams[0]>MAX_EXAM)||(exams[1]<MIN_EXAM||exams[1]>MAX_EXAM)||(exams[2]<MIN_EXAM||exams[2]>MAX_EXAM)){
                    System.out.println("Invalid enter 0-50 only...");
                    System.out.print("Please re-enter score: ");
                    exams[i] = s.nextInt();
                }
                else if(exams[3]<MIN_FINAL||exams[3]>MAX_FINAL){
                    System.out.println("Invalid enter 0-100 only...");
                    System.out.print("Please re-enter score: ");
                    exams[i] = s.nextInt();
                }
            }
        }
        System.out.print("do you wish to enter another? (y or n) ");
        again = s.next();
        if(again!="y")
            student++;
}while (again.equalsIgnoreCase ("y"));

System.out.println("***Class Results***");
System.out.println(names[1] + "," + names[0] + "   " + "Exam Percentage: "+ ((exams[0]+exams[1]+exams[2]+exams[3])/(MAX_EXAM*3+MAX_FINAL)));

}
}

私が抱えている問題は次のとおりです。

  • 最初の生徒だけでなく、ユーザーが入力したテストのスコアを割り当てる方法を考え出すと、1 人だけに正しく設定されていると思いますが、2 番目の生徒に移ると問題が発生します。
  • 何故か線引きが出来ない

    System.out.print("do you wish to enter another? (y or n) ");
    again = s.next();
    

    では何も入力できません。y ではなく n ではありません。そのため、プログラムは実質的にそこで終了します。以前とまったく同じように実行したことがあり、機能しているため、意味がありません。

  • それ以外に、私のコードで見られる他の問題がある場合は、それらを指摘すると非常に役立ちます。

ありがとうございました

編集-

に変更した後、私が抱えている新しい問題

if(!again.equalsIgnoreCase("y"))
            student++;
}while (again.equalsIgnoreCase ("y"));

今は入力できますが、 y を入力すると、次の行が次のように出力されます

生徒 1 の名前を入力してください: 試験 1 のスコアを入力してください:

なぜ、または何を変更して修正する必要があるのか​​ わかりません。何か提案はありますか?

4

3 に答える 3

1
`if(again!="y")` is the culprit here 

文字列が等しいかどうかを確認するには、 equals() メソッドを使用する必要があります。

if(!again.equals("y"))

于 2013-03-01T16:51:56.833 に答える
1

==or演算子を使用してJavaで文字列を比較する場合、!=実際には値を比較していません。代わりに、2 つの String が同じObjectであるかどうかをテストしています。

この投稿では、文字列の比較についてよく説明しています。

やりたいことをするには、に変更if (again != "y")しますif(! (again.equalsIgnoreCase("y")) )

編集

あなたの新しい問題は、forループ内で行う最初のループに起因すると思いdoます。最後に「y」と入力するたびにdo/while、全体が実行されます

for (int k = 0; k < 1; k++) {

再びループします。これが、「y」と入力した後に表示される理由ですPlease enter the name of student 1: Please enter score for Exam 1:

新しい問題の「解決策」は、for通常「ダブル​​ for」または「ネストされた for ループ」と呼ばれる、学生ごとに 4 つの試験をループして、外側が内側のものを囲むようにすることです。

とはいえ、すべての学生のすべての試験を 1 つの配列にまとめるという問題が発生します。

今こそ、腰を落ち着けて、プログラムの設計について真剣に考えるときだと思います。Studentオブジェクトを使用して学生を表し、試験の点数を保持すると、IMOははるかに簡単になります。Student次に、現在の 2 つの異なる配列とは対照的に、s の配列を作成できます。

ここにいくつかの「スターター」ステップがあります (必ずしも完全なリストではありません):

  1. Student学生の姓と名の変数と、そのStudent試験の点数を保持する配列を持つクラスを作成します
  2. メイン クラスで、作成ArrayListするすべての新しいStudentオブジェクトを保持する を作成します。
  3. do/whileループを実行します。ループの開始時に、新しいStudentオブジェクトを作成します。次に、Students の名前と試験の点数を尋ねます (4 つの試験の点数しかないことがわかっている場合は、そこで追加のロジックを実行する必要はありません。for ループを使用して 4 つの試験の点数を要求するだけです)。一度にすべてが必要な場合.可変数のスコアがある場合は、何らかのチェックを行う必要があります)
  4. Student作成した new をArrayListofに追加しますStudent
  5. 人が「n」を選択したら、 をループして、ArrayListそれぞれの情報を出力しますStudent
于 2013-03-01T16:54:52.770 に答える
0

for (int k = 0; k < 1; k++) ループは、k < 1 のときにのみ実行するように設定されているため、(1 人の学生に対して) 1 回だけ実行されます。これは 1 回だけ実行されます。k を 1 に増やすとすぐに、ループは停止します。これを for (int k = 0; k < MAX_STUDENTS; k++) に変更して、許可されている学生の最大数に達するまでループするようにします。

于 2013-03-01T17:05:55.083 に答える