2022数据结构课程设计(个人)

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

【问题描述】

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

【基本要求】

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

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

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

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

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

【设计要求】

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

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

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

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

【测试数据】

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

【实现提示】

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

项目2:校园导游咨询

【问题描述】

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

【基本要求】

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

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

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

【测试数据】

以江苏科技大学长山校区为例。

【实现提示】

一般情况下,校园的道路是双向通行的,可设校园平面图是一个无向网.顶点和边均含有相关信息.

【校园平面图】

【算法描述】

带有景点信息的结构体

struct vertex
{
    int num;
    char name[20];
    char info[300];
};
struct maps
{
    int n;
    int m;
    vertex v[M];
    int edgs[M][M];
} g;

景点信息(简介和距离)

void Creatvertex()
{
    g.v[0].num=1;
    strcpy(g.v[0].name,"后勤服务楼");
    strcpy(g.v[0].info,"这里是学生报修的地方");
    g.v[1].num=2;
    strcpy(g.v[1].name,"好又多超市");
    strcpy(g.v[1].info,"这是西区的超市,学生一般都会在这里购买生活用品");
    g.v[2].num=3;
    strcpy(g.v[2].name,"体育馆");
    strcpy(g.v[2].info,"这是学生活动的地方");
    g.v[3].num=4;
    strcpy(g.v[3].name,"七号组团");
    strcpy(g.v[3].info,"这是本班女生所在的宿舍楼,分A、B、C栋");
    g.v[4].num=5;
    strcpy(g.v[4].name,"文理大楼");
    strcpy(g.v[4].info,"这是学校最高的一栋楼,里面包含了实验室");
    g.v[5].num=6;
    strcpy(g.v[5].name,"计算机学院楼");
    strcpy(g.v[5].info,"这是计算机学院楼,教师办公就在这里");
    g.v[6].num=7;
    strcpy(g.v[6].name,"海韵湖");
    strcpy(g.v[6].info,"这是学校的一座人工湖");
    g.v[7].num=8;
    strcpy(g.v[7].name,"大学生活动楼");
    strcpy(g.v[7].info,"这是学生举办文艺活动的场所");
    g.v[8].num=9;
    strcpy(g.v[8].name,"北门");
    strcpy(g.v[8].info,"这是学校的正大门,学生一般都得从这里出去");
    g.v[9].num=10;
    strcpy(g.v[9].name,"北苑");
    strcpy(g.v[9].info,"这也叫北苑,是教师就餐的地方");
    g.v[10].num=11;
    strcpy(g.v[10].name,"笃学楼");
    strcpy(g.v[10].info,"这是学校的16号教学楼");
    g.v[11].num=12;
    strcpy(g.v[11].name,"东苑");
    strcpy(g.v[11].info,"这是东区的学生食堂,图书馆就在东苑对面");
    g.v[12].num=13;
    strcpy(g.v[12].name,"图书馆");
    strcpy(g.v[12].info,"这是学校的图书馆,同学们可以在这里学习");
}
void Creatmaps()
{
    int i,j;
    g.n=13;
    g.m=18;
    for(i=0; i<g.n; i++) 
    {
        for(j=0; j<g.n; j++)
        {
            g.edgs[i][j]=INF;
        }
    }
    g.edgs[0][1]=g.edgs[1][0]=100;
    g.edgs[1][3]=g.edgs[3][1]=200;
    g.edgs[1][7]=g.edgs[7][1]=400;
    g.edgs[3][4]=g.edgs[4][3]=600;
    g.edgs[1][4]=g.edgs[4][1]=300;
    g.edgs[2][7]=g.edgs[7][2]=100;
    g.edgs[2][10]=g.edgs[10][2]=450;
    g.edgs[3][4]=g.edgs[4][3]=300;
    g.edgs[4][7]=g.edgs[7][4]=300;
    g.edgs[4][6]=g.edgs[6][4]=1000;
    g.edgs[10][12]=g.edgs[12][10]=300;
    g.edgs[5][8]=g.edgs[8][5]=600;
    g.edgs[6][8]=g.edgs[8][6]=300;
    g.edgs[6][12]=g.edgs[12][6]=350;
    g.edgs[6][7]=g.edgs[7][6]=600;
    g.edgs[8][9]=g.edgs[9][8]=150;
    g.edgs[9][11]=g.edgs[11][9]=700;
    g.edgs[10][11]=g.edgs[11][10]=500;
}

查找景点信息

