디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

아나 발푠데 이거 소스 해석좀 해줘 고수횽 도와줘

컴공1(202.31) 2009.12.08 14:46:03
조회 88 추천 0 댓글 1

void postfix(char *, char *);

이것으로 시작된게 이해가 잘안되,,,  우리조원이 짠건데  먼지 몰겠다,,,
이거 해석 하면 복받을거임  근데 좀 어렵나,,

주석이라도 부탁해 ,,
답글 또는 메일도 좋아~

#include <stdio.h>  
#include <string.h>
#include <stdlib.h>
#include <math.h>//삼각함수 선언 해더파일

#define MAX 100
#define M_PI 3.141592
#define RD(X) (X)*M_PI/180 //삼각 함수 구하는 공식

typedef enum { lparen, rparen, plus, minus, times, divide, mod, SIN, COS, TAN, eos, operand } precedence;

char stack[MAX]; // 후휘표기법으로 바꿀때 사용할 스택
double stack_eval[MAX]; // 연산시 사용할 스택 double형

int top, top_eval; // 스택의 top
char expr[MAX]; // 입력문자 전열 배열


precedence get_token(char *); // 연산자의 내용을 리턴하는 함수
double eval (char*); // 연산하는 함수
double change_value (char *,int *); // atof 함수
double push_eval(double); // 연산스택 push
double pop_eval(void); // 연산 스택 pop


void postfix(char *, char *); // 후위 표기법으로 바꾸는 함수
void init_stack(void); // 후위표기법의 스택의 초기화
char push(char);
char get_stack_top(void);
char is_stack_empty(void);
int is_operator(int);
int precedence_def(int);
void main_a();
int help(); //도움말 함수
int help_a();
int help_b();
int help_c();
int calc1();

void main()
{
 여긴생략

 

<BLOCKQUOTE style="MARGIN-RIGHT: 0px" dir=ltr>

 int selectnum;  //입력받은 메뉴의 숫자를 저장
 while(1)
 {
  printf("입력값:");
  scanf_s("%d", &selectnum);
  if(selectnum==1)
  {
   help();break;
  }
  else if(selectnum==2)
  {
   calc1();break;
  }
  else if(selectnum==3)
  {
   while(1)
   {
    main_a();
   }
  }
  else if(selectnum==4)
  {
   printf("종료합니다\\n");break;
  }
  else                  //정해진 1,2,3,4 이외를 입력시
   printf("잘못된 숫자를 입력하셨습니다 다시 입력하세요\\n");
 }
}

</BLOCKQUOTE>

int help()
{

<BLOCKQUOTE style="MARGIN-RIGHT: 0px" dir=ltr>

여긴생략

</BLOCKQUOTE>

 

 

<BLOCKQUOTE style="MARGIN-RIGHT: 0px" dir=ltr>

 printf("\\n입력값:");
 int helpnum;
 scanf_s("%d",&helpnum);
 
 switch(helpnum)
 {
  case 1:
   printf("기본도움말\\n");
   help_a();
  case 2:
   printf("함수도움말\\n");
   help_b();
  case 3:
   printf("공식참고자료\\n");
   help_c();
  case 4:
   break;

  default :
   printf("잘못된 값을 입력하셨습니다\\n");
 }
 return 0;
}

</BLOCKQUOTE>


int help_a()
{
 printf("\\n여기에는 기본도움말에 관한 자료를 입력\\n");
 

 return help();
}

int help_b()
{
여긴생략

 

 return help();
}

int help_c()
{
 printf("\\n여기에는 공식참고자료에 관한 자료를 입력\\n");
 return help();
}

 

<BLOCKQUOTE style="MARGIN-RIGHT: 0px" dir=ltr>

void main_a()
{
 
 double result; // 모든 연산의 결과값을 리턴받는다.
 char c,str[MAX]; // 문자열로 입력받을 변수, 배열
 int i; // 인덱스
 for ( i=0 ; (c=getchar()) != \'\\n\' ; i++ ) // 문자열을 받아서 배열에 넣는 루프
 {
  str[i] = c;
 }
 str[i] = \'\\0\';

 postfix(expr,str);
 //printf("%s\\n",expr);
 result = eval (expr); // 최종 계산된 값을 리턴받는다.
 printf("%lf\\n", result);
}

</BLOCKQUOTE>

double eval (char *expr) // 연산하는 함수
{
 precedence token; // 변수 선언
 double value, value_frist, value_secound;// 연산을 위해 필요한 변수
 int i;
 int top_eval = -1; // 스택의 초기화

 for ( i=0 ; expr[i] != \'\\0\' ; i++) // 배열을 끝까지 검색하면서 연산
 {
  if( expr[i] == \' \' ) // 빈공간이면 다음칸으로 이동한다.
  i++;
  token = get_token(&expr[i]); // token값을 리턴받는다.
 
  if ( token == operand )
  {
   value = change_value(&expr[i],&i);// 함수 숫자값(char)을 받아서 숫자값을(double) 리턴해주는 함수
   push_eval(value); // 스택에 삽입
  }
  else if ( (token == SIN) || (token == COS) || (token == TAN) )
  {
   value_frist = pop_eval();//맨위의 숫자를 연산한다.
   switch (token) // 삼각함수 연산시
   {
    case SIN : push_eval( sin( RD(value_frist)) );
     break;
    case COS : push_eval( cos( RD(value_frist)) );
     break;
    case TAN : push_eval( tan( RD(value_frist)) );
     break;
   }
  }


  else // 연산자가 들어 있다면
  {
   if (i==0 && token ==\'-\')
   {
    value = change_value(&expr[i],&i);// 함수 숫자값(char)을 받아서 숫자값을(double) 리턴해주는 함수
    push_eval(value); // 스택에 삽입
   }

   else
   {
    value_secound = pop_eval();// 맨위의 값이 나중 값이므로 두번째 변수에 삽입
    value_frist = pop_eval();

    switch (token) // 연산실시
    {
     case plus : push_eval(value_frist + value_secound);
      break;
     case minus : push_eval(value_frist - value_secound);
      break;
     case times : push_eval(value_frist * value_secound);
      break;
     case divide : push_eval(value_frist / value_secound);
      break;
     case mod : push_eval((int)value_frist % (int)value_secound);
      break;
    }
   }
  }
 }
 return pop_eval(); //스택에 마지막으로 남은 숫자를 리턴한다.

}

/*----------- 연산시 사용할 함수--------------------------------------- */
double push_eval(double t) // 연산 스택의 푸시
{
 if (top_eval >= MAX - 1)
 {
  printf("\\n Stack overflow.");
  exit(1);
 }
 stack_eval[++top_eval] = t;
 return t;
}

double pop_eval(void) // 연산 스택의 팝
{
 if (top_eval < 0)
 {
  printf("\\n Stack underflow.");
  exit(1);
 }
 return stack_eval[top_eval--];
}

double change_value (char *num, int *index) // atof 함수
{
 double value; // 임시저장 값
 char temp[MAX]; // 임시 배열
 int i,k;

 for ( i=0 ; num[i] != \' \' ; i++ ) // 빈킨을 만날때 까지 배열을 검색
 temp[i] = num[i]; // 임시 배열에 넣는다.
 temp[i] =\'\\0\';
 value = atof (temp); //float값
 k = *index;
 *index = k+i; // eval함수에서 i(index)값 자체를 변환
 return value; // 변환된 값을 리턴
}

precedence get_token (char *p) // 연산자 정의
{
 switch ( *p )
 {
 case \'(\': return lparen;
 case \')\': return rparen;
 case \'+\': return plus;
 case \'-\': return minus;
 case \'*\': return times;
 case \'/\': return divide;
 case \'%\': return mod;
 case \'s\': return SIN;
 case \'c\': return COS;
 case \'t\': return TAN;
 case \'\\0\': return eos;
 default: return operand;
 }
}

//----------------------------후위표기법으로의 변환시 사용할 함수--------------------------
void init_stack(void)
{
 top = -1;
}

char push(char t)
{
 if (top >= MAX - 1)
 {
  printf("\\n Stack overflow.");
  exit(1);
 }
 stack[++top] = t;
 return t;
}

char pop(void)
{
 if (top < 0)
 {
  printf("\\n Stack underflow.");
  exit(1);
 }
 return stack[top--];
}

char get_stack_top(void)
{
 return (top < 0) ? -1 : stack[top];
}

char is_stack_empty(void)
{
 return (top < 0);
}

int is_operator(int k)
{
 return (k == \'+\' || k == \'-\' || k == \'*\' || k == \'/\');
}

int precedence_def(int op)
{
 if (op == \'(\') return 0;
 if (op == \'+\' || op == \'-\') return 1;
 if (op == \'*\' || op == \'/\') return 2;
 else return 3;
}

void postfix(char *dst, char *src) // 후위표기로의 변환
{
 int opernext=0, opercmt=0;
 int cmt=0;
 init_stack();
 while (*src!=\'\\0\') // NULL까지 순환
 {
  if (*src == \'(\') // ( 만나면 푸시
  {
   if (opercmt % 2 !=0)
   {
    *dst++ = \'-\';
    *dst++ = \'1\';
    *dst++ = \' \';
    push(\'*\');
    opercmt=0;
   }
   push(*src);
   src++;
  }
  else if (*src == \')\')
  {
   while (get_stack_top() != \'(\') // 스택의 top이 \'(\' 아니냐?
   {
    *dst++ = pop(); // 아니면 연산자를 팝
    *dst++ = \' \'; // 빈킨을 만듬
   }
   pop();// \'(\' 이것을 지움
   src++;
   if ((get_stack_top() == \'s\') || (get_stack_top() == \'c\') || (get_stack_top() == \'t\') )
   { // 괄호가 끝이난후 삼각함수의 연산자가 들어 있는지 검사
    *dst++ = pop(); // true일경우 팝
    *dst++ = \' \';
   }
   else;
  }
  else if (is_operator(*src)) // 연산자일 경우
  {
   if (cmt==0 && *src==\'-\' || (opernext != 0 && *src==\'-\'))
   {//처음이 \'-\'이거나 연산자뒤에 \'-\'경우
    opercmt++;
    opernext++;
    *src++;
   }
   else
   {
    if ((get_stack_top() == \'s\') || (get_stack_top() == \'c\') || (get_stack_top() == \'t\') )
    {// 스택의 탑이 삼각함수인지 검사. 이유 괄호다음의 우선순위는 삼각함수이다.
     *dst++ = pop();
     *dst++ = \' \';
    }
    while (!is_stack_empty() && precedence_def(get_stack_top()) >= precedence_def(*src))
    {// 사칙연산의 우선순위를 정하는 루프
     *dst++ = pop();
     *dst++ = \' \';
    }
    opernext++;
    push(*src);
    src++;
   }
  }

 

  else if (*src >= \'0\' && *src <= \'9\') // 숫자가 들어올경우
  {
   if(opercmt % 2 != 0)
   {
    *dst++ = \'-\';
   }
   do   {
    *dst++ = *src++; // 숫자를 배열에 넣는다. 숫자가 아닌것이 나올때 까지
   } while ((*src >= \'0\' && *src <= \'9\') || *src == \'.\');
    *dst++ = \' \'; // 다한다음 빈공간을 넣는다.


   opernext=0;
   opercmt=0;

  }
  else if ( *src == \'.\' )
   *dst++ = *src++;
  else if ( *src == \'s\' ) // sin을 만날경우 첫문자가 \'s\'임으로 검사
  {
   push(*src);
   src = src+3; // sin글씨 세게의 다음으로 이동
  }
  else if ( *src == \'c\' )
  {
   push(*src);
   src = src+3;
  }
  else if ( *src == \'t\' )
  {
   push(*src);
   src = src+3;
  }
  else
   src++; // 아무것도 경우에 없을경우는 다음으로

   cmt++;
 }


 while (!is_stack_empty()) // 배열의 NULL까지 검사를 다한후 스택의 내용을 출력한다.
 {
  *dst++ = pop();
  *dst++ = \' \';
 }
 dst--;
 *dst = \'\\0\'; // 후위표기법으로 바꾼 배열의 마지막에 NULL을 넣는다.
}


int calc1()
{
 int calc_1, calc_2;
 char op;
 int recent;
 //double calc_11, calc_22;
 while(1){
  scanf_s("%d", &calc_1);
  scanf_s("%c", &op);
  scanf_s("%d", &calc_2);
  //calc_1 = calc_11;
  //calc_2 = calc_22;

  switch(op)
  {
   case \'+\' : recent = calc_1 + calc_2;
    printf("%d\\n", recent);calc1();
 
   case \'-\' : recent = calc_1 - calc_2;
    printf("%d\\n", recent);calc1();
   
   case \'*\' :
    recent = calc_1 * calc_2;
    printf("%d\\n", recent);calc1();
    
   case \'/\' : recent = calc_1 / calc_2;
    printf("%d\\n", recent);calc1();
   

  
  }
 return 0;
 }
return 0;
}

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 가족과 완벽하게 손절해야 할 것 같은 스타는? 운영자 24/06/24 - -
164765 컴퓨존 <--- 요기 아는사람? [2] 임베디드(112.150) 10.01.01 116 0
164763 최근에 면접본 회사... [6] 임베디드(112.150) 10.01.01 285 0
164761 집에 짱박아둔 컴퓨터에 15000원짜리 그래픽카드 달았는데... [3] 임베디드(112.150) 10.01.01 127 0
164760 32비트 윈도우 XP에서의 4GB 이상의 메모리 활용 다람쥐v갤로그로 이동합니다. 10.01.01 574 0
164759 진지하게 물어보는건데... [2] 임베디드(112.150) 10.01.01 97 0
164758 케케켁켁 횽 [1] 유리한갤로그로 이동합니다. 10.01.01 82 0
164757 새해가 왔는데 여긴 왜 정전이야? [12] URA!갤로그로 이동합니다. 10.01.01 106 0
164756 php..iconv()도움좀~ [1] 흐음(119.148) 09.12.31 214 0
164754 무슨 특정유명한 사이트 게시물 검색기 이런거.. [2] ㅇㄹ(218.159) 09.12.31 97 0
164753 으악 월핵 하나 만들어 보려다가... 결국 실패 -ㅅ- [7] 외계달팽갤로그로 이동합니다. 09.12.31 337 0
164751 소프트웨어인가.?잘모르겟는데 형들알려줘 !! [2] 갱포스갤로그로 이동합니다. 09.12.31 65 0
164750 님들 이 코드좀 해석해주세요 고수님들 필요!!! [2] 코드(222.234) 09.12.31 92 0
164747 어떡해 일기 #19 :: 2009년 한해를 마치며... [4] 어떡해갤로그로 이동합니다. 09.12.31 481 0
164745 오늘 무슨 특별한 날임? [2] 가난한플머(121.139) 09.12.31 92 0
164744 Sean횽 인세 올라가는 소리가 들리는 짤 [3] 고추장불고기갤로그로 이동합니다. 09.12.31 116 0
164743 윈도우 xp 32bit가 램을 최대 3.25기가 밖에 활용을 못한다던데 [58] 활용법(222.105) 09.12.31 983 0
164742 프갤 여러분 새해 복 많이 받으세요 [1] D++갤로그로 이동합니다. 09.12.31 40 0
164741 컴퓨터의 황제 킹 도어를 아심미꽈? [23] 오사카(220.88) 09.12.31 257 0
164740 rntjr 에게 보내는 짤. 구석에게 보내는 짤. 가난한플머(121.139) 09.12.31 127 0
164738 ㅠㅠ 언니 오빠들 질문이야 [12] 최효정(122.128) 09.12.31 170 0
164734 윈도그 2003 [2] 때릴꺼야?(116.40) 09.12.31 115 0
164732 비주얼 베이직 6 어디서 구할수있을까여.. [2] 콩키갤로그로 이동합니다. 09.12.31 102 0
164728 안녕하세요^^ [1] KernelPanic갤로그로 이동합니다. 09.12.31 35 0
164727 UTF-8 [4] 영카(112.149) 09.12.31 99 0
164726 새해복 많이 받아. [2] DyNast(221.164) 09.12.31 68 0
164725 C언어 고수님들만!! [3] 수리가형갤로그로 이동합니다. 09.12.31 129 0
164723 DC에 은둔중인 VB고수님께 UTF8 질문점효 [6] 영카(112.149) 09.12.31 179 0
164722 연말에 프갤러들을 위한 노래 algo갤로그로 이동합니다. 09.12.31 45 0
164721 여자살람 프갤러에게 카드받은게 자랑 [7] 개쉛기갤로그로 이동합니다. 09.12.31 248 0
164720 명함나왔다능 [6] DMW(125.138) 09.12.31 166 0
164719 두뇌능력 키워주는 장난감 뭐있나여? [3] ㅇㅇ(59.2) 09.12.31 106 0
164718 새해 복받아라 이섓키들아 [12] 개쉛기갤로그로 이동합니다. 09.12.31 161 0
164715 퀴즈. (jsp) [3] 고추장불고기갤로그로 이동합니다. 09.12.31 108 0
164714 LED ┼ IPS = ? 때릴꺼야?(116.40) 09.12.31 99 0
164713 %*d 이게 뭐야 [1] 에취갤로그로 이동합니다. 09.12.31 104 0
164712 아이폰 국내판매 20만대 돌파 Vita500갤로그로 이동합니다. 09.12.31 86 0
164711 새해 인사 [1] 관심시전갤로그로 이동합니다. 09.12.31 55 0
164710 찜질방 왔다 [4] 오사카(110.69) 09.12.31 109 0
164709 exe파일에 숨겨진 아이피 포트번호 알아낼방법좀ㅠ [3] 초보자(119.206) 09.12.31 160 0
164708 우앙 역시 송고램 [4] algo갤로그로 이동합니다. 09.12.31 96 0
164707 노트북이요.. [9] 으허어어(163.152) 09.12.31 159 0
164705 후뢰시맨 이렇게 변했구나.jpg [1] 숙신갤로그로 이동합니다. 09.12.31 195 0
164704 첫 사랑의 추억 [1] Vita500갤로그로 이동합니다. 09.12.31 126 0
164703 내가 죽어도 그렇게 슬퍼해줄테야? [1] 숙신갤로그로 이동합니다. 09.12.31 135 0
164702 첫사랑의 추억 [3] 유리한갤로그로 이동합니다. 09.12.31 162 0
164701 누가 회사에서 당신을 고문관, 크래모아, 회장님이라고 부른다면... [5] 물속의다이아갤로그로 이동합니다. 09.12.31 205 0
164700 시사회 당첨된게 자랑 [3] 숙신갤로그로 이동합니다. 09.12.31 121 0
164699 좋다능...헤헤.swf [1] 숙신갤로그로 이동합니다. 09.12.31 100 0
164698 우앙 연말 분위기 쩔겠군요 [7] algo갤로그로 이동합니다. 09.12.31 139 0
164697 가난한 플머는 봅니다. rntjr갤로그로 이동합니다. 09.12.31 118 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2