지난 내 코드와 비교하여 고치면 더 좋은 점은 ranking 함수에서, int cnt를 선언해서 포문을 2번 돌리기보다는 pt[i].rank = 1; 로 초기화한 뒤 pt[i].rank++을 해주면 된다.
void setRank(ST * pt, int su) {
for (int i = 0; i < su; i++) {
pt[i].rank = 1;
for (int j = 0; j < su; j++) {
if (pt[i].sum < pt[j].sum) {
pt[i].rank++;
}
}
}
}
선생님이 짜신 코드
#include <stdio.h>
#include <stdlib.h>
typedef struct Student {
char name[10];
int kor, eng, math, sum, rank;
}ST;
int input(const char * msg);
void setData(ST * pt, int su);
void setRank(ST * pt, int su);
void disp(ST *pt, int su);
int main(void) {
int su = input("학생 수");
ST * pt = (ST *)malloc(sizeof(ST)*su);
setData(pt, su);
disp(pt, su);
free(pt);
return 0;
}
int input(const char *msg) {
int su;
printf("%s 입력 : ", msg);
scanf_s("%d", &su);
getchar(); // getchar를 여기에 써주는게 좋다.swtichcase문으로 만든다고 가정해보자.
return su;
}
void setData(ST* pt, int su) {
printf("\\\\정보 입력 \\\\\n");
for (int i = 0; i < su; i++) {
printf("%d번째 학생 정보 \n", i+1);
printf("이름 입력 : ");
//scanf_s("%s", pt[i].name,sizeof(pt[i].name));
gets_s(pt[i].name, sizeof(pt[i].name));
pt[i].kor = input("국어 점수");
pt[i].eng = input("영어 점수");
pt[i].math = input("수학 점수");
pt[i].sum = pt[i].kor + pt[i].math + pt[i].eng;
}
setRank(pt, su);
}
void setRank(ST * pt, int su) {
for (int i = 0; i < su; i++) {
pt[i].rank = 1;
for (int j = 0; j < su; j++) {
if (pt[i].sum < pt[j].sum) {
pt[i].rank++;
}
}
}
}
void disp(ST *pt, int su) {
printf("이름\t국어\t영어\t수학\t총점\t순위\n");
for (int i = 0; i < su; i++) {
printf("%s\t%d\t%d\t%d\t%d\t%d\n", pt[i].name, pt[i].kor, pt[i].eng, pt[i].math, pt[i].sum, pt[i].rank);
}
}
참고자료
kg아이티뱅크학원 (자료구조 수업) 선택정렬 참고블로그