첫번째 프로젝트 - Stack Calculator 05

Here is tips and How to make executive file.


몇가지 tip을 먼저 씁니다.

 

makefile

 

a.out : node.o que_handler.o main.o
        g++ -o a.out node.o que_handler.o main.o
node.o : node.h node.cpp
        g++ -c node.cpp
que_handler.o: que_handler.h que_handler.cpp
        g++ -c que_handler.cpp
main.o : main.cpp main.h
        g++ -c main.cpp

 

g++을 사용할 경우 - linux 에서 코딩할 경우에 사용합니다. 여러개의 파일로 나누어 작업한 파일을 합쳐서 컴파일 및 링크를 간편하게 할 수 있습니다. 문법은 찾아보시기를.. 문법을 봐도 사실 무슨 말인지 알기 참 어렵습니다 .이 것은 그런 분들을 위한 실제적인 예제 입니다. 그리고, 이 makefile은 stack calculator를 위한 것이 아닙니다. 그냥 예 입니다.

 

첫번째 두번째 줄만 설명하면

a.out  - 만들려는 (g++ 실행 뒤의 결과) 파일

':'  문법 입니다 .

node.o que_handler.o main.o - a.out을 만드는데 필요한 파일들

여백 : 반드시 tap으로 띄워야 합니다. 잘 안되면 vi나 pico를 이용해서 tap을 추가해 주세요.

g++ 이하 - 실제 실행 명령어

프로그램은 헤더파일과 cpp 파일로 나누어 작업합니다. 처음엔 조금 불편하지만 익숙해지면 오히려 편합니다.

 

#ifndef __iostream_H__ //기본 입출력 헤더
#define __iostream_H__
#include <iostream.h>
#endif

 

 헤더 파일 include가 중복되지 않도록 해주는 선언입니다.

#ifndef  : if not defined : 어떤 헤더파일을 include 할 때마다 표시를 만들어 둡니다. 이 경우 #define __iostrem_H__ 가 그 역할을 합니다. 실제 프로그램적 기능은 전혀 없고 단지 표식 일 뿐입니다. 이름의 경우, 여백과 . 대신에 _ 를 쓰고, 모두 대문자를 쓰는 것이 일반적인 약속입니다만 뭐 좀 틀리게 해도 큰 문제는 없습니다. 하나의 프로젝트 안에서 통일만 시키면 됩니다.

 

 __iostream_H__ 이 표식이 없으면 표식을 만들고  <iostream.h>를 include 해라  라는 구문입니다. 표식이 이미 만들어져 있다면 바로 #endif 로 넘어가겠지요.

 

 

Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

첫번째 프로젝트 - Stack Calculator 04

Here is Stack. very simple one.

 이번에는 stack 입니다. 매우 단순합니다.  templet 를 쓰는 경우가 많은데, 그냥 쉽게 만들었습니다. 물론, 연산자의 프라이어리티도 무시 입니다. -_-;;

 

 스택은 두 가지 입니다. 잘 보시기를..

 

///////////////////////////////////////////////////////////////////////////////
// File Name  : stack.h       //
// Date   : 2004 / 10 / 8      //
// Compiler  : g++       //
// OS   : Red Hat Linux 7.1      //
//----------------------------------------------------------------//
// Etc   : Data Strucure Assignment #1     //
//     Stack Calculator      //
// ver   : 1.0       //
// Description         //
// class Stack의 선언부. 스트링용과 char 용의 두가지 구현
///////////////////////////////////////////////////////////////////////////////

#ifndef __iostream_H__ //기본 입출력
#define __iostream_H__
#include <iostream.h>
#endif

#ifndef __FSTREAM_H__ //파일 입출력
#define __FSTREAM_H__
#include <fstream.h>
#endif

#ifndef __STRING_H__ //문자열
#define __STRING_H__
#include <string.h>
#endif

class Stack_c //char 를 위한 stack
{
 public:
  Stack_c();  // constructor
  ~Stack_c();  // destructor
  int isEmpty(); //스택이 비었는지 확인
  int isFull(); //스택이 가득 찾는지 확인
  char pop(); //스택에서 data 출력(pop)
  int push(char); //스택에 data 입력(push)
   
