【高额扑克第九季】High Stakes Poker中文|播客吧直播
15
2024 / 10 / 03
【问题描述】
参加计算机设计大赛的n个学校编号为1~n,赛事分成m个项目,项目的编号为1~m.比赛获奖按照得分降序,取前三名,写一个统计程序产生各种成绩单和得分报表。
【基本要求】
1)每个比赛项目至少有10支参赛队;每个学校最多有6支队伍参赛;
2)能统计各学校的总分;
3)可以按照学校编号或名称查询,学校的总分、各项目的总分排序输出;
4)可以按学校编号查询学校某个项目的获奖情况;可以按项目编号查询取得前三名的学校;
5)数据存入文件并能随时查询
【设计要求】
1)输入数据形式和范围:可以输入学校的名称,赛事项目的名称。
2)输出形式:有中文提示,各学校分数为整数
3)界面要求:交互设计要合理,每个功能可以设立菜单,根据提示,完成相关功能的要求。
4)存储结构:学生自己根据系统功能要求自己设计,但是赛事相关数据要存储在文件中。
【测试数据】
要求使用全部合法数据,整体非法数据,局部非法数据。进行程序测试,以保证程序的稳定。
【实现提示】
假设3<赛事项目数量<=10,学校名称长度不超过20个字符。每个赛事结束时,将其编号、名称输入,并依次输入参赛学校编号、学校名称和成绩。
对项目进行编号放入数组中存储。
排序时,对成绩以及编号排序;
school、project,可变长数组
import java.util.*;
public class Test {
static int m;
static int n;
static Project[] project = new Project[10];
static School[] school = new School[10];
static class Project {
int Code1;
String Name1;
int Num;
int[] Join = new int[10];
int[] score = new int[10];
}
static class School {
int Code2;
String Name2;
int Sum;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入项目的数目:");
m = sc.nextInt();
System.out.println("请输入学校的数目:");
n = sc.nextInt();
while (true) {
System.out.println("————————————————————————————————");
System.out.println("这里是中国计算机设计大赛赛事统计系统");
System.out.println("1.添加");
System.out.println("2.编号查询");
System.out.println("3.总分查询");
System.out.println("4.查询学校某个项目的获奖情况");
System.out.println("5.查询前三名的学校");
System.out.println("0.退出");
System.out.println("————————————————————————————————");
int a = sc.nextInt();
if (a != 0 && a != 1 && a != 2 && a != 3 && a != 4 && a != 5) {
System.out.println("输入有误!");
System.exit(0);
}
switch (a) {
case 1:
add();
break;
case 2:
printByCodes();
break;
case 3:
printByScore();
break;
case 4:
findByCodes();
break;
case 5:
getTopThree();
break;
case 0:
System.out.println("谢谢使用");
System.exit(0);
}
}
}
public static void add() {
Scanner sc = new Scanner(System.in);
for (int i = 0; i < m; i++) {
project[i] = new Project();
project[i].Code1 = i + 1;
System.out.println("请输入第" + (i + 1) + "个项目的名称:");
project[i].Name1 = sc.nextLine();
System.out.println("添加成功!");
}
for (int i = 0; i < m; i++) {
System.out.println("项目编号" + project[i].Code1 +
"项目名称" + project[i].Name1);
}
for (int i = 0; i < n; i++) {
school[i] = new School();
school[i].Code2 = i + 1;
System.out.println("请输入第" + (i + 1) + "个学校的名称:");
school[i].Name2 = sc.nextLine();
System.out.println("添加成功!");
}
for (int i = 0; i < n; i++) {
System.out.println("学校编号" + school[i].Code2 +
"学校名称" + school[i].Name2);
}
for (int i = 0; i < m; i++) {
System.out.println("请输入参加" + project[i].Name1 + "的学校数量:");
project[i].Num = sc.nextInt();
System.out.println("请依次输入参加" + project[i].Name1 + "的学校编号:");
for (int j = 0; j < project[i].Num; j++) {
project[i].Join[j] = sc.nextInt();
System.out.println("输入成功!");
}
System.out.println("参加项目" + project[i].Name1 + "的学校有");
for (int j = 0; j < project[i].Num; j++) {
System.out.println(project[i].Join[j] + " ");
}
System.out.println("请依次输入参加" + project[i].Name1 + "的学校的分数");
for (int j = 0; j < project[i].Num; j++) {
int score = sc.nextInt();
if (score >= 0 && score <= 100) {
project[i].score[j] = score;
System.out.println("输入成功!");
} else {
System.out.println("您输入的有误!");
System.exit(0);
}
}
System.out.println("显示如下:");
for (int j = 0; j < project[i].Num; j++) {
System.out.println("编号" + project[i].Join[j] + "的学校取得的成绩:" + project[i].score[j]);
}
}
}
public static void printByCodes() {
int sum = 0;
for (int i = 0; i < n; i++) {
System.out.println("学校编号:" + school[i].Code2);
System.out.println("学校名称:" + school[i].Name2);
for (int j = 0; j < m; j++) {
for (int k = 0; k < project[j].Join[k]; k++) {
if (project[j].Join[k] == school[i].Code2) {
System.out.println("参赛项目:" + project[j].Name1);
System.out.println("取得成绩:" + project[j].score[k]);
System.out.println("*****");
sum += project[j].score[k];
}
}
}
System.out.println("学校取得的总分是:" + sum);
school[i].Sum = sum;
sum = 0;
System.out.println("————————————————————————");
}
}
public static void printByScore() {
int b = 0;
int[] c = new int[n];
for (int i = 0; i < n; i++) {
c[i] = school[i].Sum;
}
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
if (c[i] > c[j]) {
b = c[i];
c[i] = c[j];
c[j] = b;
}
}
}
System.out.println("按照总分排序学校如下:");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (c[i] == school[j].Sum) {
System.out.println("总分第" + (n - i) + "名的学校是" + school[j].Name2);
System.out.println("其总分是:" + school[j].Sum);
System.out.println("——————————————————————————————");
}
}
}
}
public static void findByCodes() {
Scanner sc = new Scanner(System.in);
System.out.println("请输入你想要查询的学校编号");
int scode = sc.nextInt();
System.out.println("请输入你想要查询的项目编号");
int pcode = sc.nextInt();
int[] c = new int[project[pcode - 1].Num];
int len = c.length;
for (int i = 0; i < len; i++) {
c[i] = project[pcode - 1].score[i];
}
int b = 0;
for (int i = 0; i < len; i++) {
for (int j = i; j < len; j++) {
if (c[i] > c[j]) {
b = c[i];
c[i] = c[j];
c[j] = b;
}
}
}
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
if (project[pcode - 1].score[i] == c[j]) {
System.out.println("该学校在该项目中排第" + (j+1) + "名");break;
}
break;
}
}
}
public static void getTopThree() {
Scanner sc = new Scanner(System.in);
System.out.println("请输入您想要查询的项目的编号:");
int code = sc.nextInt();
int[] c = new int[project[code - 1].Num];
int len = c.length;
for (int i = 0; i < len; i++) {
c[i] = project[code - 1].score[i];
}
int b = 0;
for (int i = 0; i < len; i++) {
for (int j = i; j < len; j++) {
if (c[i] > c[j])
{
b = c[i];
c[i] = c[j];
c[j] = b;
}
}
}
for (int i = 0; i < len; i++) {
for (int j = 0; j < n; j++) {
if (c[len - 1] == project[code - 1].score[i]) {
if (school[j].Code2 == project[code - 1].Join[i]) {
System.out.println("第一名的学校是:" + school[j].Name2);
}
}
if (c[len - 2] == project[code - 1].score[i]) {
if (school[j].Code2 == project[code - 1].Join[i]) {
System.out.println("第二名的学校是:" + school[j].Name2);
}
}
if (c[len - 3] == project[code - 1].score[i]) {
if (school[j].Code2 == project[code - 1].Join[i]) {
System.out.println("第三名的学校是:" + school[j].Name2);
}
}
}
}
}
}
【问题描述】
设计一个校园导游程序,为来访的客人提供各种信息查询服务。
【基本要求】
(1) 设计你所在学校的校园平面图,所含景点不少于10个.以图中顶点表示校内各景点,存放景点名称、代号、简介 等信息;以边表示路径,存放路径长度等相关信息。
(2) 为来访客人提供图中任意景点相关信息的查询。
(3) 为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一条最短的简单路径。
【测试数据】
以江苏科技大学长山校区为例。
【实现提示】
一般情况下,校园的道路是双向通行的,可设校园平面图是一个无向网,顶点和边均含有相关信息。
最短路径算法(Dijkstra算法):
该算法用于寻找两个景点之间的最短路径。
Dijkstra算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。可以用堆优化。
绘制校园简图。
定义N个结点(景点名称、景点信息),边的最大值MAXedg,邻接点、边。
定义name类
定义MinPath类
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
#define Max 11
#define MX 999999
int D[Max][Max];
int path[Max][Max];
typedef struct Ver{//顶点信息
char num[5];
char name[51];
char instruct[101];
}Ver;
typedef struct{//邻接矩阵
Ver vex[Max];//顶点表
int arcs[Max][Max];
int vnum,arcnum;
}AMGragh;
void menu(){
cout<<"************欢迎您************"<<endl;
cout<<" 1、查看所有景点 "<<endl;
cout<<" 2、景点查询 "<<endl;
cout<<" 3、问路 "<<endl;
cout<<" 4、修改景点基本信息 "<<endl;
cout<<" 5、退出 "<<endl;
cout<<"**********************************"<<endl;
cout<<"请选择..."<<endl;
}
void Allprint(AMGragh G){//输出所有景点信息
cout<<"---------------校园景点总览---------------"<<endl;
cout<<"景点名称 "<<" "<<"代号"<<" "<<" 简介"<<endl;
for(int i=0;i<G.vnum;i++){
cout<<G.vex[i].name<<" "<<G.vex[i].num<<" "<<G.vex[i].instruct<<endl;
}
cout<<endl;
}
void CreateUDG(AMGragh &G){//建图
G.vnum=10;
strcpy(G.vex[0].num,"01");
strcpy(G.vex[1].num,"02");
strcpy(G.vex[2].num,"03");
strcpy(G.vex[3].num,"04");
strcpy(G.vex[4].num,"05");
strcpy(G.vex[5].num,"06");
strcpy(G.vex[6].num,"07");
strcpy(G.vex[7].num,"08");
strcpy(G.vex[8].num,"09");
strcpy(G.vex[9].num,"10");
strcpy(G.vex[0].name,"北苑美食城");
strcpy(G.vex[1].name,"北操场 ");
strcpy(G.vex[2].name,"体育馆 ");
strcpy(G.vex[3].name,"图书馆 ");
strcpy(G.vex[4].name,"广场1 ");
strcpy(G.vex[5].name,"广场2 ");
strcpy(G.vex[6].name,"湿地公园 ");
strcpy(G.vex[7].name,"公园2 ");
strcpy(G.vex[8].name,"湖 1 ");
strcpy(G.vex[9].name,"公园3 ");
strcpy(G.vex[0].instruct,"北苑美食城里面有各种各样的美食,可以让你大饱口福");
strcpy(G.vex[1].instruct,"北操场是北苑的一个运动场地,也是一个篮球场");
strcpy(G.vex[2].instruct,"体育馆设施齐全,建筑优美,在此可以尽情享受运动的快乐!");
strcpy(G.vex[3].instruct,"图书馆环境安适,藏书丰富,让人感受阅读的美好");
strcpy(G.vex[4].instruct,"广场1与学校西门相邻,也是升国旗的地方");
strcpy(G.vex[5].instruct,"广场2上会举办一些文艺晚会和校园招聘会,更是轮滑爱好者的乐园");
strcpy(G.vex[6].instruct,"湿地公园有小石桥和美丽的树木,让人心旷神怡");
strcpy(G.vex[7].instruct,"公园2的标志是一对白色的大海豚,坐落在水中央,夏天水中开有漂亮的莲花");
strcpy(G.vex[8].instruct,"湖 1的水清澈见底,还能看到活泼的小鱼");
strcpy(G.vex[9].instruct,"公园3里往届校友栽的树,生机勃勃,代表着他们对母校的爱");
G.arcs[1][2]=G.arcs[2][1]=2;
G.arcs[1][9]=G.arcs[9][1]=19;
G.arcs[2][3]=G.arcs[3][2]=3;
G.arcs[2][4]=G.arcs[4][2]=5;
G.arcs[3][4]=G.arcs[4][3]=2;
G.arcs[4][5]=G.arcs[5][4]=3;
G.arcs[4][7]=G.arcs[7][4]=29;
G.arcs[4][10]=G.arcs[10][4]=33;
G.arcs[5][6]=G.arcs[6][5]=6;
G.arcs[6][7]=G.arcs[7][6]=7;
G.arcs[7][8]=G.arcs[8][7]=8;
G.arcs[8][9]=G.arcs[9][8]=1;
G.arcs[9][10]=G.arcs[10][9]=2;
for(int i=1;i<=10;i++)//初始化路径长度
for(int j=1;j<=10;j++){
if(G.arcs[i][j]==0&&i!=j)
G.arcs[i][j]=MX;
}
G.arcnum=13;
}
void Change(AMGragh &G){//修改信息
Allprint(G);
cout<<"请输入要修改信息的代号:";
char c[5];
cin>>c;
for(int i=0;i<G.vnum;i++){
if(strcmp(c,G.vex[i].num)==0)//字符串比较的方法进行查找
{
memset(G.vex[i].name,0,sizeof(G.vex[i].name));
memset(G.vex[i].num,0,sizeof(G.vex[i].num));
memset(G.vex[i].instruct,0,sizeof(G.vex[i].instruct));
char num1[5];
char name1[51];
char instruct1[101];
cout<<"请输入修改后的景点信息:"<<endl;
cout<<"景点名称:";
scanf("%s",name1);
cout<<"代号:";
scanf("%s",num1);
cout<<"简介:";
scanf("%s",instruct1);
strcpy(G.vex[i].name,name1);
strcpy(G.vex[i].num,num1);
strcpy(G.vex[i].instruct,instruct1);
cout<<"修改成功!"<<endl;
break;
}
}
}
void Query(AMGragh G){//查询景点
cout<<"请输入查询景点的代号:";
char c[5];
cin>>c;
int i;
for(i=0;i<G.vnum;i++)
if(strcmp(c,G.vex[i].num)==0)
{
cout<<"景点名称:"<<G.vex[i].name<<" ";
cout<<"代号:"<<G.vex[i].num<<" ";
cout<<"简介:"<<G.vex[i].instruct<<endl;
break;
}
if(i==G.vnum)
cout<<"该代号不存在!"<<endl;
}
void Floyd(AMGragh G){//弗洛伊德算法,获得最短路径
int i,j,k;
for(i=1;i<=G.vnum;++i)
for(j=1;j<=G.vnum;j++){
D[i][j]=G.arcs[i][j];
if(D[i][j]<MX&&i!=j)
path[i][j]=i;
else
path[i][j]=-1;
}
for(k=1;k<=G.vnum;k++)
for(i=1;i<=G.vnum;++i)
for(j=1;j<=G.vnum;j++)
if(D[i][k]+D[k][j]<D[i][j]){
D[i][j]=D[i][k]+D[k][j];
path[i][j]=path[k][j];
}
}
void Path(AMGragh G,int a,int b){//获得具体路径
int p[Max];
p[0]=b;
int i=1;
while(a!=b){
b=path[a][b];
p[i]=b;
++i;大佬们都在玩{精选官网网址: www.vip333.Co }值得信任的品牌平台!
}
cout<<"路径:"<<G.vex[a-1].name;
i=i-2;
while(i>=0){
cout<<"--->"<<G.vex[p[i]-1].name;
--i;
}
}
void Ask(AMGragh G){//问路
Allprint(G);
cout<<"请输入起点和目的地(1~10,即第几个景点,中间用空格隔开):";
int a,b;
cin>>a>>b;
Floyd(G);
cout<<endl<<endl<<"从"<<G.vex[a-1].name<<"到"<<G.vex[b-1].name<<":"<<endl<<endl<<"最短路径长度:"<<D[a][b]*10<<"米"<<endl;
Path(G,a,b);
cout<<endl;
}
int main(){
AMGragh G;
memset(G.arcs,0,sizeof(G.arcs));
CreateUDG(G);
int m;
while(m!=5){
menu();
cin>>m;
switch(m){
case 1:
Allprint(G);
break;
case 2:
Query(G);
break;
case 3:
Ask(G);
break;
case 4:
Change(G);
break;
case 5:
cout<<"感谢您的使用!"<<endl;
return 0;
default:
cout<<"没有该选项!"<<endl;
}
system("pause");
system("cls");
}
return 0;
}
【问题描述】
设计一个简单的算术表达式计算器。
【基本要求】
实现标准整数类型的四则运算表达式的求值(包含括号,可多层嵌入).
【测试数据】
(30+2*70)/3-12*3 5+(9*(62-37)+15)*6 要求自行设计非法表达式,进行程序测试,以保证程序的稳定运行。
【实现提示】
可以设计以下辅助函数 status isNumber(char ReadInChar); //视ReadInchar 是否是数字而返回 TRUE 或 FALSE 。 int TurnToInteger(char IntChar); // 将字符’0’.’9’ 转换为整数 9。
首先我们需要两个栈:OPTR(用于存放操作符)、 OPED(用于存放操作数)
遇到操作符,将其压入OPTR栈
遇到操作数,将其压入OPED栈
当栈内运算符优先级 > 栈外运算符优先级:可以计算,计算结果压入数据栈。
当栈内运算符优先级 < 栈外运算符优先级:栈外运算符压入运算符栈。
当栈内运算符优先级 = 栈外运算符优先级:只可能是左括号和右括号的情况,将左括号出栈即可。
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define STACKINCREMENT 5
#define STACK_INIT_SIZE 10
typedef char SElemType;大佬们都在玩{精选官网网址: www.vip333.Co }值得信任的品牌平台!
typedef int Status;
typedef struct{
SElemType *base;//栈底指针
SElemType *top;//栈顶指针
int stacksize;//当前已经分配的存储空间
}SqStack;
char prior[7][7]={{'>','>','<','<','<','>','>'},{'>','>','<','<','<','>','>'},{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},{'<','<','<','<','<','=','!'},{'>','>','>','>','!','>','>'},
{'<','<','<','<','<','!','='}};//定义算符之间优先关系的二维数组
//构造一个存放char型数据的空栈
Status InitStack(SqStack *s){
s->base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!s->base) return ERROR;
s->top = s->base;//栈中元素个数为0
s->stacksize = STACK_INIT_SIZE;
return OK;
}
//入栈
Status Push(SqStack *s,SElemType e){
if(s->top-s->base>=s->stacksize){
s->base = (SElemType *)realloc(s->base,(STACKINCREMENT+s->stacksize)*sizeof(SElemType));
if(!s->base) exit(0);
s->top = s->base+s->stacksize;
s->stacksize += STACKINCREMENT;大佬们都在玩{精选官网网址: www.vip333.Co }值得信任的品牌平台!
}
*s->top++ = e;
return OK;
}
//出栈
Status Pop(SqStack *s,SElemType *e){
if(s->base==s->top){
printf("空栈!
");
return ERROR;
}
*e = *--s->top;
return OK;
}
//得到栈顶元素
SElemType GetTop(SqStack *s){
return *(s->top-1);
}
//确定输入的字符如果是操作符的话判断在二维数组中的下标 若是数字的话就另外与操作符区分开 便于在输入表达式时是入哪个栈
int Index(char c){
switch(c){
case '+': return 0;
case '-': return 1;
case '*': return 2;
case '/': return 3;
case '(': return 4;
case ')': return 5;
case '#': return 6;
default: return 7;
}
}
//判断优先级,返回大小 < > = !
char Priority(char a,char b){
int x,y;
x = Index(a); y = Index(b);
if(x!=7&&y!=7)
return prior[x][y];
else
return '!';
}
//简单表达式求值
int Reckon(int a,char theta,int b){
switch(theta){
case '+':return a+b;
case '-':return a-b;
case '*':return a*b;
case '/':return a/b;
}
}
//判断是字符是否是数字
Status isdigit(char ch){
if(ch>='0'&&ch<='9') return OK;
return ERROR;
}
//算术表达式求值
void GetExpressionValue(){
SqStack OPTR,OPND;
SElemType result;//返回最后结果
InitStack(&OPTR);
InitStack(&OPND);
Push(&OPTR,'#');//将结束符置于操作符的底端
printf("请输入算术表达式:
");
char c = getchar();
while(c!='#'||GetTop(&OPTR)!='#'){//当*c=='#'&&栈顶字符=='#'的时候
if(isdigit(c)){//如果是数字的话将其转化为数字 然后入操作数栈
int data[10];
int i,num;
i = num =0;//num是一个中间数 用于将字符串中的数字转化为整数然后入栈 i是用于将字符串中的字符存入data数组
while(isdigit(c)){
data[i] = c-'0';
i++;
c = getchar();
}
for(int j=0;j<i;j++){
num = num*10+data[j];
}
Push(&OPND,num);
}else{//如果是字符的话将其入操作符栈
SElemType a,b,theta;//a b theta是用来返回操作数栈和操作符栈里的元素的
switch(Priority(GetTop(&OPTR),c)){//比较即将入栈的字符与栈顶 操作符的优先级关系
case '<':Push(&OPTR,c);
c = getchar();
break;
case '>':Pop(&OPND,&b);
Pop(&OPND,&a);
Pop(&OPTR,&theta);
Push(&OPND,Reckon(a,theta,b));
break;//将结果入栈
case '=':Pop(&OPTR,&theta);
c = getchar();
break;//说明括号相遇 删除栈内括号即可
default:break;
}
}
}
Pop(&OPND,&result);
printf("结果是:%d",result);
}
main(){
GetExpressionValue();
}
发表评论
暂时没有评论,来抢沙发吧~