void Search()
{
    int i,n;
    cout<<"江科大长山校区的景点有:"; 
    cout<<endl;
    for(i=0; i<13; i++)
    {
       cout<<g.v[i].num<<g.v[i].name;
       cout<<endl;
    }
    while(1)
    {
        cout<<"请输入你想要查询的景点编号:";
        cout<<"按0退出";
        cin>>n;
        getchar();
        if(n==0)
        {
            break;
        }
        else if(n<0||n>13)
        {
            cout<<"输入有误,请重新输入!";
            continue;
        }
        else
        {
            cout<<g.v[n-1].num<<g.v[n-1].name;
            cout<<endl;
            cout<<g.v[n-1].info;
            cout<<endl;
        }
    }
    return ;
}

用弗洛伊德算法计算最短路径

void Floyd() 
{
    int i,j,k;
    for(i=0; i<g.n; i++) 
    {
        for(j=0; j<g.n; j++)
        {
            dist[i][j]=g.edgs[i][j];
            if(i!=j&&dist[i][j]<INF)
            {
                path[i][j]=i;
            }
            else
            {
                path[i][j]=-1;
            }
        }
    }
    
    for(k=0; k<g.n; k++)
    {
        for(i=0; i<g.n; i++)
        {
            for(j=0; j<g.n; j++)
            {
                if(dist[i][j]>(dist[i][k]+dist[k][j]))
                {
                    dist[i][j]=dist[i][k]+dist[k][j];
                    path[i][j]=k;         
                }
            }
        }
    }
    return ;
}
void Bestpath(int s, int e)
{
    if(path[s][e]==-1||path[s][e]==e||path[s][e]==s)
    {
        return;
    }
    else
    {
        Bestpath(s,path[s][e]);
        cout<<g.v[path[s][e]].name;
        Bestpath(path[s][e],e);
    }
}

主函数调用

int main()
{
    int i,n;
    int start,ends;
    Creatvertex();
    Creatmaps();
    
    while(1)
    {
        menu(); 
        cout<<"请输入需要操作的命令:";
        cout<<endl;
        cin>>n;
        getchar();
        if(n<1||n>3)
        {
            cout<<"输入有误,请重新输入!";
            continue;
        }
        else
        {
            if(n==1)
            {
                Search();
            }
            else if(n==2)
            {
                cout<<"请输入起点的景点:\n";
                cin>>start;
                cout<<"请输入终点的景点:\n";
                cin>>ends;
                Floyd();
                cout<<"从"<<g.v[start-1].name<<"到"<<g.v[ends-1].name<<"最短距离是:"<<dist[start-1][ends-1];
                cout<<endl;
                cout<<"最佳路径为:"; 
                cout<<g.v[start-1].name<<"-->";
                Bestpath(start-1, ends-1);
                cout<<g.v[ends-1].name;
            }
            
            else if(n==3)
            {
                return 0;
            }
        }

    }
    return 0;
}

项目3:算术表达式求解

【问题描述】

设计一个简单的算术表达式计算器。
【基本要求】
 实现标准整数类型的四则运算表达式的求值(包含括号,可多层嵌入).
【测试数据】
(30+2*70)/3-12*3
 5+(9*(62-37)+15)*6
 要求自行设计非法表达式,进行程序测试,以保证程序的稳定运行。

【算法描述】

    利用栈将中缀表达式转换为后缀表达式求值。如(a+b)*(c-d)为中缀表达式,转换为后缀表达式ab+cd-*,对此只需要从左往右扫描,与到操作符就将左边的两个操作数进行计算,直到整个式子扫描结束为止。

建栈

typedef struct stack
{
	int a[N];
	int top;	
}ST;

       为方便对栈的使用,进行了一系列操作(判断栈是否为空、是否上溢、出栈、入栈以及取栈顶元素)

int isempty(ST *T)  
{
	if(T->top<0)
		return 1;
	else
		return 0;
}

int isfull(ST *T)   
{
	if(T->top==N-1)
		return 1;
	else
		return 0;
}

int gettop(ST *T) 
{ 
	return T->a[T->top];
}

int pop(ST *T)  
{
	int x;
	if(T->top<0)   
	{
		cout<<"栈为空"; 
		exit(0);
	}
	else
	{
		x=T->a[T->top];
		(T->top)--;
		return x;
	}
}

void push(ST *T,int s)   
{
	if(T->top==N-1)   
	{
		cout<<"栈上溢";
		exit(0);
	}
	else
	{
		(T->top)++;
		T->a[T->top]=s;
	}
}

 将中缀表达式转换为后缀表达式的具体操作:

