数据结构课程设计-项目1-计算机设计大赛赛事统计(实验准备)


一.问题描述

参加计算机设计大赛的n个学校编号为1-n,赛事分成m个项目,项目的编号为1~m.比赛获奖按照得分降序,取前三名,写一个统计程序产生各种成绩单和得分报表。

二.基本要求

1)每个比赛项目至少有10支参赛队;每个学校最多有6支队伍参赛;
2)能统计各学校的总分;
3)可以按照学校编号或名称查询,学校的总分、各项目的总分排序输出;
4)可以按学校编号查询学校某个项目的获奖情况;可以按项目编号查询取得前三名的学校;
5)数据存入文件并能随时查询

三.设计要求

1)输入数据形式和范围:可以输入学校的名称,赛事项目的名称。
2)输出形式:有中文提示,各学校分数为整数
3)界面要求:交互设计要合理,每个功能可以设立菜单,根据提示,完成相关功能的要求。
4)存储结构:学生自己根据系统功能要求自己设计,但是赛事相关数据要存储在文件中。

四.问题分析

【问题假设】

1.假设3<赛事项目数量<=10,学校名称长度不超过20个字符。每个赛事结束时,将其编号、名称输入,并依次输入参赛学校编号、学校名称和成绩。
2.假设所有参赛队伍一同编号,不受学校项目的约束且队伍编号不能重复
3.假设每个项目设三个奖项:一等奖,二等奖,三等奖,每个奖项均只有一个队伍名额,且同项目的每个队伍的分数不能相同。

【功能分析】

1.能统计各个学校的总分
2.可以按照学校编号或名称查询学校的总分,各项目的总分排序输出
3.可以按学校编号查询学校某个项目的获奖情况
4.可以按项目编号查询取得前三名的学校
5.数据存入文件并能随时查询

五.逻辑设计

【模块划分】

1.界面设计
2.添加学校,项目,队伍
3.输出学校列表,项目列表,队伍列表
More:根据上述功能分析中的五个功能划分为五个具体功能实现模块。

【抽象数据结构ADT】

ADT 计算机设计大赛赛事统计
	Data
	  学校列表schools<School>
	  项目列表items<Item>
	  队伍列表teams<Team>
	Operation
	  界面设计
	    输入:无
	    功能:输出主菜单交互界面
	    输出:主菜单交互界面
	  添加学校/项目/队伍
	    输入:学校/项目/队伍信息
	    功能:将输入的信息存入相应的列表和文件中
	    输出:无
	  输出学校/项目/队伍列表
	    输入:无
	    功能:输出学校/项目/队伍列表
	    输出:学校/项目/队伍列表
	  统计每个学校的总分 
	    输入:无
	    功能:计算每个学校的总分并存入学校对象的sumscore成员中
	    输出:无
	  通过学校编号查询学校总分,各项目总分降序输出
	    输入:学校编号
	    功能:查询该学校的总分,降序输出各项目总分
	    输出:学校总分和降序的各个项目的总分  
	  通过学校编号/名称查询学校总分,各项目总分降序输出
	    输入:学校编号/名称
	    功能:查询该学校的总分,降序输出各项目总分
	    输出:学校总分和降序的各个项目的总分   
	  按学校编号查询学校某个项目的获奖情况
	    输入:学校编号和项目编号
	    功能:查询该学学该项目的获奖情况
	    输出:该学校该项目的获奖情况
	  按项目编号查询取得前三名的学校  
	    输入:项目编号
	    功能:查询该项目取得前三名的学校
	    输出:该项目取得前三名的学校名称
	  退出系统
	    输入:0
	    功能:退出系统
	    输出:退出系统,欢迎下次再来!  
end ADT	    

六.物理设计

【存储结构】

School类
私有成员:学校编号,学校名称,队伍数量,所含队伍列表;
公有方法:构造方法,getter方法,setter方法,增加队伍方法…;

Team类
私有成员:队伍编号,队伍所属学校编号,队伍所选项目编号,队伍得分;
公有方法:构造方法,读方法getter,写方法setter…;

Item类
私有成员:项目编号,项目名称,所含队伍数量,所含队伍列表;
公有方法:构造方法,getter方法,增加队伍方法…;

其他存储结构
LinkedList schools = new LinkedList<>();//学校列表存储所有学校
LinkedList teams = new LinkedList<>();//队伍列表存放所有队伍
LinkedList items = new LinkedList<>();//项目列表存放所有项目
ArrayList schoolindex = new ArrayList<>();//存放学校编号
ArrayList itemindex = new ArrayList<>();//存放项目编号
ArrayList teamindex = new ArrayList<>();//存放队伍编号

