/* ±¸°£È÷ÇÁ - ÃÖ´ëÈ÷ÇÁ Áö¿­º° È÷ÇÁ- ÃÖ´ëÈ÷ÇÁ */ #include #include #include #define MAX 1000 #define TRUE 1 #define FALSE 0 #define MALLOC(p, s) if (!((p) = malloc(s))) { printf("Insufficient memory!\n"); exit(1); } //////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////// AVL TREE ÀڷᱸÁ¶ Á¤ÀÇ ///////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////// typedef struct { int key; } element; typedef struct treeNode *treePointer; struct treeNode { treePointer leftChild; element data; short int bf; treePointer rightChild; }; int unbalanced = FALSE; //////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////// µ¥ÀÌÅÍÆÄÀÏ ÀڷᱸÁ¶ Á¤ÀÇ /////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////// typedef struct { int group; // ¸ðÁý±×·ì (1.°¡/2.³ª/3.´Ù ±º) char name[30]; // ´ëÇиí char major[30]; // Çаú int score; // Á¡¼ö (Ç¥Á¡) int number; // ¹Ý¿µ ¿µ¿ª °³¼ö ex) ¾ð¼ö¿ÜŽ->4°³ ; 4 ¼ö¿ÜŽ->3°³ ; 3 } DATA_1; // ´ëÇÐÁ¤º¸ µ¥ÀÌÅÍ typedef struct { int group; // ¸ðÁý±×·ì (1.°¡/2.³ª/3.´Ù ±º) char name[30]; // ´ëÇÐ int kor, mat, eng, sub; // ¹Ý¿µ ºñÀ² : ±¹.¼ö.¿µ.Ž int indicator; // ¹Ý¿µÁöÇ¥ : Ç¥ÁØÁ¡¼ö(1) or ¹éºÐÀ§(2) int score; // °è»êµÈ Á¡¼ö // char region[10]; // Áö¿ª ex) ÃæºÏ, °­¿ø, ¼­¿ï treePointer AVL_root; // °¢ ´ëÇб³º° Çаú¸¦ AVL·Î ±¸¼º } DATA_2; // ¸ðÁý¿ä°­ µ¥ÀÌÅÍ typedef struct { int course; // Àι®°è(1) / ÀÚ¿¬°è(2) int kor, mat, eng, sub1, sub2; // Á¡¼ö : ±¹.¼ö.¿µ.Ž1.Ž2 char region[10]; // Áö¿ª ex) ÃæºÏ, °­¿ø, ¼­¿ï // data... } DATA_3; // Çлýµ¥ÀÌÅÍ //////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////// MAX Heap ÀڷᱸÁ¶ Á¤ÀÇ ///////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////// #define HEAP_FULL(n) (n == MAX_ELEMENTS-1) #define HEAP_EMPTY(n) (!n) element heap[MAX]; int n = 0; typedef struct { element* link[16]; // ¿ì¸®³ª¶ó Áö¿ª /* 0 : ¼­¿ï 1 : ÀÎõ 2 : °æ±â 3 : °­¿ø 4 : Ãæ³² 5 : ÃæºÏ 6 : ´ëÀü 7 : °æºÏ 8 : ´ë±¸ 9 : ¿ï»ê 10 : ºÎ»ê 11 : °æ³² 12 : ÀüºÏ 13 : Àü³² 14 : ±¤ÁÖ 15 : Á¦ÁÖ */ } ROOT; ROOT root; // ·çÆ® //////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////// Àü¿ªº¯¼ö ¼±¾ð ////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////// DATA_1 university[MAX]; // ´ëÇÐ µ¥ÀÌÅÍ DATA_2 guidelines[MAX]; // ¸ðÁý¿ä°­ µ¥ÀÌÅÍ DATA_3 profile; // ÇлýÁ¤º¸ µ¥ÀÌÅÍ int n_of_univ = 0; // ´ëÇб³ °³¼ö int total_number; // ÀÔ·ÂµÈ Àüü ´ëÇмö //////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////// ÇÔ¼ö ¼±¾ð ////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////// void input_student_data(); // ÇлýÁ¤º¸ ÀÔ·Â void load_data(); // µ¥ÀÌÅÍ ºÒ·¯¿À±â void save_data(); // µ¥ÀÌÅÍ ÀúÀåÇϱâ (Áö¿ø°¡´É ´ëÇб³ text¿¡ ÀúÀå) void calculate_score(); // Á¡¼ö °è»ê void avlInsert(treePointer *parent, element x, int *unbalanced); // AVL Æ®¸®¿¡¼­ÀÇ »ðÀÔ void leftRotation(treePointer *parent, int *unbalanced); // leftRotation ÇÔ¼ö void rightRotation(treePointer *parent, int *unbalanced); // rightRotation ÇÔ¼ö void push(element item, int *n); // ÃÖ´ëÈ÷ÇÁ »ðÀÔ void classify(); // ´ëÇк°·Î ºÐ·ù element pop(int *n); // ÃÖ´ëÈ÷ÇÁ »èÁ¦ //////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////// ¸ÞÀÎ ÇÔ¼ö ////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////// int main(void) { int menu; // ¸Þ´º¼±Åà ¹øÈ£ while (1) { // ¸ÞÀÎ ¸Þ´º printf("\n\n"); printf("1. ¼ºÀûÀÔ·Â\n"); printf("2. Áö¿ø°¡´É´ëÇÐÁ¶È¸\n"); printf("3. µ¥ÀÌÅÍÀúÀå\n"); printf("4. Á¾·á\n"); printf("No. "); scanf("%d", &menu); switch (menu) { case 1: // 1. ¼ºÀûÀÔ·Â input_student_data(); // Å×½ºÆÃ load_data(1); // Å×½ºÆÃ calculate_score(); // Å×½ºÆÃ break; case 2: // 2. Áö¿ø°¡´É´ëÇÐÁ¶È¸ classify(); break; case 3: // 3. µ¥ÀÌÅÍÀúÀå break; case 4: // Á¾·á exit(1); default : // else. ¸Þ´º¼±Åà ¿¹¿Üó¸® printf("¸Þ´º¸¦ À߸ø ¼±ÅÃÇß½À´Ï´Ù.\n"); break; } } return 0; } //////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////// leftRotation ÇÔ¼ö ////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////// void leftRotation(treePointer *parent, int *unbalanced) { treePointer grandChild, child; child = (*parent)->leftChild; if (child->bf == 1) { (*parent)->leftChild = child->rightChild; child->rightChild = *parent; (*parent)->bf = 0; (*parent) = child; } else { grandChild = child->rightChild; child->rightChild = grandChild->leftChild; grandChild->leftChild = child; (*parent)->leftChild = grandChild->rightChild; grandChild->rightChild = *parent; switch (grandChild->bf) { case 1: (*parent)->bf = -1; child->bf = 0; break; case 0: (*parent)->bf = child->bf = 0; break; case -1: (*parent)->bf = 0; child->bf = 1; break; } *parent = grandChild; } (*parent)->bf = 0; *unbalanced = FALSE; } //////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////// rightRotation ÇÔ¼ö ///////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////// void rightRotation(treePointer *parent, int *unbalanced) { treePointer grandChild, child; child = (*parent)->rightChild; if (child->bf == -1) { (*parent)->rightChild = child->leftChild; child->leftChild = *parent; (*parent)->bf = 0; (*parent) = child; } else { grandChild = child->leftChild; child->leftChild = grandChild->rightChild; grandChild->rightChild = child; (*parent)->rightChild = grandChild->leftChild; grandChild->leftChild = *parent; switch (grandChild->bf) { case 1: (*parent)->bf = 0; child->bf = -1; break; case 0: (*parent)->bf = child->bf = 0; break; case -1: (*parent)->bf = 1; child->bf = 0; break; } *parent = grandChild; } (*parent)->bf = 0; *unbalanced = FALSE; } //////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////// AVL Æ®¸®¿¡¼­ÀÇ »ðÀÔ //////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////// void avlInsert(treePointer *parent, element x, int *unbalanced) { if (!*parent) { // ºñ¾îÀÖ´Â Æ®¸®¿¡ ¿ø¼Ò¸¦ »ðÀÔÇÑ´Ù. *unbalanced = TRUE; MALLOC(*parent, sizeof(treePointer)); (*parent)->leftChild = (*parent)->rightChild = NULL; (*parent)->bf = 0; (*parent)->data = x; } else if (x.key < (*parent)->data.key) { avlInsert(&(*parent)->leftChild, x, unbalanced); if(*unbalanced) switch ((*parent)->bf) { case -1: (*parent)->bf = 0; *unbalanced = FALSE; break; case 0: (*parent)->bf = 1; break; case 1: leftRotation(parent, unbalanced); } } else if (x.key > (*parent)->data.key) { avlInsert(&(*parent)->rightChild, x, unbalanced); if(*unbalanced) switch ((*parent)->bf) { case 1: (*parent)->bf = 0; *unbalanced = FALSE; break; case 0: (*parent)->bf = -1; break; case -1: rightRotation(parent, unbalanced); } } else { *unbalanced = FALSE; printf("The key is already in the tree\n"); } } /* //////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////// ÃÖ´ëÈ÷ÇÁ »ðÀÔ ////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////// void push(element item, int *n) { int i; if (HEAP_FULL(*n)) { printf("The heap is full.\n"); exit(1); } i = ++(*n); while ((i != 1) && (item.key > heap[i/2].key)) { heap[i] = heap[i/2]; i /= 2; } heap[i] = item; } //////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////// ÃÖ´ëÈ÷ÇÁ »èÁ¦ ////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////// element pop(int *n) { int parent, child; element item, temp; if (HEAP_EMPTY(*n)) { printf("The heap is empty.\n"); exit(1); } item = heap[1]; temp = heap[(*n)--]; parent = 1; child = 2; while (child <= *n) { if ((child < *n) && (heap[child].key < heap[child+1].key)) child++; if (temp.key >= heap[child].key) break; heap[parent] = heap[child]; parent = child; child *= 2; } heap[parent] = temp; return item; } */ //////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////// ÆÄÀÏ ÀÔÃâ·Â //////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////// void load_data(int type) { FILE *fp; char file[6][100]; // ÆÄÀÏ À̸§À» ÀϽÃÀûÀ¸·Î ÀúÀåÇÒ °ø°£ char fname[100]; int number, count = 0; int i, index; if (type == 1) { // 1. Àι®°è strcpy(file[0], "Àι®_°¡_´ëÇÐ.txt"); strcpy(file[1], "Àι®_³ª_´ëÇÐ.txt"); strcpy(file[2], "Àι®_´Ù_´ëÇÐ.txt"); strcpy(file[3], "Àι®_°¡_¿ä°­.txt"); strcpy(file[4], "Àι®_³ª_¿ä°­.txt"); strcpy(file[5], "Àι®_´Ù_¿ä°­.txt"); index = 0; for (i=0; i<1; i++) { // ´ëÇÐÁ¡¼ö¿¡ ´ëÇØ µ¥ÀÌÅ͸¦ Àоî¿È strcpy(fname, file[i]); if ((fp = fopen(fname, "r")) == NULL) { // ÆÄÀÏ ÀÔÃâ·Â ¿¹¿Üó¸® printf("¼ºÀûÆÄÀÏ %sÀ» ¿­ ¼ö ¾ø½À´Ï´Ù.\n", fname); exit(1); } while (!feof(fp)) { university[index].group = i+1; // group ÃʱâÈ­ (1. °¡/ 2. ³ª/ 3. ´Ù) fscanf(fp, "%s %s %d", &university[index].name, &university[index].major, &university[index].score); index++; } } index = 0; for (i=3; i<4; i++) { // ¸ðÁý¿ä°­¿¡ ´ëÇØ µ¥ÀÌÅ͸¦ Àоî¿È strcpy(fname, file[i]); if ((fp = fopen(fname, "r")) == NULL) { // ÆÄÀÏ ÀÔÃâ·Â ¿¹¿Üó¸® printf("¼ºÀûÆÄÀÏ %sÀ» ¿­ ¼ö ¾ø½À´Ï´Ù.\n", fname); exit(1); } while (!feof(fp)) { guidelines[index].group = i-2; // group ÃʱâÈ­ (1. °¡/ 2. ³ª/ 3. ´Ù) fscanf(fp, "%s %d %d %d %d %d", &guidelines[index].name, &guidelines[index].kor, &guidelines[index].mat, &guidelines[index].eng, &guidelines[index].sub, &guidelines[index].indicator); index++; n_of_univ++; // ´ëÇб³ °³¼ö Ä«¿îÆÃ } } } else if (type == 2) { // 2. ÀÚ¿¬°è strcpy(file[0], "ÀÚ¿¬_°¡_´ëÇÐ.txt"); strcpy(file[1], "ÀÚ¿¬_³ª_´ëÇÐ.txt"); strcpy(file[2], "ÀÚ¿¬_´Ù_´ëÇÐ.txt"); strcpy(file[3], "ÀÚ¿¬_°¡_¿ä°­.txt"); strcpy(file[4], "ÀÚ¿¬_³ª_¿ä°­.txt"); strcpy(file[5], "ÀÚ¿¬_´Ù_¿ä°­.txt"); index = 0; for (i=0; i<1; i++) { // ´ëÇÐÁ¡¼ö¿¡ ´ëÇØ µ¥ÀÌÅ͸¦ Àоî¿È strcpy(fname, file[i]); if ((fp = fopen(fname, "r")) == NULL) { // ÆÄÀÏ ÀÔÃâ·Â ¿¹¿Üó¸® printf("¼ºÀûÆÄÀÏ %sÀ» ¿­ ¼ö ¾ø½À´Ï´Ù.\n", fname); exit(1); } while (!feof(fp)) { university[index].group = i+1; // group ÃʱâÈ­ (1. °¡/ 2. ³ª/ 3. ´Ù) fscanf(fp, "%s %s %d", &university[index].name, &university[index].major, &university[index].score); index++; } } index = 0; for (i=3; i<4; i++) { // ¸ðÁý¿ä°­¿¡ ´ëÇØ µ¥ÀÌÅ͸¦ Àоî¿È strcpy(fname, file[i]); if ((fp = fopen(fname, "r")) == NULL) { // ÆÄÀÏ ÀÔÃâ·Â ¿¹¿Üó¸® printf("¼ºÀûÆÄÀÏ %sÀ» ¿­ ¼ö ¾ø½À´Ï´Ù.\n", fname); exit(1); } while (!feof(fp)) { guidelines[index].group = i-2; // group ÃʱâÈ­ (1. °¡/ 2. ³ª/ 3. ´Ù) fscanf(fp, "%s %d %d %d %d %d", &guidelines[index].name, &guidelines[index].kor, &guidelines[index].mat, &guidelines[index].eng, &guidelines[index].sub, &guidelines[index].indicator); index++; n_of_univ++; // ´ëÇб³ °³¼ö Ä«¿îÆÃ } } } total_number = index; } //////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////// ´ëÇк° ¹Ý¿µÁ¡¼ö °è»ê /////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////// void calculate_score() { int i; for (i=0; i