本关任务:设计一个程序,管理一个班级的若干学生(学生的姓名是唯一的),每个学生都修了若干门课程,没门课程都有了一个成绩。但一个班的同学修的课程不完全一样。
要求:
该程序用集合框架的Map接口来实现。学生用Map来存储,键用学生姓名,值是另一个存储课程的Map;每个同学修的若干门课程也用Map来存储,键是课程名称,值是该课程的成绩。
将把完成的工作放在Class类中。 类名:Class public Class(String name) 构造函数,name为班级名称;
public void addCourseGrade(String stuname,String []Coursenames,Integer[] grades) 增加学生及课程的数据,stuname 学生姓名,Coursenames多个课程名,grades对应的多个分数;
public void addCourseGrade(String stuname,String Coursename,Integer grade) 增加学生及课程的数据,stuname 学生姓名,Coursename课程名,grade对应的分数;
public void delStudent(String stuname) 删出一个学生,stuname学生姓名;
public void delStuCourse(String stuname,String Coursename) 删出一个学生的一门课程,stuname学生姓名,Coursename课程名;
public double getPerAvgStudent(String stuname)返回一个学生的所有课程的平均成绩,stuname学生姓名;
``
public double getClassAvgCourse(String Coursename) 返回一个班某门课程的平均成绩,如果该班有同学没选修该门课程,平均成绩不计算该同学,Coursename为课程名。
开始你的任务吧,祝你成功!
package step1;
import java.util.*;
//在此写Class类
public class Class {
String classname = null;
String stuname = null;
HashMap<String,ArrayList<HashMap<String,Integer>>> nameprojects = new HashMap<>();//姓名、课程
public Class(String classname){
this.classname = classname;
}
public void addCourseGrade(String stuname,String Coursename,Integer grade){
ArrayList<HashMap<String,Integer>> stuList = nameprojects.get(stuname);
if(stuList == null) {
stuList = new ArrayList<>();
nameprojects.put(stuname, stuList);
}
HashMap<String,Integer> courseGrade = new HashMap<>();
courseGrade.put(Coursename, grade);
stuList.add(courseGrade);
}
public void addCourseGrade(String stuname,String[] Coursenames,Integer[] grades){
for(int i = 0;i < Coursenames.length;i++){
ArrayList<HashMap<String,Integer>> stuList = nameprojects.get(stuname);
if(stuList == null) {
stuList = new ArrayList<>();
nameprojects.put(stuname, stuList);
}
HashMap<String,Integer> courseGrade = new HashMap<>();
courseGrade.put(Coursenames[i], grades[i]);
stuList.add(courseGrade);
}
}
public void delStudent(String stuname){
nameprojects.remove(stuname);
}
public void delStuCourse(String stuname,String Coursename) {
for (Map.Entry<String, ArrayList<HashMap<String, Integer>>> delet : nameprojects.entrySet()) {
if (delet.getKey().equals(stuname)) {
for(HashMap<String,Integer> deletCourse : delet.getValue()){
deletCourse.remove(Coursename);
}
}
}
}
public double getPerAvgStudent(String stuname){
double sum = 0;
int count = 0;
for (Map.Entry<String,ArrayList<HashMap<String,Integer>>> find_name : nameprojects.entrySet()) {
if(find_name.getKey().equals(stuname)){
for(HashMap<String,Integer> SUM : find_name.getValue()){
for(Map.Entry<String,Integer> Sum : SUM.entrySet()){
sum = sum + Sum.getValue();
count++;
}
}
}
}
return sum/count;
}
public double getClassAvgCourse(String Coursename){
double sum = 0;
int count = 0;
for (Map.Entry<String,ArrayList<HashMap<String,Integer>>> find_name : nameprojects.entrySet()) {
for(HashMap<String,Integer> SUM : find_name.getValue()){
for(Map.Entry<String,Integer> Sum : SUM.entrySet()){
if(Sum.getKey().equals(Coursename)){
sum = sum + Sum.getValue();
count++;
}
}
}
}
return sum/count;
}
}
本关任务:从文件读取一篇英语文章,然后统计26个英文字母出现的次数。
要求:
按26个字母的顺序统计出每个字母出现的次数。
用于统计次数的类FileLetter,只有一个方法:
public int[] LetterStatistics(String strFilename);
strFilename是输入的需统计的文件名;
返回的是一个整型数组,大小26,每个位置存放的分别是a到z出现的次数。
大小写字母算同一个字母。
开始你的任务吧,祝你成功!
package step1;
import java.io.*;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.io.IOException;
//在此写FileLetter类
public class FileLetter{
public int[] LetterStatistics(String strFilename){
int []num=new int[26];
int k=0;
for(int i=0;i<26;i++) num[i]=0;
try{
BufferedReader in=new BufferedReader(new FileReader(strFilename));
while((k=in.read())!=-1){
if(k>=65&&k<=90) k=k+32;
if(k>=97&&k<=122)
num[k-97]++;
}
in.close();
}
catch (ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
return num;
}
}
任务描述
本关任务:创建一个学生类Student,包括姓名name,年龄age两个属性。姓名的长度不超过10个字符,年龄是int类型。使用随机读写类RandomAccessFile将学生信息写入到文件中,并能对文件中的学生信息进行读取和修改。(参照教科书P196,例6-18)。
要求:
学生类的类名为:Student,该类中有两个属性,访问类型都为public:
char name[]=new char[10]; //学生姓名
int age;//年龄
public Student(String name,int age)构造函数
public void Print();显示姓名和年龄
``
还须创建一个读写类RWClass,该类有一个属性filename,打开读写的文件名。
public RWClass(String filename) 该类的构造函数
public void saveStudent(Student ss,int pos) 将学生对象的信息保存在文件中,ss为保存的学生信息,pos保存的位置。
public Student readStudent(int pos) 在文件中读出某位置的一个学生的信息,返回学生对象
开始你的任务吧,祝你成功!
Student类
package step2;
//在此写Student类
public class Student{
public char[] name={
'\u0000','\u0000','\u0000','\u0000','\u0000','\u0000','\u0000','\u0000','\u0000','\u0000'};
public int age;
public Student(String name,int age)throws Exception{
if(name.toCharArray().length>10){
System.arraycopy(name.toCharArray(),0,this.name,0,10);
}else{
System.arraycopy(name.toCharArray(),0,this.name,0,name.toCharArray().length);
}
this.age=age;
}
public Student()throws Exception{
}
public void print(){
String s=name.toString();
System.out.println("姓名:"+name);
System.out.println("年龄:"+age);
}
}
RWClass类
package step2;
import java.io.*;
//在此写RWClass类
public class RWClass{
private String filename;
public RWClass(String filename){
this.filename=filename;
}
public void saveStudent(Student ss,int pos) throws Exception{
RandomAccessFile ra=new RandomAccessFile(filename,"rw");
ra.seek(pos*24);
try{
for(int i=0;i<10;i++){
ra.writeChar(ss.name[i]);
}
ra.writeInt(ss.age);
}
catch (ArrayIndexOutOfBoundsException e) {
}
ra.close();
}
public Student readStudent(int pos) throws Exception{
char buf[]={
'\u0000','\u0000','\u0000','\u0000','\u0000','\u0000','\u0000','\u0000','\u0000','\u0000'};
int age=0;
try{
RandomAccessFile ra=new RandomAccessFile(filename,"r");
ra.seek(pos*24);
for(int i=0;i<10;i++){
buf[i]=ra.readChar();
}
age=ra.readInt();
}catch (EOFException e) {
}
String str=buf.toString();
Student ss=new Student(str,age);
return ss;
}
}
本关任务: 创建三个线程Thread1、Thread2及Thread3。三个线程要进行同步调度。
要求:
不管各线程的优先级及各线程sleep的时间,Thread1首先运行,获取数据后将数据存储在数据对象中,Thread2从数据对象中取值加10后存回数据对象,并输出;Thread3从数据对象中取值加10后输出。这三个线程运行必须同步,运行时序如下:
实验已经定义了一个类Gatherinfo(如下),该类的GetVal()方法完成数据的生成。
class Gatherinfo{
public int GetVal() {
int n = (int)(Math.random()*20+10);
return n;
}
}
线程Thread1类继承类Gatherinfo,在Thread1类中直接调用Gatherinfo类中GetVal()方法获取采集的数据。
类dataObj完成各线程的数据交换。有两个方法:
void put(int n);将数据存入数据对象中。
int get();返回数据对象中的数据。
``
Gatherinfo类系统已完成,不需要大家编此类的程序。
每个线程循环运行10次以上,各线程的输出格式如下:
10 20 30
16 26 36
每个数字代表一个线程的输出。
按要求完成Thread1、Thread2、Thread3类的编写。
最后设计一个类来测试你的所有的程序。
开始你的任务吧,祝你成功!
dataObj类`
package step1;
//在此写dataObj类
public class dataObj{
private int a=0;
public dataObj(){
}
public void put(int n){
this.a=n;
}
public int get(){
return a;
}
}
Thread1类
package step1;
//在此写Thread1类
class Thread1 extends Gatherinfo implements Runnable{
dataObj k=null;
private int m=0;
public Thread1(dataObj k){
this.k=k;
}
public void run(){
// Gatherinfo c=new Gatherinfo();
for(int i=0;i<11;i++){
int n=this.GetVal();
System.out.print(n+" ");
n=n+10;
k.put(n);
//Thread.sleep()
}
}
/* public static void main(String[] args) {
dataObj obj=null;
Thread1 t1=new Thread1(obj);
Thread2 t2=new Thread2(obj);
Thread3 t3=new Thread3(obj);
new Thread(t1).start();
new Thread(t2).start();
new Thread(t3).start();
*/
}
Thread2类
package step1;
//在此写Thread2类
class Thread2 extends Thread{
private dataObj k=null;
private int m=0;
public Thread2(dataObj k){
this.k=k;
}
public void run(){
for(int i=0;i<11;i++)
{
int n=k.get();
System.out.print(n+" ");
n=n+10;
k.put(n);
}
}
}
Thread3类
package step1;
//在此写Thread3类
class Thread3 extends Thread{
dataObj k=null;
private int m=0;
public Thread3(dataObj k){
this.k=k;
}
public void run(){
for(int i=0;i<11;i++){
int n=k.get();
System.out.println(n);
n=n+10;
k.put(n);
}
}
}