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

/연산자가  /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 지그프리드 지그프리드

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

첫번째 프로젝트 - 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/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,135
Today : 24 Yesterday : 27