Назад | Начало урока | Вперед
Содержание

Глава 6

Задача 6.4 "Оценка преподавательских качеств лектора."

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

Голос

живой и разнообразный
достаточно живой
удовлетворительный
скорее скучный
монотонный

Объем подаваемого

удовлетворительный
чрезмерный
хотелось бы больше
слишком много
недостаточный

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

Р.Н. Смит
6 ноября 2000 г
COS101 Принципы программирования
80 студентов
Голос 16 35 20 9 0
Материал 37 20 11 10 2

Возможный вариант вывода:

Р.Н. Смит
6 ноября 2000 г
COS101 Принципы программирования
Голос

А живой и разнообразный 20% ************
Б довольно живой 44% **********************
В удовлетворительный 25% ***************
Г скорее скучный 11% ******
Д монотонный 0%

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

- Решите, какие файлы потребуются для данных и в каком формате выводить данные.
- Определите, какой должна быть конструкция класса для хранения вводимой информации во время выполнения программы.
- Решите, что вам потребуется в программе: массивы, хеш-таблицы, обе структуры или ни одна из них.
- Напишите программу и протестируйте ее надлежащим образом.

Решение

Создадим класс Teach, в котором будем сохранять следующие данные о преподавателе:
- имя преподавателя(String)
- предмет, который он преподает(String)
- дата опроса(String)
- количество опрошенных студентов(int)
- массив критериев оценки (объем знаний, манера вести лекции и др)(String[])
- массив в котором собрано количество голосов за каждую оценку (тип int[][])
- массив категорий оценок (отлично, хорошо, удовлетворительно и тд) (тип String[])

Все эти переменные будут получать данные через параметры конструктора. А метод write() будет обрабатывать и выводить результаты.

class Teach {

String name;
String date;
String thema;
String pos[];
int mark[][];
int numSt;
String cat[];

Teach(String n, String d, String t, String p[], int m[][], int num, String c[]){

name = n;
date = d;
thema = t;
pos = new String[5];
mark = new int[5][5];
cat = new String[5];

for(int i=0;i < 5; i++){

pos[i] = p[i];
}
for(int i=0;i < 5; i++){
for(int j=0;j < 5; j++){
mark[i][j] = m[i][j];
}
}
numSt = num;
for(int i=0;i < 5; i++){
cat[i] = c[i];
}
}
void write () {
String stars = "*";
System.out.println("Teacher : "+ name);
System.out.println("Date: : "+ date);
System.out.println("Thema : "+ thema);
System.out.println("Number of Student : "+ numSt);
for (int i=0;i < 5;i++) {
System.out.println(pos[i]);

for (int j=0;j < 5;j++) {

int chislo = Math.round(mark[i][j]*100/numSt);
System.out.print(" " + cat[j]+ " " + chislo + "%");
for (int r=0;r < (int)(chislo/2);r++) {
System.out.print(stars);
}
System.out.println();
}
System.out.println();
}
}
}//Teach

Входной файл может выглядеть так:

Подсказка

Объекты типа Teach будем сохранять в хеш-таблице. Из этой же хеш-таблицы можем брать данные для анализа и вывода результата. Для хранения ключа к хеш-таблице создадим массив имен преподавателей masName[].

Код программы:


import java.io.*;
import javagently.*;
import java.util.*;

class TeachMark {

Hashtable table = new Hashtable();
String masName[] = {"","","","",""};
String category[] = {"best","good","mediocre","bad","very bad"};

TeachMark() throws IOException {

Stream in = new Stream(System.in);
// default the file to the keyboard
Stream fin = new Stream(System.in);
try {
fin = Filer.open("data.txt");
}
catch (FileNotFoundException e) {
System.out.println("Five tries up");
System.out.println("Connecting to keyboard by default");
}

System.out.println();
System.out.println(" TeachMark ");
System.out.println("============================");

try {

String masPos[] = new String [5];
int masMark[][] = new int[5][5];

// Read data from file
//-----------------------------------------
for (int l=0;l < 2;l++){

String nameTeach = fin.readLine();
masName[l] = nameTeach;

String date = fin.readLine();
String thema = fin.readLine();
int numStud = (int)Double.valueOf(fin.readLine()).doubleValue();
int zero = fin.readInt();

for (int i=0;i < 5;i++) {

masPos[i] = fin.readString();

for (int j=0;j < 5;j++) {

masMark[i][j] = fin.readInt();
}

}

Teach temp = new Teach(nameTeach,date,thema,masPos,masMark,numStud,category);
// temp.write();

table.put(temp.name,temp);

}//end for prim
}
catch (EOFException e) {
System.out.println(" All data is reading ");
}

//Read from Hashtable
//---------------------
String name1 = "";
String date1 = "";
String thema1 = "";
String masPos1[] = new String[5];
int masMark1[][] = new int[5][5];
int numStud2 = 10;

for (int l=0;l < 2;l++) {

System.out.println( );
Teach t = new Teach(name1,date1,thema1,masPos1,masMark1,numStud2,category);
t =(Teach) table.get(masName[l]);
t.write();
}

}//end construct

public static void main (String[] args) throws IOException {
new TeachMark();
}

}// TeachMark

