2016년 6월 14일 화요일

이것이 c언어다. 17장 성적처리

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct
{
    int stId;
    char name[10];
    int kor;
    int eng;
    int math;
    int total;
    float avg;
    enum{A=1,B,C,F}grade;
}STUDENTS;

void PrintStructure(STUDENTS *stList);
void SortStructure(STUDENTS *stList);
int CheckId(STUDENTS *stList,int tempId,int nNumber);
char GetGrade(float ar_avg);
int main(void)
{
    STUDENTS stList[5];
    int nNumber = 0;
    int tempId = 0;

    while(nNumber<5)
    {
        printf("student ID : ");
        scanf("%d",&tempId);
        fflush(stdin);              //버퍼에 남아있는 개행문자 제거


        if(nNumber == 0 || CheckId(stList,tempId,nNumber)) //Id검사에 통과되었을 경우 수행
        {
            stList[nNumber].stId = tempId;
        }
        else
        {
            printf("this ID can't use.");
            continue;
        }
        printf("name : ");
        gets(stList[nNumber].name);
        printf("kor, eng, math grade : (Ex. 99 99 99)");
        scanf("%d %d %d",&stList[nNumber].kor,&stList[nNumber].eng,&stList[nNumber].math);
        fflush(stdin);

        stList[nNumber].total = stList[nNumber].kor + stList[nNumber].eng + stList[nNumber].math;
        stList[nNumber].avg = (float)stList[nNumber].total/3.0;
        stList[nNumber].grade = GetGrade(stList[nNumber].avg);


        nNumber++;
    }

    printf("****Before Sort****\n");
    PrintStructure(stList);
    printf("****After Sort****\n");
    SortStructure(stList);
    PrintStructure(stList);
    return 0;
}
void PrintStructure(STUDENTS *stList)
{
    int i;
    for(i=0;i<5;i++)
    {
        printf("%d\t",stList[i].stId);
        printf("%s\t",stList[i].name);
        printf("%d\t",stList[i].kor);
        printf("%d\t",stList[i].eng);
        printf("%d\t",stList[i].math);
        printf("%d\t",stList[i].total);
        printf("%.1f\t",stList[i].avg);
        printf("%c\n",stList[i].grade);

    }
}
void SortStructure(STUDENTS *stList)
{
    int i,k;
    STUDENTS temp;


    for(i=0;i<5;i++)
    {
        for(k=0;k<4;k++)
        {
            if(stList[k].total < stList[k+1].total)
            {
                temp = stList[k];
                stList[k] = stList[k+1];
                stList[k+1] = temp;
            }
        }
    }
}
int CheckId(STUDENTS *stList,int tempId,int nNumber)
{
    int i;
    for(i=0;i<nNumber;i++)
    {
        if(stList[i].stId == tempId)
            return 0;
    }

    return 1;
}
char GetGrade(float ar_avg)
{
    int k = 0;

    k = (int)(ar_avg/10);
    switch(k)
    {
        case 10 :
        case 9 : return 'A'; break;
        case 8 : return 'B';break;
        case 7 : return 'C';break;
        default : return 'F';break;
    }//조금 이상한것이....'F'에 'D'를 넣어도 아무 이상없이 돌아감..
         //마음같아서는 enum에 있는것만 하게하고 없으면 오류를 띄어줫으면 좋겠는데 말이야..
}