'C++'에 해당되는 글 21건

  1. 2015.08.30 C++ 코딩 - 이자 계산 - 이자가 0으로 나와요
  2. 2014.07.19 사전 순으로 단어 정렬하기
  3. 2011.12.13 9장 Programming 1. 은행계좌
  4. 2011.12.06 Programming 08-07 (p.338) 클래스 설계
  5. 2011.02.21 C++ Espresso 에스프레소 by 천인국 에 관한 Technical Review 및 과제 등록 게시판 입니다 (6)
  6. 2011.02.12 객체지향적으로 생각하라 - 맷 와이스펠드
  7. 2008.08.23 Project 9-67 Euclid's method to get the Greate commom divisor and the Least common muliple 유클리드 소거법으로 최대공약수, 최소공배수 구하기
  8. 2008.08.23 Project 4-41 Create customers' bills 영수증 발행
  9. 2008.08.23 Project 4-40 Random number 랜덤
  10. 2008.08.23 Project 4-39 Temperature convertor : Fathrenheit VS Centigrade 온도변환기 : 화씨 섭씨
  11. 2008.08.23 Project 4-38 Compute the interest and print the balance
  12. 2008.08.23 Project 4-37 Prepare a payroll earnings statement
  13. 2008.08.23 Problem 4-35 print the ceiling, floor, and rounded value of a floating-point number
  14. 2008.08.23 Problem 4-33 Modify the "Add two digit" grogram
  15. 2008.08.21 Stack calculator #5 - Infix - Postfix translation using Stask structure
  16. 2008.08.21 Stack calculator #4 - Infix - Postfix translation using Stask structure
  17. 2008.08.21 Stack calculator #3 - Infix - Postfix translation using Stask structure
  18. 2008.08.21 Stack calculator #2 - Infix - Postfix translation using Stask structure
  19. 2008.08.21 Stack calculator #1 - Infix - Postfix translation using Stask structure
  20. 2008.08.21 A mouse in the Maze : 미로찾기
  21. 2008.08.20 Simple Linked List (practice)

코드한건데 이자가 추가가안되네요 ㅜㅜ

/연산자가  /100한걸 정수단위로 짤라서 그런가하고 더블자료형으로 소수로 이자해봣는데도 안되네요...

왜이자가안나올까요



 

 잘못된 이유는 다음과 같습니다.  

 

○ Virtual 함수 선언 / 사용에 대해서 다시 확인하세요. Virtual은 상속 하는 상위 클래스에 선언합니다. 

○ Int형 변수에 10/100을 넣으니 0이 되고, 이 때문에 이자 계산이 0이 됩니다. 



   수정된 코드는 아래와 같습니다. 
 


#include
#include

using namespace std;
const int NAME_LEN = 20;


void ShowMenu(void);//메뉴출력
void MakeAccount(void);//계좌생성
void InsertMoney(void);//입금
void ExtractMoney(void);//출금
void OutputInfo(void);//계좌정보출력

enum
{
    MAKE = 1,
    INSERT = 2,
    EXTRACT = 3,
    OUTPUT = 4,
    EXIT = 5
};

class Account
{
private:

    char*username;
    int userid;
    int usermoney;
public:
    Account(char*name, int id, int money)
        :userid(id), usermoney(money)
    {
        int len = strlen(name) + 1;
        username = new char[len];
        strcpy(username, name);
    }

    int getid() const
    {
        return userid;
    }

    virtual void deposit(int money)
    {
        usermoney += (money);
    }
    void withdraw(int money)
    {
        if (usermoney < money)
            cout << "잔액부족" << endl;
        else
            usermoney -= money;
    }
    void showinfo() const
    {
        cout << "성명: " << username << endl;
        cout << "계좌번호: " << userid << endl;
        cout << "잔액: " << usermoney << endl;
    }
    ~Account()
    {
        delete[]username;
    }
};

class NormalAccount : public Account
{
private:
    float userija;
public:
    NormalAccount(char*name, int id, int money, int ija)
        : Account(name, id, money), userija(ija)
    {
    }
    void deposit(int money)
    {
        Account::deposit(money);
        Account::deposit(money*(userija / 100));
    }
};
class HighCreditAccount : public NormalAccount
{
private:
    int userplusija;
public:
    HighCreditAccount(char*name, int id, int money, int ija, int plusija)
        :NormalAccount(name, id, money, ija)
    {}
    void deposit(int money)
    {
        NormalAccount::deposit(money);
        Account::deposit(money*(userplusija / 100));
    }
};
class Handler
{
private:
    Account*Arr[100];
    int accnum;


public:
    Handler() : accnum(0)
    {}
    void showMenu(void)
    {
        cout << "---------Menu----------" << endl;
        cout << "1.계좌개설" << endl;
        cout << "2.입 금" << endl;
        cout << "3.출금" << endl;
        cout << "4.계좌정보 전체 출력" << endl;
        cout << "5.프로그램 종료" << endl;
    }
    void MakeAccount()
    {
        int choice;
        cout << '[' << "계좌종류선택" << ']' << endl;
        cout << "1.보통계좌선택 2.신용계좌선택" << endl;
        cout << "입력:";
        cin >> choice;

        if (choice == 1)
            MakeNormalAccount();
        else
            MakeHighCreditAccount();

    }
    void MakeNormalAccount()
    {
        int id;
        char name[NAME_LEN];
        int money;
        int ija;

        cout << "[보통계좌개설]" << endl;
        cout << "이름을 입력하시오: "; cin >> name;
        cout << "계좌번호를 입력하시오: "; cin >> id;
        cout << "입금액을 입력하시오: "; cin >> money;
        cout << "기본 이자율:"; cin >> ija;
        cout << endl;
        Arr[accnum++] = new NormalAccount(name, id, money, ija);
    }

    void MakeHighCreditAccount()
    {
        int id;
        char name[NAME_LEN];
        int money;
        int ija;
        int choice;
        int plusija;

        cout << "[보통계좌개설]" << endl;
        cout << "이름을 입력하시오: "; cin >> name;
        cout << "계좌번호를 입력하시오: "; cin >> id;
        cout << "입금액을 입력하시오: "; cin >> money;
        cout << "기본 이자율:"; cin >> ija;
        cout << "신용등급[A(1),B(2),C(3)]"; cin >> choice;
        cout << endl;
        switch (choice)
        {
        case 1:
            plusija = 107;
            Arr[accnum++] = new HighCreditAccount(name, id, money, ija, plusija);
            break;
        case 2:
            plusija = 104;
            Arr[accnum++] = new HighCreditAccount(name, id, money, ija, plusija);
            break;
        case 3:
            plusija = 102;
            Arr[accnum++] = new HighCreditAccount(name, id, money, ija, plusija);
            break;
        default:
            cout << "잘못입력하셨습니다" << endl;
        }

    }
    void InsertMoney(void)
    {
        int id;
        int money;
        cout << "[입금]" << endl;
        cout << "계좌번호: "; cin >> id;
        cout << "입금액 : "; cin >> money;
        cout << endl;
        for (int i = 0; i < accnum; i++)
        {
            if (Arr[i]->getid() == id)
            {
                Arr[i]->deposit(money);
                cout << "입금완료" << endl;
                return;

            }
            else
                cout << "잘못입력" << endl;
        }
    }
    void ExtractMoney(void)
    {
        int id;
        int money;
        cout << "[출금]" << endl;
        cout << "계좌번호: "; cin >> id;
        cout << "출금액: "; cin >> money;
        for (int i = 0; i < accnum; i++)
        {
            if (Arr[i]->getid() == id)
            {
                Arr[i]->withdraw(money);
                cout << "출금완료" << endl;
                return;
            }
            else
                cout << "잘못입력" << endl;
        }
    }
    void OutputInfo(void)
    {
        int id;
        cout << "[계좌정보출력]" << endl;
        cout << "계좌번호입력 : "; cin >> id;
        for (int i = 0; i < accnum; i++)
        {
            if (Arr[i]->getid() == id)
            {
                Arr[i]->showinfo();
            }
        }
    }
};
int main(void)
{
    Handler bank;
    int choice;
    while (1)
    {

        bank.showMenu();
        cout << "선택: ";
        cin >> choice;

        switch (choice)
        {
        case MAKE:
            bank.MakeAccount();
            break;

        case INSERT:
            bank.InsertMoney();
            break;

        case EXTRACT:
            bank.ExtractMoney();
            break;

        case OUTPUT:
            bank.OutputInfo();
            break;
        case EXIT:
            return 0;

        default:
            cout << "잘못입력하셨습니다. ";
        }
    }

    return 0;

};



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


 

 문제 : 사전순으로 단어를 생성하여 N 번째 올 단어를 찾아라  

 


● 특정 문자열이 주어지고 이 문자열 안에 포함된 단어들을 사전순으로 정렬하라. 그리고 주어진 N 번째 오는 단어가 무엇인지 구하라.

단, 문자열의 최대 길이는 1,000 이고, 모두 소문자 알파벳으로만 되어 있다.

중복되는 단어는 한 단어로 생각한다. 

시간제한이 있다. (빠를 수록 점수가 높다, 1초가 넘으면 실패)


● 사전순이란 것은 알파벳 a ~ z 까지 단어를 정렬하는 것을 의미한다. 


● 예를 들어, melon 이란 문자열이 주어졌을 때, 7번째 오는 단어를 구하라. 

melon 안에 포함된 단어를 사전순으로 정렬하면 다음과 같다. 

1 : e

2 : el

3 : elo

4 : elon

5 : l

6 : lo

7 : lon

8 : m

9 : me

10 : mel

11 : melo

12 : melon

13 : n

14 : o

15 : on


즉, 답은 lon 이 된다. 



 

 일반적인 풀이  

 

● 풀이방법 1 : 위 문제와 같이 알파벳 a부터 문자열 안에 단어를 찾고, 그 뒤로 한글자씩 붙여서 단어를 만들어 나간다.

    

○ 문제점 :  주어진 문자열이 최대 1,000으로 길기 때문에 a가 몇번이고 반복될 수 있다. 예를 들어, a 부터 시작할 경우, 문자열 내의 모든 a 의 위치들을 기록하고, 그 뒤에 오는 단어들을 비교해서 순서를 만들어 나가야 한다. a가 세 번 반복된 경우, 각각의 단어의 뒷글자를 확인해서 순서를 정해야 한다. 위 문제의 예제와 같은 경우는 e가 한 번만 나오지만, e가 계속 반복되는 경우, 또 비슷한 알파벳이 많아지는 경우 문제가 복잡해진다. 


● 풀이방법 2 : 문자열의 첫글자부터 문자열을 만들어 나가면서 이 문자열을 이진 트리 형태로 저장하여 빠르게 정렬한다. 이를 통해 n 번째 아이템을 빨리 찾을 수 있다. 풀이방법 1의 반복적인 검색을 생략할 수 있다.

○ 문제점 : 모든 문자열을 다 만들어보아야 해서 메모리 문제가 있을 수 있다. C++이나 Java로 문제를 푸는 경우는 메모리 이슈를 피할 수 있지만 <STDIO.H> 만 허용된 C언어에서는 어려움이 있다. 트릭을 통해 malloc과 유사하게 푼다 하여도 속도 이슈가 발생할 수 있다. 실제로 C++로 이 문제를 푼 경우 제한 시간에 걸렸다. 



   답이 되는 풀이  
 

● 생각의 전환이 필요하다. 문자열로부터 시작하는 것이 아니라 사전 으로 부터 시작한다. 즉, a가 있는지 검색하고 있으면 다시 aa가 있는지 검색한다. 이 때, 문자열 전체를 보는 것이 아니라 a를 찾은 위치에서 그 바로 뒤에 문자와만 비교하면 된다. a를 찾은 위치의 인덱스를 활용한다. 


● 예를 들어, 주어진 문자열이 kdaabdgga 일 때, 

1) 우선 a 를 찾는다. 인덱스가 2에 a가 있음을 발견한다. 

2) 인덱스 2부터 aa가 있는지 확인한다. 인덱스 2에 aa가 있다.

3) 인덱스 2부터 aaa가 있는지 확인한다. 인덱스 2에는  aaa는 없다

3-1) 문자열 전체에서 aaa가 있는지 확인한다. aaa는 없다. 

4) 인덱스 2부터 aab가 있는지 확인한다. aab는 있다. 

5) 인덱스 2부터 aaba가 있는지 확인한다. 인덱스 2에는 aaba가 없다. 

5-1) 문자열 전체에서 aaba가 있는지 확인한다. aaba가 없다. 

6) aabc, aabd 등을 동일하게 확인한다. 


