다항식 스트링으로 입력받아 지수,계수 추출하기.

 for(a=1;a<=2;a++)
 { printf("▦▦▦ %d번째 다항식을 입력하십시오.\n▦▦▦ ",a);
  scanf("%s",str); // 입력을 받는다.
  for(cnt=0;str[cnt]!=NULL;cnt++) // NULL이 아닐때까지 배열에 있는 스트링을 빼낸다.
  {
   if(cnt==0)// 배열의 인덱스가 0이고
   {
    if(str[cnt]=='-')// Type 1. 배열 인덱스 0에 -부호가 있고
    {
     if(str[cnt+1]=='x')// ## 다음이 바로 x이면
     {
      if(str[cnt+2]=='^'){coeff=-1;xpon=(int)str[cnt+3]-48; loo++; loo2++;}
       // 그다음 꺽쇠가 있음 계수는 -1, 지수는 ^다음꺼
      else if(str[cnt+2]!='^'){coeff=-1;xpon=1; loo++; loo2++;} // 꺽쇠가 없으면 계수는 -1, 지수는 0.
     }
     else if((int)str[cnt+1]>=48&&(int)str[cnt+1]<=57)// ## 다음이 숫자범위이면
     {
      if(str[cnt+2]=='x') // 그다음이 x가 나오면
      {     
       if(str[cnt+3]=='^'){coeff=((int)str[cnt+1]-48)*-1;xpon=(int)str[cnt+4]-48; loo++; loo2++;}
       // 그다음 꺽쇠가 있으면 계수는 그 전꺼, 지수는 다음꺼.
       else if(str[cnt+3]!='^'){coeff=((int)str[cnt+1]-48)*-1;xpon=1;loo++;loo2++;}
        // 꺽쇠가 없으면 계수는 그 전꺼 지수는 0.
      }
      if(str[cnt+2] != 'x'&& str[cnt+2]!= '+'&& str[cnt+2]!= '-') // 그다음이 x가 아닐때.
      { coeff=((int)str[cnt+1]-48)*-1; xpon = 0; loo++; loo2++;}
      // 계수는 그 인덱스값일때의 숫자이고  지수는 0이다.
     }
    }
    else if(str[cnt]=='x') // Type 2. 배열인덱스 0에 바로 x가 들어가있고
    {  
     if(str[cnt+1] == '^') { coeff=1;xpon=(int)str[cnt+2]-48; loo++;loo2++; }
     // 다음이 꺽쇠면 계수는 1이고 지수는 ^다음꺼.
     if(str[cnt+1] != '^') { coeff=1;xpon=1; loo++;loo2++;}
    }
    else if((int)str[cnt]>=48&&(int)str[cnt]<=57) // Type 3.배열의 그 인덱스일때 값이 숫자범위고
    {
     if(str[cnt+1] == 'x')  // 그다음에 x가 나오면.
     { 
      if(str[cnt+2]=='^') { // 그다음에 꺽쇠가 있으면
       coeff=(int)str[cnt]-48;xpon=(int)str[cnt+3]-48; loo++; loo2++;}
      if(str[cnt+2]!='^') { // 그다음에 꺽쇠가 없으면
       coeff=(int)str[cnt]-48;xpon=1;loo++;loo2++;}
     }
     if(str[cnt+1] != 'x'&& str[cnt+1]!= '+'&& str[cnt+1]!= '-') // 그다음이 x가 아닐때.
     { coeff=(int)str[cnt]-48; xpon = 0; loo++; loo2++;} // 계수는 그 인덱스값일때의 숫자이고  지수는 0이다.
    }
   }
  //////////////////////////// 배열의 인덱스가 0일때의 모든경우 (처음들어올 경우) ////////////////////////

  else if(cnt!=0) // 배열의 인덱스가 0이 아닌경우.
  {
   if((int)str[cnt]>=48&&(int)str[cnt]<=57 && str[cnt-1] != '^') // 그 인덱스일때 고른게 어떤 숫자일때.
   {
    if(str[cnt-1] == '-' && cnt-1 != 0) // Type 1.그 숫자 이전이 - 부호일때. 중복 제거.
    {
     if(str[cnt+1] == 'x') // 그 숫자 다음이 x이고.
     {
      if(str[cnt+2] == '^') // 그 숫자 다음이 꺽쇠이면.
      {coeff=((int)str[cnt]-48)*-1; xpon=(int)str[cnt+3]-48; loo++; loo2++;}
      // 계수는 그 숫자에 곱하기 -1값 이고 지수는 꺽쇠 다음.
      if(str[cnt+2] != '^') // 그 다음 숫자가 꺽쇠가 아니면.
      {coeff=((int)str[cnt]-48)*-1; xpon=1; loo++; loo2++;} // 계수는 그 숫자의 음수값이고 지수는 1이다.
     }
     if(str[cnt+1] != 'x'&& str[cnt+1]!= '+'&& str[cnt+1]!= '-') // 그 숫자 다음이 x가 아닐때.
     { coeff=((int)str[cnt]-48)*-1; xpon = 0; loo++; loo2++;}
    }
    if(str[cnt-1] != '-' && cnt-1 != 0 && str[cnt-1] != '^') // Type 2.그 숫자 이전이 -부호가 아닐때. 중복 제거.
    {
     if(str[cnt+1] == 'x') // 그 숫자 다음이 x이고.
     {
      if(str[cnt+2] == '^') // 그 숫자 다음이 꺽쇠이면.
      {coeff=(int)str[cnt]-48; xpon=(int)str[cnt+3]-48; loo++; loo2++;}
      // 계수는 그 숫자에 곱하기 -1값이고 지수는 꺽쇠 다음.
      if(str[cnt+2] != '^') // 그 다음 숫자가 꺽쇠가 아니면.
      {coeff=(int)str[cnt]-48; xpon=1; loo++; loo2++;} // 계수는 그 숫자의 음수값이고 지수는 1이다.
     }
     if(str[cnt+1] != 'x' && str[cnt+1]!= '+'&& str[cnt+1]!= '-')
     {coeff=(int)str[cnt]-48;xpon=0;loo++;loo2++;}
    }
  
   }
   if(str[cnt] == 'x' && cnt-1 != 0) // 그 인덱스일때 고른게 x일때.
   {
    if(str[cnt-1] == '-') // 그 이전이 -부호이고
    {
     if(str[cnt+1] == '^') // 그 다음이 꺽쇠이면.
     { coeff= -1 ; xpon = (int)str[cnt+2]-48; loo++; loo2++;}
     if(str[cnt+1] != '^') // 다음이 꺽쇠가 아니면.
     { coeff= -1 ; xpon = 1; loo++; loo2++;}
    }
    if(str[cnt-1] != '-' && str[cnt-1] == '+') // 그 이전이 -가 아니고 숫자범위가 아닌경우.
    {
     if(str[cnt+1] == '^') // 그담이 꺽쇠면.
     { coeff = 1; xpon = (int)str[cnt+1]-48; loo++; loo2++;}
     if(str[cnt+1] != '^') // 그담이 꺽쇠가 아니면.
     { coeff = 1; xpon = 1; loo++; loo2++;}
    }
   }
  }
  
  if(loo==loo2 && setflag != loo)
   { // 이부분에서 리스트에 한꺼번에 적재. 계수와 지수가 같을때 (둘다 구해져있을때)
    printf("coefficient = %d exponent = %d state a = %d\n",coeff,xpon,a);  
    if(a==1)  //출력하되 그냥 통과하는 부분도 있으므로 그부분을 빼주기 위해서 setflag를 둠.
    insert_to_list(coeff,xpon,Ahead,Atail);// 이부분에서 리스트에 적재.
    else
    insert_to_list(coeff,xpon,Bhead,Btail);
    setflag = loo;
   }
  }
 }

저번엔 코드를 개날림으로 작성했었는데 체계적으로 생각해서 다시 짜봤다.
수정하기도 훨 편하고 ..암튼 훨씬 낫다.
지금 리스트로 저장시키려고 하는데 전에 코드에서 추출하면 문제가 너무 많아서
다시 짜기로 했다. 이제 좀 제대로 된듯하다..휴;

by muzie | 2007/04/18 20:39 | STUDY | 트랙백 | 덧글(2)

트랙백 주소 : http://muzie.egloos.com/tb/3122399
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by 크훽뤡 at 2007/04/18 20:48
잘보구 갑니당~~^^
Commented by muzie at 2007/04/18 23:35
홈 살짝 봤는데 프밍 잘하시는분 같네요. 이런 개허접날코드를 잘보셨다니 농담이 지나치십니다 ㅠㅠ

:         :

:

비공개 덧글

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