 private:
  char data[80];  // string buffer - 저장공간
  int top;  // 마지막 저장 위치
};

class Stack_s //string을 위한 stack
{
 public:
  Stack_s(); // constructor
  ~Stack_s(); // destructor
  int isEmpty();
  int isFull();
  char* pop();
  int push(char*);
   
 private:
  char data[80][6];  // string buffer - 저장공간
  int top;   // 마지막 저장 위치
};

 

 

///////////////////////////////////////////////////////////////////////////////
// File Name  : stack.cpp      //
// Date   : 2004 / 10 / 8      //
// Compiler  : g++       //
// OS   : Red Hat Linux 7.1      //
//----------------------------------------------------------------//
// Etc   : Data Strucure Assignment #1     //
//     Stack Calculator      //
// ver   : 1.0       //
// Description         //
// class Stack의 구현부. 스트링용과 char 용의 두가지 구현    //
///////////////////////////////////////////////////////////////////////////////

#ifndef __STACK_H__
#define __STACK_H__
#include "stack.h"
#endif

Stack_c::Stack_c() //생성자
{
 top = -1; //스택이 비어있음
}

Stack_c::~Stack_c() //소멸자
{}

// Stack_c::isEmpty()
// Input : void
// Output : 스택이 비어 있으면 -1, 비어있지 않으면 0보다 큰 수를 리턴
// Purpose : 스택이 비어있는지 확인함
int Stack_c::isEmpty()
{
 return top;
}

// Stack_c::isFull()
// Input : void
// Output : 스택이 가득 차 있으면 -1, 그렇지 않으면 1
// Purpose : 스택이에 빈공간이 있는지 확인
int Stack_c::isFull()
{
 if (top ==80)
 { return -1;}
 else
 { return 1;}
}
// Stack_c::popl()
// Input : void
// Output : 가장 위에 쌓여 있는 char를 리턴, 스택이 비어있으면 -1을 리턴
// Purpose : 스택에서 데이터를 가져옮
char Stack_c::pop()
{
 char temp;
 if ( (isEmpty() ) >= 0)
 {
  temp = data[top];
  top--;
  return temp;
 }
 else
 {
  cout << "The Stack is Empty\n";
  return -1;
 }
}

// Stack_c::pushl()
// Input : char
// Output : 스택이 가득 차 있지 않으면 데이터를 입력하고 0보다 큰 값을 리턴, 스택이 가득 차 있으면 -1을 리턴
// Purpose : 스택에서 데이터를 입력
int Stack_c::push(char temp)
{
 if ( (isFull()) >= 0)
 {
  top++;
  data[top] = temp;
  return top;
 }
 else
 {
  cout << "The Stack is FULL\n";
  return -1;
 }
}


Stack_s::Stack_s()
{
 top = -1;
}

Stack_s::~Stack_s()
{}

// Stack_s::isEmpty()
// Input : void
// Output : 스택이 비어 있으면 -1, 비어있지 않으면 0보다 큰 수를 리턴
// Purpose : 스택이 비어있는지 확인함
int Stack_s::isEmpty()
{
 return top;
}
// Stack_s::isFull()
// Input : void
// Output : 스택이 가득 차 있으면 -1, 그렇지 않으면 1
// Purpose : 스택이에 빈공간이 있는지 확인
int Stack_s::isFull()
{
 if (top ==80)
 { return -1;}
 else
 { return top+1;}
}

// Stack_s::popl()
// Input : void
// Output : 가장 위에 쌓여 있는 문자열을 리턴, 스택이 비어있으면 "error"을 리턴
// Purpose : 스택에서 데이터를 가져옮
char* Stack_s::pop()
{
 char *temp;
 if ( (isEmpty() ) >= 0)
 {
  temp = data[top];
  top--;
  return temp;
 }
 else
 {
  cout << "The Stack is Empty\n";
  return "error";
 }
}