● 이 방식은 풀이방법 1과 비교할 때, 검색 횟수가 현저하게 줄어든다. 문자열이 랜덤하게 만들어진다는 가정하에 a는 여러번 나오겠지만, aa는 그 숫자가 적어질 것이고, aaa는 훨씬 적을 것이기 때문이다. 



   최상의 풀이  
 

● 답이 되는 풀이도 속도 문제는 있다. aaa가 있는지 확인을 첫번째 a의 인덱스 뒤로는 다 해야 하기 때문이다. 즉, 예를 들어, 주어진 문자열이 aac로 시가된다면, aab 가 있는지 aad가 있는지 문자열 전체를 검사하는 작업을 계속 반복하게 된다. 


● 이 검색 시간을 줄이기 위해서 각 알파벳에 대한 해시를 만들어 놓으면 검색 시간을 대폭 단축시킬 수 있다. 헤시 인덱스를 한단어로 만들어도 되고 두 단어로 만들어도 된다. 두 단어 이상으로 만들면 오히려 효율이 떨어질 것으로 예상된다. 주어진 문자열이 일정길이 이상일 때만 헤시 테이블을 만드는 작업을 수행하는 식으로 프로그램을 완성하면 효율적인 검색이 가능하다. 


● 헤시테이블은 간단한 이중배열로 만들 수 있다. int hash[26][10] 정도로 만들어서, 각각의 알파벳의 10번째 나오는데까지 위치만 미리 기억해놔도 문제가 쉬워진다. 워스트케이시를 대응하기 위해서는 int hash[26][1000] 이 되어야 하는데 이는 메모리 낭비가 심하다.  또는 int hash2[26*26][10] 으로 만들수도 있는데 - (aa ~ zz) 이 경우 해시를 만드는데는 시간이 더 걸리겠지만, 검색 속도는 월등히 빨라질 수 있다. 



   예제 코드  
 

● 추후 업데이트할 예정이다.








'Exercise & Quizz > C' 카테고리의 다른 글

사전 순으로 단어 정렬하기  (0) 2014.07.19
빙고 게임 - 연속되는 숫자 찾기  (0) 2012.06.11
Posted by 지그프리드 지그프리드


※ 아 이건 문제가 좀 거지 같네요. Virtual 함수 쓰는 법 연습인 건 알겠지만, 문제 정의도 별로고... 실제 테스트 시나리오도 너무 부실하게 기술되어 있고... 좀더 문제가 이해하기 쉬웠으면 좋겠습니다. 

결국, 제 맘대로 해버렸다는... <iostream> 에서 cout으로 출력할 대, float 계산 결과의 소수점 맞추는 것도 마음에 안드네요. 이건 c의 stdio의 fprinf 같은 것 이용해야 깔끔합니다. 

● BankAcct.h
#ifndef __BACKACCT_H__
#define __BACKACCT_H__

#include <iostream>
#include <string>

class BankAcct
{
	protected:
		int money;

	public:
		BankAcct();
		~BankAcct();

		void deposit(int v_money);
		int withdraw(void);

		virtual float getInterest(void) = 0;
};
#endif




●BankAcct.cpp
#include "BankAcct.h"

BankAcct::BankAcct()
{
	/* do nothing */
}

BankAcct::~BankAcct()
{
	/* do nothing */
}

void BankAcct::deposit(int v_money)
{
	money += v_money;

	return;
}

int BankAcct::withdraw(void)
{
	float temp = money;

	money = 0;

	return temp;
}



●Accounts.h
#ifndef __ACCOUNTS_H__
#define __ACCOUNTS_H__

#include "BankAcct.h"

class SavingAcct:public BankAcct
{
	private:

	public:
		SavingAcct();
		~SavingAcct();
		virtual float getInterest(void);
};

class CheckingAcct:public BankAcct
{
	private:

	public:
		CheckingAcct();
		~CheckingAcct();
		float getInterest(void);
};
#endif



●Acounts.cpp
#include "Accounts.h"

SavingAcct::SavingAcct()
{
	money = 0;
}

SavingAcct::~SavingAcct()
{
	/* do nothing */
}

float SavingAcct::getInterest(void)
{
	return 0.09;
}

CheckingAcct::CheckingAcct()
{
	money = 0;
}

CheckingAcct::~CheckingAcct()
{
	/* do nothing */
}

float CheckingAcct::getInterest(void)
{
	/* do nothing */
	return 0.05;
}




●main.h
#include <iostream>
#include <iomanip>
#include <string>
#include "Accounts.h"

