- •Отчет по предмету „Java”
- •Листинг:
- •Dare de seama la „Java”
- •Varianta: № 00
- •Exemplul lucrării practice (listingul programului)
- •Rezultatele rulării programului (testingul programului)
- •Schema de calcul a notei generale la obiectul Java
- •Dare de seama la „Java”
- •Varianta: №
- •2. Formularea problemei
Листинг:
class Student
{
String name; // имя студента
float lazy; //коэффициент лени студента
double IQ; //коэффициент интеллекта студента
byte exams; //число экзаменов студента
int marks[]; //динамический вектор оценок студента
static int nr; //число созданных студентов (объектов класса)
////////////////////////////////////// конструкторы ////////////////////////////////////////
Student () // конструктор по умолчанию (без параметров) без ввода с клавиатуры (-1балл)
{
name = ”Oboltus Ivanovici”;
lazy = 0.5f;
IQ = 120.7;
exams = 6;
marks = new int[exams]; //выделяем память под вектор оценок – тип элем. int, их число = exams;
for (int y=0; y<exams; y++) //в цикле заполняем вектор восьмерками. Переменная цикла - y
marks[y] = 8;
nr ++; //если вызван конструктор => создан еще один объект => их число ( nr ) увеличивается
}
Student (float new_lazy, double IQ, byte new_exams) // конструктор с 3 параметрами
{
name = “Obormot Petrovici”;
if ( (new_lazy >= 0) && (new_lazy <= 1) ) //перед использ. парам. new_lazy, проверяем его корректность
lazy = new_lazy; //если он правелен, суем его значение в поле lazy
if ( (IQ >= 100) && (IQ <= 200) ) //перед использ. парам. IQ, проверяем его корректность
this.IQ = IQ; //если он правелен, суем его значение в поле this.IQ
if ( (new_exams >= 0) && (new_exams < 20) ) // перед использ. парам. new_exams, проверяем его корректность
exams = new_exams; //если он правелен, суем его значение в поле exams
marks = new int[exams]; //выделяем память под вектор оценок – тип элем. int, их число = exams;
for (int i=0; i<exams; i++) //в цикле заполняем вектор девятками. Переменная цикла - i
marks[i] = 9;
nr ++; //если вызван конструктор => создан еще один объект => их число ( nr ) увеличивается
}
Student (String name, double iq) //конструктор с другим набором параметров
{
this.name = name; //чтобы разделить имя параметра и имя поля, используем this
lazy = 0.8f;
if ( (iq >= 100) && (iq <= 200) ) //проверяем параметр iq на корректность
IQ = iq;
exams = 4;
marks = new int[exams]; //выделяем память под вектор оценок – тип элем. int, их число = exams;
for (int i=0; i<exams; i++) //в цикле заполняем вектор деcятками. Переменная цикла - i
marks[i] = 10;
nr ++; //если вызван конструктор => создан еще один объект => их число ( nr ) увеличивается
}
Student (Student Clon) //конструктор копирования обязан скопировать ВСЕ поля объекта-параметра Clon
{
name = Clon.name;
lazy = Clon.lazy;
IQ = Clon.IQ;
exams = Clon.exams;
marks = new int[exams]; //выделяем память под вектор оценок – тип элем. int, их число = exams;
for (int i=0; i<exams; i++)
marks[i] = Clon.marks[i];
nr ++; //если вызван конструктор => создан еще один объект => их число ( nr ) увеличивается
}
////////////////////////////////////// методы доступа к полям (get_*) ////////////////////////////////////////
public String get_name() // доступ к полю класса name - возвращает копию-значение этого поля
{
return name; // return this.name
}
public float get_lazy() //доступ к полю класса lazy – возвращает копию-значение этого поля
{
return lazy; //return this.lazy
}
public double get_IQ() //доступ к полю класса IQ – возвращает копию-значение этого поля
{
return IQ; //return this.IQ
}
public byte get_exams() //доступ к полю класса exams – возвращает копию-значение этого поля
{
return exams; //return this.exams
}
public int get_mark(int index) //доступ к элементу вектора marks под номером index, т.е. к конкретной оценке
{
if ( (index >= 0) && (index < exams) ) //проверим, существует ли вообще экзамен с введенным № (index)
return marks[index]; //если да, то возвращаем оценку под этим номером
else //если нет – выводим сообщение, что такого экзамена не существует
{
System.out.println(“such exam doesn’t exist”);
return -1;
}
}
////////////////////////////////////// методы изменения полей (set_*) ////////////////////////////////////////
public void set_name(String new_name) //изменение поля класса name на новое значение параметра new_name
{
name = new_name; // this.name = new_name;
}
public void set_lazy(float new_lazy) //изменение поля класса lazy на новое значение параметра new_lazy
{
if ( (new_lazy >= 0) && (new_lazy <= 1) ) //перед использ. парам. new_lazy, проверяем его корректность
lazy = new_lazy; //если он правелен, суем его значение в поле lazy
}
public void set_IQ( double new_IQ) //изменение поля класса IQ на новое значение параметра new_IQ
{
if ( (new_IQ >= 100) && (new_IQ <= 200) ) //перед использ. парам. new_IQ, проверяем его корректность
IQ = new_IQ; //если он правелен, суем его значение в поле IQ
}
public void set_exams(byte new_exams) //изменение поля класса exams на новое значение new_exams
{
if ( (new_exams >= 0) && (new_exams <= 20) && (new_exams != exams) ) //проверяем new_exams на корректность
{
exams = new_exams; //если параметр правелен, суем его значение в поле exams
marks = new int[new_exams]; //т.к. изменилось число экзаменов, должно измениться и число оценок =>
} //перевыделяем память для marks. При этом теряются бывшие оценки (-1балл)
} //В идеале их надо сохранить в промежут. вектор, и оттуда переписать в новый вектор marks с перевыделенной памятью.
public void set_mark(int index, int new_mark) //изменение одной оценки (под № = index) из marks на new_mark
{
if ( (index >= 0) && (index < exams) && (new_mark >= 0) && (new_mark <= 10) ) //проверяем правильность параметров
marks[index] = new_mark; //если они корректны, суем новую оценку new_mark в ячейку № index
}
//////////////////////////////////////метод вывода на экран всех полей класса/////////////////////////////////////////
public void printInfo()
{
System.out.println (“ Student’s name is…………… ” + name );
System.out.println (“ Student’s laziness is….… ” + lazy );
System.out.println (“ Student’s IQ is………….…… ” + IQ );
System.out.println (“ Student has …………….……… ” + exams + “ exams” );
System.out.println (“ Student’s marks are : “ );
for (int i=0; i<exams; i++)
System.out.print (“ ” + marks[i] + “ ”); //выводим в одну строчку через пробел все оценки студента
System.out.println (“ \n ----------------------------------------------------------- “ );
}
//////////////////////////////////////метод подсчета среднего балла студента/////////////////////////////////////////
public double averageMark()
{ int sum = 0;
for (int i=0; i<exams; i++) //вычисляем сумму всех оценок студента
sum += marks[i]; //по одному элементу вектора (по одной оценке, начиная с 0 позиции до последней, exams)
return (sum/exams); //возвращаем среднее арифметическое оценок, т.е. сумма / число оценок
}
/////////////////////////////////////////метод подсчета степендии студента///////////////////////////////////////////
public double bursary()
{
return ( 500 + IQ / lazy ); //чем больше IQ и чем меньше лень, тем больше стипендия :)
}
////////////////////////////////////////////////метод «отличник»/////////////////////////////////////////////////////
public void otli4nik (Student Vasea)
{
if ( this.averageMark() > Vasea.averageMark() ) //если вызывающий студент учится лучше студента-параметра Васи
System.out.println ( this.name + “ learns better, than ” + Vasea.name );
if ( this.averageMark() < Vasea.averageMark() ) //если вызывающий студент учится хуже студента-параметра Васи
System.out.println ( Vasea.name + “ learns better, than ” + name );
else
System.out.println ( Vasea.name + “ and ” + name + “ learn equally ” );
} //если вызывающий и студент-параметр Вася учатся одинаково
////////////////////////////////////////////////метод «умник»/////////////////////////////////////////////////////
public static void umnik (Student Andrei, Student Vasea)
{
if ( Andrei.bursary() > Vasea.bursary() ) //если первый студент Андрей умнее второго Васи (получает стипендии выше)
System.out.println ( Andrei.name + “ is smarter, than ” + Vasea.name );
if ( Andrei.IQ > Vasea.IQ ) //если первый студент Андрей глупее (меньше стипендия) второго Васи
System.out.println ( Vasea.name + “ is smarter, than” + Andrei.name );
else
System.out.println ( Vasea.name + “ and ” + Andrei.name + “ are equally intelligent ” );
} //если оба студента-параметра одинаково умны (глупы) (стипендии равны)
//////////////////////////////////////////// главная функция main //////////////////////////////////////////////////
public static void main (String args[])
{
System.out.println("\n");
Student Alex = new Student (); //создаем объект - студента Alex - конструктором по умолчанию (без параметров)
Alex.printInfo(); //выводим на экран всю подноготную студента Alex
Student Dima = new Student (0.4f, 130.8, (byte)5); //создаем студента Dima, используя конструктор с 3-мя параметрами.
Dima.printInfo(); //выводим на экран всю подноготную студента Dima
Student Galea = new Student ( “Nicorici Galina”, 180.9 ); // Галю мы создали конструктором с 2-мя параметрами.
Galea.printInfo(); //выводим на экран всю подноготную студентки Galea
Student Dolly = new Student (Dima); //студентка Dolly была склонирована (создана конструктором копирования) с Димы
Dolly.printInfo(); //выводим на экран всю подноготную студентки Dolly
int nrStudGrupa = 8;
Student grupa[] = new Student[nrStudGrupa] ; //создаем и выделяем память под группу студентов – динамич.вектор из 12 эл-тов
for (int i=0; i< nrStudGrupa; i+=4) // заполняем элементы вектора объектами класса студент
{
grupa[i] = new Student(); //элементы 0, 4 заполняем студентами, создавая их дефолтным конструктором
grupa[i+1] = new Student(0.7f, 180.0, (byte)3); //элементы 1, 5 заполняем объектами, созд. конструктором с 3 парам.
grupa[i+2] = new Student(“Student”+(i+2), 145.9); //эл-ты 2, 6 – конструктор с 2 параметрами
grupa[i+3] = new Student(Alex); // grupa[i+3] = new Student(grupa[i]); // эл-ты 3, 7 – копируем с Alex-a.
}
for (int i=0; i< nrStudGrupa; i++) //в цикле выводим инфу по всем студентам из группы
{
grupa[i].set_name("Student nr "+ (i+1)); //меняем имя каждого студента группы на Student nr 1, Student nr 2, и т.д.
grupa[i].printInfo(); // grupa[0], grupa[1], и т.д – это имена объектов, находящихся в конкретных ячейках 0, 1.
}
Dolly.otli4nik(Dima); // сравниваем, кто лучше учится: Долли (вызывающий объект (текущий)) или Дима.
Galea.otli4nik(grupa[2]); // сравниваем, кто лучше учится: Галя (вызывающий объект (текущий)) или grupa[2].
grupa[0].otli4nik(Alex); // сравниваем, кто лучше учится: grupa[0] (вызывающий объект (текущий)) Алекс.
grupa[7].otli4nik(grupa[5]); // сравниваем, кто лучше учится: grupa[7] (вызывающий объект (текущий)) или grupa[5].
System.out.println("\n");
umnik(Alex, Dolly); //смотрим, кто умнее: Алекс или Долли
umnik(grupa[6], Galea); //смотрим, кто умнее: седьмой студент в группе ( grupa[6] ) или Галя
umnik(grupa[3], grupa[7]); //смотрим, кто умнее: четвертый или восьмой студент в группе
System.out.println("\n");
float maxLazy = 0; //в переменную maxLazy будем сохранять максимальный коэффициент лени студента
int indexMaxLazy = 0; //в переменную indexMaxLazy сохраним номер студента в группе с наибольшей ленью
for (int i=0; i<12; i++) //пройдемся по всем студентам группы
{
if (grupa[i].lazy > maxLazy) // и если лень текущего (i-го) студента больше нашей maxLazy,
{
maxLazy = grupa[i].lazy; // то запомним лень текущего студента в maxLazy
indexMaxLazy = i; // и запомним № самого ленивого на данный момент студента в indexMaxLazy
}
}
System.out.println (“\n\n The champion in Lazyness is ” + grupa[indexMaxLazy].name + “ ! ! ! ”); //печатаем имя наилентяистого :)
// выводим число созданных студентов, т.е. статич. переменную nr (к ней можно обратиться и от имени класса: Student.nr)
System.out.println (“\n We created ” + nr + “ students…”); // System.out.println (“\n We created ” + Student.nr + “ students…”);
}
}
Результат работы программы (Тестовые примеры):
D:\JDK\bin>javac StudentTest.java
D:\JDK\bin>java Student
Students name is Oboltus Ivanovici
Students lazyness is 0.5
Students IQ is 120.7
Student has 6 exams
Students marks are :
8 8 8 8 8 8
--------------------------------------
Students name is Obormot Petrovici
Students lazyness is 0.4
Students IQ is 130.8
Student has 5 exams
Students marks are :
9 9 9 9 9
--------------------------------------
Students name is Nicorici Galina
Students lazyness is 0.8
Students IQ is 180.9
Student has 4 exams
Students marks are :
10 10 10 10
--------------------------------------
Students name is Oboltus Ivanovici
Students lazyness is 0.5
Students IQ is 120.7
Student has 6 exams
Students marks are :
8 8 8 8 8 8
--------------------------------------
Students name is Student nr 1
Students lazyness is 0.5
Students IQ is 120.7
Student has 6 exams
Students marks are :
8 8 8 8 8 8
--------------------------------------
Students name is Student nr 2
Students lazyness is 0.7
Students IQ is 180.0
Student has 3 exams
Students marks are :
9 9 9
--------------------------------------
Students name is Student nr 3
Students lazyness is 0.8
Students IQ is 145.9
Student has 4 exams
Students marks are :
10 10 10 10
--------------------------------------
Students name is Student nr 4
Students lazyness is 0.5
Students IQ is 120.7
Student has 6 exams
Students marks are :
8 8 8 8 8 8
--------------------------------------
Students name is Student nr 5
Students lazyness is 0.5
Students IQ is 120.7
Student has 6 exams
Students marks are :
8 8 8 8 8 8
--------------------------------------
Students name is Student nr 6
Students lazyness is 0.7
Students IQ is 180.0
Student has 3 exams
Students marks are :
9 9 9
--------------------------------------
Students name is Student nr 7
Students lazyness is 0.8
Students IQ is 145.9
Student has 4 exams
Students marks are :
10 10 10 10
--------------------------------------
Students name is Student nr 8
Students lazyness is 0.5
Students IQ is 120.7
Student has 6 exams
Students marks are :
8 8 8 8 8 8
--------------------------------------
Obormot Petrovici learns better, than Oboltus Ivanovici
Student nr 3 and Nicorici Galina learn equally
Oboltus Ivanovici and Student nr 1 learn equally
Student nr 6 learns better, than Student nr 8
Obormot Petrovici is smarter, than Oboltus Ivanovici
Oboltus Ivanovici is smarter, thanObormot Petrovici
Nicorici Galina and Student nr 7 are equally intelligent
Student nr 8 and Student nr 4 are equally intelligent
The champion in Lazyness is Student nr 3 ! ! !
We created 12 students
D:\JDK\bin>
Выводы.
Это раздел, где нужно вкратце описать, навыки работы с чем были усвоены в этой лабораторной работе, что в ней получилось универсальным, а какие механизмы или функции - с более ограниченными возможностями… В общем - что хорошо, и что - плохо на Ваш взгляд.
Я же хочу прокомментировать следующие моменты. Пример лабораторной работы №1 Вариант 00 реализован на оценку 7. Т.к. в конструкторе по умолчанию не описан ввод с клавиатуры значений для полей класса (-1 балл), не описан алгоритм сохранения старых значений оценок в методе set_exams (-1 балл) и не описана работа с текстовым файлом (-1 балл). Обязательное условие (проверять ВСЕ входные параметры (простых типов) в функции на корректность перед тем, как их использовать) выполнено. В примере приведен только один вариант работы программы потому, что в коде не реализовано считывание с клавиатуры, поэтому никаких динамических вариаций работы программа не предусматривает.
00 (rom)
De creat clasa “Student” cu câteva câmpuri.
Cîmpurile obligatorii:
- cîmpul de tip șir de caractere, care păstrează numele studentului.
- 2 cîmpuri fracționale (float, double), ce păstrează coeficienții lenii (0 - 1) și IQ (100 - 200) ai studentului.
- cîmp de tip număr intreg (byte), care păstrează informația despre numărul de examene ai studentului.
- vector dinamic (int), care păstrează informația despre notele studentului la fiecare examen (de la 0 la 10)
-
cîmp static de tip întreg, care păstrează informația despre
numărul studenților creați.
Cîmpurile neobligatorii: grupa, numărul pașaportului, nocivitatea, sexul ș.a.m.d.
De creat trei tipuri de constructori pentru această clasă (cu alocare dinamică a memoriei):
- constructor standard (implicit - fără parametri) – toate datele de introdus de la tăstatură
- câteva constructori cu parametri
- constructor de copiere
De creat metodele pentru acces la toate câmpurile clasei şi de modificare a lor (set() si get()).
De creat metoda pentru a afişa la ecran toată informaţia despre student.
De scris o funcţie care va calcula media aritmetică a notelor studentului.
De scris o funcţie ce calculеаză bursa studentului (luînd în considerație IQ și lenea lui).
De scris o funcţie ”eminent”care compară 2 studenți(unu care apelează și altul primit ca parametru) dupa media aritmetica a notelor, folosind funcția descrisă mai sus. De afișat la ecran numele celui care învață mai bine.
De scris o funcţie static ”desteptu”, care primeşte ca parametri doi studenți, şi care calculează cu cît primul student e mai deștept ca al doilea(în lei – după bursă) sau mai prost ca acesta (rezultatul de afișat la ecran).
Î
n
funcţia main()
de creat o gașcă de studenți, folosind toţi constructorii
descrişi. După crearea fiecărui obiect al clasei „Student”,
de afişat la ecran cîmpurile lui folosind metoda clasei. De creat
un vector dinamic de studenți -"grupa". Vectorul să fie
iniţializat pe bucăţi, folosind constructori diferiţi. În ciclu
de afişat toată informaţia despre fiecare student din grupă. De
comparat cîțiva perechi de studenți după ”eminență” și
”deșteptăciune”. De găsit și de afișat numele celui mai
lenos student din grupă. Ultimul rînd afişat să conţină
numărul studenților creați, folosind variabila statică a clasei.
Pentru nota 10. Adaugator pentru tot ce este descris mai sus:
- un constructor care primeşte ca parametru denumirea fişierului textual (String), de unde se incarcă valori pentru câmpurile obiectului creat.
- o funcţie care înscrie toate cîmpurile clasei în fişier, numele fisierului se indică ca parametru la intrare.
- În funcţia main pentru toate obiectele create de salvat datele în fişiere, denumirile cărora se preiau de la numele obiectelor.
După ce totul a fost terminat fără greşelile — de spus “URRRRRRRRRAAAAAAAAAA ! ! ! !” şi de prezentat profesorului primul laborator. :)
Ministerul Educaţiei al Republicii Moldova
Universitatea de Stat din Moldova
Facultatea de Matematică şi Informatică
Departamentul “Tehnologii Informationale »