// Stack_s::pushl()
// Input : char*
// Output : 스택이 가득 차 있지 않으면 데이터를 입력하고 0보다 큰 값을 리턴, 스택이 가득 차 있으면 -1을 리턴
// Purpose : 스택에서 데이터를 입력
int Stack_s::push(char *temp)
{
 if ( (isFull()) >= 0)
 {
  top++;
  strcpy(data[top], temp);
  return top;
 }
 else
 {
  cout << "The Stack is FULL\n";
  return -1;
 }
}


Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

첫번째 프로젝트 - Stack Calculator 03

 

Here is File I/O function


이번에는 file I/O 입니다. 간단하죠.

 

///////////////////////////////////////////////////////////////////////////////
// File Name  : file.h       //
// Date   : 2004 / 10 / 8      //
// Compiler  : g++       //
// OS   : Red Hat Linux 7.1      //
//----------------------------------------------------------------//
// Etc   : Data Strucure Assignment #1     //
//     Stack Calculator      //
// ver   : 1.0       //
// Description         //
// File의 입출력을 담당하는 class File 의 선언부     //
///////////////////////////////////////////////////////////////////////////////

#ifndef __iostream_H__ //기본 입출력
#define __iostream_H__
#include <iostream.h>
#endif

#ifndef __FSTREAM_H__ //파일 입출력
#define __FSTREAM_H__
#include <fstream.h>
#endif

#ifndef __STRING_H__ //문자열을 다루기 위함
#define __STRING_H__
#include <string.h>
#endif

class File
{
 public:
  File(); // constructor
  ~File(); // destructor
  int Input_fopen(char *filename); //Input file open
  int Input_fclose();   //Input file close
  int Output_fopen();   //output file open
  int Output_fclose();   //input file close
  char* ReadLine();    // read one line
  int Write(char);   //output 파일에 한 글자 출력
  int WriteLine(char* );  //output 파일에 문자열 출력
 
 private:
  char m_StrBuf[80]; // string buffer
  ifstream m_fin; // input file stream
  ofstream m_fout; //output file stream
};

 

///////////////////////////////////////////////////////////////////////////////
// File Name  : file.cpp       //
// Date   : 2004 / 10 / 8      //
// Compiler  : g++       //
// OS   : Red Hat Linux 7.1      //
//----------------------------------------------------------------//
// Etc   : Data Strucure Assignment #1     //
//     Stack Calculator      //
// ver   : 1.0       //
// Description         //
//  file의 입출력을 담당하는 Class의 구현부      //
///////////////////////////////////////////////////////////////////////////////

#ifndef __FILE_H__
#define __FILE_H__
#include "file.h"
#endif

File::File()  //생성자
{}

File::~File() //소멸자
{
 m_fin.close(); //input file close
 m_fout.close(); //output file close
}

int File::Input_fopen(char* filename) // input file open
{
 m_fin.open (filename, ifstream::in);
 return 1;
}

int File::Input_fclose()  // input file close
{
 m_fin.close ();
 return 1;
}

int File::Output_fopen()  // output file open
{
 m_fout.open ("output.txt", ofstream::out | ofstream::app);
 return 1;
}

int File::Output_fclose()  // output file close
{
 m_fout.close();
 return 1;
}

// File::ReadLine()
// Input : void
// output : char*
// Purpose : 파일로부터 한 줄을 읽어서 (getline) 여백을 제거한 후 리턴
char* File::ReadLine()
{
 int loop1, loop2;
 m_fin.getline(m_StrBuf,80); // 파일에서 한 줄을 읽어옴
 
 for (loop1 = 0; loop1 <=strlen(m_StrBuf); loop1++) //문자열의 처음 부터 끝까지 검사
 {
  if ( m_StrBuf[loop1] == ' ') //여백이 있는 경우
  {
   for (loop2 = loop1; loop2 <= strlen(m_StrBuf); loop2++) // 여백 뒤의 문자열을 한 자리씩 앞으로 당김
   {
    m_StrBuf[loop2] = m_StrBuf[loop2+1];
   }
   loop1--; //여백이 있었던 자리부터 다시 검사하기 위해서
  }
 }
 return m_StrBuf; //여백이 제거된 문자열 리턴
}

