1095 디 코딩 PAT 수험표 (25 점) PAT 을 급 진제
PAT 수험 번 호 는 4 부분 으로 구성 되 어 있 습 니 다. · 1 위 는 등급, 즉 T 는 최고급 을 대표 합 니 다.A 대표 갑 급;B 는 을 급 을 대표 한다.2 ~ 4 위 는 시험장 번호 로 101 에서 999 까지 범위 가 넓 습 니 다.5 ~ 10 위 는 시험 날짜 로 연, 월, 일 순 으로 각각 2 위 를 차지한다.마지막 11 ~ 13 명 은 수험생 번호 로 범위 가 000 에서 999 까지 이다.현재 일련의 수험생 의 수험표 번호 와 그들의 성적 을 정 하고 있 으 니, 요구 에 따라 각종 통계 정 보 를 출력 해 주 십시오.
입력 형식: 입력 은 먼저 한 줄 에 두 개의 정수 N (≤ 1 0 4) 을 입력 하고 먼저 한 줄 에 두 개의 정수 N (≤ 10 ^ {4}) 을 입력 하 며 먼저 한 줄 에 두 개의 정수 N (≤ 10 4) 과 M (≤ 100) 을 제시 하여 각각 수험생 수 와 통계 요구 의 개 수 를 제시한다.이 어 N 행 은 각 행 별로 수험생 의 수험 번호 와 그 점수 (구간 [0, 100] 내 정수) 를 주 고 그 사이 빈 칸 으로 구분한다.수험생 정 보 를 제공 한 후에 M 줄 을 제시 하고 각 줄 은 하나의 통계 요 구 를 제시한다. 형식 은 유형 지령 이다. 그 중에서 유형 은 1 로 특정한 등급 의 수험생 의 성적 을 점수 비 오름차 순 으로 출력 하고 해당 하 는 지령 은 지 정 된 등급 을 대표 하 는 자 모 를 제시한다.유형 은 2 로 특정한 시험장 의 수험생 수 와 총 점 을 통계 수출 하 라 고 요구 하고 해당 하 는 지 시 는 지 정 된 시험장 의 번 호 를 제시한다.유형 은 3 으로 특정한 날 짜 를 지정 한 수험생 수 를 시험장 으로 나 누 어 통계 수출 하도록 요구 하고 해당 하 는 지 시 는 지 정 된 날 짜 를 제시 하 며 형식 은 수험표 의 날짜 와 같다.
출력 형식: 모든 통계 에 대한 요 구 는 먼저 한 줄 에 Case \ #: 요구, 그 중 \ # 이 요구 하 는 번호 입 니 다. 1 부터 시작 합 니 다.요구 사항 은 입력 을 복사 하 는 것 입 니 다.그 다음 에 해당 하 는 통계 결 과 를 출력 한다. · 유형 이 1 인 명령, 출력 형식 은 입력 한 수험생 정보 형식 과 같 고 즉 수험표 성적 이다.점수 가 병렬 된 수험생 에 대해 수험표 번호 의 사전 순서에 따라 수출 을 점차 늘린다 (문 제 는 중복 수험표 번호 가 없 음 을 보증한다).형식 이 2 인 명령 은 인원수 총 분 의 형식 으로 출력 합 니 다.유형 은 3 의 명령 이 고 출력 은 인원수 에 따라 증가 하지 않 는 순서 이 며 형식 은 시험장 번호 의 총 인원수 이다.인원 이 병렬 되면 시험장 번호 가 증가 하 는 순서에 따라 출력 한다.검색 결과 가 비어 있 으 면 NA 를 출력 합 니 다.
입력 예시:
8 4
B123180908127 99
B102180908003 86
A112180318002 98
T107150310127 62
A107180908108 100
T123180908010 78
B112160918035 88
A107180908021 98
1 A
2 107
3 180908
2 999
출력 예시:
Case 1: 1 A
A107180908108 100
A107180908021 98
A112180318002 98
Case 2: 2 107
3 260
Case 3: 3 180908
107 2
123 2
102 1
Case 4: 2 999
NA
이 문 제 는 나 에 게 '갑' 을 만 났 고 제시 한 조건 이 매우 많다 는 느낌 을 주 었 다.저 는 각 정 보 를 포함 하 는 구조 체 로 모든 수험생 의 정 보 를 저장 한 다음 에 데 이 터 를 3 으로 나 누 어 각각 세 가지 케이스 에 대해 순 서 를 매 긴 다음 에 필요 에 따라 찾 습 니 다.이렇게 하면 매번 찾 을 때마다 정렬 해 야 하 는 비용 을 최대한 낮 출 수 있다.케이스 3 은 앞의 두 개 보다 좀 번 거 로 우 며, 매번 검색 조건 을 제시 한 후, 각 시험장 의 인원 을 통계 해 야 한다.나 는 처음에 논리 적 통일 을 위해 시험장 번 호 를 1 부터 시 작 했 지만 빠 른 줄 을 사용 할 때 0 부터 시 작 했 기 때문에 비극 적 이 었 다. 그리고 이 bug 는 여러 개의 테스트 데 이 터 를 사용 해서 야 문제점 을 측정 했다.이 문 제 를 다 쓴 후에 저 는 방법 을 보 러 갔 습 니 다. 류 신 이 쓴 cmp 는 정말 저 를 놀 라 게 했 습 니 다. 빨리 작은 공책 을 가지 고 공 부 를 했 습 니 다.비록 코드 가 만점 을 받 았 고 시간 도 괜 찮 았 지만 아직도 많은 개선 점 이 있다 는 것 을 발견 했다. 케이스 2 와 케이스 3 는 정렬 할 필요 가 없다. 케이스 1 에 의 해 관성 적 인 사 고 를 받 았 다. 정렬 한 후에 찾 는 것 이 얼마 빠 르 지 않 지만 정렬 하 는 시간 은 확실히 소모 되 었 다.다음은 출력 결 과 를 읽 기 쉬 운 파일 로 출력 코드 를 입력 하 는 것 입 니 다. 파일 형식 으로 보지 않 으 면 읽 기 가 쉽 지 않 습 니 다.사용 할 때 같은 디 렉 터 리 아래 에 '1095. in' 을 입력 으로 만 들 면 '1095. out' 을 출력 파일 로 하고 텍스트 문서 형식 으로 열 면 됩 니 다.다음은 코드:
#include
#include
typedef struct Stu
{
char level;
int exam_number;
long date;
int id_number;
int grade;
}Stu;
typedef struct Room
{
int Room_no;
int count;
}Room;
int cmp1(const void *a,const void *b);
int cmp2(const void *a,const void *b);
int cmp3(const void *a,const void *b);
int cmp4(const void *a,const void *b);
void case_1(char c,struct Stu student[4][10000],int n,FILE *q);
void case_2(struct Stu student[4][10000],int n,int exam,FILE *q);
void case_3(struct Stu student[4][10000],int n,long date,FILE *q);
int main(void)
{
FILE *p = fopen("./1095.in", "r");
FILE *q = fopen("./1095.out", "w");
Stu student[4][10000];
int n,m;
int i,j;
long temp,temp1,temp2;
char c;
fscanf(p,"%d %d%c",&n,&m,&c);
for(i = 0;i < n;i++)
{
fscanf(p,"%c",&c); //level
for(j = 1;j <= 3;j++)
{
student[j][i].level = c;
student[j][i].date = 0;
student[j][i].exam_number = 0;
student[j][i].grade = 0;
student[j][i].id_number = 0;
}
temp = 0;
for(j = 1;j <= 3;j++) //exam_number
{
fscanf(p,"%c",&c);
temp = temp * 10 + (c - '0');
}
temp1 = 0;
for(j = 1;j <= 6;j++) //date
{
fscanf(p,"%c",&c);
temp1 = temp1 * 10 + (c - '0');
}
temp2 = 0;
for(j = 1;j <= 3;j++) //id_number
{
fscanf(p,"%c",&c);
temp2 = temp2 * 10 + (c - '0');
student[j][i].date = temp1;
student[j][i].exam_number = temp;
}
fscanf(p,"%ld%c",&temp,&c);
for(j = 1;j <= 3;j++)
{
student[j][i].grade = temp;
student[j][i].id_number = temp2;
}
}
qsort(&student[1][0],n,sizeof(Stu),cmp1);
qsort(&student[2][0],n,sizeof(Stu),cmp2);
qsort(&student[3][0],n,sizeof(Stu),cmp3);
for(i = 1;i <= m;i++)
{
fprintf(q,"Case %d: ",i);
fscanf(p,"%ld",&temp);
if(temp == 1)
{
fscanf(p,"%c",&c);
fscanf(p,"%c",&c);
fprintf(q,"1 %c
",c);
case_1(c,student,n,q);
}
else
{
if(temp == 2)
{
fscanf(p,"%ld",&temp);
fprintf(q,"2 %ld
",temp);
case_2(student,n,temp,q);
}
else
{
fscanf(p,"%ld",&temp);
fprintf(q,"3 %06ld
",temp);
case_3(student,n,temp,q);
}
}
if(i < m) fprintf(q,"
");
}
fclose(p);
fclose(q);
return 0;
}
int cmp1(const void *a,const void *b)
{
struct Stu *aa=(Stu *)a;
struct Stu *bb=(Stu *)b;
int f = 1;
if(aa->level > bb->level)
{
f = 1;
}
else
{
if (aa->level < bb->level)
{
f = -1;
}
else //
{
if(aa -> grade < bb -> grade)
{
f = 1;
}
else
{
if(aa -> grade > bb -> grade)
{
f = -1;
}
else //
{
if(aa -> exam_number > bb ->exam_number)
{
f = 1;
}
else
{
if(aa -> exam_number < bb ->exam_number)
{
f = -1;
}
else //
{
if(aa -> date > bb ->date)
{
f = 1;
}
else
{
if(aa -> date < bb ->date)
{
f = -1;
}
else //
{
if(aa -> id_number > bb ->id_number)
{
f = 1;
}
else f = -1;
}
}
}
}
}
}
}
}
return f;
}
int cmp2(const void *a,const void *b)
{
struct Stu *aa=(Stu *)a;
struct Stu *bb=(Stu *)b;
int f = 0;
if(aa -> exam_number > bb -> exam_number) f = 1;
else f = -1;
return f;
}
int cmp3(const void *a,const void *b)
{
struct Stu *aa=(Stu *)a;
struct Stu *bb=(Stu *)b;
int f = 0;
if(aa -> date > bb ->date)
{
f = 1;
}
else
{
if(aa -> date < bb ->date)
{
f = -1;
}
else
{
if(aa -> exam_number > bb -> exam_number) f = 1;
else f = -1;
}
}
return f;
}
void case_1(char c,struct Stu student[4][10000],int n,FILE *q)
{
int i = 0;
int f = 1;
while(student[1][i].level != c && i < n)
{
i++;
}
while(student[1][i].level == c && i < n)
{
fprintf(q,"%c%03d%06ld%03d %d",student[1][i].level,student[1][i].exam_number,student[1][i].date,student[1][i].id_number,student[1][i].grade);
i++;
f = 0;
if(student[1][i].level == c && i < n) fprintf(q,"
");
}
if (f) fprintf(q,"NA");
}
void case_2(struct Stu student[4][10000],int n,int exam,FILE *q)
{
int s = 0,i = 0;
int sum = 0;
while(student[2][i].exam_number != exam && i < n)
{
i++;
}
while(student[2][i].exam_number == exam && i < n)
{
s++;
sum += student[2][i].grade;
i++;
}
if(s != 0) fprintf(q,"%d %ld",s,sum);
else fprintf(q,"NA");
}
void case_3(struct Stu student[4][10000],int n,long date,FILE *q)
{
Room a[1000];
int i;
int f = 1;
for(i = 0;i < 1000;i++)
{
a[i].Room_no = i;
a[i].count = 0;
}
for(i = 0;i < n;i++)
{
if(student[3][i].date == date)
{
a[student[3][i].exam_number].count++;
}
}
qsort(a,1000,sizeof(Room),cmp4);
i = 0;
while(a[i].count != 0)
{
fprintf(q,"%d %d",a[i].Room_no,a[i].count);
i++;
if(a[i].count != 0)fprintf(q,"
");
f = 0;
}
if (f) fprintf(q,"NA");
}
int cmp4(const void *a,const void *b)
{
struct Room *aa=(Room *)a;
struct Room *bb=(Room *)b;
int f = 0;
if(aa -> count < bb -> count)
{
f = 1;
}
else
{
if(aa -> count > bb -> count)
{
f = -1;
}
else
{
if(aa -> Room_no > bb -> Room_no) f = 1;
else f = -1;
}
}
return f;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
PAT B 1080 MOOC 기 말 성적 (C 언어)다음은 세 개의 입력 이 있 습 니 다.첫 번 째 블록 은 P 개의 온라인 프로 그래 밍 성적 G p 를 포함 합 니 다.두 번 째 는 M 개 중간고사 성적 G mid - term 를 포함한다.세 번 째 는 N 개의...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.