信息输入输出排序:从键盘输入本寝室的所有成员的学号,姓名,年龄。然后按照姓名首字母排序输出,有简单文字界面及操作选项
代码如下:
import java.text.Collator;
import java.util.*;
import java.io.File;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileInputStream;
class Student {//学生类
String ID; //学号
String name; //姓名
int age; //年龄
double[] scores;//学生成绩数组
double totalscore;//学生总成绩
/**
* 设置学生各信息
* @param id 学号
* @param n 姓名
* @param a 年龄
* @param num 录入成绩的科目数
*/
public void setItem(String id,String n,int a,int num) {
ID = id;
name = n;
age = a;
scores = new double[num];
Scanner reader = new Scanner(System.in);
System.out.println("※成绩录入:");
double t = 0;
for(int i = 0;i < num;i++) {
System.out.print("请输入该学生第"+(i+1)+"门科目的成绩:");
double s = reader.nextDouble();
scores[i] = s;//赋值成绩数组
t += s;//计算累计成绩
}
totalscore = t;//总成绩
System.out.println("----------------------------------");
}
/**
* 显示学生信息
*/
public void showInfo(){
System.out.println("学号:" + ID +" 姓名:"+name+" 年龄:"+age);
for(int i = 0;i < scores.length;i++) {
System.out.println("科目"+(i+1)+"成绩:"+scores[i]);
}
System.out.println("总成绩:"+totalscore);
System.out.println("==================================");
}
}
public class StuTest{//程序测试类,测试Student的使用
/**
* 选择排序后显示方式(升序、降序)
* @param stus
*/
static void chooseSortF(Student stus[]){
Scanner reader = new Scanner(System.in);
System.out.println("(1)升序显示 (2)降序显示 "+"\n※ 请输入您的选择(1 or 2):");
int choice = reader.nextInt();
if(choice == 1) {
for(int i = 0; i < stus.length; i++) {
stus[i].showInfo();
}
}
else if(choice == 2){
for(int i = stus.length-1; i >= 0; i--) {
stus[i].showInfo();
}
}
else System.out.println("输入错误,请输入数字1或2!");
}
/**
* 选择排序:根据中文姓名首字母对学生信息选择排序 升序
* @param stus
*/
static void sortStusByName(Student stus[]) {
//获取中文的校验器
Collator collator = Collator.getInstance(Locale.CHINA);
for(int i = 0;i < stus.length-1;i++) {
int index = i;//标记第一个为待比较的学生
for(int j = i+1; j < stus.length; j++) {//从后面遍历与第一个数比较
int result = collator.compare(stus[i].name, stus[j].name);
if(result > 0) {
index = j;//保存最小元素的下标
}
}
//找到最小值后,将最小值放到第一的位置,进行下一遍循环
Student temp = stus[index];
stus[index] = stus[i];
stus[i] = temp;
}
}
/**
* 选择排序:根据学生总成绩对学生信息选择排序 降序
* @param stus
*/
static void sortStusByTotalscore(Student stus[]) {
for(int i = 0;i < stus.length-1;i++) {
int index = i;//标记第一个为待比较的学生
for(int j = i+1; j < stus.length; j++) {//从后面遍历与第一个数比较
if(stus[i].totalscore > stus[j].totalscore) {
index = j;//保存最小元素的下标
}
}
//找到最小值后,将最小值放到第一的位置,进行下一遍循环
Student temp = stus[index];
stus[index] = stus[i];
stus[i] = temp;
}
}
/**
* 折半插入排序:按姓名中文首字母升序
* @param stus
*/
static void sortStusByName2(Student stus[]) {
Collator collator = Collator.getInstance(Locale.CHINA);
for(int i = 1; i < stus.length; i++) {
int low = 0,high = i - 1, mid;
while(low <= high) {//二分思想循环寻找a[i]的位置
mid = (low + high) / 2;
int result = collator.compare(stus[i].name, stus[mid].name);
if(result <= 0)
high = mid - 1;
else
low = mid + 1;
}//循环结束,low就是stus[i]应该放置的位置
Student temp = stus[i];
for(int j = i; j > low; j--)//将元素向后平移
stus[j] = stus[j - 1];
stus[low] = temp;
}
}
/**
* 折半插入排序:按总成绩
* @param stus
*/
static void sortStusByTotalscore2(Student stus[]) {
for(int i = 1; i < stus.length; i++) {
int low = 0,high = i - 1, mid;
while(low <= high) {//二分思想循环寻找a[i]的位置
mid = (low + high) / 2;
if(stus[i].totalscore < stus[mid].totalscore)
high = mid - 1;
else
low = mid + 1;
}//循环结束,low就是stus[i]应该放置的位置
Student temp = stus[i];
for(int j = i; j > low; j--)//将元素向后平移
stus[j] = stus[j - 1];
stus[low] = temp;
}
}
/**
* 排序界面菜单
*/
static void sortFace() {
System.out.println("|-----------请选择排序方式------------|");
System.out.println("| ①按学生总成绩排序(通道1)");
System.out.println("| ②按学生总成绩排序(通道2)");
System.out.println("| ③按学生姓名排序(通道1) ");
System.out.println("| ④按学生姓名排序(通道2) ");
System.out.println("| ⑤返回首页 ");
System.out.println("|=================================|");
}
/**
* 主界面菜单
*/
static void mainFace() {
System.out.println("|-----------请选择要进行的操作-----------|");
System.out.println("| ①查询学生信息");
System.out.println("| ②学生信息排序 ");
System.out.println("| ③退出 ");
System.out.println("|==================================|");
}
/**
* 查找学生信息函数
*/
static void findStudent(Student stus[]) {
Scanner reader = new Scanner(System.in);
System.out.println("|-----------请选择查询方式------------|");
System.out.println("| ①按姓名查询");
System.out.println("| ②按学号查询");
System.out.println("| ③按序号查询");
System.out.println("| ④按成绩查询");
System.out.println("| ⑤返回首页");
System.out.println("|=================================|");
int choice = reader.nextInt();
boolean fig = true;
while(fig) {
switch (choice){
case 1:
System.out.print("※ 请输入学生姓名:");
String n = reader.next();
int flag = 0;
for(int i = 0; i < stus.length; i++) {
if(stus[i].name.equals(n)) {
stus[i].showInfo();flag = 1;
}
}
if(flag == 1)
System.out.println("※ 查询成功!");
else System.out.println("※ 无该学生信息,请确认查询信息或录入学生信息!");
break;
case 2:
System.out.print("※ 请输入学生学号:");
String n2 = reader.next();
int flag2 = 0;
for(int i = 0; i < stus.length; i++) {
if(stus[i].ID.equals(n2)) {
stus[i].showInfo();flag2 = 1;
}
}
if(flag2 == 1)
System.out.println("※ 查询成功!");
else System.out.println("※ 无该学生信息,请确认查询信息或录入学生信息!");
break;
case 3:
System.out.print("※ 请输入学生序号:");
int number = reader.nextInt();
if(number > 0 && number < stus.length) {
stus[number-1].showInfo();
}
else System.out.println("系统中有"+stus.length+"位学生,无序号为 "+number+" 的学生,请输入合法序号!");
break;
case 4:
System.out.print("※ 请问要查找分数为多少的成绩?");
double score = reader.nextDouble();
if(score >= 0 && score <= 100) {
boolean ff0 = false;
for(int i = 0; i < stus.length; i++) {
for(int j = 0; j < stus[i].scores.length; j++) {
if(score == stus[i].scores[j]) {
System.out.println("※ 第 "+(i+1)+" 位学生"+stus[i].name+" 的第 "+(j+1)+" 门科目成绩为"+score);
ff0 = true;
}
}
}
if(ff0 == false)
System.out.println("未找到该分数的成绩......");
}
else System.out.println("输入错误,请输入0~100内的数!");
break;
default:
fig = false;break;
}break;
}
}
/* //获取中文字符串拼音首字母
public static String getPinYinHeadChar(String str) {
String convert = "";
for (int j = 0; j < str.length(); j++) {
char word = str.charAt(j);
String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word);
if (pinyinArray != null) {
convert += pinyinArray[0].charAt(0);
} else {
convert += word;
}
}
return convert;
}
*/
public static void main(String[] args) {
//Date date=new Date();//使用Date创建日期对象
//String dir = "E:\\eclipseWorkspace\\Student\\ " ;
File file = new File("E:/eclipseWorkspace/Student", "file.txt");
try {
file.createNewFile(); // 创建文件
} catch (IOException e) {
e.printStackTrace();
}
Scanner reader = new Scanner(System.in);
System.out.println("==========欢迎,请先录入信息===============");
System.out.println("请输入录入信息的学生人数:");
int num = reader.nextInt();
if(num <= 0)//若输入非法
System.out.println("输入错误,请输入正整数!");
else {
Student[] stus = new Student[num]; //创建学生对象数组
//循环创建每个数组元素对象,设置对象的全部信息
for(int c = 0;c < num;c++) {
stus[c] = new Student();
System.out.println("\n请输入第"+(c+1)+"个学生的信息-----------");
System.out.print("请输入学号:");
String id = reader.next();
System.out.print("请输入姓名:");
String n = reader.next();
System.out.print("请输入年龄:");
int a = reader.nextInt();
System.out.print("请输入要录入成绩的科目数:");
int sn = reader.nextInt();
stus[c].setItem(id, n, a, sn);
}
String str = "";
for(int c = 0;c < num;c++) {
str += "\n学号:" + stus[c].ID +" 姓名:"+stus[c].name+" 年龄:"+stus[c].age;
for(int i = 0;i < stus[c].scores.length; i++) {
str += " 科目"+(i+1)+"成绩:"+stus[c].scores[i];
}
str += "总成绩:"+stus[c].totalscore;
}
//向文件写入内容
byte bt[] = new byte[1024];
bt = str.getBytes();
try {
FileOutputStream in = new FileOutputStream(file);
try {
in.write(bt, 0, bt.length);
in.close();
// System.out.println("写入文件成功");
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
System.out.println("※ 录入成功!");
while(true) {
mainFace();
int num2 = reader.nextInt();
int choice0 = 0;
//防止输入不规范bug
if(num2 == 1)choice0 = 1;
else if(num2 == 2)choice0 = 2;
else if(num2 == 3)choice0 = 3;
else System.out.println("请输入1~3的数字!");
switch(choice0) {
case 1://查询信息
findStudent(stus);break;
case 2://学生信息排序
boolean nn = true;
while(nn) {
sortFace();
int choice2 = reader.nextInt();
switch(choice2) {
case 1://按总成绩排序(通道一:选择排序)
sortStusByTotalscore(stus);chooseSortF(stus);break;
case 2://按总成绩排序(通道二:折半插入排序)
sortStusByTotalscore2(stus);chooseSortF(stus);break;
case 3://按姓名排序(通道一:选择排序)
sortStusByName(stus);chooseSortF(stus);break;
case 4://按姓名排序(通道二:折半插入排序)
sortStusByName2(stus);chooseSortF(stus);break;
default:
nn = false;break;
}
}
break;
case 3://系统退出
System.out.println("系统已退出!");return;
default:
break;
}
reader.nextLine();//吸收回车符
System.out.println("按回车键返回主界面");
reader.nextLine();
}
}
reader.close();
}
}