class Teach {

String name;
String date;
String thema;
String pos[];
int mark[][];
int numSt;
String cat[];

Teach(String n, String d, String t, String p[], int m[][], int num, String c[]){

name = n;
date = d;
thema = t;
pos = new String[5];
mark = new int[5][5];
cat = new String[5];

for(int i=0;i < 5; i++){

pos[i] = p[i];
}
for(int i=0;i < 5; i++){
for(int j=0;j < 5; j++){
mark[i][j] = m[i][j];
}
}
numSt = num;
for(int i=0;i < 5; i++){
cat[i] = c[i];
}
}
void write () {
String stars = "*";
System.out.println("Teacher : "+ name);
System.out.println("Date: : "+ date);
System.out.println("Thema : "+ thema);
System.out.println("Number of Student : "+ numSt);
for (int i=0;i < 5;i++) {
System.out.println(pos[i]);

for (int j=0;j < 5;j++) {

int chislo = Math.round(mark[i][j]*100/numSt);
System.out.print(" " + cat[j]+ " " + chislo + "%");
for (int r=0;r < (int)(chislo/2);r++) {
System.out.print(stars);
}
System.out.println();
}
System.out.println();
}
}
}//Teach


Результат :

TeachMark
============================

Teacher : Smith
Date: : 6 November 2000 year
Thema : COS101 Principle of programming
Number of Student : 80
Voice
best 20%**********
good 43%*********************
mediocre 25%************
bad 11%*****
very bad 0%

Material
best 46%***********************
good 25%************
mediocre 13%******
bad 12%******
very bad 2%*

Manner
best 28%**************
good 46%***********************
mediocre 16%********
bad 7%***
very bad 1%

Fascinating
best 17%********
good 45%**********************
mediocre 21%**********
bad 12%******
very bad 3%*

Device
best 30%***************
good 16%********
mediocre 31%***************
bad 13%******
very bad 8%****

Teacher : Brown
Date: : 6 November 2000 year
Thema : COS102 Psychology
Number of Student : 95
Voice
best 35%*****************
good 23%***********
mediocre 18%*********
bad 20%**********
very bad 2%*

Material
best 34%*****************
good 5%**
mediocre 26%*************
bad 29%**************
very bad 4%**

Manner
best 4%**
good 29%**************
mediocre 26%*************
bad 5%**
very bad 34%*****************

Fascinating
best 2%*
good 18%*********
mediocre 23%***********
bad 20%**********
very bad 35%*****************

Device
best 30%***************
good 41%********************
mediocre 11%*****
bad 11%*****
very bad 5%**

Анализ:

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

Далее создаем новый объект Teach и инициируем его, путем считывания данных из хеш-таблицы, выводим данные об объекте при помощи его метода write(), повторяем то же самое для второго объекта во второй итерации цикла.

Использованные приемы:

- Хеш-таблица
- Массивы одно и двумерный
- Считывание из файла
- Специализированный класс Teach.

Интересно, что после чтения числа как строки инструкцией:

int numStud = (int)Double.valueOf(fin.readLine()).doubleValue();
int zero = fin.readInt();

Пришлось еще написать и вторую указанную инструкцию, иначе компилятор выдавал ошибку. Это выявлено опытным путем.


Назад | Начало урока | Вверх | Вперед
Содержание

Hosted by uCoz