기타

<18> Q4. Do it C언어 입문

도라몬즈 2020. 8. 20. 14:31
#include<stdio.h>
#include<stdlib.h>

typedef struct person {
    char Name[14];
    int Korean;
    int English;
    int Math;
    int Sum;
    struct person *next;
} Person;

void AddScore(Person **head, Person **tail, int *count)
{
    if(*head != NULL){
        (*tail)->next = (Person *)malloc(sizeof(Person));
        *tail = (*tail)->next;
    }else{
        *head = (Person *)malloc(sizeof(Person));
        *tail = *head;
    }
    printf("%d 번째 학생 이름: ",*count+1);
    scanf("%s",(*tail)->Name);
    printf("국어 점수: ");
    scanf("%d",&(*tail)->Korean);
    printf("영어 점수: ");
    scanf("%d",&(*tail)->English);
    printf("수학 점수: ");
    scanf("%d",&(*tail)->Math);
    (*tail)->Sum = (*tail)->Korean + (*tail)->English + (*tail)->Math;
    *count=*count+1;
}

void PrintGrade(Person **head, int count)
{
    if(count) {
        Person **p = head;
        Person *arr = (Person *)malloc(sizeof(Person) * count);
        Person temp;
        int check=1;

        for (int i = 0; i < count*sizeof(Person); i+=sizeof(Person)) {
            *(arr + i) = **p;
            *p = (*p)->next;
        }

        while(check){
            check = 0;
            for (int i = 0; i < count*sizeof(Person); i+=sizeof(Person)) {
                for (int j = i + sizeof(Person); j < count*sizeof(Person); j+=sizeof(Person)) {
                    if ((arr + i)->Sum < (arr + j)->Sum) {
                        temp = *(arr + i);
                        *(arr + i) = *(arr + j);
                        *(arr + j) = temp;
                        check++;
                    }
                }
            }
        }
        printf("------------------------------------\n");
        printf(" 이름   국어  영어  수학  총점  평균  등수\n");
        printf("------------------------------------\n");

        for (int i = 0; i < count*sizeof(Person); i+=sizeof(Person)) {
            printf(" %3s  %3d  %3d  %3d  %3d  %3d  %d등\n", (arr + i)->Name, (arr + i)->Korean, (arr + i)->English,
                   (arr + i)->Math, (arr + i)->Sum, ((arr + i)->Sum) / 3, i/sizeof(Person) + 1);
        }
    }else{
        printf("입력된 값 없음\n");
    }
}

void main()
{
    Person *Mhead = NULL, *Mtail = NULL;
    char num;
    int count = 0;

    while(num!='3') {
        printf("[Menu]\n1. 성적 입력\n2. 성적 확인\n3. 종료\n__________\n선택 (1 ~ 3) :");
        scanf("%c", &num);
        fflush(stdin);
        if(num=='1') AddScore(&Mhead, &Mtail, &count);
        else if (num=='2') PrintGrade(&Mhead, count);
        else if (num=='3') printf("프로그램이 종료됨");
        else{
            printf("비정상 값 입력됨\n");
            num = 0;
        }
    }
}