/*------------------------------------------------------------------------- * Project Name : datastruct - struct.cpp * Programmed by : Bohyun Jang * Student Number : 2008060014 * Date : 6. april. 2014. * (c) Copyright by Department of Computer Education at Chungbuk * National University, Chungbuk, Republic of Korea -------------------------------------------------------------------------*/ #include #include"malloc.h" //malloc »ç¿ëÇÒ ¶§ ÇÊ¿äÇÑ Çì´õÆÄÀÏ #include"stdlib.h" //atoi() »ç¿ëÇϱâÀ§ÇÑ Çì´õÆÄÀÏ #include"ctype.h" //isdigit »ç¿ëÇϱâ À§ÇÑ Çì´õÆÄÀÏ #define MAX_TERMS 100 #define COMPARE(x,y) ( ((x)<(y)) ? -1: ((x)==(y)) ? 0 : 1) typedef struct{ int coef; int expon; } polynomial; polynomial terms[MAX_TERMS]; polynomial terms_temp[MAX_TERMS]; // °ö¼ÀÀ» À§ÇØ ¼±¾ð int input(); void output(int start, int finish); void add(); void mul(); void attach(int x, int y); int avail = 0; // ÇöÀç »ç¿ëÇÒ structure¹è¿­ÀÇ index °ª int starta = 0; // A(x)ÀÇ ¸Ç óÀ½ index int finisha = 0; // A(x)ÀÇ ¸Ç ³¡ index int startb = 0; // B(x)ÀÇ ¸Ç óÀ½ index int finishb = 0; // B(x)ÀÇ ¸Ç ³¡ index int starto = 0; // °á°ú ´ÙÇ×½ÄÀÇ ¸Ç óÀ½ index int finisho = 0; // °á°ú ´ÙÇ×½ÄÀÇ ¸Ç ³¡ index int main(void) { int menu; printf("================ MENU ================ \n"); printf("= 1. Input A(x) = \n"); printf("= 2. Input B(x) = \n"); printf("= 3. Addition of A(x) and B(x) = \n"); printf("= 4. Multiplication of A(x) and B(x) = \n"); printf("= 5. Exit Program = \n"); printf("====================================== \n"); printf("\n Enter MENU \n"); while (1) { scanf("%d", &menu); getchar(); switch (menu){ case 1: printf("Input A(x) (ex: 1x2+3x1+1 ) ? "); starta = avail; input(); finisha = avail - 1; printf("A(x) = "); output(starta, finisha); break; case 2: printf("Input B(x) ? "); startb = avail; input(); finishb = avail - 1; printf("B(x) = "); output(startb, finishb); break; case 3: starto = avail; add(); break; case 4: starto = avail; mul(); break; case 5: break; } } return 0; } int input() // ´ÙÇ×½ÄÀ» ÀԷ¹ÞÀ½ Áö¼ö³ª °è¼ö°¡ 1ÀÏ °æ¿ì´Â ²À 1À» ½á¾ßÇÑ´Ù. { char temp[MAX_TERMS]; char temp2[9]; int i = 0; int c = 0; int j = 1; scanf("%s", &temp); while ((int)temp[i] != 0) { if (isdigit(temp[i])) { if (temp[i - 1] == '-') // ÀԷ¹ÞÀº ±ÛÀÚ ¾ÕÀÇ ºÎÈ£°¡ -À̸é À½¼ö¸¦ °è¼ö¿¡ ÀúÀå { j = -1; while (isdigit(temp[i])) { temp2[c] = temp[i]; c++; i++; } terms[avail].coef = atoi(temp2)*j; for (c = 0; c<9; c++) temp2[c] = 'x'; } else if (temp[i - 1] == 'x') //ÀԷ¹ÞÀº ±ÛÀÚ ¾ÕÀÌ xÀ̸é Áö¼ö¿¡ ÀúÀå { while (isdigit(temp[i])) { temp2[c] = temp[i]; c++; i++; } terms[avail++].expon = atoi(temp2)*j; for (c = 0; c<9; c++) temp2[c] = 'x'; } else if (temp[i - 1] == '+') //ÀԷ¹ÞÀº ±ÛÀÚ ¾ÕÀÌ +¸é °è¼ö¿¡ ÀúÀå { while (isdigit(temp[i])) { temp2[c] = temp[i]; c++; i++; } terms[avail].coef = atoi(temp2)*j; for (c = 0; c<9; c++) temp2[c] = 'x'; } else { while (isdigit(temp[i])) //À§ÀÇ °æ¿ì°¡ ¾Æ´Ï¸é °è¼ö¿¡ ÀúÀå { temp2[c] = temp[i]; c++; i++; } terms[avail].coef = atoi(temp2)*j; for (c = 0; c<9; c++) temp2[c] = 'x'; } if ((int)temp[i] == 0) terms[avail++].expon = 0; } else i++; } return 0; } void output(int start, int finish) //void À̹ǷΠreturn 0À» Áö¿ü½À´Ï´Ù. { int i = start; int j = finish; for (i = start; i <= j; i++) { if (terms[i].coef >= 0 && i == start && terms[i].expon != 0) // °è¼ö°¡ ¾ç¼öÀÌ°í ùÇ× { // ÀÌ°í Áö¼ö°¡ 0ÀÌ ¾Æ´Ï¸é printf("%d", terms[i].coef); printf("x"); printf("%d", terms[i].expon); } else if (terms[i].coef >= 0 && terms[i].expon != 0) // °è¼ö°¡ ¾ç¼öÀÌ°í Áö¼ö°¡ 0ÀÌ { // ¾Æ´Ï°í ùÇ×ÀÌ ¾Æ´Ï¸é printf("+%d", terms[i].coef); printf("x"); printf("%d", terms[i].expon); } else if (terms[i].coef < 0 && terms[i].expon != 0) // °è¼ö°¡ À½¼öÀÌ°í Áö¼ö°¡ 0ÀÌ ¾Æ´Ï¸é { printf("%d", terms[i].coef); printf("x"); printf("%d", terms[i].expon); } else if (terms[i].coef > 0 && terms[i].expon == 0) // °è¼ö°¡ ¾ç¼öÀÌ°í Áö¼ö°¡ 0À̸é { printf("+%d", terms[i].coef); break; } else if (terms[i].coef < 0 && terms[i].expon == 0) // °è¼ö°¡ À½¼öÀÌ°í Áö¼ö°¡ 0À̸é { printf("%d", terms[i].coef); break; } } printf("\n"); } void add() { while ((starta <= finisha) && (startb <= finishb)) { switch (COMPARE(terms[starta].expon, terms[startb].expon)) { case -1: // Áö¼ö¸¦ ºñ±³Çؼ­ µÚ¿¡°ÍÀÌ Å©¸é µÚ¿¡Ç×ÀÇ index¸¦ Áõ°¡ attach(terms[startb].coef, terms[startb].expon); startb++; break; case 0: //Áö¼ö°¡ °°À¸¸é µÎ °è¼öÀÇ ÇÕÀ» ¹ÝȯÇÏ°í µÑ´Ù index¸¦ Áõ°¡ attach(terms[starta].coef + terms[startb].coef, terms[starta].expon); starta++; startb++; break; case 1: //Áö¼ö°¡ ¾Õ¿¡°ÍÀÌ Å©¸é ¾ÕÀÇÇ×ÀÇ index¸¦ Áõ°¡ attach(terms[starta].coef, terms[starta].expon); starta++; break; } } finisho = avail - 1; //ÀúÀåµÈ ´ÙÇ×½ÄÀÇ ¸¶Áö¸· index°ª output(starto, finisho); //È­¸é¿¡ Ãâ·Â } void attach(int x, int y) //³Ñ¾î¿Â °ªÀ» °á°ú¿¡ ÀúÀå //¾Æ¹«·± °ªµµ µ¹·ÁÁÖ´Â °ÍÀÌ ¾øÀ¸¹Ç·Î void { terms[avail].coef = x; terms[avail++].expon = y; } void mul() { int size = terms[starta].expon + terms[startb].expon + 1; //°á°ú°ª ÀúÀå int i, j; int *mulOut; mulOut = (int *)malloc(size); for (i = 0; i < size; i++) //»õ·Î¿î ¹è¿­(°è¼ö¸¸ °è»ê)À» ÃʱâÈ­ mulOut[i] = 0; for (i = starta; i <= finisha; i++) for (j = startb; j <= finishb; j++) mulOut[terms[i].expon + terms[j].expon] += terms[i].coef * terms[j].coef; //Áö¼öÀÇ ÇÕÀ» ¹è¿­ÀÇ index·Î ÇÏ°í °Å±â¿¡ °Ô¼öÀÇ °öÀ» ÀúÀåÇÑ´Ù. for (i = size - 1; i >= 0; i--) if (mulOut[i] != 0) { if (i == size - 1); else { if (mulOut[i] > 0) printf("+"); //¾ç¼öÀ̸é else printf("-"); //À½¼öÀ̸é } printf("%d", abs(mulOut[i])); // Àý´ë°ªÀ» Ãâ·ÂÇÑ´Ù. if (i != 0) printf("x%d", i); } printf("\n"); }