자료구조(8) 숙제(4) 해설

지난 내 코드와 비교하여 고치면 더 좋은 점은 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아이티뱅크학원 (자료구조 수업) 선택정렬 참고블로그

0%