2007년 04월 06일
두 다항식 입력받아 계산하기.
////// 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 | 2007/04/06 00:40 | STUDY | 트랙백 | 덧글(0)




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