运动会积分系统
问题描述:学生运动会成绩数据库系统记录某校运动会上全部运动项目,各系获得的分数及排名情况,运动会项目包括100,400,1500米,跳高,跳远等。分设男子组和女子组。请设计一个积分系统,方便学校对比赛成绩进行统计管理
功能要求:
管理员:
1) 管理员凭密码进入系统,完成以下工作
填写比赛结果(每项目取前三名,分别为积7,5,4分),输入各项目获奖运动员的信息
2)可以按各系院名称输出该学院获得的总分,并按总分排序
3)输出男子团体,女子团体总分排序结果
4)实现按院系名称,运动项目名称查询比赛成绩
普通用户:
普通用户可以查询运动员个人比赛成绩,查看参赛院系的成绩和各比赛项目最终名次等。
以下代码运行须知:
1.在vc6.0下fstream头文件要改成fstream.h
2.在工程目录下手动新建三个.txt文件
1) password.txt (输入******并保存)
2) game_data.txt (空文件)
3) department_data.txt (空文件)
3.性别男为m,女为f,不能输入别的无关字符
4.部分环境不支持中文,与字符编码有关
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fstream>
typedef struct athlete
{
char name[20]; //姓名
char code[10]; //号码
char department[20]; //院系
}Athlete;
typedef struct award_name
{
char sport[20]; //项目名称
char sex[10]; //f女 m男
Athlete award_ath;
int rank;
int score;
}Award;
typedef struct statistic
{
char department[20];
int score_fm;
int score_m;
int score;
}Statistic;
int Judge_Password()
{
char inp[20];
char p[20];
FILE *fp = NULL;
fp = fopen("password.txt", "r+");
fscanf(fp, "%s", p);
if(strcmp(p, "******") == 0) //输入原始密码
{
printf("Please input init password (no more than 15ch)\n");
scanf("%s", p);
fprintf(fp, "%s", p);
fclose(fp);
return 1;
}
else
{
printf("Please input the password\n");
scanf("%s", inp);
if(strcmp(inp, p + 6) == 0)
{
fclose(fp);
return 1;
}
else
{
printf("wrong password!\n");
fclose(fp);
return 0;
}
}
}
void a_input_result()
{
int i, j, flag1, flag2, d_num = 0, a_num = 0, tmpd, tmpa;
FILE *fp1, *fp2;
Award a[3], af[100];
Statistic s[3], sf[100];
memset(a, 0, sizeof(a));
memset(s, 0, sizeof(s));
fp1 = fopen("game_data.txt", "r");
fp2 = fopen("department_data.txt", "r");
fscanf(fp2, "%d\n", &d_num);
fscanf(fp1, "%d\n", &a_num);
for(i = 0; i < d_num; i++)
fscanf(fp2, "%s %d %d %d\n", sf[i].department, &sf[i].score_fm, &sf[i].score_m, &sf[i].score);
for(i = 0; i < a_num; i++)
fscanf(fp1, "%s %s %s %s %s %d %d\n", af[i].sport, af[i].award_ath.name, af[i].award_ath.code, af[i].award_ath.department, af[i].sex, &af[i].rank, &af[i].score);
fclose(fp1);
fclose(fp2);
printf("按项目输入前三名信息(项目名称 姓名 编号 院系 性别 排名):\n");
for(i = 0; i < 3; i++)
{
scanf("%s %s %s %s %s %d", a[i].sport, a[i].award_ath.name, a[i].award_ath.code, a[i].award_ath.department, a[i].sex, &a[i].rank);
if(i == 0)
{
if(a[i].sex[0] == 'f')
s[i].score_fm += 7;
else
s[i].score_m += 7;
s[i].score += 7;
a[i].score += 7;
}
else if(i == 1)
{
if(a[i].sex[0] == 'f')
s[i].score_fm += 5;
else
s[i].score_m += 5;
s[i].score += 5;
a[i].score += 5;
}
else if(i == 2)
{
if(a[i].sex[0] == 'f')
s[i].score_fm += 4;
else
s[i].score_m += 4;
s[i].score += 4;
a[i].score += 4;
}
strcpy(s[i].department, a[i].award_ath.department);
}
for(i = 0; i < 3; i++)
{
af[a_num + i] = a[i];
sf[d_num + i] = s[i];
}
a_num += 3;
d_num += 3;
fp1 = fopen("game_data.txt", "w");
fp2 = fopen("department_data.txt", "w");
fprintf(fp2, "%d\n", d_num);
fprintf(fp1, "%d\n", a_num);
for(i = 0; i < a_num; i++)
fprintf(fp1, "%s %s %s %s %s %d %d\n", af[i].sport, af[i].award_ath.name, af[i].award_ath.code, af[i].award_ath.department, af[i].sex, af[i].rank, af[i].score);
for(i = 0; i < d_num; i++)
fprintf(fp2, "%s %d %d %d\n", sf[i].department, sf[i].score_fm, sf[i].score_m, sf[i].score);
fclose(fp1);
fclose(fp2);
}
void Swap(Statistic x, Statistic y)
{
Statistic tmp;
tmp = x;
x = y;
y = tmp;
}
void Sort(Statistic *s, int num, int op) //0总分 1男 2女
{
int i, j, mi, idx;
for(i = 0; i < num; i++)
{
mi = 1000000;
for(j = i; j < num; j ++)
{
if(op == 0)
{
if(s[j].score < mi)
{
mi = s[j].score;
idx = j;
}
}
else if(op == 1)
{
if(s[j].score_m < mi)
{
mi = s[j].score_m;
idx = j;
}
}
else
{
if(s[j].score_fm < mi)
{
mi = s[j].score_fm;
idx = j;
}
}
}
Swap(s[i], s[j]);
}
}
void a_output_total_goal()
{
int i, j, num, cnt = 0, flag = 0, idx;
Statistic s[100], rs[100];
FILE *fp;
memset(rs, 0, sizeof(rs));
fp = fopen("department_data.txt", "r");
fscanf(fp, "%d", &num);
for(i = 0; i < num; i++)
fscanf(fp, "%s %d %d %d\n", s[i].department, &s[i].score_fm, &s[i].score_m, &s[i].score);
for(i = 0; i < num; i++)
{
for(j = 0; j < cnt; j++)
{
flag = 0;
if(strcmp(s[i].department, rs[j].department) == 0)
{
flag = 1;
idx = j;
break;
}
}
if(flag)
{
rs[idx].score += s[i].score;
}
else
{
strcpy(rs[cnt].department, s[i].department);
rs[cnt].score += s[i].score;
cnt ++;
}
}
Sort(rs, cnt, 0);
for(i = 0; i < cnt; i++)
printf("院系名称: %s 总分: %d\n", rs[i].department, rs[i].score);
fclose(fp);
}
void a_output_fandfm_goal()
{
int i, j, num, cnt1 = 0, cnt2 = 0, f1 = 0, f2 = 0, idx;
Statistic s[100], rfs[100], rms[100];
FILE *fp;
fp = fopen("department_data.txt", "r");
memset(rfs, 0, sizeof(rfs));
memset(rms, 0, sizeof(rms));
fscanf(fp, "%d", &num);
for(i = 0; i < num; i++)
fscanf(fp, "%s %d %d %d\n", s[i].department, &s[i].score_fm, &s[i].score_m, &s[i].score);
for(i = 0; i < num; i++)
{
for(j = 0; j < cnt1; j++)
{
f1 = 0;
if(strcmp(s[i].department, rms[j].department) == 0)
{
f1 = 1;
idx = j;
break;
}
}
if(f1)
{
rms[idx].score_m += s[i].score_m;
//printf("rms[%d].score_m = %d\n", idx, rms[idx].score_m);
}
else
{
//printf("rms[%d].score_m = %d\n", cnt1, rms[cnt1].score_m);
strcpy(rms[cnt1].department, s[i].department);
rms[cnt1].score_m += s[i].score_m;
cnt1 ++;
}
}
Sort(rms, cnt1, 1);
for(i = 0; i < cnt1; i++)
printf("院系名称: %s 男团分: %d\n", rms[i].department, rms[i].score_m);
printf("\n\n");
for(i = 0; i < num; i++)
{
for(j = 0; j < cnt2; j++)
{
f2 = 0;
if(strcmp(s[i].department, rfs[j].department) == 0)
{
f2 = 1;
idx = j;
break;
}
}
if(f2)
rfs[idx].score_fm += s[i].score_fm;
else
{
strcpy(rfs[cnt2].department, s[i].department);
rfs[cnt2].score_fm += s[i].score_fm;
cnt2 ++;
}
}
Sort(rfs, cnt2, 2);
for(i = 0; i < cnt2; i++)
printf("院系名称: %s 女团分: %d\n", rfs[i].department, rfs[i].score_fm);
fclose(fp);
}
void query_by_department()
{
int i, num, flag = 0, sum = 0, fm_sum = 0, m_sum = 0;
FILE *fp;
Statistic s[20];
char d_name[100];
fp = fopen("department_data.txt", "r");
fscanf(fp, "%d", &num);
for(i = 0; i < num; i++)
fscanf(fp, "%s %d %d %d\n", s[i].department, &s[i].score_fm, &s[i].score_m, &s[i].score);
printf("请输入查询的院系名称:\n");
scanf("%s", d_name);
for(i = 0; i < num; i++)
{
if(strcmp(d_name, s[i].department) == 0)
{
flag = 1;
sum += s[i].score;
m_sum += s[i].score_m;
fm_sum += s[i].score_fm;
}
}
if(!flag)
printf("没有该院系的相关信息\n");
else
printf("院系名称: %s\n", d_name);
printf("总分: %d\n", sum);
printf("男子总分: %d\n", m_sum);
printf("女子总分: %d\n", fm_sum);
fclose(fp);
}
void a_query_by_aname()
{
int i, num, flag = 0, cnt = 0;
FILE *fp;
Award ad[100], Tar[100];
char a_name[100];
memset(Tar, 0, sizeof(Tar));
fp = fopen("game_data.txt", "r");
fscanf(fp, "%d", &num);
for(i = 0; i < num; i++)
fscanf(fp, "%s %s %s %s %s %d %d\n", ad[i].sport, ad[i].award_ath.name, ad[i].award_ath.code, ad[i].award_ath.department, ad[i].sex, &ad[i].rank, &ad[i].score);
printf("请输入查询的项目名称:\n");
scanf("%s", a_name);
for(i = 0; i < num; i++)
{
if(strcmp(a_name, ad[i].sport) == 0)
{
flag = 1;
Tar[cnt ++] = ad[i];
}
}
if(!flag)
printf("没有该项目的相关信息\n");
else
{
printf("项目名称: %s\n", a_name);
for(i = 0; i < cnt; i++)
{
printf("运动员姓名: %s 编号: %s 学院: %s\n", Tar[i].award_ath.name, Tar[i].award_ath.code, Tar[i].award_ath.department);
printf("运动员性别: %s 得分: %d 排名: %d\n", Tar[i].sex, Tar[i].score, Tar[i].rank);
printf("\n");
}
}
fclose(fp);
}
int Admin_opt() //管理员选项
{
int opt = 0;
printf("请选择操作\n");
printf("1 - 填写比赛结果\n");
printf("2 - 输出学院总分\n");
printf("3 - 输出男子团体,女子团体的总分\n");
printf("4 - 按院系名称查询比赛成绩\n");
printf("5 - 按运动项目名称查询比赛成绩\n");
printf("6 - 退出\n");
scanf("%d", &opt);
switch(opt)
{
case 1:
a_input_result();
break;
case 2:
a_output_total_goal();
break;
case 3:
a_output_fandfm_goal();
break;
case 4:
query_by_department();
break;
case 5:
a_query_by_aname();
break;
case 6:
return 0;
}
return 1;
}
void u_query_by_person()
{
int i, num, flag = 0, cnt = 0;
FILE *fp;
Award ad[100], Tar[100];
char p_name[100];
memset(Tar, 0, sizeof(Tar));
fp = fopen("game_data.txt", "r");
fscanf(fp, "%d", &num);
for(i = 0; i < num; i++)
fscanf(fp, "%s %s %s %s %s %d %d\n", ad[i].sport, ad[i].award_ath.name, ad[i].award_ath.code, ad[i].award_ath.department, ad[i].sex, &ad[i].rank, &ad[i].score);
printf("请输入查询的运动员姓名:\n");
scanf("%s", p_name);
for(i = 0; i < num; i++)
{
if(strcmp(p_name, ad[i].award_ath.name) == 0)
{
flag = 1;
Tar[cnt ++] = ad[i];
}
}
if(!flag)
printf("没有该运动员的相关信息\n");
else
{
printf("姓名: %s 编号: %s 学院: %s 性别: %s\n", p_name, Tar[0].award_ath.code, Tar[0].award_ath.department, Tar[0].sex);
for(i = 0; i < cnt; i++)
printf("项目名称: %s 得分: %d 排名: %d\n", Tar[i].sport, Tar[i].score, Tar[i].rank);
}
fclose(fp);
}
void u_query_final_rank()
{
int i, num, flag = 0, cnt = 0;
FILE *fp;
Award ad[100], Tar[100];
char s_name[100];
fp = fopen("game_data.txt", "r");
fscanf(fp, "%d", &num);
for(i = 0; i < num; i++)
fscanf(fp, "%s %s %s %s %s %d %d\n", ad[i].sport, ad[i].award_ath.name, ad[i].award_ath.code, ad[i].award_ath.department, ad[i].sex, &ad[i].rank, &ad[i].score);
printf("请输入查询的项目名称:\n");
scanf("%s", s_name);
for(i = 0; i < num; i++)
{
if(strcmp(s_name, ad[i].sport) == 0)
{
flag = 1;
Tar[cnt ++] = ad[i];
}
}
if(!flag)
printf("没有该项目的相关信息\n");
else
{
printf("项目名称: %s\n", Tar[0].sport);
for(int i = 0; i < cnt; i++)
{
printf("姓名: %s 编号: %s 学院: %s\n", Tar[i].award_ath.name, Tar[i].award_ath.code, Tar[i].award_ath.department);
printf("性别: %s 得分: %d 排名: %d\n", Tar[i].sex, Tar[i].score, Tar[i].rank);
printf("\n");
}
}
fclose(fp);
}
int user_opt()
{
int opt = 0;
printf("请选择操作\n");
printf("1 - 查询运动员个人比赛成绩\n");
printf("2 - 查看参赛院系的成绩\n");
printf("3 - 各比赛项目最终名次\n");
printf("4 - 退出\n");
scanf("%d", &opt);
switch(opt)
{
case 1:
u_query_by_person();
break;
case 2:
query_by_department();
break;
case 3:
u_query_final_rank();
break;
case 4:
return 0;
}
return 1;
}
int main()
{
char id[20]; //管理员or用户
printf("You can enter Q to quit\n\nPlease enter admin or user\n");
while(scanf("%s", id))
{
if(strcmp(id, "admin") == 0)
{
while(!Judge_Password());
while(Admin_opt());
exit(0);
}
else if(strcmp(id, "user") == 0)
{
while(user_opt());
exit(0);
}
else if(strcmp(id, "Q") == 0)
{
exit(0);
}
else
{
printf("invalid input\n");
}
}
return 0;
}