//============================================================================
//  제출일 : 2005. 4. 12
//  작업환경 :  Windows XP SP1, VC++ 6.0, Pentium4
//  연습문제 9-67
//============================================================================

#include <iostream.h>

int get_gcd(int a, int b); //recursive fuction

int main()
{
 int gcd;
 int a, b;

 cout << "input factor A : ";
 cin >> a;
 cout << "input factor B : ";
 cin >> b;

 gcd = get_gcd(a, b);
 cout << "gcd is " << gcd << endl;
 cout << "lcm is " << a*b/gcd << endl;

 return 0;
}

int get_gcd(int a, int b) //get gcd by recursive
{
 if (a ==0 || b == 0)
  return a+b;
 else if (a >= b)
  return get_gcd(a%b, b);
 else
  return get_gcd(b%a, a);
};


 

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

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

//============================================================================
//  제출일 : 2005. 3. 12
//  작업환경 :  Windows XP SP1, VC++ 6.0, Pentium4
//  연습문제 4-41
//  : Call by Reference를 사용하기 위하여 메인함수에 값을 받아오는 함수를
//    추가하였습니다. 클래스 구조를 사용할 경우 굳이 사용할 필요는 없습니다만
//    주어진 조건에 충실하기 위하여 추가하였습니다.
//============================================================================


#include <iostream.h>
#include <iomanip.h>
#define LABOR 0.35  //고정변수 : Labor cost per sqare fit
#define TAX 8.5 //%  //고정변수 : Tex rate

class Bill    //청구서를 발행하는 클래스
{
 public:
  Bill();
  ~Bill();
  void setData(int _length, int _width, int _discount, float carpet); //사용자로부터 읽어온 값을 클래스의 데이터로 set함
  void calculate(void);            //계산 시작
  void printResult(void);            //결과 출력

 private:
  int length;
  int width;
  int discount;
  int area;
  float carpet;
  float carpet_cost;
  float labor_cost;
  float intalled_price;
  float discount_cost;
  float subtotal;
  float tax;
  float total;

  void calcInstall(void);            //계산에 필요한 세 가지 함수
  void clacSubTotal(void);
  void calcTotal(void);
};

Bill::Bill() //생성자
{}    //Do nothing
 
Bill::~Bill() //소멸자
{}    //Do nothing

void Bill::setData(int _length, int _width, int _discount, float _carpet)  //입력받은 변수를 저장하는 함수
{
 length = _length;
 width = _width;
 discount = _discount;
 carpet = _carpet;
 return;
}

void Bill::calculate(void)              //계산의 시작
{
 calcInstall();
 clacSubTotal();
 calcTotal();
 return;
}

void Bill::calcInstall(void)             //시설비 계산
{
 area = length * width;
 carpet_cost = area * carpet;
 labor_cost = (float)(area * LABOR);
 intalled_price = carpet_cost + labor_cost;
 return;
}

void Bill::clacSubTotal(void)             //SubTotal 계산
{
 discount_cost = intalled_price * discount/100;
 subtotal = intalled_price - discount_cost;
 return;
}

void Bill::calcTotal(void)              //Total 계산
{
 tax = (float)(subtotal * TAX/100);
 total = subtotal + tax;
 return;
}

void Bill::printResult(void)             //결과의 출력
{
 cout << "\n\n\t\tMEASUREMENT\n";
 cout.setf( ios::right); //오른쪽 정렬
 cout <<"Length\t\t\t"<<setw(7)<<setfill(' ')<<length<<"\tfeet\n";
 cout <<"Width\t\t\t"<<setw(7)<<setfill(' ')<<width<<"\tfeet\n";
 cout <<"Area\t\t\t"<<setw(7)<<setfill(' ')<<area<<"\tfeet\n";

 cout << "\t\tCHAREGES\n\n";
 cout << "DESCRIPTION\tCOST/SQ.FT.\tCHARGE/ROOM\n";
 cout << "-----------\t-----------\t-----------\n";
 cout <<"Carpet\t\t"<<setw(11)<<setfill(' ')<< carpet<<"\t"<<setw(11)<<setfill(' ')<<carpet_cost<<"\n";
 cout <<"Labor\t\t"<<setw(11)<<setfill(' ')<< LABOR<<"\t"<<setw(11)<<setfill(' ')<<labor_cost<<"\n";
 cout <<"\t\t\t\t-----------\n";
 cout <<"INSTALLED PRICE\t\t\t"<<setw(11)<<setfill(' ')<<intalled_price<<"\n";
 cout <<"Discount\t"<<setw(10)<<setfill(' ')<< discount<<'%'<<"\t"<<setw(11)<<setfill(' ')<<discount_cost<<"\n";
 cout <<"\t\t\t\t-----------\n";
 cout <<"SUBTOTAL\t\t\t"<<setw(11)<<setfill(' ')<<subtotal<<"\n";
 cout <<"TAX\t\t\t\t"<<setw(11)<<setfill(' ')<<tax<<"\n";
 cout <<"TOTAL\t\t\t\t"<<setw(11)<<setfill(' ')<<total<<"\n";

 return;
}
//END of class Bill

//Subfunction of MAIN
void getData(int &_length, int &_width, int &_discount, float &_cost); //Call by Reference를 사용하기 위하여 추가한 함수

int main()
{
 int _length;              //Call by Reference를 사용하기 위하여 추가한 변수
 int _width;
 int _discount;
 float _carpet;
 getData(_length, _width, _discount, _carpet);      //사용자로부터 값을 입력받음
 Bill bill;               //클래스 생성
 bill.setData(_length, _width, _discount, _carpet);     //데이터 저장
 bill.calculate();             //계산  
 bill.printResult();             //결과 출력
 
 return 0;

}

//Subfunction of MAIN
void getData(int &_length, int &_width, int &_discount, float &_carpet) //Call by Reference를 사용하기 위하여 추가한 함수
{
 cout << "Length of room (feet)? ";
 cin >> _length;
 cout << "Width of room (feet)? ";
 cin >> _width;
 cout << "Customer discount (feet)? ";
 cin >> _discount;
 cout << "Cost per square foot (xxx.xx)? ";
 cin >> _carpet;
}

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

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

//============================================================================
//  제출일 : 2005. 3. 12
//  작업환경 :  Windows XP SP1, VC++ 6.0, Pentium4
//  연습문제 4-40
//============================================================================

#include <iostream.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

int main()
{
 float number;
 int rand_num;
 float product;
                                //Process No.
 cout << "Enter a number\n"; //1
 cin >> number;    //2
 cout << number << "\n";  //3

 srand(time(NULL)); //Seed Initianlization //4
 rand_num = rand()%35+3; //Get a Random number
 cout << rand_num << "\n"; //5

 product = number * rand_num; //6
 cout << ceil(product)<< "\n"; //7
 cout << pow(number, 5)<< "\n"; //8
 cout << floor (product)<< "\n"; //9
 cout << pow(number, 5)<< "\n"; //10
 cout << sqrt(product)<< "\n"; //11

 return 0;
}


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

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

//============================================================================
//  제출일 : 2005. 3. 12
//  작업환경 :  Windows XP SP1, VC++ 6.0, Pentium4
//  연습문제 4-39
//============================================================================

#include <iostream.h>

void C2F(float input)    //썹씨를 화씨로 고치는 함수
{
 float output;
 output = 32 + input*(180/100); //변환식
 cout << output <<" F degree\n"; //출력
 return;
}

void F2C(float input)    //화씨를 썹씨로 고치는 함수
{
 float output;
 output = (input-32)*100/180; //변환식
 cout << output <<" C degree\n"; //출력
 return;
}

int main()
{
 float temp;
 cout << "Enter Centigrade temperature :\n";
 cin >> temp;
 C2F(temp);
 cout << "Enter Fathrenheit temperature :\n";
 cin >> temp;
 F2C(temp);


 return 0;
}

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

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

//============================================================================
//  제출일 : 2005. 3. 12
//  작업환경 :  Windows XP SP1, VC++ 6.0, Pentium4
//  연습문제 4-38
//============================================================================

#include <iostream.h>
#include <iomanip.h>
#include <fstream.h>
#include <string.h>
#include <stdlib.h>

float calc(float input);  //이자의 계산
void print(float input);  //출력

int main()
{
 float begining_balance;
 cout << "원금을 입력하세요\n";
 cin >> begining_balance;

 print(begining_balance); //출력 함수 호출

 return 0;
}


float calc(float input)   //이자 계산 함수
{
 return (float)(input * 0.053);
}

void print (float input)  //출력함수 : 이자 계산 함수 호출
{
 int loop ;
 cout << "============================|\n";
 cout << "|Quater| Interest |  Total  |\n";
 cout << "============================|\n";
 for (loop = 0; loop < 5 ; loop++)
 {
  cout.setf( ios::right, ios::adjustfield ); //오른쪽 정렬       
  cout <<'|'<<setw(6)<<loop <<'|';
  cout <<setw(10)<<calc(input)<<'|';   //이자의 계산
  input+=calc(input);       //계산된 이자를 원금에 합산
  cout <<setw(9)<<input<<"|\n";    //최종 잔액 출력
 }
 cout << "=================================\n";
}

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

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

//============================================================================
//  제출일 : 2005. 3. 12
//  작업환경 :  Windows XP SP1, VC++ 6.0, Pentium4
//  연습문제 4-37
//  data.txt로 부터 세일즈맨의 정보를 읽어와 처리함
//============================================================================

#include <iostream.h>
#include <iomanip.h>
#include <fstream.h>
#include <string.h>
#include <stdlib.h>

class Salesperson
{
 public:
  Salesperson();      //Default 생성자
  ~Salesperson();      //소멸자
  void init(char *data_string);  //한 줄을 입력 받아 Data를 변수에 저장
  void calc();      //계산을 수행하는 메쏘드
  void print();      //계산 내용을 출력하는 메쏘드

 private:
  char name[80];
  int sales;
  int bonus;
  float federal;
  float state;
  float retirement;
};

Salesperson::Salesperson()
{} //Do nothing

Salesperson::~Salesperson()
{} //Do nothing

void Salesperson::init(char *data_string) //파일로부터 Data를 읽어오는 생성자
{
 strcpy(name, strtok(data_string," \t"));
 sales = atoi(strtok(NULL," \t"));
 bonus = atoi(strtok(NULL," \t"));
}

void Salesperson::calc()     //계산 함수
{
 float total_income = (float)(sales*0.125 + bonus);
 federal = (float)(total_income * 0.25);
 state = (float)(total_income * 0.10);
 retirement = (float)(total_income * 0.08);
}

void Salesperson::print()      //화면 출력을 담당하는 함수
{
 cout.setf( ios::right, ios::adjustfield ); //오른쪽 정렬                                
 cout <<"| "<<setw(9)<<setfill(' ')<<name<<' '; //9칸의 공간을 할당, 여백을 ' '으로 채움
 cout <<"| "<<setw(7)<<setfill(' ')<<sales<<' ';
 cout <<"| "<<setw(7)<<setfill(' ')<<bonus<<' ';
 cout <<"| "<<setw(7)<<setfill(' ')<<federal<<' ';
 cout <<"| "<<setw(7)<<setfill(' ')<<state<<' ';
 cout <<"| "<<setw(8)<<setfill(' ')<<retirement <<" |\n";
}


int main()
{
 char buf[80];       //파일에서 한줄씩 읽기 위한 버퍼
 ifstream  file;       //file stream
 Salesperson salesperson;    //세일즈맨들의 정보를 저장, 계산하기위한 클래스
 file.open("data.txt", ifstream::in); //Data.txt File Open
 file.getline(buf, 80);     //첫번째 줄 무시
 file.getline(buf, 80);
 cout << "================================================================\n";
 cout << "|SALESPERSON|  SLAES  |  BONUS  | FEDERAL |  STATE  |RETIREMENT|\n";
 cout << "================================================================\n";

 do
 {
  salesperson.init(buf);
  salesperson.calc();
  salesperson.print();
 } while (file.getline(buf, 80)); //마지막 줄까지 읽으면서 새로운 데이터를 생성하고 출력함
 cout << "================================================================\n";

 return 0;
}

--------------------------------------------------------------------------------------

data.txt


salesperson sales   bonus
1           53500   425
2           41300   300
3           56800   350
4           36200   175

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

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

//============================================================================
//  제출일 : 2005. 3. 12
//  작업환경 :  Windows XP SP1, VC++ 6.0, Pentium4
//  연습문제 4-35
//============================================================================
#include <iostream.h>
#include <math.h>

float round(float num);

int main()
{
 float num;
 cout << "아무수나 입력하세요\n";
 cin >> num;

 cout << "Ceiling : " << ceil(num) << "\n";
 cout << "Floor : " << floor(num) << "\n";
 cout << "Round : " << round(num) << "\n";
 

 return 0;
}

float round(float num)
{
 float temp;
 temp = (int)num;
 temp = num - temp;
 
 if (num > 0)
 {
  if (temp >= 0.5)
   return ceil(num);
  else
   return floor(num);
 }
 else
 {  
  if (temp >= -0.5)
   return ceil(num);
  else
   return floor(num);
 }
}

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

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

//============================================================================
//  제출일 : 2005. 3. 12
//  작업환경 :  Windows XP SP1, VC++ 6.0, Pentium4
//  연습문제 4-33
//============================================================================

#include <iostream.h>
//using namespace std;

// Prototype Declarations
 int addThreeDigits (int num);
 int firstDigit (int);
 int secondDigit (int);
 int thirdDigit (int);

int main()
{
 cout << "Enter an integer: ";
 int number;
 cin >> number;

 int sum = addThreeDigits (number);
 cout << "\nSum of last three digits is: " << sum;
 return 0;
} //main

int addThreeDigits (int number)
{
 int result = firstDigit(number) + secondDigit(number) + thirdDigit(number);
 return result;
}

int firstDigit(int num)
{
 return (num % 10);
}

int secondDigit(int num)
{
 int result = (num / 10) % 10;
 return result;
}

int thirdDigit(int num)
{
 int result = (num /100) % 10;
 return result;
}

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

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

첫번째 프로젝트 - 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/12   »
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 31        
Total : 315,600
Today : 2 Yesterday : 22