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

Глава 6

Задача 6.9 "Максимальный "непроходной" балл."

Ученый совет университета Саванны принял решение, согласно которому, по крайней мере 75% студентов каждого курса должны переводиться на следующий курс. Это означает, что сумма баллов, позволяющая студенту перейти на следующий курс, будет специфической для каждого курса. Напишите программу, которая считывает из файла оценки студентов и определяет такой максимальный "непроходной" балл, который не нарушал бы директиву сената.

Решение

Исходный файл будет выглядеть примерно так:

Подсказка

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

Далее, поскольку у нас массив отсортирован, найдем индекс с граничной оценкой используя для поиска длину массива оценок и обыкновенную пропорцию:

//Найдем индекс с граничной оценкой
int bal = (int)Math.round(mlong*75/100); Теперь нам известна граничная оценка и ее индекс в отсортированном массиве. Все оценки, большие, чем граничная окажутся в одной части массива, все те, что ниже - в другой. Проверим результат.

Массив отсортирован. Программа нашла искомую оценку, ниже которой получившие не проходят на следующий курс.

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


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

class BallCalc {

void selectionSort (int[] a, int n) {
int temp;
int chosen;
for (int leftmost = 0; leftmost < n-1; leftmost++) {
chosen = leftmost;
for (int j = leftmost+1; j < n; j++)
if (a[j] > a[chosen])
chosen = j;
temp = a[chosen];
a[chosen] = a[leftmost];
a[leftmost] = temp;
}
}
BallCalc() throws IOException {
int mlong = 24;
int mas[] = new int [mlong];

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(" Session balls ");
System.out.println("============================");

int test = 0; // ball of testing
int prac = 0; // ball of practic
int exzam = 0; // ball of exzamen
int sumAverange = 0;
String nameStudent;

try {

int i = 0;
for (;;) {
nameStudent = fin.readLine();
String nameS = fin.readString();
nameS = fin.readString();
test = fin.readInt();
prac = fin.readInt();
exzam = fin.readInt();

//calculate averange
int averange = (int)Math.round(test*0.2 + prac*0.3 + exzam*0.5);
sumAverange = sumAverange + averange;
mas[i] = averange;
i++;
// Report
System.out.println("Student " + nameStudent + ": testing - " + test + ", " +
"practicum - " + prac + ", " +
"exzamen - " + exzam);
System.out.println("Student " + nameStudent + " averange ball: " + averange);

}
}
catch (EOFException e) {
System.out.println(" All data is reading ");
}
int m1 = (int)Math.round(sumAverange/mlong);
System.out.println("Total averange ball: " + m1 );

//отсортируем массив
selectionSort(mas,mlong);

//выведем отсортированный массив
for(int i=0;i < mlong;i++){

System.out.print(" " + mas[i]);
if(i!=0 & i%10==0)
System.out.println(" ");
}

//Найдем индекс с граничной оценкой
int bal = (int)Math.round(mlong*75/100);

// выведем граничный балл
System.out.println();
System.out.println("Ball of maximum: " + mas[bal] +" index: " + bal);

int m = mas[bal];
int min =0;
int max = 0;

//проверим правильность в %
for(int j=0;j < mlong;j++){

// System.out.println(mas[j]);
if(mas[j] > m){
max++;
}
else{
min++;
}
}
int pr1 = Math.round(max*100/mlong);
int pr2 = Math.round(min*100/mlong);

System.out.println(" " + max + " " + pr1 +"% ");
System.out.println(" " + min + " " + pr2 + "%");

}


public static void main (String[] args) throws IOException {

new BallCalc ();
}
}


Результат :

Session balls
============================
Student Poul McCartny : testing - 90, practicum - 75, exzamen - 65
Student Poul McCartny averange ball: 73
Student Jhon Lennon: testing - 95, practicum - 80, exzamen - 70
Student Jhon Lennon averange ball: 78
Student Ringo Starkey: testing - 70, practicum - 55, exzamen - 40
Student Ringo Starkey averange ball: 51
Student Gorge Harrison: testing - 65, practicum - 51, exzamen - 75
...

Student Richard Stock: testing - 80, practicum - 85, exzamen - 90
Student Peter O-Tool averange ball: 82
Student James Bond: testing - 64, practicum - 54, exzamen - 87
Student James Bond averange ball: 73
Student Judy Bishoop: testing - 98, practicum - 95, exzamen - 95
Student Judy Bishoop averange ball: 96
All data is reading
Total averange ball: 67
96 87 86 82 78 74 73 73 70 70 69
69 68 67 66 64 61 57 54 52 51
51 50 47
Ball of maximum: 54 index: 18
18 75%
6 25%

Что улучшить в программе?

- создать класс Студент, чтобы иметь инф о том, кто именно прошел, а кто нет.
- чтобы не ограничивать себя ограничениями, связанными с обычным массивом, считывать данные из файла в связный список, и при этом вести подсчет сколько именно считано студентов.

Задача эта интересная! Практическая!


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

Hosted by uCoz