⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sportsmeeting.cpp

📁 这是我做的数据结构作业-运动会分数统计;其中有详细代码
💻 CPP
字号:
(1)Gdefine.h

#define Status int
#define OK 1
#define FAIL 0
#define ERROR 0
#define PASS 1
#define OVERFLOW 0

(2)Sqlist.h

#include"stdlib.h"
#include"Gdefine.h"

///////////////////////////////////////
//顺序表抽象数据类型表示和实现
#define LIST_INIT_SIZE    100 //线性表存储空间的初始分配
#define LISTINCREMENT     20  //线性表存储空间的分配增量
/*............................................*/
//顺序表数据元素类型 ElemType
typedef struct
{
 int item;//项目编号
 int item_Od; //区分取前五名还是取前三名
 int order;//名次
 char name[20];//运动员姓名 
 int school_id;//学校编码
    int score;//分数
} ElemType;
/*............................................*/


/*............................................*/
//顺序表结构类型Sqlist
/*............................................*/
typedef struct
{
 ElemType *elem;//基地址
 int length;//表长
 int listsize;//目前表长
} SqList;


//----------------顺序表基本操作-------------------
 Status InitList_Sq(SqList &L); //初始化顺序表
 void DestroyList_Sq( SqList &L); //销毁顺序表
 int ListLength(SqList L); //返回L中数据元素的个数
 void GetElem(SqList L,int i,ElemType &e); //用e返回L中第i个数据元素的值
 Status ListInsert_Sq(SqList &L,int i,ElemType e); //插入操作
 Status ListDelete_Sq(SqList &L,int i ,ElemType &e); //删除操作
 void print(SqList &L,int i); //输出顺序表第i个数据元素

//----------------顺序表基本操作实现-------------------
////////////////////////////////////////////
//构造一个空的线性表L.
Status InitList_Sq(SqList  &L)
{  
 if(L.elem!=NULL) //若再次执行本函数时将原来的数组空间释放
  DestroyList_Sq(L);
 L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
 if(!L.elem)exit(OVERFLOW);    //存储分配失败
 L.length=0;                   //空表长度为0
 L.listsize=LIST_INIT_SIZE;    //初始存储容量
  return OK;
}//InitList_Sq      算法2.3

////////////////////////////////////////////
//销毁结构
void DestroyList_Sq( SqList &L)
{
  // 释放顺序表 L 所占存储空间
  free(L.elem);
  L.listsize = 0;
  L.length = 0;
}// DestroyList_Sq

////////////////////////////////////////////
//在顺序线性表L中第i个位置之前插入新的元素e,
//i的合法值为1≤i≤ListLength_Sq(L)+1
Status ListInsert_Sq(SqList &L,int i,ElemType e)
{  
   ElemType *newbase,*q,*p;
 if (i<1||i>L.length+1)
  return ERROR;   //i值不合法
if (L.length>=L.listsize)     //当前存储空间已满,增加分配
    { newbase=(ElemType *)realloc(L.elem,
                 (L.listsize+LISTINCREMENT)*sizeof(ElemType));
      if(!newbase)exit(OVERFLOW);  //存储分配失败
      L.elem=newbase;              //新基址
      L.listsize +=LISTINCREMENT; //增加存储容量
    }
   q = &(L.elem[i-1]);              //q为插入位置
   {
   for(p = &(L.elem[L.length-1]);p>=q;--p) 
   *(p+1)=*p;
     *q=e; //插入e
   
   }
   ++L.length;  //表增长1
   return OK;
}

//在顺序线性表L中删除第i个元素,并用e返回其值
//i的合法值为1≤i≤ListLength_Sq(L)
Status ListDelete_Sq(SqList &L,int i ,ElemType &e)  
{  
 ElemType *q,*p;
  if((i<1)||(i>L.length))//i值不合法
   return ERROR; 
  p = &(L.elem[i-1]);    //p为被删除元素的位置
    e=*p;
    q = L.elem+L.length-1;                //表尾元素的位置
  for(++p;p<=q;++p) 
   *(p-1)=*p;         //被删除元素之后的元素左移
  --L.length;                          //表长减1
  return OK;
}
//返回L中数据元素的个数
int ListLength(SqList L)
{
 return L.length;
}
////////////////////////////////////////////
//用e返回L中第i个数据元素的值
void GetElem(SqList L,int i,ElemType &e)
{ 
  if(i<=L.length)
    e=L.elem[i];
}

////////////////////////////////////////////
//输出顺序表第i个数据元素
void print(SqList &L, int i)
{
 printf("%-12d %-8d %-4d %-4d %-12s %-4d\n",(L.elem+i)->school_id,(L.elem+i)->item,(L.elem+i)->item_Od,(L.elem+i)->order,(L.elem+i)->name,(L.elem+i)->score);//输出项目编号
}

(3)main.cpp

#include<stdio.h>
#include<conio.h>
#include"Gdefine.h"
#include"Sqlist.h"


Status ReadFormFile(SqList &L);//从文件读入信息
int GetFromKey (SqList &L);//从键盘输入信息
Status OutSchoolScore(SqList &L);//输出各学校成绩单
Status outtotletable(SqList &L);//输出各学校总成绩

int menu(void);//显示主菜单


