Dziennik szkolny jako ArrayList

0

Cześć. Nie do wiary, że siedziałem nad tym z dwie godziny bo miałem milion problemów. Moglibyście mi pokazać jakie głupie błędy popełniłem?

 

import java.util.ArrayList;
import java.util.Scanner;

/**
 * Created by Maciej on 2015-10-05.
 */
public class Class {
    public static void main(String[] args) {
        StudentInfo studentInfo = new StudentInfo();
        Scanner scanner = new Scanner(System.in);
        int students;
        String name, fullname;
        System.out.println("Ilu uczniów jest w Twojej klasie?");
        students = scanner.nextInt();
        System.out.println("Dodawaj kolejno uczniów:");
        ArrayList<String> list = new ArrayList<String>(students);
        String details[] = new String[students];
        for(int i = 0; i<students; i++){
            name = scanner.next();
            fullname = scanner.next();
            list.add(name + " " + fullname);
            System.out.println("Uzupelnij dane: (Imie, Nazwisko, Matka, Ojciec, Zachowanie");
            details[i]= new StudentInfo().StudentData(scanner.next(), scanner.next(), scanner.next()+ " "+ scanner.next(), scanner.next());
            System.out.println("Kolejny uczen:");
        }
        for(int i=0; i<students; i++){
            System.out.println(i+1+". "+(String)list.get(i));
        }
        System.out.println("O kim chcesz wyswietlic informacje?");
        int x = scanner.nextInt()-1;
        System.out.println(details[x]);

    }
}
public class StudentInfo {
    public String StudentData(String n, String f, String b, String p) {
        String studentName = n;
        String studentFullname = f;
        String parents = p;
        String behavior = b;
        return studentName+" "+studentFullname+", "+parents+", "+behavior;

    }
}
0

Z całą pewnością głupotą było podejście do programowania w stylu faraonowatego maina - rozdziel ten kod ładnie na sensowne klasy i metody.
PS jaki sens ma klasa StudentInfo?

0

To już z czwarta godzina leci, a Ja nadal nie mogę sobie poradzić. Dobry jestem. Moglibyście mi powiedzieć dlaczego setStudent nie chce mi przypisać wartości dla tablicy?

public class AddStudent {

    public static String data(String n, String f){
        String name=n, fullname=f;
        return name+" "+fullname;
    }

    public static int setStudent(){
        DataInputStream in = new DataInputStream(System.in);
       try{
        int student = in.read();
       return student;}
       catch(Exception e){
           return -1;
       }
    }
    public static void Add(){

        Scanner scanner = new Scanner(System.in);
        System.out.println("Ilu mamy uczni w klasie?");
        ArrayList<String> register = new ArrayList<String>(setStudent());
        for(int i = 0; i<register.size(); i++){
            System.out.println("Wprowadz imie i naziwsko ucznia:");
            data(scanner.next(), scanner.next());
        }
     }
        }
    
 

W sumie to cały czas próbowałem ze scannerem. Na jakimś forum wyszukałem to DataInputStream, choć jeszcze nigdy nie miałem okazji tego używac. Uciekam spać a jutro dalej będę nad tym główkował.

0

Nie, nie, nie.
Zacznij od zrobienia klasy Student, która będzie przetrzymywać dane studenta.

0

Powstało coś takiego.

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

        StudentData studentData = new StudentData();
        AddStudent addStudent = new AddStudent();
        addStudent.add();
    }

}
import java.util.Scanner;

/**
 * Created by Maciej on 2015-10-06.
 */
public class StudentData {

        String name, fullname;
        int number, nstud;
        String studentname, studentfullname, studentparents, studentbehavior;

    public String data() {
        Scanner scanner = new Scanner(System.in);
        this.name = scanner.next();
        this.fullname = scanner.next();
        return name + " " + fullname;
    }

    public String extradata(){
        Scanner scanner = new Scanner(System.in);
        this.studentname = scanner.next();
        this.studentfullname = scanner.next();
        this.studentparents = scanner.next()+" i "+scanner.next();
        this.studentbehavior = String.valueOf(scanner.nextInt());
        return studentname+" "+studentfullname+", "+", "+studentparents+", "+studentbehavior;
    }

    public void students(){
     Scanner scanner = new Scanner(System.in);
     System.out.println("Ilu uczni mamy w klasie?");
     this.nstud = scanner.nextInt();
}
    public int getStudents(){
        return this.nstud;
    }
}
public class AddStudent {

    public static String add(){
            Scanner scanner = new Scanner(System.in);
            StudentData studentData = new StudentData();
        studentData.students();
            ArrayList<String> register = new ArrayList<String>(studentData.nstud);
            String extra[] = new String[studentData.nstud];
       for(int i = 0; i<studentData.nstud; i++)
            {
        register.add(studentData.data());
        System.out.println("Uzupelnic ucznia o dodatkowe dane?\n1=TAK\n2=NIE" );
                if(scanner.nextInt()==1)
                {
                extra[i] = studentData.extradata();
                }
                 else {
                System.out.println("Pominales krok.");
                }
            }

        for(int i = 0; i<register.size(); i++)
            {
            System.out.println(register.get(i));
            }
        System.out.println(extra[0]);

        return "1";
    }}
1

Nie wypełniłeś polecenia.
Nie kombinuj i zrób dokładnie klasę Student, która tylko i wyłącznie przechowuje dane.

0

No to zrobiłem klasę, która przechowuje dane.

public class Student {
    String name, surname, parents;
    int behavior, students;
}
 
1

@m4rku1s zrób tą klasę student, która opisuje Studenta daję Ci przykład:

private class Student {

        private String name;

        private String behavior;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getBehavior() {
            return behavior;
        }