1.从左往右遍历表达式;

2.如果是运算数,输出;

3.如果是左括号,入栈;

4.如果是右括号,则不断取出栈顶元素并输出,直到遇到左括号;

5.如果是预算符,将其与栈顶运算符比较优先级,若高于栈顶运算符,则入栈;若低于,则将栈顶运算符弹出并输出,然后继续和下一个栈顶运算符比较。


void transfer(char *In,char *Post)  
{
	ST T;
	int i,j,flag=0;    
	int count;     
	int right=0,left=0;     
	T.top=-1;
	for(i=0,j=0;In[i]!='\0';i++)
	{
		switch(In[i])
		{
		case '0':
		case '1':
		case '2':
		case '3':
		case '4':
		case '5':
		case '6':
		case '7':
		case '8':
		case '9':for(count=0;(In[i]<='9'&&In[i]>='0')||In[i]=='.';i++,j++)
				{
				 	Post[j]=In[i];
				 	if(In[i]=='.') 
				 		count++;
				}  
				i--;
				if(count>1)
				{
				 	cout<<"表达式错误(数中有两个小数点)";
				 	exit(0);
				}
				Post[j]=' ';
				j++;
				flag=1;  
				break;
		case '(':if(flag)
				{
 					cout<<"表达式错误(数字后直接跟括号)";
				 	exit(0);
				}
				push(&T,In[i]); 
				left++;
			    break;
		case ')':right++;   
				while(gettop(&T)!='(')
				{
					 Post[j]=pop(&T);
					 j++;
				}
			     pop(&T); 
				 break;
		case '+':
		case '-':if(!flag&&i!=0)
				{
				 	cout<<"表达式错误(有连续两个运算符之间没有数字)";
				 	exit(0);
				}
				while(!isempty(&T)&&gettop(&T)!='(')
				{
					Post[j]=pop(&T);
					j++;
				}
			    push(&T,In[i]);
			    flag=0;
				break;
		case '*':
		case '/':if(!flag) 
				{
				 	cout<<"表达式错误(有连续两个运算符之间没有数字)";
				 	exit(0);
				} 
				while(!isempty(&T)&&(gettop(&T)=='/'||gettop(&T)=='*'))
				{
					 Post[j]=pop(&T);
					 j++;
				}
			    push(&T,In[i]);
			    flag=0;
				break;
		default:cout<<"表达式错误(输入非法字符)";
			    exit(0);
		}
	}
	if(left!=right)
	{
		cout<<"表达式错误(左右括号不匹配)";
		exit(0);
	}
	while(!isempty(&T)) 
	{
		Post[j]=pop(&T);
		j++;
	}
	
	Post[j]='\0';
}

计算表达式


float Calculate(char *post)
{
	int i,j;       
	int len;  
	int top=-1 ;                
	float temp,aa[N];           
	char ch[N];                 
	for(i=0,j;post[i]!='\0';i++)   
	{
		if(post[i]>='0'&&post[i]<='9')
		{
			j=0;   
			while(post[i]!=' ') 
			{ 
				ch[j]=post[i]; 
				i++;
				j++;
			}
			ch[j]='\0'; 
			
				for(j=0;ch[j]!='\0';j++);
					len=j-1;
				for(j=0,temp=0.;ch[j]!='\0';j++)
					temp+=(ch[j]-'0')*pow(10,len-j);
			
			top++;
			aa[top]=temp;
		}
		else      
		{
			switch(post[i])  
			{
				case'+':
						temp=aa[top];
						top--;
						temp+=aa[top];  
						aa[top]=temp;
						break;
				case'-':
						temp=aa[top];
						top--;
						temp=aa[top]-temp;  
						aa[top]=temp;
						break;
				case'*':
						temp=aa[top];
						top--;
						temp=temp*aa[top]; 
						aa[top]=temp;
						break;
				case'/':
						temp=aa[top];
						top--;
						temp=aa[top]/temp;   
						aa[top]=temp;
			}
		}
	}
	return aa[top];
}

主函数调用

int main()
{
	char in[N],post[N];     
	float answer;           
	cout<<"输入中缀表达式:  ";
	cin>>in;
	while(strcmp(in,"#")!=0)   
	{
		transfer(in,post);     
		cout<<"后缀表达式为:";    
		cout<<post;
		cout<<endl;
		cout<<"计算结果为:";
		answer=Calculate(post);
		cout<<answer;
		cout<<endl;
		cout<<"输入中缀表达式为:  ";
	    cin>>in;
	}
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值