본문 바로가기

ECIM list (Help!)

배열 구조체를 이용한 성적출력 - 버블소팅 예제 (Bubble soring example)

질문 제목 :  배열 구조체를 이용한 성적출력

 

 

질문 요약 :   과목별로 성적을 출력하여 내림차순을 시키는 방법

 

 

질문 내용 :   아래함수 부분에서 down_stand함수에 내림차순을 시키는겁니다.

                  학교에서 자면서 열심히 연구했는데 도저히 안떠오르네요.ㅠㅠ

                  도와주세요...ㅠㅠ힌트라도..제발~ㅠㅠ


 Code Example:


/* Written by rinehart@naver.com         */
/* 2009. 2. 10.                                    */
/* Tested on Windows, Cygwin, gcc      */
/* This code example is very very ugly*/
/* It's originaly written by a questioner */
/* My code is the function : down_stand*/

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

struct grade
{
    char sub[5];
    char name1[10];
    char name2[10];
    char name3[10];
    char name4[10];
};

typedef struct grade grade;

void grade_prt(grade score[]); //성적표 출력함수
void grade_score(grade score[], char subject[]); //과목별 개인 점수
void down_stand(grade score[], char subject[], int i);


/****************************************************************/


int main()
{
    int i=0;
    char subject[5];

    grade score[5]= {{"   ","김태희", "한가인", "손예진", "이지아"},
                    {"국어", "80", "100", "10", "95"},
                    {"영어", "100", "100", "15", "85"},
                    {"수학", "90", "85", "75", "35"},
                    {"과학", "75", "90", "65", "25"}};

    grade_prt(score); //성적표 출력함수
   
    while(1) //종료를 위함
    {
        printf("\n***************************************\n\n");
        printf("**종료하고싶으시면 x 를 입력하세요.**\n\n");
        printf("<과목을 입력해주세요.>\n");

        memset(subject, 0x00, sizeof(char)*5);
        gets(subject);

        if(subject[0]=='x')
            break;

        printf("\n--> (%s)  과목의 개인별 점수는?\n", subject);
        grade_score(score, subject); //과목별 개인 점수
    }

    return 0;
}


/****************************************************************/


void grade_prt(grade score[]) //성적표 출력함수
{
    int i=0;

    for(; i<=4; i++)
    {
        printf("%5s | %6s | %6s | %6s | %6s\n",
                score[i].sub,
                score[i].name1,
                score[i].name2,
                score[i].name3,
                score[i].name4);
    }
}


/****************************************************************/


void grade_score(grade score[], char subject[]) //과목별 개인 점수
{
    int i, j, k=0;

    for(i=0; i<=5; i++) //score[i].sub선택
    {
        for(j=4; j>=0; j-- ) //과목 비트비교
        {
            if(score[i].sub[j] == subject[j])
                k++;
        }

        if(k==5)
        {
            down_stand(score, subject, i); //내림차순 정렬
        }

        k=0;
    }
}

/****************************************************************/
void down_stand(grade score[], char subject[], int m) //내림차순 정렬
{
    int i, j;

    typedef struct new_grade
    {
        char name[10];
        int score;
    }new_grade;

    new_grade New_Grade[4] = {  {"김태희", 0},
                                {"한가인", 0},
                                {"손예진", 0},
                                {"이지아", 0}
    };

    struct new_grade s_temp;    //for sorting

    //initialize new_grade array.
    New_Grade[0].score = atoi(score[m].name1);
    New_Grade[1].score = atoi(score[m].name2);
    New_Grade[2].score = atoi(score[m].name3);
    New_Grade[3].score = atoi(score[m].name4);

    // Bubble Sorting
    for (i = 3; i > 0; i--)
    {
        for (j= i; j > 0; j--)
        {
            if (New_Grade[j].score > New_Grade[j-1].score)  //Bigger one switch to foward
            {
                memset(&s_temp, 0x00, sizeof(new_grade));
                memcpy(&s_temp, &New_Grade[j-1], sizeof(new_grade));
                memcpy(&New_Grade[j-1], &New_Grade[j], sizeof(new_grade));
                memcpy(&New_Grade[j], &s_temp, sizeof(new_grade));
            }
        }
    }

    // Print out
    printf("%5s | %6s | %6s | %6s | %6s\n", score[0].sub,
            New_Grade[0].name, New_Grade[1].name, New_Grade[2].name, New_Grade[3].name);
           
    printf("%5s | %6d | %6d | %6d | %6d\n", score[m].sub,
            New_Grade[0].score, New_Grade[1].score, New_Grade[2].score, New_Grade[3].score);
}