Created
June 22, 2019 11:07
-
-
Save lhs9842/7d3c71ca4114306fd8ec2998f15e5be4 to your computer and use it in GitHub Desktop.
2017학년도 2학기 C언어 기말고사
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*2017-2학기 기말고사 C언어 사전 제출 소스코드 | |
제출자 : ****대학교 컴퓨터정보기술공학부 A반 17***** OOO*/ | |
#define _CRT_SECURE_NO_WARNINGS // scanf 관련 | |
#include <stdio.h> // 표준 입출력 | |
#include <string.h> // strcpy 관련 | |
#include <stdlib.h> // system 관련 | |
struct value | |
{ | |
int num; // 학번 | |
char name[50]; // 이름 | |
int score[3]; // 성적 (3과목) | |
char grad[3][2]; // 등급 (3과목, 널문자 공간 및 문자열 취급 방지) | |
union su | |
{ | |
int sum; // 합계 | |
double avg; // 평균 | |
}av; | |
}grade[100]; | |
int CheckLine(); // 입력파일 데이터 수 카운트 함수 | |
void Sort(int choice, int line); // 정렬 요청 함수 | |
void Sorting(int tem); // 정렬 실행 함수 | |
void CalGrade(int subject, int line); // 등급 산출 함수 | |
void Printing(int cho, int line); // 출력 함수 | |
int main() | |
{ | |
int temp, line = CheckLine(); // 변수 선언 및 데이터량 확인 | |
if (line > 100) // 데이터 한계치 초과유무 확인 | |
{ | |
printf("이 프로그램은 100명 이상의 데이터를 처리할 수 없습니다. \n이용에 불편을 드려 죄송합니다."); | |
system("pause"); | |
return 0; | |
} | |
FILE *in; // 읽을 파일 선언 | |
in = fopen("input.txt", "r"); // 파일 열기 | |
for (temp = 0; temp < line; temp++) // 성적 추출 및 평균 산출 | |
{ | |
fscanf(in, "%d %s %d %d %d", &grade[temp].num, &grade[temp].name, &grade[temp].score[0], &grade[temp].score[1], &grade[temp].score[2]); | |
grade[temp].av.sum = grade[temp].score[0] + grade[temp].score[1] + grade[temp].score[2]; | |
grade[temp].av.avg = grade[temp].av.sum / 3; | |
} | |
fclose(in); | |
for (temp = 0; temp < 3; temp++) // 등급 산출 | |
CalGrade(temp, line); | |
while (1) // 정렬 방식 선택 | |
{ | |
printf("출력 방식을 선택하십시오.\n1. 학번 순으로 정렬 2. 평균 성적 순으로 정렬\n선택 : "); // 출력 방식 선택 | |
scanf("%d", &temp); | |
if (temp>2) | |
printf("잘못 입력하셨습니다. \n"); | |
else | |
{ | |
Printing(temp + 2, line); | |
return 0; | |
} | |
} | |
} | |
int CheckLine() | |
{ | |
FILE *fp; | |
fp = fopen("input.txt", "rt"); | |
int line = 1; | |
char c; | |
while ((c = fgetc(fp)) != EOF) | |
if (c == '\n') line++; | |
fclose(fp); | |
return line; | |
} | |
void Sort(int choice, int line) | |
{ | |
int temp, tem; | |
for (temp = 0; temp < line; temp++) | |
{ | |
for (tem = 0; tem < line - 1; tem++) | |
{ | |
if (choice < 3) // 과목 성적 산출용 정렬(과목 성적 내림차순) | |
{ | |
if (grade[tem].score[choice] < grade[tem + 1].score[choice]) | |
{ | |
Sorting(tem); | |
} | |
} | |
else if (choice == 3) // 출력용 정렬(학번 올림차순) | |
{ | |
if (grade[tem].num > grade[tem + 1].num) | |
{ | |
Sorting(tem); | |
} | |
} | |
else if (choice == 4) // 출력용 정렬(평균 점수 내림차순) | |
{ | |
if (grade[tem].av.avg < grade[tem + 1].av.avg) | |
{ | |
Sorting(tem); | |
} | |
} | |
} | |
} | |
} | |
void Sorting(int tem) | |
{ | |
int temp1, temp3, temp5, te; | |
char temp2[50], temp4[2]; | |
temp1 = grade[tem + 1].num; | |
grade[tem + 1].num = grade[tem].num; | |
grade[tem].num = temp1; | |
strcpy(temp2, grade[tem + 1].name); | |
strcpy(grade[tem + 1].name, grade[tem].name); | |
strcpy(grade[tem].name, temp2); | |
for (te = 0; te < 3; te++) | |
{ | |
temp3 = grade[tem + 1].score[te]; | |
grade[tem + 1].score[te] = grade[tem].score[te]; | |
grade[tem].score[te] = temp3; | |
strcpy(temp4, grade[tem + 1].grad[te]); | |
strcpy(grade[tem + 1].grad[te], grade[tem].grad[te]); | |
strcpy(grade[tem].grad[te], temp4); | |
} | |
temp5 = grade[tem + 1].av.avg; | |
grade[tem + 1].av.avg = grade[tem].av.avg; | |
grade[tem].av.avg = temp5; | |
} | |
void CalGrade(int subject, int line) | |
{ | |
int temp; | |
int A_Grade = line*0.3, B_Grade = line*0.7; // 등급컷 산출 | |
Sort(subject, line); // 순위 산출을 위한 정렬 | |
for (temp = 0; temp < line; temp++) | |
{ | |
if (temp + 1 < A_Grade) | |
{ | |
if (grade[temp].score[subject]>= 60) | |
strcpy(grade[temp].grad[subject], "A"); | |
else | |
strcpy(grade[temp].grad[subject], "F"); | |
} | |
else if (temp + 1 < B_Grade) | |
{ | |
if (grade[temp].score[subject] >= 60) | |
strcpy(grade[temp].grad[subject], "B"); | |
else | |
strcpy(grade[temp].grad[subject], "F"); | |
} | |
else if (grade[temp].score[subject]>= 70) | |
strcpy(grade[temp].grad[subject], "C"); | |
else if (grade[temp].score[subject] >= 60) | |
strcpy(grade[temp].grad[subject], "D"); | |
else | |
strcpy(grade[temp].grad[subject], "F"); | |
} | |
} | |
void Printing(int cho, int line) | |
{ | |
int temp; | |
Sort(cho, line); // 선택한 형태로 정렬 | |
FILE *out; | |
// 이어쓰기로 파일 열기 | |
out = fopen("output.txt", "a"); | |
// 파일에 성적 출력하기 | |
for (temp = 0; temp < line; temp++) | |
{ | |
fprintf(out, "%d %d %s %3d(%s) %3d(%s) %3d(%s) %5.2f\n", temp + 1, grade[temp].num, grade[temp].name, grade[temp].score[0], grade[temp].grad[0], grade[temp].score[1], grade[temp].grad[1], grade[temp].score[2], grade[temp].grad[2], grade[temp].av.avg); | |
} | |
fclose(out); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment