项目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;
}
}