Глава 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 {
Teach(String n, String d, String t, String p[], int m[][], int num, String c[]){
for(int i=0;i < 5; i++){
for (int j=0;j < 5;j++) {
Входной файл может выглядеть так:
Объекты типа 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();
Пришлось еще написать и вторую указанную инструкцию, иначе компилятор выдавал ошибку. Это выявлено опытным путем.
Назад |
Начало урока |
Вверх |
Вперед
Содержание