数据结构课程设计预习报告

本文档详细介绍了三个项目:中国计算机设计大赛赛事统计系统、校园导游咨询系统和算术表达式求解器的设计。统计系统实现了学校比赛信息的输入、排序和查询功能;导游咨询系统提供了校园地图、景点信息和导航路径规划;求解器则能处理包含括号的整数四则运算表达式。每个项目都包含了详细的设计思路、数据结构设计、实现代码和测试案例,展示了在实际问题中如何运用数据结构和算法知识。
摘要由CSDN通过智能技术生成

目录

项目

项目内容

项目1:中国计算机设计大赛赛事统计

1. 问题描述

2. 基本要求

3. 设计要求

4. 测试数据

5. 实现提示

6. 问题分析和任务定义

7. 数据结构的逻辑设计和物理设计

8. 调用关系

9. 完整代码

10. 运行结果

项目2:校园导游咨询

1. 问题描述

2. 基本要求

3. 测试数据

4. 实现提示

5. 问题分析和任务定义

6. 数据结构的逻辑设计和物理设计

7. 实景地图及拓扑图

8. 完整代码

9. 运行结果

项目3:算术表达式求解

1. 问题描述

2. 基本要求

3. 测试数据

4. 实现提示

5. 问题分析和任务定义

6. 数据结构的逻辑设计和物理设计

7. 完整代码

8. 运行结果分析


项目

一、中国计算机设计大赛赛事统计

二、校园导游咨询

三、算术表达式求解

项目内容

项目1:中国计算机设计大赛赛事统计

1. 问题描述

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

2. 基本要求

1)每个比赛项目至少有10支参赛队;每个学校最多有6支队伍参赛;

2)能统计各学校的总分;

3)可以按照学校编号或名称,学校的总分、各项目的总分排序输出;

4)可以按学校编号查询学校某个项目的获奖情况;可以按项目编号查询取得前三名的学校;

5)数据存入文件并能随时查询

3. 设计要求

1)输入数据形式和范围:可以输入学校的名称,赛事项目的名称。

2)输出形式:有中文提示,各学校分数为整数

3)界面要求:交互设计要合理,每个功能可以设立菜单,根据提示,可以完成相关功能的要求。

4)存储结构:学生自己根据系统功能要求自己设计,但是赛事相关数据要存储在文件中。

4. 测试数据

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

5. 实现提示

  假设3<赛事项目数量<=10,学校名称长度不超过20个字符。每个赛事结束时,将其编号、名称输入,并依次输入参赛学校编号、学校名称和成绩。

6. 问题分析和任务定义

利用结构体建立数组存放信息

int item[m0+5][n0+1];
//item[1][0]-item[m0][0]     存放项目编号
//item[0][1]-item[0][n]      存放学校编号
//item[1][]-item[m0][]       存放各项目成绩
//item[m0+1][]               存放各项目总成绩
//item[m0+3][]               存放学校各项目总成绩
//item[m0+4][]               存放学校按总分排序的名次 

主函数中分模块,欢迎界面,输入信息,排序输出,查询模块等。

7. 数据结构的逻辑设计和物理设计

7.1逻辑设计

(1)结构体

#define n0 20          //学校最大数目
#define m0 20          //项目最大数目

typedef struct itemnode//存放信息
{
int item[m0+5][n0+1];
//item[1][0]-item[m0][0]     存放项目编号
//item[0][1]-item[0][n]      存放学校编号
//item[1][]-item[m0][]       存放各项目成绩
//item[m0+1][]               存放各项目总成绩
//item[m0+3][]               存放学校各项目总成绩
//item[m0+4][]               存放学校按总分排序的名次 
}itemnode;

(2)主函数中存放欢迎界面,输入信息,排序输出,查询模块四个主要模块。

7.2物理设计

(1)欢迎界面

    int n,m;
    printf("              计算机设计大赛赛事统计系统                \n");
    printf("\t\t\t欢迎使用\t\t\t\t\n\n");
    printf("该系统实现的功能有:\n");
    printf("              1.输入大赛相关信息;\n");
    printf("              2.能统计各学校总分并排序输出;\n");
    printf("              3.可以按学校编号,查询学校总分、各项目总分及名次;\n");
    printf("              4.可以按项目编号查询前三名获奖情况:\n");
    printf("实现功能2、3、4要先录入信息哟~\n");
	printf("请先输入大赛主要信息\n"); 

