java头歌实训题

本关任务:设计一个程序,管理一个班级的若干学生(学生的姓名是唯一的),每个学生都修了若干门课程,没门课程都有了一个成绩。但一个班的同学修的课程不完全一样。

要求:
该程序用集合框架的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);
     }
 }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值