java作业一:简单输入、输出、排序

信息输入输出排序:从键盘输入本寝室的所有成员的学号,姓名,年龄。然后按照姓名首字母排序输出,有简单文字界面及操作选项

代码如下:

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();
		}
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值