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를 호출해서 값을 바꾸게 됩니다.