(2)输入信息

    printf("输入学校个数:");
	scanf("%d",&n);
	printf("输入项目个数:");
    scanf("%d",&m);
    int c;
    int i,j;
    struct itemnode a;
 
    for(i=1;i<n+1;i++)
   {
		printf("请输入第%d个学校编号:",i);
   		scanf("%d",&a.item[0][i]);
   		printf("\n");
	}
	for(j=1;j<m+1;j++)
	{
   		printf("请输入第%d个项目编号:",j);
        scanf("%d",&a.item[j][0]);
        printf("\n");
    }
    for(i=1;i<n+1;i++)
    {
        for(j=1;j<m+1;j++)
       {
           printf("请输入第%d个学校第%d个项目成绩:",i,j);
           scanf("%d",&a.item[j][i]);
           printf("\n");
       }
    }
    for(i=1;i<n+1;i++)
    {
        a.item[m+1][i]=0;
        a.item[m+2][i]=0;
        a.item[m+3][i]=0;
        a.item[m+4][i]=0;
    }

(3)排序输出

   //下面计算各学校、各学校项目总分
   for(i=1;i<n+1;i++)
    {
        for(j=1;j<m+1;j++)
        {
            a.item[m+3][i]+=a.item[j][i];//学校项目总分
        }
    }
    for(i=1;i<n+1;i++)
    {
        for(j=1;j<m+1;j++)
        {
            a.item[m+1][i]+=a.item[j][i];//各项目总分
        }
    }
    printf("****************************************排序输出*************************************\n");
    int temp,temp1;
    int xu;
    for(i=2;i<n+1;i++)
    {
        temp=a.item[m+3][i];
        for(j=i-1;j>=1&&temp>a.item[m+3][j];j--)//寻找插入位置
        {
            a.item[m+3][j+1]=a.item[m+3][j];//交换总分列
            for(xu=0;xu<m+4;xu++)
            {
                if(xu!=m+3)//除了总分那一列不交换 其他的都交换  因为总分的那一列在上面交换
                {
                    temp1=a.item[xu][j+1];
                    a.item[xu][j+1]=a.item[xu][j];
                    a.item[xu][j]=temp1;
                }
            }
        }
        a.item[m+3][j+1]=temp;//小于当前值的,插到当前值后面
    }
    //赋值名次
    for(i=1;i<n+1;i++)
    {
        a.item[m+4][i]=i;
    }
	for(i=0;i<n+1;i++)
    {
        for(j=0;j<m+5;j++)
        {
            if(i==0)
            {
                if(j==0)
                {
                    printf("\t");
                }
                else if(j>=1&&j<m+1)
                {
                    printf("项目%d\t\t",a.item[j][i]);
                }
                else if(j==m+1)
                {
                    printf("各项目总成绩\t\t\t");
                }
                else if(j==m+3)
                {
                    printf("学校总成绩\t");
                }
                else if(j==m+4)
                {
                    printf("名次\t");
                }
            }
            else if(j==0)
            {
                if(i!=0)
                {
                    printf("学校%d\t",a.item[j][i]);
                }
            }
            else
            {
                printf("  %d\t\t",a.item[j][i]);
            }
        }
        printf("\n");
    }
    int s;
    printf("\t\t*******1.按学校总分排序输出*******\n");
    printf("\t\t*******2.按学校编号输出*******\n");
    printf("\t\t*******3.按各项目总分排序输出*******\n");
    printf("\n\n");
	printf("请选择要实现输出功能的编号(1—3):");
	scanf("%d",&s);
    switch(s)
{
case 1://学校总分排序
{
  for(i=0;i<n+1;i++)
    {
        for(j=0;j<m+5;j++)
        {
            if(i==0)
            {
                if(j==0)
                {
                    printf("\t");
                }
                else if(j>=1&&j<m+1)
                {
                    printf("项目%d\t\t",a.item[j][i]);
                }
                else if(j==m+1)
                {
                    printf("各项目总成绩\t\t\t");
                }
                else if(j==m+3)
                {
                    printf("学校总成绩\t");
                }
                else if(j==m+4)
                {
                    printf("名次\t");
                }
            }
            else if(j==0)
            {
                if(i!=0)
                {
                    printf("学校%d\t",a.item[j][i]);
                }
            }
            else
            {
                printf("  %d\t\t",a.item[j][i]);
            }
        }
        printf("\n");
    }
}break;
case 2://学校编号排序
{ 
   for(i=2;i<n+1;i++)
    {
        temp=a.item[0][i];
        for(j=i-1;j>=1&&temp<a.item[0][j];j--)//寻找插入位置
        {
            a.item[0][j+1]=a.item[0][j];//交换学校列
            for(xu=0;xu<m+5;xu++)
            {
                if(xu!=0)//除了学校那一列不交换 其他的都交换  因为学校的那一列在上面交换
                {
                    temp1=a.item[xu][j+1];
                    a.item[xu][j+1]=a.item[xu][j];
                    a.item[xu][j]=temp1;
                }
            }
        }
        a.item[0][j+1]=temp;//小于当前值的,插到当前值后面
    }
     for(i=0;i<n+1;i++)
    {
        for(j=0;j<m+5;j++)
        {
            if(i==0)
            {
                if(j==0)
                {
                    printf("\t");
                }
                else if(j>=1&&j<m+1)
                {
                    printf("项目%d\t\t",a.item[j][i]);
                }
                else if(j==m+1)
                {
                    printf("各项目总成绩\t\t\t");
                }
                else if(j==m+3)
                {
                    printf("学校总成绩\t");
                }
                else if(j==m+4)
                {
                    printf("名次\t");
                }
            }
            else if(j==0)
            {
                if(i!=0)
                {
                    printf("学校%d\t",a.item[j][i]);
                }
            }
            else
            {
                printf("  %d\t\t",a.item[j][i]);
            }
        }
        printf("\n");
    }
}break;
case 3://各项目总分排序
{
    for(i=2;i<n+1;i++)
    {
        temp=a.item[m+1][i];
        for(j=i-1;j>=1&&temp>a.item[m+1][j];j--)//寻找插入位置
        {
            a.item[m+1][j+1]=a.item[m+1][j];//交换项目总分列
            for(xu=0;xu<m+5;xu++)
            {
                if(xu!=m+1)//除了项目总分那一列不交换 其他的都交换  因为项目总分的那一列在上面交换
                {
                    temp1=a.item[xu][j+1];
                    a.item[xu][j+1]=a.item[xu][j];
                    a.item[xu][j]=temp1;
                }
            }
        }
        a.item[m+1][j+1]=temp;//小于当前值的,插到当前值后面
    }
     for(i=0;i<n+1;i++)
    {
        for(j=0;j<m+5;j++)
        {
            if(i==0)
            {
                if(j==0)
                {
                    printf("\t");
                }
                else if(j>=1&&j<m+1)
                {
                    printf("项目%d\t\t",a.item[j][i]);
                }
                else if(j==m+1)
                {
                    printf("各项目总成绩\t\t\t");
                }
                else if(j==m+3)
                {
                    printf("学校总成绩\t");
                }
                else if(j==m+4)
                {
                    printf("名次\t");
                }
            }
            else if(j==0)
            {
                if(i!=0)
                {
                    printf("学校%d\t",a.item[j][i]);
                }
            }
            else
            {
                printf("  %d\t\t",a.item[j][i]);
            }
        }
        printf("\n");
    }
}break;
}

(4)查询模块

    //下面为查询模块
    printf("**************************************查询模块***********************************\n");
    int bianhao;
    printf("请输入要查询的学校编号:");
    scanf("%d",&bianhao);
    printf("\n");
    for(i=1;i<n+1;i++)
    {
        if(a.item[0][i]==bianhao)
        {
            printf("该学校的各项成绩及各项总分和名次如下:\n");
            for(j=0;j<m+5;j++)
            {
                if(j==0)
                {
                    printf("\t");
                }
                else if(j>=1&&j<m+1)
                {
                    printf("项目%d\t\t",a.item[j][0]);
                }
                else if(j==m+1)
                {
                    printf("各项目总成绩\t\t\t");
                }
                else if(j==m+3)
                {
                    printf("学校总成绩\t");
                }
                else if(j==m+4)
                {
                    printf("名次\t");
                }
            }
            printf("\n");
            for(j=0;j<m+5;j++)
            {
                if(j==0)
                {
                    printf("学校%d\t",a.item[0][i]);
                }
                else
                {
                    printf("  %d\t\t",a.item[j][i]);
                }
            }
        }
    }
    printf("\n");
    int bianhao1;
    printf("请输入要查询的项目编号:");
    scanf("%d",&bianhao1);
    printf("\n");
    for(i=2;i<n+1;i++)
    {
        temp=a.item[m+3][i];
        for(j=i-1;j>=1&&temp>a.item[m+3][j];j--)/
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值