【功能实现】(只列出部分功能)

1.增添学校
    //增添学校
    void addschool(){
    
    
        try{
    
    
            Scanner input = new Scanner(System.in);
            out.print("请输入需要增添的学校个数:");
            int n = input.nextInt();
            out.print("\n请输入学校编号和学校名称(输入-1强制退出):");
            int num = 1;
            while(num++ <= n){
    
    
                out.println("\n请输入第" + (num-1) + "个学校信息:");
                int i = input.nextInt();
                if(i == -1){
    
    
                    break;
                }
                if(schoolindex.contains(i)){
    
    
                    out.println("该学校编号已存在,请重新输入!");
                    num--;
                    continue;
                }
                String s = input.next();
                if(s.equals("-1")){
    
    
                    break;
                }
                School school = new School(i,s);
                schools.add(school);//将输入的学校对象添加到schools列表中
                schoolindex.add(i);//将输入的学校对象编号添加到schoolindex列表中
                try {
    
    
                    WriteFile("schoollist.txt",i + "、" +s);
                    out.println("已完成" + s + "的文件存储");
                } catch (IOException e) {
    
    
                    e.printStackTrace();
                }
            }
        }catch (java.util.InputMismatchException e){
    
    
            out.println("输入数据的类型错误!");
        }
    }
2.增添项目
   //增添项目
    void additem(){
    
    
        try{
    
    
            Scanner input = new Scanner(System.in);
            out.print("请输入需要增添的项目个数:(输入-1强制退出)");
            int n = input.nextInt();
            out.print("\n请输入项目编号和项目名称(一个项目一行):");
            int num = 1;
            while(num++ <= n){
    
    
                out.println("\n请输入第" + (num-1) + "个项目信息:");
                int i = input.nextInt();
                if(i == -1)
                    break;
                if(itemindex.contains(i)){
    
    
                    out.println("该项目编号已存在,请重新输入!");
                    num--;
                    continue;
                }
                String s = input.next();
                if(s.equals("-1"))
                    break;
                Item item = new Item(i,s);
                items.add(item);//将输入的项目对象添加到items列表中
                itemindex.add(i);//将输入的项目对象编号添加到itemindex列表中
                try {
    
    
                    WriteFile("itemlist.txt",i + "、" +s);
                    out.println("已完成" + s + "项目的文件存储");
                } catch (IOException e) {
    
    
                    e.printStackTrace();
                }
            }
        }catch (java.util.InputMismatchException e){
    
    
            out.println("输入数据的类型错误!");
        }

    }
