디시인사이드 갤러리

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

갤러리 본문 영역

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

컴공1(202.31) 2009.12.08 14:46:03
조회 92 추천 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
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 끝까지 다 본 걸 후회하게 만든 용두사미 드라마는? 운영자 25/07/07 - -
AD 디지털 액세서리 기간한정 세일! 운영자 25/07/11 - -
275592 그리고 자바도 망할듯, 얘넨 세 번 망할듯, 완전히 망할듯 [2] 삼등이(218.48) 11.09.24 89 0
275591 구조체 복사에 관해서 질문좀 해봄... [9] 독담갤로그로 이동합니다. 11.09.24 66 0
275587 C언어 질문 하나 할게요~ [4] Chic.(122.202) 11.09.24 69 0
275586 내가 달팽이 배열 만들고 만다 개객끼야 [2] 로하로하알로하갤로그로 이동합니다. 11.09.24 67 0
275585 c언어 질문요~ [21] 뉴비(211.60) 11.09.24 148 0
275584 자바 프레임 출력 이거 다 나오게 할려면 어떻게 해야함? SPlCA갤로그로 이동합니다. 11.09.24 32 0
275583 나 매틀랩 도저히 못하겠다... 매틀랩(125.128) 11.09.24 68 0
275582 파이썬 하는 횽들 헬프좀 ㅠㅠㅠㅠ 1234(169.229) 11.09.24 52 0
275581 공정률 30% [10] 이문동쮸쮸바갤로그로 이동합니다. 11.09.24 204 1
275580 쭈쭈바형은 봅니다 [2] Adelposs(218.152) 11.09.24 47 0
275579 c언어 조건연산자를 이용해서 계산기 어떻게 만들어.???ㅠ./ㅠ [10] ㅇㅇ(175.124) 11.09.24 102 0
275578 DX11, ComputeShader, SpeedTree, 람다식, PPL [7] 이문동쮸쮸바갤로그로 이동합니다. 11.09.24 119 0
275577 java 야 마영전 하니? [1] Adelposs(218.152) 11.09.24 44 0
275576 나도 공부 때려치고 Adelposs(218.152) 11.09.24 42 0
275574 자바 프레임 이거 어떻게 처리해야되지? [1] SPlCA갤로그로 이동합니다. 11.09.24 45 0
275573 동적할당형은 [1] Adelposs(218.152) 11.09.24 42 0
275572 prezi 말고 다른건 없음? ㅁㄴㅇㄹ(175.195) 11.09.24 42 0
275571 대털 1,2부는 재미없다 [1] 분당살람갤로그로 이동합니다. 11.09.24 59 0
275570 어디서 에러나는지 찾아봐 [30] 동적할당갤로그로 이동합니다. 11.09.24 161 0
275569 양자택일 i++; // i+=1; [7] 로하로하알로하갤로그로 이동합니다. 11.09.24 100 0
275568 형들 매틀랩에서 nxn 정방행렬 만들려고 하는데 [2] 매틀랩(125.128) 11.09.24 97 0
275567 그럼 xhtml이나 html5 로 론칭하면 어떨까? 쵸쵸(219.251) 11.09.24 23 0
275566 형들 비주얼스투디오2010같은거 사용법 어떻게 공부해?? [2] 컴파일(180.228) 11.09.24 96 0
275565 교수가 이 숙제를 왜 낸걸까 [3] 저격甲갤로그로 이동합니다. 11.09.24 115 0
275564 취업했다. ㅋㅋㅋ [5] 천재해커(59.14) 11.09.24 144 0
275562 아래 정보처리기사 안따면 경력 반토막이라는 게 이해가 안되는게 fdsa(59.30) 11.09.24 95 0
275561 나의 돌머리를 인정한다 [3] 로하로하알로하갤로그로 이동합니다. 11.09.24 71 0
275559 신입이 형들께 질문.. [6] fdsa(59.30) 11.09.24 97 0
275557 html 이라는 패션브랜드를런칭할건데 [3] 쵸쵸(219.251) 11.09.24 67 0
275556 쇼핑몰 만들고 잇는데 [1] 꿀레(14.33) 11.09.24 51 0
275554 우리 모두 고민을 고민하지 말자! [6] 분당살람갤로그로 이동합니다. 11.09.24 77 0
275552 컴게이들아 파일 입출력 어디서 공부하면 좋을까 [5] 늅늅냄새(211.212) 11.09.24 83 0
275550 형들 [1] Adelposs갤로그로 이동합니다. 11.09.24 40 0
275548 CString사용의 좋은 예, 나쁜 예 [4] 이문동쮸쮸바갤로그로 이동합니다. 11.09.24 109 0
275547 경제적으로 아무리 어려움이 없어도 [8] 분당살람갤로그로 이동합니다. 11.09.24 81 0
275545 아 찌발 공부 안되네 [2] Adelposs갤로그로 이동합니다. 11.09.24 50 0
275544 cstring으로 구글 이미지 검색 하니까 [2] 이문동쮸쮸바갤로그로 이동합니다. 11.09.24 80 0
275543 나도 어제 죽을뻔 했다 Adelposs갤로그로 이동합니다. 11.09.24 69 0
275541 로하로하 형은 봅니다 Adelposs갤로그로 이동합니다. 11.09.24 36 0
275539 USB 자동인식하면 재부팅 되는 현상 어떻게 해야하나요? 유동닉(183.108) 11.09.24 27 0
275537 제 블로그 200번째 포스트 돌파 [6] [성대아싸]갤로그로 이동합니다. 11.09.24 91 0
275536 고급스러운 spring좀 하는쉑이좀 봐봐 [4] 쵸쵸(219.251) 11.09.24 75 0
275534 머리에 산소 공급 안되면 졸리냐? [5] 로하로하알로하갤로그로 이동합니다. 11.09.24 106 0
275533 자동차 정비센터 왔는데 [15] 외계달팽갤로그로 이동합니다. 11.09.24 126 0
275532 침묵 [3] 로하로하알로하갤로그로 이동합니다. 11.09.24 48 0
275531 C++ 클래스에서 함수쓸때 질문이요. 하양(221.159) 11.09.24 57 0
275530 니들 날아가는 잠자리가 잘못해서 달리는 버스안으로 들어오면 어케되게? [5] 쵸쵸(219.251) 11.09.24 85 0
275529 어셈 질문점 [1] SODMaster갤로그로 이동합니다. 11.09.24 55 0
275528 사이버 진짜 좆같다 [1] Adelposs갤로그로 이동합니다. 11.09.24 73 0
275525 니들 지구가 갑자기 자전을 멈추면 어떻게 되는줄이나 아냐? [15] 쵸쵸(219.251) 11.09.24 173 0
뉴스 [집 나가면 개호강] “보조견은 다 대형견인 줄” 강소라도 몰랐다…청각장애인 돕는 ‘보청견’ 등장에 시선 집중! 디시트렌드 07.11
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2