// File::Write(char input)
// input : char
// output : 1
// Purpose : output 파일에 한 글자를 출력
int File::Write(char input)
{
 m_fout.put (input);
 return 1;
}

// File::Write(char* input)
// input : char
// output : 1
// Purpose : output 파일에 문자열을 출력

int File::WriteLine(char* input)
{
 m_fout. write ( input , strlen(input) );  
 return 1;
}

 

PS. 척 봐도 이런 file I/O는 유니크 합니다. copy하면 바로 걸릴거란 뜻입니다. 참고만 하시기를.

 

 

Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

첫번째 프로젝트 - Stack Calculator 02


Here is Main function.

main함수 코드는 다음과 같습니다.

 

///////////////////////////////////////////////////////////////////////////////
// File Name  : main.h      //
// Date   : 2004 / 10 / 8      //
// Compiler  : g++       //
// OS   : Red Hat Linux 7.1      //
//----------------------------------------------------------------//
// Etc   : Data Strucure Assignment #1     //
//     Stack Calculator      //
// ver   : 1.0       //
// Description         //
// main 함수에서 생성하는 Calculator class 를 생성하기 위한 헤더    //
// 와 기본 입출력 헤더를 포함한다.       //
///////////////////////////////////////////////////////////////////////////////

#ifndef __iostream_H__ //기본 입출력 헤더
#define __iostream_H__
#include <iostream.h>
#endif

#ifndef __CALCULATOR_H__ //Calculator 클래스 헤더
#define __CALCULATOR_H__
#include "calculator.h"
#endif

///////////////////////////////////////////////////////////////////////////////
// File Name  : main.cpp      //
// Date   : 2004 / 10 / 8      //
// Compiler  : g++       //
// OS   : Red Hat Linux 7.1      //
//----------------------------------------------------------------//
// Etc   : Data Strucure Assignment #1     //
//     Stack Calculator      //
// ver   : 1.0       //
// Description         //
// 메인함수를 갖고 있는 cpp 파일. Calculator 를 생성, 실행 시킴        //
///////////////////////////////////////////////////////////////////////////////
#include "main.h"

int main(int argc, char* argv[])
{
 if (argc != 2) // 파일 명이 입력 되지 않거나, 너무 많은 인자가 입력된 경우
 {
  cout << "하나의 파일명을 입력하세요\n" ;
  return 0;
 }
 else  //파일 명이 하나만 입력된 경우
 {
  cout << "Data Structure Assignment #1. Stack Calculator\n";
   cout<< "2004. 10. 8.\tVer. 1.0\n";
  Calculator calculator(argv[1]);  //Calculator 생성
  calculator.figure_out();  //Calculator 계산 시작
  cout << "\n";
 }
 
 return 1;
}

Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

 Stack을 이용하여 infix 수식을 posfix 로 바꾸는 프로그램. 많이들 하는 것이고...  소스도 엄청 많고 공개된 알고리즘들도 많이 있음. 교과서에도 실려있으니...   그럼에도 불구하고... 많은 학생들이 애를 먹는 문제. 


 내 경우에는 어떠한 알고리즘을 구현하기 전에 손으로 충분한 문제를 풀어봅니다. 어떤 공통된 패턴 내지는 사고의 흐름만 찾아내면 프로그램으로 구현하는 것은 그리 어렵지 않기 때문이죠. 이번 프로그램 같은 경우, 조건의 제한이 ( ) * / - + 로 단순했기 대문에 다른 알고리즘 들보다 훨씬 단순한 알고리즘을 만들어 사용했습니다.


 우선 입력과 출력 부터 봅시다. 입력과 출력은 모두 파일로 합니다.

입력 : infix

A+B
C-D
E*F
G/H
(A*B*C/D)+(E*F+(G*H/I)-J)
(A*B*C/D)
(A + B * C) / (D -E )


출력 : postfix + simple assembly code


