-
C언어 구조체와 사용자정의함수를 사용해서 학점구하기개발노트 2018. 10. 14. 14:27
변수정의는 구조체를 사용하고
사용자정의함수를 사용해서 입력, 출력, 계산, 오름차순을 하는 코드를 만들어봅시다.
이전 글과 동일하게 구조체를 만들어줍니다.
12345678typedef struct{char name[20];int kor, eng, mat;int tot;double avg;char grade;}Student;cs 사용자정의함수는 아래처럼 만들어줬습니다.
12345678910111213void input_data(Student *parry)//입력{}void calc_data(Student *parry)//계산{}void sort_data(Student *parry)//순서{}void print_data(Student *parry)//출력{}cs 구조체를 포인터로 연결시켜 줬는데 5명의 학생을 입력, 계산.... 해줘야 하기 때문에
구조체는 아래와 같이 배열로 만들었습니다.
123456void main() {Student s1[5];}cs 저번 글과 다를게 없습니다.
저번에는 main함수에 입력부터 출력까지 모든 것을 넣었지만
이번에는 다른 함수에 옮겨담기만 했습니다.
비교해볼까요?
우선 이전 글의 main입니다.
123456789101112131415161718192021void 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';elses1.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 입력, 출력, 계산부분만 나눠서 함수에 넣어주면 됩니다.
아래 함수에 나눠서 넣었습니다.
123456789101112131415161718192021222324252627282930313233void 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';elseparry->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문을 이용합니다.
1234567891011121314void 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문을 돌며 순서대로 출력합니다.
마지막으로 순서를 변경하는 부분을 만들어봅시다.
우선 함수부분
12345678void sort_data(Student *parm_frist, Student *parm_second)//순서{Student temp;temp = *parm_frist;*parm_frist = *parm_second;*parm_second = temp;}cs temp라는 임시로 데이터가 저장될 공간도 만들어주고
임의의 포인터명을 줘서 각각의 값이 바뀌도록 해줍니다.
배열은 그대로있고 포인터로 안에있는 값만 바꿔준겁니다.
아래는 main 부분입니다.
1234567for (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를 호출해서 값을 바꾸게 됩니다.