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