package project2; import java.text.*; public class Scholarship { private final int MAX_DEFAULT = 5; private String scholarshipName; private double amount; private int intendedAwards; private int actualAwards; private Scholar[] applicants; private int numApplicants; private DecimalFormat twoDigits; public Scholarship(String scholarshipName, double amount, int number) { this.scholarshipName = scholarshipName; this.amount = amount; intendedAwards = number; numApplicants = 0; applicants = new Scholar[MAX_DEFAULT]; twoDigits = new DecimalFormat("0.00"); } public String getScholarshipName() { return scholarshipName; } public int getNumApplicants() { return numApplicants; } public boolean addApplicant(Scholar s) { if (numApplicants == applicants.length) { Scholar[] newApplicants = new Scholar[2 * numApplicants]; for (int i = 0; i < numApplicants; i++) { newApplicants[i] = applicants[i]; } applicants = newApplicants; } applicants[numApplicants] = s; numApplicants++; return true; } public void printAllApplicantsByScore() { sortByScore(applicants, numApplicants); printAllApplicants(); } public void printAllApplicantsByName() { sortByName(applicants, numApplicants); printAllApplicants(); } private void setSelected() { for (int i = 0; i < numApplicants; i++) applicants[i].setSelected(false); if (numApplicants <= intendedAwards) actualAwards = numApplicants; else actualAwards = intendedAwards; sortByScore(applicants, numApplicants); for (int i = 0; i < actualAwards; i++) applicants[i].setSelected(true); while ((actualAwards < numApplicants) && applicants[actualAwards - 1].getScore() == applicants[actualAwards].getScore()) { applicants[actualAwards].setSelected(true); actualAwards++; } } private String leftJustify(String s, int n) { while (s.length() < n) { s = s + " "; } return s; } private String rightJustify(String s, int n) { while (s.length() < n) { s = " " + s; } return s; } private String justifyTwoDigits(double x, int n) { return rightJustify(twoDigits.format(x), n); } private String applicantHeader() { return leftJustify("Name", 20) + rightJustify("GPA", 6) + rightJustify("essay", 7) + rightJustify("SCH", 7) + rightJustify("science", 9) + rightJustify("score", 10) + "\n"; } private String yesNo(boolean f) { if (f) return "yes"; return "no"; } private String applicantInfo(Scholar sch) { return leftJustify(sch.getLastFirstName(), 20) + justifyTwoDigits(sch.getGradePointAverage(), 6) + rightJustify("" + sch.getEssayScore(), 7) + rightJustify("" + sch.getCreditHours(), 7) + rightJustify(yesNo(sch.isScienceMajor()), 9) + justifyTwoDigits(sch.getScore(), 10); } private void printAllApplicants() { System.out.print(applicantHeader()); for (int i = 0; i < numApplicants; i++) { System.out.println(applicantInfo(applicants[i])); } } public int getNumberAwardees() { setSelected(); return actualAwards; } public double getSingleScholarshipAmount() { setSelected(); if (numApplicants == 0) return 0; return amount / actualAwards; } public void printWinners() { setSelected(); System.out.print(applicantHeader()); for (int i = 0; i < actualAwards; i++) { System.out.println(applicantInfo(applicants[i])); } } public Scholar searchByName(String targetName) { for (int i = 0; i < numApplicants; i++) { if (applicants[i].getFullName().equals(targetName)) { return applicants[i]; } } return null; } public String toString() { return "Scholarship name: " + scholarshipName + ", Total amount: " + twoDigits.format(amount) + ", Number of awards intended: " + intendedAwards; } // sorts (all use seleciton sort) // sort by score, highest score first private static void sortByScore(Scholar[] list, int len) { for (int index = 0; index < len - 1; index++) { int min = findMaxPositionScore(list, index, len); Scholar temp = list[min]; list[min] = list[index]; list[index] = temp; } } private static int findMaxPositionScore(Scholar[] list, int start, int len) { int min = start; for (int scan = start + 1; scan < len; scan++) if (list[min].getScore() < list[scan].getScore()) min = scan; return min; } // sort by score, highest score first private static void sortByName(Scholar[] list, int len) { for (int index = 0; index < len - 1; index++) { int min = findMinPositionName(list, index, len); Scholar temp = list[min]; list[min] = list[index]; list[index] = temp; } } private static int findMinPositionName(Scholar[] list, int start, int len) { int min = start; for (int scan = start + 1; scan < len; scan++) if (list[min].getLastFirstName().compareTo(list[scan]. getLastFirstName()) > 0) min = scan; return min; } }