using namespace std;



●main.cpp
#include "main.h"

int main()
{
	float s_temp=0, c_temp = 0;

	/* Create acconts */
	SavingAcct S = SavingAcct();
	CheckingAcct C = CheckingAcct();

	/* Save some money */
	S.deposit(20000);
	C.deposit(15000);

	/* Calculate interest incomes */
	s_temp = S.withdraw() * S.getInterest();
	c_temp = C.withdraw() * C.getInterest();

	cout << "Saving Account Interest Incomes : expecting : " << setw(8) << setprecision(6) << s_temp << "\n";
	cout << "Checking Account Interest Incomes : expecting : " << setw(8) << setprecision(6) << c_temp << "\n";

	/* Save more money */
	S.deposit(s_temp + 20000);
	C.deposit(c_temp + 17000);

	/* Widthraw and Calculate total incomes */
	s_temp = S.withdraw() * (1 + S.getInterest());
	c_temp = C.withdraw() * (1 + C.getInterest());

	cout << "Saving Account Total Incomes : " << setw(8) << setprecision(6) << s_temp << "\n";
	cout << "Checking Account Total Incomes : " << setw(8) << setprecision(6) << c_temp << "\n";

	return 0;
}


 


Posted by 지그프리드 지그프리드
Student.h
#include <iostream>
#include <string>
using namespace std;

class Student
{
	protected:
		string name;		//이름
		string id;			//학번
		string major;		//전공
		unsigned int grade;	//학년
		unsigned int credit;//학점

	public:
		Student();
		~Student();	
};

Student::Student()
{
	/* Do nothing */
}

Student::~Student()
{
	/* Do nothing */
}
graduate.h
class Graduate:private Student
{
	private:
		string assistant;	//조교
		float scholarship;	// 장학금

	public:
		Graduate(string s_name, string s_id, string s_major, unsigned int i_grade, unsigned int i_credit, string s_assistant, float f_scholarship);
		~Graduate();
		void print(void);
};


Graduate::Graduate(string s_name, string s_id, string s_major, unsigned int i_grade, unsigned int i_credit, string s_assistant, float f_scholarship)
{
	name = s_name;
	id = s_id;
	major = s_major;
	grade = i_grade;
	credit = i_credit;
	assistant = s_assistant;
	scholarship = f_scholarship;
}

Graduate::~Graduate()
{
	/* Do nothing */
}

void Graduate::print(void)
{
	cout << "이름" << " : " << name << "\n";
	cout << "학번" << " : " << id << "\n";
	cout << "전공" << " : " << major << "\n";
	cout << "학년" << " : " << grade << "\n";
	cout << "이수학점" << " : " << credit << "\n";
	cout << "조교유형" << " : " << assistant << "\n";
	cout << "장학금비율" << " : " << scholarship << "\n";
}

UnderGraduate.h
class UnderGraduate:private Student
{
	private:
		string circle;	//동아리

	public:
		UnderGraduate(string s_name, string s_id, string s_major, unsigned int i_grade, unsigned int i_credit, string s_circle);
		~UnderGraduate();
		void print(void);
};


UnderGraduate::UnderGraduate(string s_name, string s_id, string s_major, unsigned int i_grade, unsigned int i_credit, string s_circle)
{
	name = s_name;
	id = s_id;
	major = s_major;
	grade = i_grade;
	credit = i_credit;
	circle = s_circle;
}

UnderGraduate::~UnderGraduate()
{
	/* Do nothing */
}

void UnderGraduate::print(void)
{
	cout << "이름" << " : " << name << "\n";
	cout << "학번" << " : " << id << "\n";
	cout << "전공" << " : " << major << "\n";
	cout << "학년" << " : " << grade << "\n";
	cout << "이수학점" << " : " << credit << "\n";
	cout << "동아리" << " : " << circle << "\n";
}

Main.cpp
#include "student.h"
#include "under_graduate.h"
#include "graduate.h"

int main()
{
	Graduate g("홍길동","20051111","컴퓨터공학과",4, 140,"연구조교", 0.5);

	UnderGraduate u("하길동","20011111","컴퓨터공학과",2, 80,"Visaul C++");

	g.print();
	cout<<"-------------------------"<<endl;
	u.print();

	return 0;
}

PS. VS2010 문제인지, 오랬만에 해서 뭔가 헛갈리는 건지 모르겠지만... Include 중복 문제가 있어서 이 코드는 좀 우습게 되었습니다. 참고만 하세요.
Posted by 지그프리드 지그프리드
  C++ 책을 졸업하고 몇년만에 다시 훝어보고 있습니다. 그동안의 짬밥이 헛된 것이 아니기를 바라며, 책의 내용에 대한 궁금증들에 대한 답을 스스로 해보려고 합니다. 우선은 Technical한 부분에 치중을 하겠지만, 중간에 재미있는 과제들이 보인다면 그에 대한 해답도 가끔 올라갈 것입니다. 

  사실, 과제 위주로 하고 싶은 마음도 크지만, 블로그에 소스코드를 보기좋게 올리는 것이 생각보다 쉽지 않아서 - Syntax highlighting이 제대로 지원되지 않아, 캡춰 후 이미지로 올려야 웹에서 보기 좋습니다 - 좀 고민이 되고 있습니다. 새로 PC를 산 뒤에 아직 빌드 환경을 깔지 않은 것이 두번째 이유 입니다. 귀찮다고 여기는건데, 영 좋지 않습니다. 

  퇴근 후 잠깐잠깐 할까 했으나, 이미 잘시간이 되어갑니다. 내일부터 할까요? 
Posted by 지그프리드 지그프리드

객체지향적으로 생각하라!
국내도서>컴퓨터/인터넷
저자 : 맷 와이스펠드(Matt Weisfeld) / 배선종역
출판 : 정보문화사 2009.05.07
상세보기

   Object Oriented Programing 을 공부하기 전에 필독할 만한 책  

  오늘날 프로그래밍의 주류언어로 자바(Java)가 각광을 받으면서, 대부분의 학교에서도 Java를 가르치고 있다. 자바와 C++을 공부하는데 있어서 C의 포인터 만큼이나 넘기 어려운 부분이 있다면, 객체지향(Object Oriented)의 개념을 이해하고, 설계에 적용하는 부분일 것이다. 어떠한 문제를 해결하기 위한 프로그래밍 방법은 수십가지가 있겠지만, 객체지향의 이념을 잘 살려서 우수한 설계와 구현을 하는 것은 결코 쉬운일이 아니다. 특히나 학부 레벨에서 관련된 내용을 배우기도 쉽지 않다. 대부분 과제에서도 죽지않고 돌아가는 프로그램을 짜기 급급한 수준이다. 

  이 책은 객체지향언어를 공부하기에 앞서 한번 완독할 만한 책이다. 내용이 어렵지 않으면서, 예제 코드도 적절하게, 충분히 있고, 개념 설명과 설계의 의도를 충실히 설명해 주고 있다. 최신 기술과 트렌드들을 다양하게 다루고 있고, 여러 언어의 차이와 특성에 대해서도 비교하여 설명해 주고 있다. 이만한 개념서를 찾아보기가 어렵다. 

  물론, 학부 수준 - 프로그래밍을 공부한지 1 ~ 2 학기 정도 - 된 학생의 입장에서는 모든 내용을 100% 소화하기는 어려울 것이다. 하지만, 이 책은 학기 시작 전에 읽고, 학기를 마친 뒤에 다시 한번 읽어봐도 좋을 만한 책이다. 수학 정석을 한 번 보고 버지리 않듯이, 이 책은 여러번 읽어도 좋을 만큼 내용이 다양하고, 새내기 프로그래머에게 주는 교훈들이 많이 들어있다. 

  충분히 읽어 내용을 이해한다면, 아니 이해하지 못해도 충분히 숙지해 둔다면, 후에 고급 개발자로 나아가는데 큰 도움이 될 만한 책이다. 강추한다. 

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

//============================================================================
//  제출일 : 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 지그프리드 지그프리드

//=========================================================
// 날짜 : 2005. 6. 18
// File : maze.h
//=========================================================

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


#define MAXX 13
#define MAXY 17

int maze[MAXX][MAXY] =
{
 {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
 {1,0,1,0,0,0,1,1,0,0,0,1,1,1,1,1,1},
 {1,1,0,0,0,1,1,0,1,1,1,0,0,1,1,1,1},
 {1,0,1,1,0,0,0,0,1,1,1,1,0,0,1,1,1},
 {1,1,1,0,1,1,1,1,0,1,1,0,1,1,0,0,1},
 {1,1,1,0,1,0,0,1,0,1,1,1,1,1,1,1,1},
 {1,0,0,1,1,0,1,1,1,0,1,0,0,1,0,1,1},
 {1,0,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1},
 {1,0,0,1,1,0,1,1,0,1,1,1,1,1,1,1,1},
 {1,1,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1},
 {1,0,0,1,1,1,1,1,0,0,0,1,1,1,1,0,1},
 {1,0,1,0,0,1,1,1,1,1,0,1,1,1,1,0,1},
 {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
};


int mark[MAXX][MAXY] =
{
 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
};
 
 //최종 경로 표시용
int good_way[MAXX][MAXY] =
{
 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
};


struct MovePosition
{
 int x;
 int y;
}  mp[8] = {
 {-1,0},{-1,1},
 {0,1},{1,1},
 {1,0},{1,-1},
 {0,-1},{-1,-1}
};


class RAT;
class ListofStack;


class Node
{
 private:
  int RatPositionX;
  int RatPositionY;
  int RatDirection;
  Node *next;

 public:
  friend class ListofStack; //프렌드 선언으로 코드가 간단해진다
  friend class RAT;
  Node();
  Node(int X, int Y, int D);
  ~Node();
};

Node::Node()
{
 // 변수 초기화
 RatPositionX = -1;
 RatPositionY = -1;
 RatDirection = -1;
 next = NULL;
}

Node::Node(int X, int Y, int D)
{
 RatPositionX = X;
 RatPositionY = Y;
 RatDirection = D;
 next = NULL;
}

Node::~Node()
{ /* Do nothing */ }


class ListofStack
{
 private:
  Node *top;

 public:
  friend class RAT;
  ListofStack();
  ~ListofStack();
  Node* pop();
  Node* get_last();
  void push(Node *input_node);
  bool IsEmpty();
};

ListofStack::ListofStack()
{
 top = new Node(); //더미 노드
 top->next = NULL;
}

ListofStack::~ListofStack()
{ /* Do nothing */ }

Node* ListofStack::pop()
{
 Node *temp;
 Node *here;
 Node *before;

 if (top -> next)
 {
  before = top;
  here = top->next;
  while(here->next)
  {
   before = before ->next;
   here = here->next;
  }

  temp = here;
  before->next = NULL;
 }
 else
 {
  cout << "The stack is EMPTY\n";
  temp = NULL;
 }

 return temp;
}

Node* ListofStack::get_last()
{
 Node *temp;
 Node *here;
 Node *before;

 if (top -> next)
 {
  before = top;
  here = top->next;
  while(here->next)
  {
   before = before ->next;
   here = here->next;
  }

  temp = here;
 }
 else
 {
  cout << "The stack is EMPTY\n";
  temp = NULL;
 }
 return temp;
}


void ListofStack::push(Node *input_node)
{
 Node *here;
 Node *temp;

 temp = new Node(input_node->RatPositionX, input_node->RatPositionY, input_node->RatDirection);
 here = top;
 while(here->next)
  here = here->next;

 here->next = temp;

}


bool ListofStack::IsEmpty()
{
 if (top->next)
  return false;
 else
  return true;
}

class RAT
{
 private:
  ListofStack path;
  Node *next_move;
  char buf[80]; //input buffer

 public:
  RAT();
  ~RAT();
  int find_way();
  void display_maze(void);
  void display_mark(void);
};

RAT::RAT()
{
 //initialization
 Node *first_one = new Node(0, 0, -1);
 path.push(first_one);
 
}

RAT::~RAT()
{ /*do nothing */ }


int RAT::find_way()   //길찾기 : 실질적 메인함수
{
 Node *current_position;
 int p_i, p_j, p_d;
 p_d = -1;
 bool poped = true;
 
 while (!path.IsEmpty()) //스택이 비면 길찾기 실패
 {
  display_mark();
  gets(buf);

  if (poped) // 막힌 길을 다시 찾아가는 중이라면
  {
   current_position = path.pop();
   p_d = -1;
  }
  else  //처음 가는 길이라면
  {
   current_position = path.get_last();
   p_d = -1;
  }

  while(p_d < 8)
  {
   //current_position->RatDirection++;
   p_d++; //다음 방향을 탐색
   
   //calculate next position
   p_i = current_position->RatPositionX + mp[p_d].x;
   p_j = current_position->RatPositionY + mp[p_d].y;
   
   //미궁을 벗어나는 경우
   if (p_i < 0 || p_j < 0)
   {
    //Do nothing
   }
   //출구를 찾은 경우
   else if (p_i == 11 && p_j == 15)
   {
    cout <<"Success : I find the right way ^-^ \n";
    mark[p_i][p_j] = 1;
    next_move = new Node();
    next_move->RatPositionX = p_i;
    next_move->RatPositionY = p_j;
    next_move->RatDirection = p_d;
    path.push(next_move);
    return 1;
   }
   //처음 가는 길인 경우
   else if (maze[p_i][p_j] == 0 && mark[p_i][p_j] == 0)
   {
    mark[p_i][p_j] = 1;
    next_move = new Node();
    next_move->RatPositionX = p_i;
    next_move->RatPositionY = p_j;
    next_move->RatDirection = p_d;
    path.push(next_move);
    poped = false;
    break;
   
   }
   //8방향을 모두 탐색한 경우
   else if (p_d == 8)
    poped = true;
  }

 }
 
 //길찾기에 실패하여 빠져나온 경우
 cout << "No way out!!!\n";
 exit(0);
 
 return 0;
}

void RAT::display_maze(void) //최종 경로 표시
{
 int loop, loop2;
 Node *temp;
 while(!path.IsEmpty()) //올바른 길을 표시
 {
  temp = path.pop();
  good_way[temp->RatPositionX][temp->RatPositionY] = 1;
 }

 for (loop = 0; loop < MAXX ; loop ++)
 {
  for (loop2 = 0; loop2 < MAXY; loop2++)
  {
   if (good_way[loop][loop2])
    cout << good_way[loop][loop2];
   else
    cout << " ";
  }
  cout << endl;
 }
} //End of display_maze

void RAT::display_mark(void) //길을 찾는 과정에서의 경로 표시
{
 int loop, loop2;
 system("cls");

 for (loop = 0; loop < MAXX ; loop ++)
 {
  for (loop2 = 0; loop2 < MAXY; loop2++)
  {
   cout << mark[loop][loop2];
  }
  cout << endl;
 }
} //End of display_mark



//=========================================================
// 날짜 : 2005. 6. 18
// File : maze.cpp
//=========================================================


#include "Maze.h"

int move(void);

//Global Variables
ListofStack path; //전체 프로젝트를 관리하는 클래스

int main()
{
 
 RAT rat;
 if (rat.find_way())   //길찾기에 성공하면
  rat.display_maze();  //정확한 길을 단번에 보여준다.

 return 0;
} //End of Main


Posted by 지그프리드 지그프리드
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Node
{
    int num;
    char data[80];
    struct Node *next;
} Node;

// 전역변수
Node head;


void add_node (int num, char *data)
{
    Node *here = &head;
    Node *temp;
    temp = malloc(sizeof (Node));
    temp->num = num; strcpy(temp->data, data); temp->next = NULL;

    while(here->next)
    {
        if (here->num <= temp->num)
        {
            if (!here->next)
            {
                here->next = temp;
                return;
            }
            else if (here->next->num > temp->num)
            {
                temp->next = here->next;
                here->next = temp;
                return;
            }   
        }
        here = here->next;
    }

    here->next = temp;
    return;
};

void delete_node (int index)
{
    Node *here = &head;
    Node *temp;
    while(here)
    {
        if (here->next->num == index)
        {
            temp = here->next;
            here->next = here->next->next;
            free(temp);
            return;
        }
        here = here->next;
    }
    return;
};

int display(void)
{
    int count = 1;
    Node *here = head.next;
    
    while(here)
    {
        printf ("%d : %d  \t%s\n", count, here->num, here->data);
        here = here->next;
        count++;
    }

    return count;
}

int main()
{
    int loop;
    int t_n;
    char t_d[80];
    head.next = NULL;
    head.num = -1;
    strcpy(head.data, "");

    for (loop = 0; loop < 5; loop++)
    {
        scanf("%d\n", &t_n);
        gets(t_d);
        add_node(t_n, t_d);
    }
    display();

    delete_node(3);
    delete_node(1);
    printf ("\n");

    display();

    return 0;
}

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/06   »
            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 : 313,389
Today : 12 Yesterday : 11