int main()
{//主函数
  
  SqList a;
  int num,i;
  a.elem=NULL;//创建SqList a时指针elem没有初始化,编译器对指针elem赋了值,所以将elem赋空值
  int status=InitList_Sq(a);
  if (!status)
  {
  printf("Init list ERROR!!");
  }
  while((num=menu())!=0)
     switch(num)
       {
     case 0: exit(0);
        case 1: 
                InitList_Sq(a);
    ReadFormFile(a);
    break;
        case 2: i=GetFromKey(a);  break;
        case 3: OutSchoolScore(a); break;
        case 4: outtotletable(a); break;
       }
  return 0;
}//main


//////////////////////////////////////////////////////////////////
//从文件读入信息
Status ReadFormFile(SqList &L)
{
 FILE *fp;
 char filename[40];
 int i=1;
 ElemType temp;
 fp=fopen("data.txt","r");//当前目录下的date.txt
 while (!fp)//当在d:\\c\\找不到date.txt文件时,指定文件与路径
 {
  printf("please input your date filename and director:\n");
  scanf("%s",filename);
  if (!filename) return (FAIL);
  fp=fopen (filename,"r");
 }

 while(!feof(fp))//若读date.txt文件时将文件的最后一行多读一次,有可能是文件的最后一行有换行,将光标退格到最后一个字,再将文件另存一下date1.txt。
 {
  //读入项目编号,名次,姓名,校编号,得分
  fscanf(fp,"%d %d %d %s %d %d",&temp.item,&temp.item_Od,&temp.order,temp.name,&temp.school_id,&temp.score);
     ListInsert_Sq(L,i,temp); //利用顺序表的插入操作
  i++;
 }

 fclose(fp);
 return OK;
}//GetCustomScoreFromFile


//////////////////////////////////////////////////////////////////
//从键盘输入信息
int GetFromKey (SqList &L)
{
 int i=0;
 ElemType temp;
 printf("item number(0 to end input)\n");
 printf("item number(item number is even get 5 ,odd get 3):");
 scanf("%d",&temp.item);  
 if (!temp.item) return OK;
 while(temp.item)
 {
 printf("item_order:(5 / 3)");
 scanf("%d",&temp.item_Od);
 printf("order:(1--10)");
 scanf("%d",&temp.order);
 if (temp.item%2!=0) //项目编号为奇数的项目取前五名
 {
  switch(temp.order)
  {
  case 1: temp.score=7; break; //第一名得7分
     case 2: temp.score=5; break; //第二名得5分
  case 3: temp.score=3; break; //第三名得3分
  case 4: temp.score=2; break; //第四名得2分
  case 5: temp.score=1; break; //第五名得1分
  }
 }
  else //否则,项目编号为偶数的项目取前三名
  {
  switch(temp.order)
  {
  case 1: temp.score=5; break; //第一名得5分
     case 2: temp.score=3; break; //第二名得3分
  case 3: temp.score=2; break; //第三名得2分
  }
  }
   printf("school_id:");
   scanf ("%d",&temp.school_id);
   printf("name(NO blank ):");
   scanf ("%s",temp.name);
   getchar();
  ListInsert_Sq(L,L.length+1,temp);
  printf("item number:"); 
  scanf("%d",&temp.item); 
  if (!temp.item) break;
  i++;
 }
 //L.length=i;
 return i;
}//GetFromKey


//////////////////////////////////////////////////////////////////
//输出各学校成绩单 
Status OutSchoolScore(SqList &L)
{
  int min,max,i,j;
  min=max=L.elem[0].school_id;//min是school_id的最小值,max是school_id的最大值
  for(i=0;i<L.length;i++)
  {
    if(L.elem[i].school_id<min) min=L.elem[i].school_id;
    if(L.elem[i].school_id>max) max=L.elem[i].school_id;
  }
  printf("学校编号  项目编号 类型符  名次   名字     得分\n"); 
  for(i=min;i<=max;i++)
    for(j=0;j<L.length;j++)
      if(L.elem[j].school_id==i)
        print(L,j);
  return OK;
}//OutSchoolScore


//////////////////////////////////////////////////////////////////

Status outtotletable(SqList &L)
{//输出各学校总成绩
  int min,max,i,j,boyscore=0,girlscore=0;//min是school_id的最小值,max是school_id的最大值
  min=max=L.elem[0].school_id;
  for(i=0;i<L.length;i++)
  {
    if(L.elem[i].school_id<min) min=L.elem[i].school_id;
    if(L.elem[i].school_id>max) max=L.elem[i].school_id;
  }
  printf("学校编号  男子总份  女子总分  团体总分\n"); 
  for(i=min;i<=max;i++)
  {
    for(j=0;j<L.length;j++)
      if(L.elem[j].school_id==i)
      {
        if(L.elem[j].item_Od==5)boyscore+=L.elem[j].score;
        if(L.elem[j].item_Od==3)girlscore+=L.elem[j].score;
      }
    printf("%-12d %-8d %-8d %-8d\n",i,boyscore,girlscore,boyscore+girlscore);
  }
 return OK;
}//addition


//////////////////////////////////////////////////////////////////
int menu(void)//显示主菜单
{   
  int number;
    
    printf("\n      main menu      \n");
    printf("1. input date from file\n"); 
 printf("2. input date by KeyBord\n");
    printf("3. output school grade table\n");
    printf("4. output group sum total table\n");
 printf("5. put date to file\n");
    printf("0. exit\n");
    printf("-----------------------\n");
    printf("Input Select(1,2,3,4,...,0)");
    scanf("%d",&number);
 getchar();
    return number;   //获得选择
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -