2007년 04월 18일
다항식 스트링으로 입력받아 지수,계수 추출하기.
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 | 2007/04/18 20:39 | STUDY | 트랙백 | 덧글(2)




☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]