디시인사이드 갤러리

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

갤러리 본문 영역

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

컴공1(202.31) 2009.12.08 14:46:03
조회 93 추천 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/14 - -
공지 프로그래밍 갤러리 이용 안내 [88] 운영자 20.09.28 45604 65
2872944 핸드폰 중고로 사려는데 XZ1 순정롬 넥도리아(220.74) 21:29 0 0
2872943 내 친구 강유현이 그립구나 [5] ㅆㅇㅆ(124.216) 21:27 18 0
2872942 에구구 이눔아! ♥삣삐냥덩♥갤로그로 이동합니다. 21:27 5 0
2872940 잡아먹힐거 같아.. [2] ♥삣삐냥덩♥갤로그로 이동합니다. 21:15 10 0
2872939 C++ Malloc 쓴다는 병신 들어와라 프갤러(106.101) 21:13 15 0
2872937 옛날 프갤은 언제를 말하는건가요? [7] 개멍청한유라갤로그로 이동합니다. 21:06 37 0
2872936 옛날프갤이 그립당.. [3] ♥삣삐냥덩♥갤로그로 이동합니다. 21:04 22 0
2872935 옛사람들 나이를 생각해보면 왜 안오는지 대충 짐작이 가지 [3] 프갤러(110.8) 20:58 35 0
2872932 ㅇㅅㅇ❤+ ♥냥덩이는충전중♥갤로그로 이동합니다. 20:48 9 0
2872931 ㅔ근데 요즘 퓨어 c++ 쓰는사람 없어서 malloc 모를수있다봄 [1] 초코냥갤로그로 이동합니다. 20:45 37 0
2872930 전세계 부정선거조작 배후 밝혀졌넹 ㄷㅅㄷ ♥냥덩이는충전중♥갤로그로 이동합니다. 20:44 16 0
2872929 옛날사람들 왜 안옴? 배구공(119.202) 20:44 10 0
2872928 구멍 ♥냥덩이는충전중♥갤로그로 이동합니다. 20:41 11 0
2872927 new malloc 지랄하지 말고 러스트 써라 [3] 프갤러(211.234) 20:39 31 0
2872925 모기 있는거 같아서 찜찜하당.. ♥냥덩이는충전중♥갤로그로 이동합니다. 20:30 8 0
2872923 진정한 개발자들로 다시 프로그래밍 갤러리 살려야함 [1] 초코냥갤로그로 이동합니다. 20:20 42 0
2872922 이제 나이들어서 [1] 배구공(119.202) 20:18 24 0
2872921 가끔은 과거 프갤이 그립다 ㅇㅅㅇ.. [1] 초코냥갤로그로 이동합니다. 20:17 51 0
2872917 경상도 분들이 많으신듯 배구공(119.202) 20:10 27 0
2872916 과학교육과 여신 발명도둑잡기갤로그로 이동합니다. 20:08 10 0
2872915 난 그래도 ㅆㅇㅆ리스펙한다 [1] 초코냥갤로그로 이동합니다. 20:08 36 0
2872913 사람들이 왜 차타는지 알거같아요 개멍청한유라갤로그로 이동합니다. 20:05 24 0
2872911 징글징글하다 [7] 개멍청한유라갤로그로 이동합니다. 20:00 36 0
2872907 형들 34살 취업 조언점 [9] 프갤러(116.39) 19:50 49 0
2872905 OEM 잠금해제가 어떤지 없더라고, 넥도리아(220.74) 19:42 15 0
2872903 SD카드인데... 흠나... 넥도리아(220.74) 19:40 16 0
2872901 요즘 시대에 영어 공부가 꼭 필요할까요? [1] 질문왕(121.171) 19:38 23 0
2872900 강박증 심하면 언어 갈수록 흩트러지는 거 스트레쓰 받겠지 [3] 발명도둑잡기갤로그로 이동합니다. 19:35 19 0
2872898 네이버 AI가 왜 깔아져 있지? [2] 넥도리아(220.74) 19:33 26 0
2872897 이재명 대통령님께 당부드리는 흡연자 저격 아버지 포함 전자담배 빼고, 넥도리아(220.74) 19:31 17 0
2872896 애초에 수치 계산할때 malloc쓰라는 이유가 연속 메모리할당 [10] ㅆㅇㅆ(124.216) 19:30 68 0
2872895 ❤✨☀⭐⚡☘♥+나님 시작합니당♥+☘⚡⭐☀✨❤ [2] ♥냥덩이는충전중♥갤로그로 이동합니다. 19:28 31 0
2872894 결국 빤스런했노 ㅋㅋ 애초에 내가 씨발 초전도체 물성 계산한다고 CPP [3] ㅆㅇㅆ(124.216) 19:25 64 0
2872892 고수준에서만 작업하는 애들은 [8] 루도그담당(118.235) 19:21 88 0
2872891 애초에 ecs지피티한테 짜달라하면 맵기반으로 ㅆㅇㅆ찡갤로그로 이동합니다. 19:20 21 0
2872889 현업들한테 질문 [2] 프갤러(49.169) 19:12 34 0
2872888 요즘은 지가 쳐모른다고 지피티 운운하는 새끼들 개패고싶네 [4] ㅆㅇㅆ찡갤로그로 이동합니다. 19:08 53 0
2872887 지가 모른다고 지피티ㅋㅋ 저새낀 병신인가 ㅆㅇㅆ찡갤로그로 이동합니다. 19:06 19 0
2872885 한남 스윗하니까 한녀들이 1등시민 된거지 ㅇㅅㅇ 류류(118.235) 19:01 14 1
2872884 CPP에서 malloc 쓰지말란건 일반적으로 고수준 에서 쓰지말란거지 [6] ㅆㅇㅆ(124.216) 18:57 79 0
2872883 웹 개발 커미션 받는데 별의 별 사람이 다 있음 [2] ㅇㅇ갤로그로 이동합니다. 18:53 41 0
2872882 1분삭 ㅇㅇ(106.101) 18:48 20 0
2872881 안중근이 일본에서는 테러리스트 취급하듯이 [2] 류류(118.235) 18:43 29 2
2872878 최원종 보다 더 똑똑한애들 ㅇㅅㅇ [1] 류류(118.235) 18:32 47 2
2872876 최원종이 똑똑한가야 ㅇㅅㅇ 류류(118.235) 18:27 20 0
2872874 우측 엉덩이 실 점액낭종 수술 해주는 곳 없냐? 넥도리아(220.74) 18:24 13 0
2872873 서연고는 동네 개만도 못한대학이였구나 ㅇㅅㅇ 류류(118.235) 18:23 26 0
2872871 cpp 노베 강좌 추천좀 프갤러(116.121) 18:17 22 0
2872869 보통 일본 어디에 핵 떨어졌나 모르면 [5] 아스카영원히사랑해갤로그로 이동합니다. 18:16 46 0
뉴스 빅뱅 대성, 호주 멜버른 콘서트 취소 "기술 관련 문제" 디시트렌드 07.17
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2