📄 sportsmeeting.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 + -