        public void setBehavior(String behavior) {
            this.behavior = behavior;
        }
    }

PS pamiętaj, że możesz ten program kupić u mnie jakby Ci się nie chciało uczyć

1

Ok, a teraz zrób to na zasadzie:

String name; // imię studenta
String surname; // nazwisko studenta

I:
1.Ustaw wszystkie te pola prywatne.
2.Jaki cel ma pole students?

0

dlaczego Student ma mieć pole students ? Student to imie, nazwisko, wiek i takie rzeczy a nie jeszcze studenci w studencie.

Zrób porządnie klase student (same pola, gettery i settery i pokaż) a potem zrobisz dalej coś co przechowa tych studentów jakąś LISTE!!! albo MAPE!!! a nie tablice pff

0

Tak jak powiedzieliście, tak zrobiłem.

class Student {
    private String name; //imię studenta
    private String surname; // nazwisko studenta
    private String parents; //dane rodziców
    private int behavior; //zachowanie


    public void setname(String name) {
        this.name = name;
    }

    public String getName(){
        return name;
    }
    
    public void setSurname(String surname){
        this.surname=surname;
    }
    
    public String getSurname(){
        return surname;
    }
    
    public void setParents(String parents){
        this.parents=parents;
    }
    
    public String getParents(){
        return parents;
    }
    
    public void setBehavior(int behavior){
        this.behavior=behavior;
        
    }
    
    public int getBehavior(){
        return behavior;
    }
} 
0

Dlaczego imię i nazwisko osobno?

0

dobrze. no to teraz zrób sobie listę List<Student> students , która przechowuje tych studentów i wczytuj do niej dane od użytkownika. dodawaj w pętli do tej listy obiekt Student , który stworzysz z wczytanych danych .

@Patryk27 dobrze, że osobno. po co razem jak ktoś będzie miał na imię Michał a na nazwisko też Michał to co wtedy hmm ??

1

Faktycznie, sam sobie utrudniam sprawę.

 public void setFullname(String name, String surname) {
        this.name = name;
        this.surname = surname;
    }

    public String getFullname(){
        return name+" "+surname;
    } 
0

Zamiast

 int behavior 

zrobiłbym interfejs i trzymał go w studencie. Jeśli 'behavior' ma z góry określone wartości to zrobiłbym dodatkowo enuma który implementuje interfejs o którym wspomniałem, żeby mieć większą elastyczność.

0

Nah, nah, skoro potrzebujesz znać pełne imię i nazwisko to po co w ogóle te dwa pola rozdrabniać na osobne?
Choć tak, w ogólnym przypadku (jeśli potrzebujesz bo np. wyszukiwanie) to te dwie metody są spoko i jak najbardziej na miejscu.

0

Uprościłem sobie behavior i zmieniłem na String, co by łatwiej było.

public enum Behavior {
    NAGANNE(false),
    NIEODPOWIEDNIE(false),
    POPRAWNE(false),
    DOBRE(true),
    BDOBRE(true),
    CELUJACE(true);

    boolean grzeczny;

    private Behavior(boolean behavior){
        behavior = grzeczny;
    }
}
0
public class AddStudent {
    public void Add() {
        Scanner scanner = new Scanner(System.in);
        int registerSize = scanner.nextInt();
        List<String> students = new ArrayList<String>(registerSize);
        for(int i = 0; i<registerSize; i++){
            Student student = new Student();
            student.setFullname(scanner.next(), scanner.next());
            student.setParents(scanner.next());
            student.setBehavior(scanner.next());
            students.add(student.getFullname(), student.getParents(), student.getBehavior());
        }
    }
}
 

Coś tu jest nie tak.

@Edit
Wstawiłem przecinki zamiast znaku dodawania. Sam na to wpadłem!:D
Drugi dzień się męczę z dziennikiem. Im dalej w to brnę tym mniej w siebie wierze:D

@EDIT2

 public class AddStudent {
    public void Add() {
        Scanner scanner = new Scanner(System.in);
        int registerSize = scanner.nextInt();
        List<String> students = new ArrayList<String>(registerSize);
        for (int i = 0; i < registerSize; i++) {
            Student student = new Student();
            System.out.println("Wprowadz numer ucznia");
            student.setNumber(scanner.nextInt());
            System.out.println("Wprowadz imie i nazwisko:");
            student.setFullname(scanner.next(), " " + scanner.next());
            System.out.println("Ocena zachowania:");
            student.setBehavior(scanner.next());
            System.out.println("Wprowadz imię matki i ojca ucznia:");
            student.setParents(scanner.next() +" " + scanner.next());
            students.add(student.getNumber() + ". " + student.getFullname());

Już lepiej.

0

Po co osobna klasa AddStudent?

3

@m4rku1s zamiast listy stringów rób listę studentów. zrób sobie takie proste coś:

class StudentService {
    private List<Student> students = new ArrayList<Student>();
    private Scanner scanner = new Scanner(System.in);

    public void addStudentFromConsole() {
        Student student = new Student();
        student.setFullname(scanner.next(), scanner.next());
        student.setParents(scanner.next());
        student.setBehavior(Behavior.valueOf(scanner.next()));
        students.add(student);
    }

    public void addStudentsFromConsole() {
        int registerSize = scanner.nextInt();
        for (int i = 0; i < registerSize; i++) {
            addStudentFromConsole();
        }
    }

    public void printAllStudents() {
        for(Student student : students) {
            System.out.println(student.getName());
        }
    }
}
 

i w main

        StudentService studentService = new StudentService();
        studentService.addStudentsFromConsole();
        studentService.printAllStudents();

1 użytkowników online, w tym zalogowanych: 0, gości: 1