Имея много проблем с классами в Java - PullRequest
3 голосов
/ 17 февраля 2012

Я учусь использовать классы и методы, но ничто не может мне достучаться. Я прочитал разделы в учебнике и множество веб-страниц. Я пишу программу на Java, которая будет принимать оценки от 2-х тестов, промежуточных и итоговых и выкладывать все оценки, итоговую взвешенную оценку и буквенную оценку. Я пытался много раз, но не мог сделать это с помощью классов. Мне удалось написать программу, которая работает без реализации классов, но я ОЧЕНЬ хочу знать о классах.

Вот как я это делал без классов:

import java.util.Scanner;

public class grade {
    public static void main(String args[]) {


        //quiz method       
        Scanner keyboard = new Scanner(System.in);
        System.out.printf("Please enter the grade of Quiz 1: ");
        double a = keyboard.nextInt();

        System.out.printf("Please enter the grade of Quiz 2: ");
        double b = keyboard.nextInt();

        double c = (a + b);
        double d = (c / 20);
        double quizGrade = (d * 25);


        //midterm method
        System.out.printf("Please enter the grade of the Midterm: ");
        double aa = keyboard.nextInt();
        double bb = (aa / 100);
        double midtermGrade = (bb * 25);


        //final method
        System.out.printf("Please Enter the grade of the Final: ");
        double aaa = keyboard.nextInt();
        double bbb = (aaa / 100);
        double finalGrade = (bbb * 50);

        double overallGrade = (quizGrade + midtermGrade + finalGrade);

        System.out.printf("Score for Quiz 1 is: %f\n", a);
        System.out.printf("Score for Quiz 2 is: %f\n", b);
        System.out.printf("Score for Midterm is: %f\n", aa);
        System.out.printf("Score for Final is: %f\n", aaa);


        //figuring letter grade
        if (overallGrade >= 90) {
            System.out.printf("Your overall grade is: %f\n", overallGrade);
            System.out.printf("Your letter grade is: A\n");
        }
        if (overallGrade >= 80 && overallGrade <= 89) {
            System.out.printf("Your overall grade is: %f\n", overallGrade);
            System.out.printf("Your letter grade is: B\n");
        }
        if (overallGrade >= 70 && overallGrade<= 79) {
            System.out.printf("Your overall grade is: %f\n", overallGrade);
            System.out.printf("Your letter grade is: C\n");
        }
        if (overallGrade >= 60 && overallGrade<= 69) {
            System.out.printf("Your overall grade is: %f\n", overallGrade);
            System.out.printf("Your letter grade is: D\n");
        }
        if (overallGrade < 60) {
            System.out.printf("Your overall grade is: %f\n", overallGrade);
            System.out.printf("Your letter grade is: F\n");
        }
    }

}

И вот как я попробовал это с классами ... Я думаю, можно с уверенностью сказать, что я понятия не имею, что я делаю:

import java.util.Scanner;

public class grade2 {
    Scanner keyboard = new Scanner(System.in);
    System.out.printf("Please enter the grade of Quiz 1: ");
    double grade1 = keyboard.nextInt();
    System.out.printf("Please enter the grade of Quiz 2: ");
    double grade11 = keyboard.nextInt();
    System.out.printf("Please enter the grade of the Midterm: ");
    double grade2 = keyboard.nextInt();
    System.out.printf("Please enter the grade of the Final: ");
    double grade3 = keyboard.nextInt();

    public static double quizgrade(double grade1, double grade11) {
        //quiz      
        double a = grade1
        double b = grade11

        double c = (a + b);
        double d = (c / 20);
        double quizGrade = (d * 25);
        return quizGrade;
    }

    public static double midtermgrade(double grade2) {
        //midterm
        double aa = grade2
        double bb = (aa / 100);
        double midtermGrade = (bb * 25);
        return midtermGrade;
    }

    public static double finalgrade(double grade3) {
        //final
        double aaa = grade3
        double bbb = (aaa / 100);
        double finalGrade = (bbb * 50);
        return finalGrade;
    }

        double overallGrade = (quizgrade + midtermgrade + finalgrade);

        System.out.printf("Quiz 1 grade is: %f\n", grade1);
        System.out.printf("Quiz 2 grade is: %f\n", grade11);
        System.out.printf("Midterm grade is: %f\n", grade2);
        System.out.printf("Final grade is: %f\n", grade3);


        //figuring letter grade
        if (overallGrade >= 90) {
            System.out.printf("Your overall grade is: %f\n", overallGrade);
            System.out.printf("Your letter grade is: A\n");
        }
        if (overallGrade >= 80 && overallGrade <= 89) {
            System.out.printf("Your overall grade is: %f\n", overallGrade);
            System.out.printf("Your letter grade is: B\n");
        }
        if (overallGrade >= 70 && overallGrade<= 79) {
            System.out.printf("Your overall grade is: %f\n", overallGrade);
            System.out.printf("Your letter grade is: C\n");
        }
        if (overallGrade >= 60 && overallGrade<= 69) {
            System.out.printf("Your overall grade is: %f\n", overallGrade);
            System.out.printf("Your letter grade is: D\n");
        }
        if (overallGrade < 60) {
            System.out.printf("Your overall grade is: %f\n", overallGrade);
            System.out.printf("Your letter grade is: F\n");
        }
}

Любая помощь? Этот материал не смущает до конца!

Ответы [ 7 ]

1 голос
/ 17 февраля 2012

Ваша первая цель должна состоять в том, чтобы заставить ваш код выполняться, чтобы вы могли изучить его и понять, что происходит, а затем вы можете узнать о других аспектах ООП.

В вашем первомфрагмент кода, вы обернули класс вокруг процедурного кода и, поскольку он находится внутри статического метода main, он будет выполняться при запуске вашей программы.Однако, со второй попытки вы нигде не создаете экземпляр класса (объекта), так как же что-нибудь может выполнить?Основного метода не существует, поэтому, если вы не создадите экземпляр класса 2 где-то еще, ваш код никогда не будет выполнен.

Для реализации с одним классом у вас будет статический метод main внутри объекта grade2, который создаетэкземпляр самого себя (я бы посоветовал имена классов с заглавными именами), например:

public class Grade2 {

    static void main(String[] args) {

        Grade2 grade2 = new Grade2(); // Construct (instantiate) the object.

        // Access methods etc. on the grade2 instance.
        grade2.doStuff(args);
    }

    // Other methods etc.
}

Итак, создав экземпляр своего класса, вы можете затем использовать экземпляр (grade2) для вызова методов и доступа к переменными т.д. Я пока не хочу перегружать вас доступом (общедоступным, частным, защищенным).Но если вы сможете обернуть голову вокруг этого, то начнете набирать обороты другие аспекты ООП.

Удачи!

0 голосов
/ 17 февраля 2012

Просто для хихиканья, мой рефакторинг.На самом деле не доведено до конца, но настроено показывать несколько идей, таких как:

  • Конструкторы
  • Фабричный метод
  • Статический и экземплярный методы
  • Более чистая обработка ввода / вывода
  • toString() метод

Веселитесь.

import java.io.InputStream;
import java.util.Scanner;

public class Grade2 {

  /** In fractions of available points. */
  final double quiz1Grade;

  /** In fractions of available points. */
  final double quiz2Grade;

  /** In fractions of available points. */
  final double midtermGrade;

  /** In fractions of available points. */
  final double finalGrade;

  Grade2(double quiz1Grade, double quiz2Grade, double midtermGrade,
      double finalGrade) 
  {
    this.quiz1Grade = quiz1Grade;
    this.quiz2Grade = quiz2Grade;
    this.midtermGrade = midtermGrade;
    this.finalGrade = finalGrade;
  }

  /** returns a final grade in percentage points. */
  public double overallGrade()
  {
    // weighted sum out of 100
    return ((quiz1Grade + quiz2Grade) * 25) + 
           (midtermGrade * 25) +
           (finalGrade * 50);
  }

  private static String letterGrade(double overallGrade)
  {
    final String letter;
    //figuring letter grade
    if (overallGrade >= 90) {
        letter= "A";
    } else if (overallGrade >= 80 && overallGrade <= 89) {
      letter= "B";
    } else if (overallGrade >= 70 && overallGrade<= 79) {
      letter= "C";
    } else if (overallGrade >= 60 && overallGrade<= 69) {
      letter= "D";
    } else if (overallGrade < 60) {
      letter= "F";
    } else {
      letter = "UNKNOWN "+overallGrade;
    }
    return letter;
  }

  public void reportGrade()
  {
    double overallGrade = overallGrade();
    String letter = letterGrade(overallGrade);
    System.out.printf("Your overall grade is: %f\n", overallGrade);
    System.out.printf("Your letter grade is:" + letter + "\n");
  }

  @Override
  public String toString()
  {
    return String.format("Score for Quiz 1 is: %f\n", quiz1Grade) +
    String.format("Score for Quiz 2 is: %f\n", quiz2Grade) +
    String.format("Score for Midterm is: %f\n", midtermGrade) +
    String.format("Score for Final is: %f\n", finalGrade);    
  }

  public static Grade2 readGradeFrom(final InputStream in)
  {
    Scanner keyboard = new Scanner(in);
    System.out.printf("Please enter the grade of Quiz 1: ");
    int quiz1 = keyboard.nextInt();
    // in points out of 10

    System.out.printf("Please enter the grade of Quiz 2: ");
    int quiz2 = keyboard.nextInt();
    // in points out of 10

    //midterm method
    System.out.printf("Please enter the grade of the Midterm: ");
    int midterm = keyboard.nextInt();
    // in points out of 25

    //final method
    System.out.printf("Please Enter the grade of the Final: ");
    int finalTest = keyboard.nextInt();
    // in points out of 100

    return new Grade2( quiz1 / 10.0, quiz2/10.0, midterm / 25.0, finalTest / 100.0);
  }



  public static void main(String args[]) 
  {
    Grade2 grade = readGradeFrom(System.in);
    grade.reportGrade();
  }
  }
0 голосов
/ 17 февраля 2012

Может пойти так:

public class GradesReport{

    //Here you store keyboard input
    private double quizOneGrade;
    private double quizTwoGrade;
    private double midtermGrade;
    private double finalGrade;

    public printAllGrades(){
        //Send all attributtes to standart output
    }


    public getOverallGrade(){
        //Do your algorithm magic here
    }

    // Getters and setters here. If you want some formatting do that there

Вы создаете экземпляр этого класса с помощью ввода с клавиатуры другого класса, у которого есть метод main.

0 голосов
/ 17 февраля 2012

Я предлагаю перенести это на https://codereview.stackexchange.com/.

По сути, классы являются моделями для экземпляров (также называемых объектами).Все экземпляры одного класса можно использовать с помощью методов, предоставляемых этим классом.Пример:

class Color {
  // instance variable
  String name;

  // constructor
  Color(String nameOfColor) {
    name = nameOfColor;
  }
}

Color red = new Color("red");
Color green = new Color("green");

System.out.println(red.name) // prints "red"
System.out.println(green.name) // prints "green"

Это то, что произошло выше:

  1. Мы объявили класс Color
  2. Мы создали два объекта класса Color с именами red изеленый
  3. Мы использовали метод name, чтобы напечатать название цвета

Вы можете видеть, что мы использовали один и тот же метод (name) для обоих цветов, но получили разные результаты.Это потому, что переменные каждого экземпляра отличаются, но модель (класс) остается прежней.

Вы использовали статические методы, они не имеют доступа к переменным (состоянию) экземпляра, но могут бытьвызывается непосредственно в классе (экземпляр не нужен).НО программирование со статическими методами не очень объектно-ориентировано, то есть не основано на классах.Его функциональное программирование.

0 голосов
/ 17 февраля 2012

Во-первых, вам нужно идентифицировать объект реального мира, который вам нужно представить

В вашем случае это Grade, Test, User

Test может иметь тип - Quiz, MidTerm, Final

Каждый пользователь получит оценку за каждый тип теста

  Class User {

   List<Test> testList ;

   public double getQuizGrade() { .. }
   public double getMidTermGrade() { .. }
   public double getFinalTermGrade() {..} 
   public String getOverAllGrade() { .. }

   }

   Class Test {
   // define an enum of TestType( QUIZ , MIDTERM , FINALTERM)
   Grade g ;

   }

   Class Grade {
   double marks ; 
   }

Теперь, когда вы смоделировали эти классы, вы можете продолжить и добавить основной метод, который будет фиксировать оценки для каждого из них.проверить, что пользователь берет и при вызове соответствующего пользовательского метода вычисляет и дает оценку

0 голосов
/ 17 февраля 2012

Ладно ... Иногда я думаю, что это похоже на поездку на велосипеде ... у тебя его нет, но как только он у тебя будет, он останется на всю жизнь.

Ты хочешь решитьэта проблема с использованием некоторых классов ... хорошо.

Прежде всего, разбейте это на две вещи ... программу (вещь, которая будет принимать входные данные от пользователя) и модель (или домен).

Ваша модель - это просто серия занятий.Проще говоря, давайте создадим класс с именем

Ученик класса с именем Экзамен

У ученика могут быть поля с личным строковым именем;

и, возможно, некоторые другие,частный экзамен в середине срока;индивидуальный выпускной экзамен;приватный экзамен;

создайте методы получения и установки для этих полей

хорошо ... надеюсь, вы все еще со мной.Если это кажется простым, попробуйте внедрить вес экзамена в подклассы для экзаменов.

Ваш суперкласс экзамена (если вы решили пойти по маршруту подкласса) имеет метод, называемый что-то вроде getWeightedExamMark или как вы хотите его вызывать.Возвращает двойное число и принимает двойное в своей подписи.Подклассифицируя экзамен, скажем, в Final, Midterm и Quiz, этот метод можно переопределить, чтобы применить правила того, сколько это стоит.

На самом деле, вы должны переместить три объекта Exam из класса Student вкласс ReportCard ... тогда у вас есть метод на ReportCard метода getMark (), который связывает методы getWeightedExamMark из трех подклассов экзамена для отображения итоговой оценки.

Я бы написал код, но подумал, что этолучше вести вас, чтобы вы выучили синтаксис и структурировали себя.

Удачи.

0 голосов
/ 17 февраля 2012

в ООП, когда вы указываете, что метод или переменная статичнее, чем, он является членом класса.Если он не статичен, он является членом экземпляра этого класса.Также, глядя на конструкторы, первое, что вызывается при создании нового экземпляра класса.

ex.

public class grade2{
       static{
         //this is a static block that is only called on the first time an instance of the class is ran
     }
   public grade2(){
         //this is a constructor
       }
}
...