模拟//代码还没过..不知道错哪了,放两天改//现在已正确
3.31写完的代码。
4.15更正,在网上找了正确的代码对拍,终于把错找出来了。。。
题意:就是模拟一个c语言程序设计里的 个人信息管理系统,细节给的很详细,输入输出都是要按他的规范来,之前错就是因为一个小小的输出的问题。顺便学习了一下对拍的批文件怎么写。
思路: 题意就是总体的思路,必须得有一个具体的框架,然后一个功能一个功能实现与调试。注意EPS的使用,因为浮点数运算或比较可能会出现我们并不期望的结果。
c语言程序设计
#include <cstdio>
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
#define maxn 1000005
const double EPS = 1e-5;
struct student
{
char id[3][25];
int course[4];
double pj;
student(){}
student(char a[3][25],int b[4])
{
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 25; j++)
id[i][j] = a[i][j];
}
for(int i = 0; i < 4 ; i++)
course[i] = b[i];
}
}data[maxn];
int Size = 0;
int Fin(char s[25],int a)
{
for(int i = 0; i < Size; i++)
if(strcmp(data[i].id[a],s) == 0)
return i;
return -1;
}
int pm(int id)
{
int num = 1;
int temp = 0;
for(int i = 0; i < 4 ; i++)
temp += data[id].course[i];
int flag = 0;
for(int i = 0; i < Size; i++)
{
int com = 0;
for(int j = 0; j < 4 ; j++)
com += data[i].course[j];
if(com > temp) num++;
}
return num;
}
void init()
{
printf("Welcome to Student Performance Management System (SPMS).\n\n");
printf("1 - Add\n");
printf("2 - Remove\n");
printf("3 - Query\n");
printf("4 - Show ranking\n");
printf("5 - Show Statistics\n");
printf("0 - Exit\n");
printf("\n");
}
int add() //增加
{
while(1)
{
char id[3][25];
int co[4];
printf("Please enter the SID, CID, name and four scores. Enter 0 to finish.\n");
scanf("%s",id[0]);
if(id[0][0] == '0' && strlen(id[0]) == 1) return 0;
scanf("%s%s",id[1],id[2]);
for(int i = 0; i < 4 ; i++)
scanf("%d",&co[i]);
if(Fin(id[0],0) == -1)
data[Size++] = student(id,co);
else
printf("Duplicated SID.\n");
}
return 1;
}
int query() //查询
{
while(1)
{
printf("Please enter SID or name. Enter 0 to finish.\n");
char x[25];
scanf("%s",x);
if(x[0] == '0' && strlen(x) == 1) break;
int ans = 0;
if(x[0] >= 'A' && x[0] <= 'Z')
{
for(int id = 0; id < Size; id++)
{
if(strcmp(data[id].id[2],x) != 0) continue;
int sum = 0;
printf("%d %s %s %s ",pm(id),data[id].id[0],data[id].id[1],data[id].id[2]);
for(int a = 0; a < 4; a ++)
{
sum += data[id].course[a];
printf("%d ",data[id].course[a]);
}
printf("%d %.2f\n",sum,(double)sum/4.0+EPS);
}
}
else
{
for(int id = 0; id < Size ;id++)
{
if(strcmp(data[id].id[0],x) != 0) continue;
printf("%d %s %s %s ",pm(id),data[id].id[0],data[id].id[1],data[id].id[2]);
int sum = 0;
for(int a = 0; a < 4; a ++)
{
sum += data[id].course[a];
printf("%d ",data[id].course[a]);
}
printf("%d %.2f\n",sum,(double)sum*1.0/4.0+EPS);
}
}
}
return 1;
}
int dq() //删除
{
while(1)
{
printf("Please enter SID or name. Enter 0 to finish.\n");
char x[25];
scanf("%s",x);
if(x[0] == '0' && strlen(x) == 1) break;
int ans = 0;
if(x[0]>='A' && x[0] <= 'Z')
{
for(int id = 0; id < Size; id++)
{
if(strcmp(data[id].id[2],x) != 0){ continue;}
for(int a = id; a < Size; a++)
data[a] = data[a+1];
ans++; Size--;
id= id-1;
}
}
else
{
for(int id = 0; id < Size ;id++)
{
if(strcmp(data[id].id[0],x) != 0) continue;
for(int a = id; a < Size; a++)
data[a] = data[a+1];
ans++;Size --;;
}
}
printf("%d student(s) removed.\n",ans);
}
return 1;
}
int ran()
{
printf("Showing the ranklist hurts students' self-esteem. Don't do that.\n");
return 0;
}
int sa[maxn][4];
int sta() //统计
{
printf("Please enter class ID, 0 for the whole statistics.\n");
int pnum[4] = {0};
int ma[4] = {0};
int pass[5] = {0};
int rnum = Size;
char s[25];
scanf("%s",s);
if(s[0] == '0' && strlen(s) == 1)
{
for(int i = 0; i < Size; i++)
{
int num = 0;
for(int j = 0; j < 4; j++)
{
ma[j] += data[i].course[j];
if(data[i].course[j] > 59)
{ pnum[j]++; num++; }
}
for(int j = num; j >= 1; j--)
pass[j]++;
}
}
else
{
for(int i = 0; i <Size; i++)
{
if(strcmp(data[i].id[1],s) != 0) {rnum --;continue;}
int num = 0;
for(int j = 0; j < 4 ; j++)
{
ma[j] += data[i].course[j];
if(data[i].course[j] > 59)
{
pnum[j]++; num++;
}
}
for(int j = num; j >= 1; j--)
pass[j]++;
}
}
for(int i = 0; i < 4 ; i++)
{
double ans = 0;
if(rnum == 0) ans = 0;
else ans = (double)ma[i]/(rnum)*1.0 + EPS;
if(i == 0) printf("Chinese\n");
if(i == 1) printf("Mathematics\n");
if(i == 2) printf("English\n");
if(i == 3) printf("Programming\n");
printf("Average Score: %.2f\n",ans);
printf("Number of passed students: %d\n",pnum[i]);
printf("Number of failed students: %d\n",rnum-pnum[i]);
printf("\n");
}
printf("Overall:\n");
for(int i = 4; i >= 0; i--)
{
printf("Number of students who ");
if(i >= 1 && i < 4)
printf("passed %d or more subjects: %d\n",i,pass[i]);
else if(i == 4)
printf("passed all subjects: %d\n",pass[i]);
else printf("failed all subjects: %d\n",rnum - pass[1]);
}
printf("\n");
return 0;
}
int main()
{
// freopen("D://in.txt","r",stdin);
// freopen("D://out.txt","w",stdout);
while(1)
{
int n;
init();
scanf("%d",&n);
if(n == 0) break;
switch (n)
{
case 1: add(); break;
case 2: dq(); break;
case 3: query(); break;
case 4: ran(); break;
default : sta();
}
}
return 0;
}