3.增添队伍
    //增添队伍
    void addteam(){
    
    
        try{
    
    
            Scanner input = new Scanner(System.in);
            out.print("请输入需要增添的队伍个数:");
            int n = input.nextInt();
            out.print("\n请输入队伍编号,队伍所属学校编号,队伍所属项目编号以及队伍得分(输入-1强制退出):");
            int num = 1;
            while(num++ <= n){
    
    
                out.println("\n请输入第" + (num-1) + "个队伍信息:");
                int i = input.nextInt();
                if(i == -1)
                    break;
                if(teamindex.contains(i)){
    
    
                    out.println("该队伍编号已存在,请重新输入!");
                    num--;
                    continue;
                }
                int j = input.nextInt();
                if(j == -1)
                    break;
                if(!schoolindex.contains(j)){
    
    
                    out.println("该学校编号不存在,请重新输入!");
                    num--;
                    continue;
                }
                int k = input.nextInt();
                if(k == -1)
                    break;
                if(!itemindex.contains(k)){
    
    
                    out.println("该项目编号不存在,请重新输入!");
                    num--;
                    continue;
                }
                int score = input.nextInt();
                if(k == -1)
                    break;
                if(score > 100 || score < 0){
    
    
                    out.println("输入的分数需在0-100之间,您输入的分数不合法,请重新输入!");
                    num--;
                    continue;
                }
                Team team = new Team(i,j,k,score);
                teams.add(team);//将输入的队伍对象添加到teams列表中
                teamindex.add(i);//将输入的队伍对象编号添加到teamindex列表中
                try {
    
    
                    WriteFile("teamlist.txt","编号:"+team.getIndex() + "  隶属于:" +SchoolindexToSchoolname(team.getSchoolindex()) + "  参加了" + ItemindexToItemname(team.getItemindex()) + "  得分为:" + team.getScore());;
                    out.println("已完成编号为" + i + "的队伍的文件存储");
                } catch (IOException e) {
    
    
                    e.printStackTrace();
                }
            }
            //增加队伍后需要重新初始化学校队伍和项目队伍
            inititemteam();
            initschoolteam();
        }catch (java.util.InputMismatchException e){
    
    
            out.println("输入数据的类型错误!");
        }
    }

    //将队伍列表写入文件"teamlist.txt"
    void wteamlist(){
    
    
        try {
    
    
            WriteFile("teamlist.txt",String.format("当前已有队伍%d个:",teams.size()));
            for(Team team:teams)
                WriteFile("teamlist.txt","编号:"+team.getIndex() + "  隶属于:" +SchoolindexToSchoolname(team.getSchoolindex()) + "  参加了" + ItemindexToItemname(team.getItemindex()) + "  得分为:" + team.getScore());
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }
4.读取文件并输出学校列表
//读取文件并输出学校列表
    void printSchoolList(){
    
    
        if(schools.isEmpty())
            out.println("当前学校列表为空!");
        else{
    
    

            System.out.println("\t  ***********学校列表************     ");
            System.out.println("------------------------------------------");
            /*out.printf("当前已有学校%d所:\n",schools.size());
            for(School school:schools)
                out.println(school.getIndex() + "、" +school.getName() + "队伍数量:" + school.getNumber());*/
            try {
    
    
                ReadFile("schoollist.txt");
            } catch (IOException e) {
    
    
                e.printStackTrace();
            }
            System.out.println("------------------------------------------");
        }
    }
5.读取文件并输出项目列表
 //读取文件并输出项目列表
    void printItemList(){
    
    
        if(items.isEmpty())
            out.println("当前项目列表为空!");
        else{
    
    
            System.out.println("\t  ***********项目列表************     ");
            System.out.println("------------------------------------------");
            /*out.printf("当前已有项目%d个:\n",items.size());
            for(Item item:items)
                out.println(item.getIndex() + "、" + item.getName() + "队伍数量:" + String.format("%3d",item.getNumber()));*/
            try {
    
    
                ReadFile("itemlist.txt");
            } catch (IOException e) {
    
    
                e.printStackTrace();
            }
            System.out.println("------------------------------------------");
        }
    }

6.读取文件并输出队伍列表
 //读取文件并输出队伍列表
    void printTeamList(){
    
    
        if(teams.isEmpty())
            out.println("当前队伍列表为空!");
        else{
    
    
            System.out.println("\t  ***********队伍列表************     ");
            System.out.println("------------------------------------------");
            /*out.printf("当前已有队伍%d个:\n",teams.size());
            for(Team team:teams)
                out.println("编号:"+team.getIndex() + "  隶属于:" +SchoolindexToSchoolname(team.getSchoolindex()) + "  参加了" + ItemindexToItemname(team.getItemindex()));*/
            try {
    
    
                ReadFile("teamlist.txt");
            } catch (IOException e) {
    
    
                e.printStackTrace();
            }
            System.out.println("------------------------------------------");
        }
    }
7.统计学校总分
    //统计每个学校的总分
    void computersumscore(){
    
    
        for(int i:schoolindex){
    
    
            int sum = 0;
            for(Team x:teams){
    
    
                if(x.getSchoolindex() == i){
    
    
                    sum += x.getScore();
                }
            }
            for(School x:schools){
    
    
                if(x.getIndex() == i){
    
    
                    x.setSumscore(sum);
                    break;
                }
            }
        }
    }
8.文件存取
    //向dir文件中写入string
    public void WriteFile(String dir,String string) throws IOException {
    
    
        File file = new File(dir);
        //如果文件不存在,创建文件
        if (!file.exists())
            file.createNewFile();
        //创建BufferedWriter对象并向文件写入内容
        BufferedWriter bw = new BufferedWriter(new FileWriter(file,true));
        //向文件中写入内容
        bw.write(string + "\n");//写入后自动换行
        bw.flush();
        bw.close();
    }

    //读取dir文件
    public void ReadFile(String dir) throws IOException {
    
    
        File file = new File(dir);
        //如果文件不存在,创建文件
        if (!file.exists())
            file.createNewFile();
        //创建BufferedReader读取文件内容
        BufferedReader br = new BufferedReader(new FileReader(file));
        String line;
        while ((line=br.readLine())!=null) {
    
    
            System.out.println(line);
        }
        br.close();
    }

【函数算法框架】

在这里插入图片描述

七.测试数据

要求使用全部合法数据,整体非法数据,局部非法数据。进行程序测试,以保证程序的稳定。

猜你喜欢

转载自blog.csdn.net/m0_59056822/article/details/124900926