《数据结构课程设计》实验报告

admin 41 2024-02-06 14:18:32

  【问题描述】

  参加计算机设计大赛的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();

  }

《数据结构课程设计》实验报告

《数据结构课程设计》实验报告

上一篇:中央电视台5套节目表(中央电视台5套在线直播)
下一篇:2023-2024年小学体育工作计划范文
相关文章

 发表评论

暂时没有评论,来抢沙发吧~

返回顶部小火箭