栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

数据结构实验预习报告

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据结构实验预习报告

实验报告一:计算机设计大赛赛事统计

【问题描述】

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

【基本要求】

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

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

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

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

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

设计思路:


其中class projectManage设计处结构体project ,school,team分别留在之后调用,然后设计出类,分别初始化遍历信息

projectManage(team teams[], int len)       根据队伍情况初始化项目类
void bijiao()     根据总分排序,使用sort函数
void frontschool()     将排序过的学校,标记为获奖
void award_school()    打印出已经获奖的学校
void award_school_index(int index)   打印出指定项目的获奖学校
project pro[n];   引用project 结构体

然后是对学校的信息处理
 

school schools[m]   初始化调用school 的结构体
schoolManage(team* teams, int len)  初始化遍历school 和project 之间的联系
void getSum()  计算出学校的奖总数
void show_award()  显示学校的获奖
void show_proj_byid(int x, int y) 显示项目获奖情况
void award_team() 输出获奖
void school_awrad() 排序输出学校获奖

然后对原函数初始化,函数自己生成函数值。

关键步骤:

tring schname[] = { "江苏科技大学","南京大学","东南大学","扬州大学","河海大学","南京医科大学" ,"苏州大学","江苏大学","郑州大学","南京理工大学" };
        string proname[] = { "互联网+","计算机设计大赛","蓝桥杯","物联网大赛","大学生数学建模大赛","大学生英语竞赛" };
        for (int j = 0; j < m; j++)
        {
            schools[j].name = schname[j];
            for (int i = 0; i < n; i++)
            {
                schools[j].pro[i].name = proname[i];
            }
        }

        for (int i = 0; i < len; i++)//初始化队伍信息
        {
            for (int j = 0; j < m; j++)//遍历学校
            {
                if (teams[i].school == schools[j].name)//根据队伍所属学校 找到学校
                {
                    for (int k = 0; k < n; k++)//遍历项目
                    {
                        if (schools[j].pro[k].name == teams[i].proname)//根据队伍报名科目找到 学校的科目
                        {
                            schools[j].pro[k].teams[schools[j].pro[k].num++] = &teams[i];
                        }
                    }
                }
            }
        }

        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
            {
                if (schools[i].pro[j].num > 6)
                {
                    cout << schools[i].name << " " << schools[i].pro[j].name << " 多于6支!" << endl;
                }
            }
        }
    }

    void getSum()
    {
        for (int i = 0; i < m; i++)
        {
            int sum = 0;
            for (int j = 0; j < n; j++)
            {
                int len = schools[i].pro[j].num;
                for (int k = 0; k < len; k++)
                {
                    sum += schools[i].pro[j].teams[k]->goal;
                }
            }
            schools[i].goal = sum;
        }
    }

    bool compare(team* t1, team* t2)
    {
        return t1->goal > t2->goal;
    }

    //显示学校各个项目的获奖情况
    void show_award()
    {
        for (int i = 0; i < m; i++)//对每个学校的项目的队伍得分排序
        {
            for (int j = 0; j < n; j++)//每个项目
            {
                sort(schools[i].pro[j].teams, schools[i].pro[j].teams + schools[i].pro[j].num, [](team* t1, team* t2) {return t1->goal > t2->goal; });
            }
        }

        for (int i = 0; i < m; i++)//每个学校
        {
            for (int j = 0; j < n; j++)//每个项目
            {
                int l = 0;
                int len = schools[i].pro[j].num;

                for (int k = 0; k < len; k++)//的前三名
                {
                    cout << left << setw(4) << "学校id: " << setw(3) << i + 1 << setw(4) << " 学校:" << setw(16) << schools[i].name << setw(4) << " id: " << j + 1 << "  项目:" << setw(16) << schools[i].pro[j].name << " " << schools[i].pro[j].teams[k]->name << " 小队 分数为:"
                        << schools[i].pro[j].teams[k]->goal;
                    if (schools[i].pro[j].teams[k]->getAward)
                    {
                        cout << " 获奖!" << endl;
                        schools[i].pro[j].winteams[l++] = schools[i].pro[j].teams[k];
                    }
                    else
                    {
                        cout << " 未获奖!" << endl;
                    }
                }

                cout << left << setw(4) << "学校id: " << setw(3) << i + 1 << setw(4) << " 学校:" << setw(16) << schools[i].name << setw(4) << " id: " << j + 1 << "  项目:" << setw(16) << schools[i].pro[j].name << " " << l << " 支小队" << " 获奖" << endl << endl;

            }
        }
    }

出现问题与思考:

这个方法没有输入数值,存在遗憾

实验预习报告二:校园导游咨询

【问题描述】

设计一个校园导游程序,为来访的客人提供各种信息查询服务。

【基本要求】

(1) 设计你所在学校的校园平面图,所含景点不少于10个.以图中顶点表示校内各景点,存放景点名称、代号、简介  等信息;以边表示路径,存放路径长度等相关信息。

  (2)  为来访客人提供图中任意景点相关信息的查询。

(3) 为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。

设计思路:

设计出景点之间的无向图,使其能够反映出景点之间的关系,我使用二维数组来规范景点之间的距离,不存在路径的项数无限大,然后依次寻找自己所需要的路径和景点信息,找寻最短路径时,标注结点,然后依次遍历,然后压栈,最后弹出栈顶。

设计的学校图片

核心步骤:

int FindMin(int start_point ,int end_point )
{
   int weight[N]; 
   int disp[N];    //边的距离 
   bool visited[N] = {false};
   fill(disp,disp + N,inf);
   int prev[N];    //用来标注当前结点的上一个结点,以便输出两点间最短路线 
   for(int i=0;i     prev[i] = i;//初始状态设每个点的前驱为自身 
    disp[start_point] = 0;                
    for(int i = 0;i < N;i++)
    {    int u = -1,min = inf;
        for(int j = 0;j < N;j++){
            if(visited[j] == false && disp[j] <= min)
            {
                u = j;
                min = disp[j];
            }
        }    
        
        if(u == -1)
            break;
        
        visited[u] = true;
        for(int v = 0;v < N;v++){
            if(visited[v] == false && M[u][v] != inf)
            {
                { if(disp[u] + M[u][v] < disp[v])
                    disp[v] = disp[u] + M[u][v];
                    prev[v] = u;//prev保存当前结点的上一个节点,以便输出最短路线
                }        
            }
        }
    }
    stack myStack;
    int temp = end_point;
    myStack.push(end_point);  //先加终点 
    while(start_point != temp)
    {    temp = prev[temp];
        myStack.push(temp);//注意这里是把当前点的上一个结点放进去,此时换成了temp 
    }
    
    cout<<"起点"<     while(!myStack.empty())
    {    cout<";
        myStack.pop(); 
        
    }
    if(myStack.empty() )
    cout<     
}

出现问题和思考:

没有标注起自己的路径长度,有点可惜。

项目3:算术表达式求解

【问题描述】
设计一个简单的算术表达式计算器。

【基本要求】
 实现标准整数类型的四则运算表达式的求值(包含括号,可多层嵌入)

设计思路

使用后缀表达的写法,首先读取输入的中缀表达式,然后将中缀表达式转化为后缀表达式,1) 初始化两个栈:运算符栈S1和储存中间结果的栈S2;
(2) 从左至右扫描中缀表达式;
(3) 遇到操作数时,将其压入S2;
(4) 遇到运算符时,比较其与S1栈顶运算符的优先级:
(4-1) 如果S1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈;
(4-2) 否则,若优先级比栈顶运算符的高,也将运算符压入S1(注意转换为前缀表达式时是优先级较高或相同,而这里则不包括相同的情况);
(4-3) 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(4-1)与S1中新的栈顶运算符相比较;
(5) 遇到括号时:
(5-1) 如果是左括号“(”,则直接压入S1;
(5-2) 如果是右括号“)”,则依次弹出S1栈顶的运算符,并压入S2,直到遇到左括号为止,此时将这一对括号丢弃;
(6) 重复步骤(2)至(5),直到表达式的最右边;
(7) 将S1中剩余的运算符依次弹出并压入S2;
(8) 依次弹出S2中的元素并输出,结果的逆序即为中缀表达式对应的后缀

核心步骤:

int main()
{
    string str;
    X:cout << "输入表达式(括号要输入字母括号): "<     cin >> str;
    stack stk;        //运算符栈
    stack stk2;      //数字栈 
    stack tmp;       //创建一个临时值的栈
    tmp = stk;    string temp;             //临时值 
    string num;            //可转换的数 
    for (int i = 0; i <= str.length(); i++)
    {   
        //压入temp里面剩余值
        if ((!temp.empty()) && (i == str.length()))
        {
            stk2.push(temp);
            temp.clear();
            continue;
        }
        //防止越界访问
        if (i == str.length())
        {
            continue;
        }
        //如果是数字直接压入栈stk2
        if (str[i] >= '0' && str[i] <= '9')
        {   if(str[i]=='0.9')
             str[i]=9;
            temp += str[i];
            
        }
        //如果是运算符压入stk
         else if (str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/')
        {    if (str[i+1] == '+' || str[i+1] == '-' || str[i+1] == '*' || str[i+1] == '/')
            {  cout<<"输入错误,请重新输入!"<                 goto X;
                 break;
            }
            //后面是)会丢掉这个temp
            //每次要判断temp是否为空,如果没有会把空压入stk2导致后面结果不正确
            if (!temp.empty())
            {
                stk2.push(temp);
                temp.clear();
            }
            while (1)
            {
                if (stk.empty() || stk.top().c_str()[0] == '(') //stk为空或者栈顶为"("   stk.top().c_str()[0]取符号   
                {
                    num = str[i];
                    stk.push(num);                //要输入字母的括号
                    break;
                }
                else if (function(str[i]) > function(stk.top().c_str()[0]))  //判断符号优先级,大于就压栈
                {
                    num = str[i];
                    stk.push(num);                       //压栈 
                    break;
                }
                else
                {
                    num = stk.top();                    //依次输出 
                    stk.pop();                    
                    stk2.push(num);
                }
            }
        }
        else  if(str[i]=='('||str[i]==')') //这里是() 
        {
            if (str[i] == '(')
            {
                num = str[i];
                stk.push(num);
            }
            else //不是'('    就是')'
            {
                //把'('前的符号出栈,然后'('符号丢弃
                while (stk.top().c_str()[0] != '(')
                {
                    //因为其他步骤都跳过了,故这也要添加
                    if (!temp.empty())
                    {
                        stk2.push(temp);
                        temp.clear();
                    }
                    num = stk.top();
                    stk.pop();                 //最后将运算符依次出栈,将运算符压在数字栈顶(排列顺序) 
                    stk2.push(num);
                }
                stk.pop();                    //符号中再次出栈 
            }
            
        }
        else 
        {  cout<<"输入错误,请重新输入!"<            goto X;
            break;
        }
    }
    //正序转换

遇到的问题和思考

对后缀方法使用不熟练,不太清楚使用方法。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/943171.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号