Skip to content

Instantly share code, notes, and snippets.

@zzzz465
Last active May 25, 2019 15:02
Show Gist options
  • Save zzzz465/d5d0993982280ac437b8cee744efc027 to your computer and use it in GitHub Desktop.
Save zzzz465/d5d0993982280ac437b8cee744efc027 to your computer and use it in GitHub Desktop.
메인에압축시켜넣은거
#include <stdio.h>
int main()
{
int data[100][7] = {0}, n, code, koScore, EnScore, MathScore, input, KoScoreMin = 100, EnScoreMin = 100, MathScoreMin = 100, KoScoreMax = 0, EnScoreMax = 0, MathScoreMax = 0, KoScoreSum = 0, EnScoreSum = 0, MathScoreSum = 0;
scanf("%d", &n); // 몇줄짜리 데이터를 받는지 n에 저장합니다
for(int count = 0; count < n; count++) // 0부터 n-1까지 "n번" 반복합니다
{
scanf(" %d %d %d %d", &code, &koScore, &EnScore, &MathScore); // 학번, 국어, 영어, 수학 성적을 받습니다
data[count][0] = code; //학번
data[count][1] = koScore; // 국어
data[count][2] = EnScore; // 영어
data[count][3] = MathScore; // 수학
data[count][4] = koScore + EnScore + MathScore; // 3개의 성적의 합산을 저장
data[count][5] = data[count][4] / 3; // 합산된 성적을 3으로 나눠 평균을 구함
data[count][6] = GradeEval(data[count][5]); // GradeEval 함수를 이용하여 등급을 계산, 문자를 int형으로 저장
MaxEval(koScore, &KoScoreMax); // MaxEval 함수를 이용하여, 만약 현재 학생의 국어 성적(koScore)이 최고로 높은 국어 성적(koScoreMax) 보다 높으면, koScoreMax에 값을 저장
MaxEval(EnScore, &EnScoreMax); // 이하 동일
MaxEval(MathScore, &MathScoreMax); // 이하 동일
MinEval(koScore, &KoScoreMin); // MinEval 함수를 이용하여, 만약 현재 학생의 국어 성적(koScore)이 최고로 낮은 국어 성적(koScoreMax) 보다 낮으면, koScoreMin에 값을 저장
MinEval(EnScore, &EnScoreMin); // 이하 동일
MinEval(MathScore, &MathScoreMin); // 이하 동일
KoScoreSum += koScore; // 모든 학생들의 평균을 구해야하니까, 모든 학생의 국어 성적을 모아두는 KoScoreNum에 현재 학생의 점수를 저장
MathScoreSum += MathScore; // 동일
EnScoreSum += EnScore; // 동일
}
// 메타데이터(데이터에 대한 데이터)를 설정해줍니다. 지금까지 모아둔 자료들을 활용합니다.
data[n][1] = KoScoreMin;
data[n][2] = EnScoreMin;
data[n][3] = MathScoreMin;
data[n+1][1] = KoScoreMax;
data[n+1][2] = EnScoreMax;
data[n+1][3] = MathScoreMax;
data[n+2][1] = KoScoreSum / n;
data[n+2][2] = EnScoreSum / n;
data[n+2][3] = MathScoreSum / n;
while(1)
{
printf("type 0, 1 or 2\n1 -> print data of all students\n2 -> get student's code and return value. if the value isn't right, raise error\n");
scanf(" %d", &input); // 0부터 2까지 입력받습니다
switch (input) // 스위치문
{
case 0:
return 0; // 0을 입력받을경우, return을 통하여 main 탈출
case 1:
for(int count = 0; count < n; count++) // 0부터 n-1번까지 n개의 학생의 데이터를 읽어옵니다
{
printf("%d %d %d %d %d %d %c\n", data[count][0], data[count][1], data[count][2], data[count][3], data[count][4], data[count][5], (char)data[count][6]); // data[count][6]에는 학생의 등급이 int형으로 저장되어있으므로, (char) 명시적 형변환을 통해서 문자로 바꿔줍니다.
}
for(int count = n; count < n+3; count++) // n번부터 n+2번까지는 모든 학생의 최고, 평균, 최저 등의 메타데이터를 담고있습니다.
{
printf("%d %d %d %d\n", data[count][0], data[count][1], data[count][2], data[count][3]);
}
break;
case 2:
printf("학생의 학번을 입력해주세요 : ");
scanf(" %d", &input); printf("\n"); // 학번을 입력받습니다, (printf는 줄넘김을 위하여 사용)
for(int count = 0; count < n; count++)
{
if(data[count][0] == input) // 만약
printf("%d %d %d %d %d %d %c\n", data[count][0], data[count][1], data[count][2], data[count][3], data[count][4], data[count][5], (char)data[count][6]); // data[count][6]에는 학생의 등급이 int형으로 저장되어있으므로, (char) 명시적 형변환을 통해서 문자로 바꿔줍니다.
break; //만약 해당하는 학생이 있을경우, 값을 출력하고 break을 통해 switch 문을 빠져나옵니다. 이후 while(1)에 의해 다시 처음으로 돌아갑니다.
}
printf("Not Valid\n"); // 만약 위의 조건에 해당하는 학생이 없을경우, break문이 실행되지 않으므로 여기로 내려옵니다.
break;
default:
printf("error"); // 문제에서 제시한 구현대상은 아니지만, 임의로 넣었습니다.
}
}
}
void MaxEval(int value, int* p)
{ *p = (*p < value) ? value : *p; }
void MinEval(int value, int *p)
{ *p = (*p > value) ? value : *p;}
int GradeEval(int Score)
{ if (Score >= 90)
return 'A';
else if (Score >= 80)
return 'B';
else if (Score >= 70)
return 'C';
else if (Score >= 60)
return 'D';
else
return 'F';}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment