#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에 아주 잘 나와있죠..
//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: }