【问题描述】
参加计算机设计大赛的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
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
int temp = end_point;
myStack.push(end_point); //先加终点
while(start_point != temp)
{ temp = prev[temp];
myStack.push(temp);//注意这里是把当前点的上一个结点放进去,此时换成了temp
}
cout<<"起点"<
{ 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 << "输入表达式(括号要输入字母括号): "<
stack
stack
stack
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<<"输入错误,请重新输入!"<
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<<"输入错误,请重新输入!"<
break;
}
}
//正序转换
遇到的问题和思考
对后缀方法使用不熟练,不太清楚使用方法。



