두 다항식 입력받아 계산하기.

////// Warning!! This Program is very 캐안습
////// Edited By Muzie. ver 0.0000001
////// 일반적인 다항식 2개를 입력받아 합을 구하여 일반적인 다항식의 모습으로 출력하는 프로그램.
////// 미리 말해두지만 String.h를 쓸줄몰라서 안쓴게 아니라 오기가 생겨서 if노가다 한거다 -_-;
////// 마찬가지로 쓰잘데기없이 학교과제로 썼다간 주위의 웃음거리가 될 것이니 왠만함 자제하시길.

#include <stdio.h>
#include <stdlib.h>
#define MAX 1000
#define MAX_TERMS 1000

struct{
 int coef;
 int expon;
}terms[MAX_TERMS];

static int avail=0;

char compare(int a,int b)
{
 if(a>b) return '>';
 else if(a==b) return '=';
 else return '<';
}

void attach(int coef,int expon)
{
 if(avail>MAX_TERMS){
  printf("항의 개수가 너무 많음");
  exit(0);
 }
 terms[avail].coef=coef;
 terms[avail].expon=expon;
 avail++;
}
void poly_add2(int As,int Ae,int Bs,int Be,int *Cs,int *Ce){

 int tempcoef;
 *Cs=avail; // avail은 b다항식 바로뒤를 가리킴.
 while(As<=Ae&&Bs<=Be)
  switch(compare(terms[As].expon,terms[Bs].expon)){

 case '>':

   attach(terms[As].coef,terms[As].expon);
   As++;
   break;
 case '=':
  tempcoef=terms[As].coef+terms[Bs].coef;
  if(tempcoef != 0)
   attach(tempcoef,terms[As].expon);
  As++;
  Bs++;
  break;

 case '<':
  attach(terms[Bs].coef,terms[Bs].expon);
  Bs++;
  break;
 }

 for(;As<=Ae;As++) attach(terms[As].coef,terms[As].expon);
 for(;Bs<=Be;Bs++) attach(terms[Bs].coef,terms[Bs].expon);
 *Ce=avail - 1;
}

void main()
{

 char str[MAX]; // 입력받은 문자열을 저장할 공간.
 int cnt; // 루프를 돌리기 위한 변수.
 int loo=0,loo2=0;
 int As=0,Ae,Bs,Be,Cs,Ce;
 int a;

 for(a=1;a<=2;a++) {
 printf("▦▦▦ %d번째 다항식을 입력하십시오.\n▦▦▦ ",a);
 scanf("%s",str); // 입력을 받는다.
 
 for(cnt=0;str[cnt]!=NULL;cnt++) // NULL이 아닐때까지 배열에 있는 스트링을 빼낸다.
 {
  if(cnt==0&&str[cnt]=='-'&&str[cnt+1]=='x') {terms[loo].coef = -1 ; cnt++; loo++;}// 만약 배열의 처음이고 '-'가 붙어있으면
  if(cnt==0&&str[cnt]=='-') {terms[loo].coef = ((int)str[cnt+1]-48)*-1 ; cnt++; loo++;}// 만약 배열의 처음이고 '-'가 붙어있으면
  if(cnt==0&&(int)str[cnt]>=48&&(int)str[cnt]<=57) { terms[loo].coef = (int)str[cnt]-48; loo++; }// 만약 배열의 처음이고 cnt가 숫자의 범위에 들어와있으면 계수이다.
  if(str[cnt]=='x') {if(str[cnt-1]=='+'||cnt==0) {terms[loo].coef = 1; loo++;}//만약 x 이전이 +이면 계수는 1.
       if(str[cnt-1]=='-'&&cnt-1 != 0) {terms[loo].coef = -1;  loo++;}//만약 x 이전이 -이면 계수는 -1. 
         if(str[cnt+1]=='^')  // 만약 x가 나오고 바로뒤가 ^이면 지수가 2 이상이다.
        {cnt ++; continue;}
         if(str[cnt+1]=='+'||str[cnt+1]=='-'||str[cnt+1]==NULL) {terms[loo2].expon=1; loo2++;continue;}         
      } // x뒤에 ^ 없으면 지수가 1이다.
  if((int)str[cnt]>=48&&(int)str[cnt]<=57&&str[cnt-1]=='^'){ // 숫자범위이고 이전 스트링에 ^가 있으면 그놈은 계수다.
   terms[loo2].expon = (int)str[cnt]-48;
   loo2++;}
  if((int)str[cnt]>=48&&(int)str[cnt]<=57&&str[cnt+1]=='x'&&str[cnt-1]=='+'&&cnt!=0&&cnt-1!=0) { terms[loo].coef =(int)str[cnt]-48; loo++;}
  if((int)str[cnt]>=48&&(int)str[cnt]<=57&&str[cnt+1]=='x'&&str[cnt-1]=='-'&&cnt!=0&&cnt-1!=0) { terms[loo].coef =((int)str[cnt]-48)*-1; loo++;}
  if(str[cnt-1]=='+'&&(int)str[cnt]>=48&&(int)str[cnt]<=57&&str[cnt+1]==NULL) { terms[loo].coef = (int)str[cnt]-48; terms[loo2].expon=0; loo2++;  loo++; }
  if(str[cnt-1]=='-'&&(int)str[cnt]>=48&&(int)str[cnt]<=57&&str[cnt+1]==NULL) { terms[loo].coef = ((int)str[cnt]-48)* (-1); terms[loo2].expon=0; loo++; loo2++;}
 }
 if(a==1) {Ae=loo-1; Bs=loo;}
 if(a==2) {Be=loo-1; avail = loo;}
 }
 poly_add2(As,Ae,Bs,Be,&Cs,&Ce);

 for(cnt=loo;cnt<avail;cnt++)
 {  if(terms[cnt].expon == 0 && terms[cnt].coef == 1) printf("%c1",cnt == loo ? NULL : '+');
         if(terms[cnt].expon == 0 && terms[cnt].coef == -1) printf("-1");
   if(terms[cnt].expon == 0 && terms[cnt].coef > 1) printf("%c%d",cnt == loo ? NULL : '+',terms[cnt].coef);
   if(terms[cnt].expon == 0 && terms[cnt].coef < -1) printf("%d",terms[cnt].coef);
   if(terms[cnt].expon == 1 && terms[cnt].coef == 1) printf("%cx",cnt == loo ? NULL : '+');
   if(terms[cnt].expon == 1 && terms[cnt].coef == -1) printf("-x");
   if(terms[cnt].expon == 1 && terms[cnt].coef > 1) printf("%c%dx",cnt == loo ? NULL : '+',terms[cnt].coef);
   if(terms[cnt].expon == 1 && terms[cnt].coef < -1) printf("%dx",terms[cnt].coef);
   if(terms[cnt].expon > 1 && terms[cnt].coef == 1) printf("%cx^%d",cnt == loo ? NULL : '+',terms[cnt].expon);
   if(terms[cnt].expon > 1 && terms[cnt].coef == -1) printf("-x^%d",terms[cnt].expon);
   if(terms[cnt].expon > 1 && terms[cnt].coef > 1) printf("%c%dx^%d",cnt==loo?NULL:'+',terms[cnt].coef,terms[cnt].expon);
   if(terms[cnt].expon > 1 && terms[cnt].coef < -1) printf("%dx^%d",terms[cnt].coef,terms[cnt].expon);
 }
 
}

by muzie | 2007/04/06 00:40 | STUDY | 트랙백 | 덧글(0)

트랙백 주소 : http://muzie.egloos.com/tb/3096715
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