ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C언어 구조체와 사용자정의함수를 사용해서 학점구하기
    개발노트 2018. 10. 14. 14:27

    변수정의는 구조체를 사용하고

    사용자정의함수를 사용해서 입력, 출력, 계산, 오름차순을 하는 코드를 만들어봅시다.

    이전 글과 동일하게 구조체를 만들어줍니다.


    1
    2
    3
    4
    5
    6
    7
    8
    typedef struct
    {
        char name[20];
        int kor, eng, mat;
        int tot;
        double avg;
        char grade;
    }Student;
    cs


    사용자정의함수는 아래처럼 만들어줬습니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void input_data(Student *parry)//입력
    {
    }
    void calc_data(Student *parry)//계산
    {
    }
    void sort_data(Student *parry)//순서
    {
    }
    void print_data(Student *parry)//출력
    {
    }
    cs


    구조체를 포인터로 연결시켜 줬는데 5명의 학생을 입력, 계산.... 해줘야 하기 때문에

    구조체는 아래와 같이 배열로 만들었습니다.


    1
    2
    3
    4
    5
    6
    void main() {
     
     
        Student s1[5];
        
    }
    cs


    저번 글과 다를게 없습니다.

    저번에는 main함수에 입력부터 출력까지 모든 것을 넣었지만

    이번에는 다른 함수에 옮겨담기만 했습니다.

    비교해볼까요?


    우선 이전 글의 main입니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    void main() {
     
        
        Student s1;
        printf("학생의 이름과 국어, 영어, 수학점수를 입력하세요. \n");
        scanf("%s %d %d %d", s1.name, &s1.kor, &s1.eng, &s1.mat);
        s1.tot = s1.kor + s1.eng + s1.mat;
        s1.avg = (double)s1.tot / 3;
        if (s1.avg > 90)
            s1.grade ='A';
        else if (s1.avg>80)
            s1.grade = 'B';
        else if (s1.avg>70)
            s1.grade = 'C';
        else if (s1.avg>60)
            s1.grade = 'D';
        else
            s1.grade = 'F';
        printf("이름\t국어\t영어\t수학\t총점\t평균\t학점\n");
        printf("%s\t%d\t%d\t%d\t%d\t%.1f\t%c \n", s1.name, s1.kor, s1.eng, s1.mat, s1.tot, s1.avg, s1.grade);
    }
    cs


    입력, 출력, 계산부분만 나눠서 함수에 넣어주면 됩니다.

    아래 함수에 나눠서 넣었습니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    void input_data(Student *parry)//입력
    {
     
        printf("학생의 이름과 국어, 영어, 수학점수를 입력하세요. \n");
        scanf("%s %d %d %d", parry->name, &parry->kor, &parry->eng, &parry->mat);
    }
    void calc_data(Student *parry)//계산
    {
        parry->tot = parry->kor + parry->eng + parry->mat;
        parry->avg = (double)parry->tot / 3;
        if (parry->avg > 90)
            parry->grade = 'A';
        else if (parry->avg>80)
            parry->grade = 'B';
        else if (parry->avg>70)
            parry->grade = 'C';
        else if (parry->avg>60)
            parry->grade = 'D';
        else
            parry->grade = 'F';
    }
    void sort_data(Student *parry)//순서
    {
     
    }
    void print_data(Student *parry)//출력
    {
     
        //printf("이름\t국어\t영어\t수학\t총점\t평균\t학점\n");
        printf("%s\t%d\t%d\t%d\t%d\t%.1f\t%c \n", parry->name, parry->kor, parry->eng, parry->mat, parry->tot, parry->avg, parry->grade);
     
    }
     
    cs


    다른점은 함수와 포인터 사용인데, 구조체의 포인터에 접근하기 위해서 arrow 연산자( -> ) 를 이용해서 구조체의 변수들과 포인터로 연결해줬습니다.

    포인터->구조체의변수 와 같은 형식입니다.


    이제 main으로 돌아가서 출력만 해주면 끝입니다.

    하지만 5명의 정보를 입력받고 출력해줘야 하기 때문에 for문을 이용합니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void main() {
     
     
        Student s1[5];
        for (int i = 0; i < 5; i++) {
            input_data(&s1[i]);
            calc_data(&s1[i]);
        }
        printf("이름\t국어\t영어\t수학\t총점\t평균\t학점\n");
        for (int j = 0; j < 5; j++) {
            print_data(&s1[j]);
        }
     
    }
    cs


    for문을 돌며 s1[0]부터 5개의 배열에 정보를 넣고

    다시 for문을 돌며 순서대로 출력합니다.



    마지막으로 순서를 변경하는 부분을 만들어봅시다.


    우선 함수부분

    1
    2
    3
    4
    5
    6
    7
    8
    void sort_data(Student *parm_frist, Student *parm_second)//순서
    {
        Student temp;
     
        temp = *parm_frist;
        *parm_frist = *parm_second;
        *parm_second = temp;
    }
    cs

    temp라는 임시로 데이터가 저장될 공간도 만들어주고

    임의의 포인터명을 줘서 각각의 값이 바뀌도록 해줍니다.

    배열은 그대로있고 포인터로 안에있는 값만 바꿔준겁니다.


    아래는 main 부분입니다.

    1
    2
    3
    4
    5
    6
    7
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                if (s1[i].tot > s1[j].tot) {
                    sort_data(&s1[i], &s1[j]);
                }
            }
        }
    cs

    sort_data(&s1[i], &s1[j]); 이부분에서 sort_data를 호출해서 값을 바꾸게 됩니다.

    댓글

Designed by Tistory.