디시인사이드 갤러리

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

갤러리 본문 영역

형들 헬프좀

횽들아(219.241) 2010.10.12 19:51:48
조회 51 추천 0 댓글 0

infix -> postfix 소슨데

왜 이걸로 문자열까지 계산하면 아스키코드값으로 계산되자나

근데 원하는게 아스키코드값말고 a=1, b=2 이런식으로 지정해주고 싶은데

어떠케바꿔야될까 모르겟썸 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ







<요긴소스>

#include<stdio.h>
#include<stdlib.h>

#define max_stack_size 5 /*스택의 최대 크기*/
#define max_expr_size 5 /*수식의 최대 크기*/
typedef enum {lparen, rparen, plus, minus, times, divide, eos, operand} precedence;
static int isp[] = {0,19,12,12,13,13,0};
static int icp[] = {20,19,12,12,13,13,0};
int i=0; //후위 연산을 할때 쓸 char형 배열의 첨자
int top;
int stack_i[max_stack_size];
char expr[max_expr_size];
precedence stack_p[max_stack_size];

/* isp와 icp 배열 -- 인텍스는 연산자
  lparen,rparen,plus, minus,times,divide,eos의 우선순위 값 */

int eval(void);
precedence get_token(char *,int *);
void postfix(void );
print_token(precedence token);
add_p(int *,precedence );
add_i(int *,int );
int delete_top(int *);

////////////////////////////////전처리기 & 전역변수 & 프로토 타입///////////////
main(){

 printf("연산식을 입력하시오:");
 scanf("%s",expr);
 printf("infix(중위 연산자) : %s \\n",expr);
 printf("postfix(후위 연산자) : ");
 postfix();
 printf("\\n연산 \\n");
 eval();
 printf("답은 %d 입니다. ",stack_i[0]);

}
//stack_p=>char으로 받은 expr을 열거형으로 바꾼다. 그래서 피연산자(숫자)랑 연산자를 구분한다.
//////////////////////////중위 표기를 후위 표기로 변환하는 함수/////////////
void postfix(void)
{
 /*수식을 후위 표기식으로 출력한다. 수식 문자열, 스택, top은 전역적이다.*/
 char symbol;
 precedence token;
 int n=0;
 int top = 0; 
 stack_p[0] = eos;  /*eos를 스택에 넣는다.*/

 for(token = get_token(&symbol, &n); token != eos; token = get_token(&symbol,&n)){
  
  if(token == operand){
   expr[i++] = symbol;
   printf("%c",symbol);
  }

  else if (token == rparen){
   /*왼쪽괄호가 나올 때 까지 토큰들을 제거해서 출력시킴*/
   while(stack_p[top] != lparen)
     print_token(stack_p[delete_top(&top)]);
   
   delete_top(&top); /*좌괄호를 버린다.*/
  }  

  else{
  /*symbol의 isp가 token의 icp보다 크거나 같으면 symbol을 제거하고 출력시킴*/
   while( isp[stack_p[top]] >= icp[token] ){
    print_token(stack_p[top]);
    delete_top(&top);
   }

   add_p(&top, token);
  }

 }
 while( (token = stack_p[delete_top(&top)]) != \'\\0\' )
  print_token(token); 

}


//expr=>입력받을 시 char배열로 수를 받는다.
////////////////////////입력 문자열로 부터 토큰을 생성하는 함수//////////////
precedence get_token(char *symbol,int *n){

 /*다음 토큰을 취한다.
 symbol은 문자표현이며,
 token은 그것의 열거된 값으로 표현되고 명칭으로 반환된다.*/

 *symbol = expr[(*n)++];
 switch (*symbol){
 case \'(\' :
  return lparen;
 case \')\' :
  return rparen;
 case \'+\' :
  return plus;
 case \'-\' :
  return minus;
 case \'*\' :
  return times;
 case \'/\' :
  return divide;
 case \'\\0\' :
  return eos;
 default :
  return operand;
 }
}
///////////////////////////////////////////////////////////////////////////
add_i(int *top,int token){ stack_i[++*top]=token; }
add_p(int *top,precedence token){  stack_p[++*top]=token; }//push하는 함수
/////////////////////////////////////////////////////////////////////////
int delete_top(int *top){ return (*top)--; }//top만 감소
///////////////////////////////////////////////////////////////////////////
print_token(precedence token){//출력
 char temp;

 switch(token){
    case plus:
     expr[i++] = \'+\';

     printf("+");    
     break;

    case minus:
     expr[i++] = \'-\';

     printf("-");    
     break;

    case times:
     expr[i++] = \'*\';

     printf("*");
     break;

    case divide:
     expr[i++] = \'/\';

     printf("/");
     break;

    case eos:
     expr[i++] = \'\\0\';

     temp=\'\\0\';
     printf("%c",temp);
     break;       
   }
 return 0;
}

//열거형인 stack_p로 되어있는 것을 정수형인 stack_i로 바꾼다.
///////////////////////////후위 표기식을 연산하는 함수////////////////
int eval(void)
{
 /* 전역 변수로 되어 있는 후위 표기식 expr을 연산한다. \'/0\'은 수식의 끝을 나타낸다.
 stack과 top은 전역 변수이다. 함수 get_token은 토큰의 타입과 문자 심벌을 반환한다.
 피연산자는 한 문자로 된 숫자임을 가정한다.*/
 precedence token;
 char symbol;
 int op1,op2;
 int n = 0; /*수식 문자열을 위한 카운터*/
 int  top = -1; 

 token = get_token(&symbol,&n);
 
 while(token != eos){
  if(token == operand)   
   add_i(&top, symbol -\'0\');
  
  

  else{   
   /*두 피연산자를 삭제하여 연산을 수행한 후, 그 결과를 스택에 삽입함*/

   op2 = stack_i[delete_top(&top)]; /*스택 삭제*/
   op1 = stack_i[delete_top(&top)];

   switch(token){
    case plus:
     printf("%d %d + = %d\\n",op1,op2,op1+op2);
     add_i(&top,op1+op2);    
     break;

    case minus:
     printf("%d %d - = %d\\n",op1,op2,op1-op2);
     add_i(&top,op1-op2);     
     break;

    case times:
     printf("%d %d * = %d\\n",op1,op2,op1*op2);
     add_i(&top,op1*op2);
     break;

    case divide:
     printf("%d %d / = %d\\n",op1,op2,op1/op2);
     if(!op2){
      printf("불능");
      exit(1);
     }
     add_i(&top,op1/op2);
     break;
     
   }

  }
  token = get_token(&symbol,&n);
 }
 return delete_top(&top); /*결과를 반환*/
 
}

추천 비추천

0

고정닉 0

0

댓글 영역

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

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 비난 여론에도 뻔뻔하게 잘 살 것 같은 스타는? 운영자 24/06/03 - -
224151 액티브X는 사라져야한다. [4] 한마음택배갤로그로 이동합니다. 10.12.11 60 0
224150 덕짤이 이런거맞나요? [2] 꿀레갤로그로 이동합니다. 10.12.11 109 0
224149 사실적인 해킹 [3] 세브(222.239) 10.12.11 207 0
224148 소셜 네트워크만큼 해킹 장면 사실적으로 그린 영화 있음? [10] ㅁㄴㅇㄹ(58.122) 10.12.11 252 0
224147 살려주세요..ㅠㅠ 난관임 (짤 수정 ㅠㅠ) [16] 이로이로。갤로그로 이동합니다. 10.12.11 131 0
224146 AMOLED 란 건 말이다.. [2] 때릴꺼야?(119.67) 10.12.11 90 0
224145 이진트리 사칙연산에서 도움을 청합니다. [7] 과제에빡치겠(219.248) 10.12.11 253 0
224143 초대졸si업체 3년경력 vs 3년동안편입준비+학사학위[초진지글] [5] 시크한훈남갤로그로 이동합니다. 10.12.11 332 0
224141 프로그래머 전산학과 대학원 설포카중에 어느곳나와야 좋냐? [1] radf(59.27) 10.12.11 139 0
224138 정전엔 뻘글 차가운핫쵸코갤로그로 이동합니다. 10.12.11 38 0
224137 AMD APU조낸 나오길 기대하고 있음. [2] 마타버터갤로그로 이동합니다. 10.12.11 187 0
224136 자바아는횽없어? [4] 시크한훈남갤로그로 이동합니다. 10.12.11 72 0
224135 형들 linux에서 hardy edgy 이런게 뭐임? 주시미갤로그로 이동합니다. 10.12.11 31 0
224134 프갤님들에게 질문드려요 avilock 관해서 굽싡굽신.. avilock(210.102) 10.12.11 27 0
224133 횽들은 학력컴플렉스 어떻게 극복함? [3] 졷뉴비(211.172) 10.12.11 150 0
224132 횽들아 좀 도와주세요 [2] 감자군대(222.101) 10.12.11 70 0
224131 6개월 정도 배울만한 것중에 재밌고 보람있는거 추천해주세요 ㅎㅎ; [4] 알바즐갤로그로 이동합니다. 10.12.11 148 0
224129 자바질문 getText에서 뽑은 문자와 db에서 뽑은 문자가달라요!!ㅠㅠ [3] 시크한훈남갤로그로 이동합니다. 10.12.11 82 0
224128 이클립스쓰면 왠지기분좋음 [1] 꿀레갤로그로 이동합니다. 10.12.11 84 0
224127 프로그래머가 프리로 뛰면 돈 얼마나 벌까? [3] ㄴㅇ(143.248) 10.12.11 157 0
224126 횽들아 전선과목이여 윈도우프로그래밍말고 유닉스 프로그래밍 고르면 [3] 마타버터갤로그로 이동합니다. 10.12.11 81 0
224125 학원에서도 안드로이드 과정은 1개월밖에 안해염.. [8] 홍어(218.51) 10.12.11 137 0
224124 리눅스 콘솔에 컬러뜨게 하는법(GCC코딩) [2] 마타버터갤로그로 이동합니다. 10.12.11 98 0
224123 너님들 c에서 thread구현 _beginthread(..); [5] 뉴비(175.217) 10.12.11 289 0
224122 아프면서 기분이 좋을 때가 있잖아 [11] 세브(222.239) 10.12.11 134 0
224121 캠퍼스 커플 해본사람 있습니까? 그거 어떻죠? [13] 금호족기(61.75) 10.12.11 125 0
224120 이더넷 궁금해요. [10] 저격곰팡이갤로그로 이동합니다. 10.12.11 86 0
224119 안드로이드 폰 어플 개발해보고 싶은 뉴비입니다. [24] 알바즐갤로그로 이동합니다. 10.12.11 269 0
224118 eclipse test코드 써본사람~ [1] 황태자갤로그로 이동합니다. 10.12.11 43 0
224117 리눅스에 C언어코드에 색상넣을려면 어떻게해야함. [2] 마타버터갤로그로 이동합니다. 10.12.11 90 0
224116 형들 비베말야.ㅂ [8] 킁봑(112.171) 10.12.11 89 0
224115 밥먹었어? [4] elwlwlwk갤로그로 이동합니다. 10.12.11 92 0
224114 플로이드알고리즘이 최적이 원리가성립되는걸어케알까요?ㅋㅋ [1] 알고리즘ㅠ(59.25) 10.12.11 171 0
224113 8시간 30분.... [1] 권혁진(58.233) 10.12.11 55 0
224112 시험 망했다 \(^0^)/ [4] Rei@디씨갤로그로 이동합니다. 10.12.11 100 0
224111 촘 조용하다 오늘? [1] 땡칠도사갤로그로 이동합니다. 10.12.11 82 0
224110 노트북이 부서졌다...ㅠㅠ [9] Rei@디씨갤로그로 이동합니다. 10.12.11 194 0
224109 동적할당해서 도서관 프로그램 소스공개 [1] 꿀레갤로그로 이동합니다. 10.12.11 124 0
224107 코드를 직관적으로 짜는 게 좋은거야? [5] 노력하는초보갤로그로 이동합니다. 10.12.11 103 0
224106 요즘 갤에 잦뉴비들이 유난히 설치는거 같다 [6] Heimdal(121.185) 10.12.11 131 0
224105 c언어 코딩좀 제발부탁드려요ㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜ [6] 코딩(183.109) 10.12.11 119 0
224103 예비고3 실업계생인데요 [3] 응잉잉(221.155) 10.12.11 85 0
224101 c언어 프로젝트 코딩좀 해주세요 [11] 코딩(183.109) 10.12.11 195 0
224100 야이 싯팔 숙제갤러색히들아 [7] printf(115.93) 10.12.11 110 0
224099 혹시 이거 아는 사람 있어? [3] 빨리빨리(58.140) 10.12.11 117 0
224097 형들 쪽팔리지만 질문 좀 할게(숙제아님) [12] printf(115.93) 10.12.11 156 0
224096 C언어 공용체 이거 원리가 뭐야. [5] (168.131) 10.12.11 134 0
224095 c언어 실력 '상' 급 될려면 c언어 몇 년 파야 되나요??? [11] 컴돌이(58.77) 10.12.11 409 0
224094 자 토요일이라.. [1] 홍어(218.51) 10.12.11 41 0
224093 난 지금 뭔가가 크게 잘못되어 있어 도와줘 [4] 십ㄹㄹ바(211.192) 10.12.11 104 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2