Skip to content

Instantly share code, notes, and snippets.

@lhs9842
Created June 22, 2019 11:07
Show Gist options
  • Save lhs9842/7d3c71ca4114306fd8ec2998f15e5be4 to your computer and use it in GitHub Desktop.
Save lhs9842/7d3c71ca4114306fd8ec2998f15e5be4 to your computer and use it in GitHub Desktop.
2017학년도 2학기 C언어 기말고사
/*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