C 구조체 배열 정렬 - C gujoche baeyeol jeonglyeol

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

#define MAX_NA 10
#define MAX_N 20

typedef struct
{
	char name[MAX_NA];
	int num[MAX_N];
	int sum;

}Person;

void sort_name(Person* arr);
void sort_num(Person* arr);
void sort_total(Person* arr);

int main()
{
	Person arr[5] = { 0, };
	int ch=0;

	for (int i = 0; i < 5; i++)
	{
		printf("학생 %d 정보\n", i+1);
		printf("이름: ");
		scanf("%s", &arr[i].name);
		printf("학번: ");
		scanf("%s", &arr[i].num);
		printf("총점: ");
		scanf("%d", &arr[i].sum);
		printf("\n");
	}

	while (1)
	{
		printf("1.이름 순(ABC순) 2.학번순(오름차순) 3.총점(내림차순)\n원하는 정렬을 선택하시오.:");
		scanf("%d", &ch);
		printf("\n");

		if (ch == 1)
			sort_name(arr);
		else if (ch == 2)
			sort_num(arr);
		else if (ch == 3)
			sort_total(arr);
		else if (ch == 0)
			break;
	}

	return 0;
}

void sort_name(Person *arr)
{	
	Person temp;

	for (int i = 0; i < 5; i++)
	{	
		for (int j = 0; j < i; j++)
		{
			if (strcmp(arr[i].name, arr[j].name) == -1)
			{
				temp = arr[i];
				arr[i] = arr[j];
				arr[j] = temp;
			}
		}
	}

	printf("-------------------------------\n");
	printf("이름      학번     총점\n");
	printf("-------------------------------\n");

	for (int i = 0; i < 5; i++)
	{
		printf("%s        %s        %d\n", arr[i].name, arr[i].num, arr[i].sum);
	}
	printf("\n");
}

void sort_num(Person* arr)
{
	Person temp;

	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < i; j++)
		{
			if (strcmp(arr[i].num, arr[j].num) == -1)
			{
				temp = arr[i];
				arr[i] = arr[j];
				arr[j] = temp;
			}
		}
	}

	printf("-------------------------------\n");
	printf("이름      학번     총점\n");
	printf("-------------------------------\n");

	for (int i = 0; i < 5; i++)
	{
		printf("%s        %s        %d\n", arr[i].name, arr[i].num, arr[i].sum);
	}
	printf("\n");
}

void sort_total(Person* arr)
{
	Person temp;

	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < i; j++)
		{
			if (arr[i].sum> arr[j].sum)
			{
				temp = arr[i];
				arr[i] = arr[j];
				arr[j] = temp;
			}
		}
	}

	printf("-------------------------------\n");
	printf("이름      학번     총점\n");
	printf("-------------------------------\n");

	for (int i = 0; i < 5; i++)
	{
		printf("%s        %s        %d\n", arr[i].name, arr[i].num, arr[i].sum);
	}
	printf("\n");
}

skymong9.egloos.com/1425794

@breif
    C#의 Array.Sort(...)를 이용하여 구조체 배열을 정렬.
@remarks
    구조체 요소중 하나를 key로 하여 정렬합니다. myReverserClass의 내부 method를 알맞게 수정하여 사용하시면되겠습니다.
    다들 아시겠지만 혹시나 저처럼 잘 모르는 초보분들을 위해서 Post합니다.
    객체를 이용한 정렬법입니다. MSDN에 아주 잘 나와있죠..
    http://msdn2.microsoft.com/en-us/library/system.array.sort(VS.71).aspx

[Example]

01: using System;
02: using System.Collections;
03: using System.Text;
04:
05: namespace ConsoleApplication1
06: {
07:     class Program
08:     {
09:         struct DD
10:         {
11:             public int key;
12:             public int value;
13:
14:             public DD(int _key, int _value) { key = _key; value = _value; }
15:         }
16:
17:         public class myReverserClass : IComparer
18:         {
19:             //Calls CaseInsensitiveComparer.Compare with the parameters reversed.
20:             int IComparer.Compare(Object _x, Object _y)
21:             {
22:                 DD x = (DD)_x;
23:                 DD y = (DD)_y;
24:
25:                 return x.key.CompareTo(y.key);
26:             }
27:         }
28:
29:         static void Main(string[] args)
30:         {
31:             DD[] dd = { new DD(4, 3424), new DD(1, 847), new DD(3, 9876), new DD(5, 423), new DD(2, 745) };
32:
33:             Console.WriteLine("before...");
34:             foreach (DD res in dd)
35:                 Console.WriteLine(res.key.ToString() + " - " + res.value.ToString());
36:
37:             /*Sorting */
38:             IComparer myComparer = new myReverserClass();
39:             Array.Sort(dd, myComparer);
40:
41:             Console.WriteLine("after...");
42:             foreach (DD res in dd)
43:                 Console.WriteLine(res.key.ToString() + " - " + res.value.ToString());
44:         }
45:     }
46: }