--------------------------------------------------
A+B => AB+
--------------------------------------------------
 MOVE R1, B
 MOVE R2, A
 ADD R2, R1
 MOVE TEMP1, R2
 RETURN TEMP1
--------------------------------------------------
--------------------------------------------------
C-D => CD-
--------------------------------------------------
 MOVE R1, D
 MOVE R2, C
 SUB R2, R1
 MOVE TEMP1, R2
 RETURN TEMP1
--------------------------------------------------
--------------------------------------------------
E*F => EF*
--------------------------------------------------
 MOVE R1, F
 MOVE R2, E
 MUL R2, R1
 MOVE TEMP1, R2
 RETURN TEMP1
--------------------------------------------------
--------------------------------------------------
G/H => GH/
--------------------------------------------------
 MOVE R1, H
 MOVE R2, G
 DIV R2, R1
 MOVE TEMP1, R2
 RETURN TEMP1
--------------------------------------------------
--------------------------------------------------
(A*B*C/D)+(E*F+(G*H/I)-J) => ABCD/**EF*GHI/*+J-+
--------------------------------------------------
 MOVE R1, D
 MOVE R2, C
 DIV R2, R1
 MOVE TEMP1, R2
 MOVE R1, TEMP1
 MOVE R2, B
 MUL R2, R1
 MOVE TEMP2, R2
 MOVE R1, TEMP2
 MOVE R2, A
 MUL R2, R1
 MOVE TEMP3, R2
 MOVE R1, F
 MOVE R2, E
 MUL R2, R1
 MOVE TEMP4, R2
 MOVE R1, I
 MOVE R2, H
 DIV R2, R1
 MOVE TEMP5, R2
 MOVE R1, TEMP5
 MOVE R2, G
 MUL R2, R1
 MOVE TEMP6, R2
 MOVE R1, TEMP6
 MOVE R2, TEMP4
 ADD R2, R1
 MOVE TEMP7, R2
 MOVE R1, J
 MOVE R2, TEMP7
 SUB R2, R1
 MOVE TEMP8, R2
 MOVE R1, TEMP8
 MOVE R2, TEMP3
 ADD R2, R1
 MOVE TEMP9, R2
 RETURN TEMP9
--------------------------------------------------
--------------------------------------------------
(A*B*C/D) => ABCD/**
--------------------------------------------------
 MOVE R1, D
 MOVE R2, C
 DIV R2, R1
 MOVE TEMP1, R2
 MOVE R1, TEMP1
 MOVE R2, B
 MUL R2, R1
 MOVE TEMP2, R2
 MOVE R1, TEMP2
 MOVE R2, A
 MUL R2, R1
 MOVE TEMP3, R2
 RETURN TEMP3
--------------------------------------------------
--------------------------------------------------
(A+B*C)/(D-E) => ABC*+DE-/
--------------------------------------------------
 MOVE R1, C
 MOVE R2, B
 MUL R2, R1
 MOVE TEMP1, R2
 MOVE R1, TEMP1
 MOVE R2, A
 ADD R2, R1
 MOVE TEMP2, R2
 MOVE R1, E
 MOVE R2, D
 SUB R2, R1
 MOVE TEMP3, R2
 MOVE R1, TEMP3
 MOVE R2, TEMP2
 DIV R2, R1
 MOVE TEMP4, R2
 RETURN TEMP4
--------------------------------------------------


 대략 이해가 되시는지. 문제는 간단 명료 합니다.


Posted by 지그프리드 지그프리드

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절


BLOG main image
일상, 프로그래밍, IT 그리고 직장생활, Dive, 여행 by 지그프리드

카테고리

Class List (402)
Studies (30)
Exercise & Quizz (10)
Term Project (0)
ECIM list (Help!) (10)
Issues & News (0)
Gossip about IT & Job (22)
Tools (2)
Think about the Justice (23)
Book Review (170)
조엘 온 소프트웨어(번역) (28)
Diary (87)
Vacations (9)
Clash of clans 클래시 오브.. (11)

글 보관함

달력

«   2019/11   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Total : 315,137
Today : 26 Yesterday : 27