Adapter Pattern (어댑터 패턴)

Adapters Pattern

 

정의 : class interface client에서 필요로 하는 다른 interface 변환한다. Adapter 이용하면 interface 호환성문제로 없는 class들을 연결해서 있다.




그림과 같이 Adapter 소스만 변경하여 Existing System Vender Class 연결해 준다.

 


1.    Class Adapter Pattern


A.    장점 : Adapter 전체를 다시 구현할 필요가 없다.


B.     단점 : 상속을 활용하기 때문에 유연성이 떨어진다.
(java
다중상속 -지원 X)


C.    Class Adapter에서는 다중 상속을 이용하기 때문에 JAVA에서는 사용할 없다 (간접적 다중상속 지원 à Interface 이용)

 

2.    Object Adapter Pattern


A.    장점 : Composition 사용하기 때문에 유연성이 뛰어나다.


B.     단점 : Adapter Class 대부분의 코드를 구현해야 하기 때문에 효율성이 떨어진다.

 


사용방법


1.    Client에서 Target Interface 사용하여 method 호출함으로써 adapter 요청을 한다.


2.    Adapter에서는 adapter interface 사용하여 요청을 adapter 대한 하나 이상의 메소드를 호출로 변환한다.


3.    Client에서는 호출 결과를 받긴 하지만 중간에 Adapter 역할이 있었는지 전혀 없다.



기존의 Duck interface

public interface Duck {

         public void quack();

         public void fly();

}

 

Duck interface implement하는 MallardDuck

public class MallardDuck implements Duck{
    @Override
    public void fly() {
     // TODO Auto-generated method stub
     System.out.println("Quack");
    }
 
    @Override
    public void quack() {
     // TODO Auto-generated method stub
     System.out.println("I'm flying");
    }
}

 

하지만 turkey 오고싶다. 그래서 interface 만들어준다.

public interface Turkey {
    public void gobble();
    public void fly();
}

 

, Duck interface 사용하기 위해 Adapter 사용한다.

public class TurkeyAdapter implements Duck{
    Turkey turkey;
     public TurkeyAdapter(Turkey turkey){
     this.turkey=turkey;
    }
     @Override
    public void quack() {
     turkey.gobble();
    }         
    @Override
    public void fly() {
     turkey.fly();
    }
}


 

Turkey interface implements 하는 WildTurkey

public class WildTurkey implements Turkey{
    @Override
    public void fly() {
     // TODO Auto-generated method stub
     System.out.println("Gobble gobble");
    }
    @Override
    public void gobble() {
     // TODO Auto-generated method stub
     System.out.println("I'm flying a short distance");
    }
}

 

Main 소스

public class DuckTestDrive {
    public static void main(String[] args) {
     MallardDuck duck = new MallardDuck();
     WildTurkey turkey = new WildTurkey();
     Duck turkeyAdapter = new TurkeyAdapter(turkey);
     
     System.out.println("The turkey says...");
     turkey.gobble();
     turkey.fly();
     System.out.println("The Duck says...");
     testDuck(duck);
     System.out.println("The TurkeyAdapter says...");
     testDuck(turkeyAdapter);
    }
    
    public static void testDuck(Duck duck){
     duck.quack();
     duck.fly();
    }
}

 

결과 화면

The turkey says...

I'm flying a short distance

Gobble gobble

The Duck says...

I'm flying

Quack

The TurkeyAdapter says...

I'm flying a short distance

Gobble gobble



UML



Command Pattern (커맨드 패턴)

Command Pattern

 

정의

command pattern을 이용하면 요구사항을 객체로 캡슐화 하여, 요구사항을 나중에 이용할 수 있도록 메소드 이름과 매개변수 등 요구사항에 필요한 정보를 집어넣을 수 있다. 요청내역을 큐에 저장하거나 로그를 기록할 수 있으며, 작업취소 기능도 있다.

 

구성

1.    Client : Client ConcreteCommand를 생성하고 Receiver를 설정한다.

2.    Receiver : 요구사항을 수행하기 위해 어떤 일을 처리하는 객체

3.    Invoker : 명령이 있으며 execute() 메소드를 호출하여 커맨드 객체에게 특정 작업을 수행하도록 요청

4.    Command : 모든 커맨드 객체가 구현할 Interface. Receiver에게 시킬 모든 명령은 execute()메소드를 호출함으로써 수행되며, Receiver에게 특정 작업을 처리하라는 지시를 내린다.

5.    ConcreteCommand : 특정 행동과 Receiverbind한다. Invoker에서 execute()메소드 호출을 통해 요청하고 ConcreteCommand 객체에서는 Receiver에 있는 메소드를 호출함으로써 작업을 처리한다.


 

구현방법

1.    기능Class(Receiver)들을 캡슐화 한다.

2.    기능Class를 외부에 작동할 수 있는 Command (interface or class)를 추상화 및 구현한다.

3.    기능실행class(Invoker) command 타입 객체로 구현한다.

4.    기능실행class(Invoker) setter method를 구현하여 Command 타입 object를 가져오도록 한다.

5.    Invoker Object, Receiver Object, Command 타입의 Receiver Objectparameter로 하는 Object들을 생성한다.

6.    Invoker Object에서 Setter method를 호출하여 해당 commandAction Object를 등록하고, invoker에서 Command execute할 수 있는 method를 호출한다.

 

특징

request부와 execute부를 분리하고, undo, 보관, log생성이 가능하다.

장점

Receiver Command만 추가하면 dynamic하게 object 호출이 가능하다.

단점

Object 구성부가 추가되면 abstract부분부터 수정해야 한다.


 

Client 소스

public class RemoteLoader {

         public static void main(String[] args) {

                 RemoteControl remoteControl = new RemoteControl();

                 CeilingFan ceilingFan = new CeilingFan("Living Room");

                 CeilingFanHighCommand ceilingFanHigh = new CeilingFanHighCommand(ceilingFan);

                 CeilingFanOffCommand ceilingFanOff = new CeilingFanOffCommand(ceilingFan);

                 remoteControl.setCommand(2, ceilingFanHigh, ceilingFanOff);

                 System.out.println(remoteControl);

                 remoteControl.onButtonWasPushed(0);

                 remoteControl.offButtonWasPushed(0);

                 remoteControl.undoButtonWasPushed();

                 remoteControl.onButtonWasPushed(2);

                 remoteControl.offButtonWasPushed(2);

                 remoteControl.undoButtonWasPushed();

         }

}


Receiver 소스

/**
 * Receiver (천장의 FAN 작동시킨다)
 */
public class CeilingFan {
         public static final int HIGH=3;
         public static final int MEDIUM=2;
         public static final int LOW=1;
         public static final int OFF=0;
         String location;
         int speed;
         public CeilingFan(String location) {
                 // TODO Auto-generated constructor stub
                 this.location=location;
                 speed=OFF;
         }
         public void high(){
                 speed = HIGH;
         }
         public void medium(){
                 speed = MEDIUM;
         }
         public void low(){
                 speed = LOW;
         }
         public void off(){
                 speed = OFF;
         }
         public int getSpeed(){
                 return speed;
         }
}


 

Invoker

/**
 * Invoker
 */
public class RemoteControl {
         Command[] onCommands;
         Command[] offCommands;
         Command undoCommand;
         public RemoteControl() {
                 // TODO Auto-generated constructor stub
                 onCommands = new Command[7];
                 offCommands = new Command[7];
 
                 Command noCommand = new NoCommand();
                 for(int i=0; i<7; i++){
                          onCommands[i] = noCommand;
                          offCommands[i] = noCommand;
                 }
                 undoCommand = noCommand;
         }
         /**
          * @param slot
          * @param onCommand
          * @param offCommand
          * 리모컨의  slot command 넣는다.
          */
         public void setCommand(int slot, Command onCommand, Command offCommand) {
                 onCommands[slot] = onCommand;
                 offCommands[slot] = offCommand;
         }
         /**
          * @param slot
          * slot ON button 눌리면  slot OnCommand execute()메소드가 호출된다.
          */
         public void onButtonWasPushed(int slot) {
                 onCommands[slot].execute();
                 undoCommand = onCommands[slot];
         }
         public void offButtonWasPushed(int slot) {
                 offCommands[slot].execute();
                 undoCommand = offCommands[slot];
         }
         @Override
         public String toString() {
                 StringBuffer stringBuffer = new StringBuffer();
                 stringBuffer.append("\n-----Remote Control-----\n");
                 for(int i=0; i<onCommands.length; i++){
                          stringBuffer.append("[slot " + i + "] " + onCommands[i].getClass().getName()+"\n");
                 }
                 return stringBuffer.toString();
         }
         public void undoButtonWasPushed() {
                 // TODO Auto-generated method stub
                 undoCommand.undo();
         }
}


Command 소스 (fan의 속도를 높임)

/**
 *  class fan 속도를 높이고, Receiver CeilingFan 사이를 bind한다.
 */
public class CeilingFanHighCommand implements Command{
         CeilingFan ceilingFan;
         int prevSpeed;
 
         public CeilingFanHighCommand(CeilingFan ceilingFan) {
                 // TODO Auto-generated constructor stub
                 this.ceilingFan=ceilingFan;
         }
         
         /* 
          * Invoker에서 execute 호출하면 fan 속도를 높인다.
          * unDo 구현하기 위해 prevSpeed 속도 값을 저장해 둔다.
          */
         @Override
         public void execute() {
                 // TODO Auto-generated method stub
                 prevSpeed = ceilingFan.getSpeed();
                 ceilingFan.high();
         }
         
         /* 
          * prevSpeed 기준으로 speed 설정한다.
          */
         @Override
         public void undo() {
                 // TODO Auto-generated method stub
                 if(prevSpeed == CeilingFan.HIGH){
                          ceilingFan.high();
                 }else if (prevSpeed == CeilingFan.MEDIUM){
                          ceilingFan.medium();
                 }else if (prevSpeed == CeilingFan.LOW){
                          ceilingFan.low();
                 }else if (prevSpeed == CeilingFan.OFF){
                          ceilingFan.off();
                 }
         }
}


 

Command소스 (Fan의 속도를 설정)

public class CeilingFanOffCommand implements Command{
         CeilingFan ceilingFan;
         int prevSpeed;
 
         public CeilingFanOffCommand(CeilingFan ceilingFan) {
                 // TODO Auto-generated constructor stub
                 this.ceilingFan = ceilingFan;
         }
 
         @Override
         public void execute() {
                 // TODO Auto-generated method stub
                 prevSpeed = ceilingFan.getSpeed();
                 ceilingFan.off();
         }
 
         @Override
         public void undo() {
                 // TODO Auto-generated method stub
                 if(prevSpeed == CeilingFan.HIGH){
                          ceilingFan.high();
                 }else if(prevSpeed==CeilingFan.MEDIUM){
                          ceilingFan.medium();
                 }else if(prevSpeed==CeilingFan.LOW){
                          ceilingFan.low();
                 }else if(prevSpeed==CeilingFan.OFF){
                          ceilingFan.off();
                 }
         }
}

 

Command

/**
 *  class null object이다.
 * return object 없어도 client에서 null 처리하지 않아도
 * 되게   사용한다.
 */
public class NoCommand implements Command{
         @Override
         public void execute() {
                 // TODO Auto-generated method stub
 
         }
         @Override
         public void undo() {
                 // TODO Auto-generated method stub
 
         }
 
}


Interface

/**
 * 모든 command에서 구현해야 하는 interface이다.
 * 모든 command execute method 통해서 호출되며,
 *  method에서는 receiver 특정 작업을 처리하게 한다.
 */
public interface Command {
         public void execute();
         public void undo();
}

 


구현


흑백돌 옮기기 문제

문제


To solve the swapping puzzle, use only two types of moves. Move one stone into the empty hole or jump one stone over one stone of the opposite color (into the empty hole)

You may not back up, and you may not jump over two stones.


/*Visual Studio 2015*/
/*C++*/

#include<iostream>  
#pragma warning(disable:4996) //scanf warning 해제
using namespace std;
#define MAX 180
int n = 3, idx;
int res[MAX];//움직인 돌의 위치를 저장할 배열
char state[MAX];//현재 돌의 배열상태를 나타낼 배열
void init()//초기화
{
	idx = 1;//몇번 움직였는지 카운트 할 인덱스
	for (int i = 1; i <= n; i++)//1~n번째 돌은 흰색
		state[i] = 'W';
	state[n + 1] = ' ';//n+1번째는 빈칸
	for (int i = n + 2; i <= 2 * n + 1; i++)//n+2번째 부터 2n+1까지 검은돌
		state[i] = 'B';
}
void swap(int &x, int &y)//돌의 위치를 바꾸는 함수
{
	int t;
	t = x;
	x = y;
	y = t;
}

void sum_show()//움직인 돌의 위치를 보여주는 함수
{//총 20개가 넘으면 개행하도록 함
	int sum = 0;
	for (int i = 1; i <= n*(n + 2); i++)
	{
		if (sum % 20 == 0)
			printf("%d", res[i]);
		else printf(" %d", res[i]);
		sum++;
		if (sum % 20 == 0)
			printf("\n");
	}
	if (sum % 20)
		printf("\n");
}

void puzzle(int hole, int cnt)//hole은 빈칸의 위치, cnt는 움직인 횟수
{
	if (cnt == idx)
		idx++;
	if (hole - 2>0 && state[hole - 2] == 'W' && state[hole - 1] == 'B')
	{//빈칸의 왼쪽에 2개 이상의 돌이 있고, 빈칸에서 왼쪽으로 2칸은 W, 1칸은 B일때
		swap(state[hole - 2], state[hole]);//빈칸 왼쪽에서 두번째 자리에 위치한 돌을 빈칸으로 점프
		res[cnt] = hole - 2;//움직인 돌은 빈칸에서 왼쪽으로 두번째 있는 돌이므로, res에 해당 위치를 저장
		if (cnt == n*(n + 2) && hole - 2 == n + 1)//답이라면(cnt가 2^n+2n이고, 빈칸의 위치가 가운데일경우
		{
			sum_show();//결과를 보여주고
			return;//리턴
		}
		else if (cnt<n*(n + 2))//답보다 작다면
			puzzle(hole - 2, cnt + 1);//현재 빈칸의 위치는 원래 빈칸에서 왼쪽으로 두칸 이동하였다.
									//돌이 움직인 횟수가 1 증가인 상태로 재귀호출
		swap(state[hole - 2], state[hole]);
	}
	if (hole - 1>0 && state[hole - 1] == 'W')//빈칸의 왼쪽에 1개 이상의 돌이 있고, 바로 왼쪽의 돌은 W일때
	{
		swap(state[hole - 1], state[hole]);//왼쪽에 있는 돌을 빈칸으로 옮긴다.
		res[cnt] = hole - 1;//움직인 돌은 빈칸 왼쪽에 있던 돌이였으므로, res에 추가한다.
		if (cnt == n*(n + 2) && hole - 1 == n + 1)//답이라면 답을 보여주고 리턴
		{
			sum_show();
			return;
		}
		else if (cnt<n*(n + 2))//답보다 작다면
			puzzle(hole - 1, cnt + 1);//빈칸의 위치는 하나 밀렸고 이동횟수는 1 증가
		swap(state[hole - 1], state[hole]);
	}
	if (hole + 1 <= 2 * n + 1 && state[hole + 1] == 'B')
	{
		swap(state[hole + 1], state[hole]);
		res[cnt] = hole + 1;
		if (cnt == n*(n + 2) && hole + 1 == n + 1)
		{
			sum_show();
			return;
		}
		if (cnt<n*(n + 2))
			puzzle(hole + 1, cnt + 1);
		swap(state[hole + 1], state[hole]);
	}
	if (hole + 2 <= 2 * n + 1 && state[hole + 2] == 'B' && state[hole + 1] == 'W')
	{
		swap(state[hole + 2], state[hole]);
		res[cnt] = hole + 2;
		if (cnt == n*(n + 2) && hole + 2 == n + 1)
		{
			sum_show();
			return;
		}
		if (cnt<n*(n + 2))
			puzzle(hole + 2, cnt + 1);
		swap(state[hole + 2], state[hole]);
	}
}
void main()
{
	while (n != 0)//0을 입력받을때까지 루프를 돌림
	{
		printf("input n = ");
		scanf("%d", &n);//n을 입력받음
		init();
		puzzle(n + 1, 1);//인덱스를 1부터 시작하기 위해 n+1을 대입
		printf("result : %d\n\n", idx - 1);//1부터 시작하였기에 -1을 하여 올바른 결과가 나오도록 함
	}
}


'SW > Algorithm' 카테고리의 다른 글

카다네 알고리즘  (0) 2017.09.07

카다네 알고리즘

문제 : 정수로 이루어진 N x N 행렬이 있을때 사각형을 만들어 최대와 최소인 사각형을 만드는 알고리즘


출력 : 사각형의 좌측상단의 좌표, 우측하단의 좌표, 최댓값, 최솟값



/*Compiler : Visual Studio 2015 */
/*Language : C*/

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <limits.h>
#include <stdlib.h>

#pragma warning(disable:4996)//scanf 경고 해제
#define MAX 1000

double calc(double* arr, int* first, int* last, int arr_size);
void findroot(double *arr[], int SizeOfArray);

int main()
{
	int SizeOfArray;
	double **arr;
	scanf("%d\n", &SizeOfArray);//행과 열의 크기를 먼저 받음
	arr = (double**)malloc(sizeof(double *)*SizeOfArray);
	for (int i = 0; i < SizeOfArray; i++)
	{
		arr[i] = (double *)malloc(sizeof(double)*SizeOfArray);
	}//동적배열 생성

	for (int i = 0; i < SizeOfArray; i++)
	{
		for (int j = 0; j < SizeOfArray; j++)
		{
			scanf("%lf", &arr[i][j]);
		}
	}//동적으로 받은 array에 데이터를 대입

	findroot(arr, SizeOfArray);
	//대입이 끝난 arr을 findroot에 배열의 행과 열의 크기와 함께 대입
	
	for (int i = 0; i<SizeOfArray; i++) 
	{
		free(arr[i]);
	}

	free(arr);	//array 동적할당 해제
	getchar();	//실행 후 종료됨 방지
	return 0;
}


void findroot(double *arr[], int SizeOfArray)
{
	int R_Left, R_Right, R_Up, R_Down, left, right, i, first, last;
	const int size = SizeOfArray;
	double maxSum = LONG_MIN, minSum = LONG_MIN, PartSum[MAX], sum;
	printf("\n%d x %d MATRIX\n", SizeOfArray, SizeOfArray);//행렬 정보 출력

	//Finding Maxvalue
	for (left = 0; left < SizeOfArray; ++left)
	{
		memset(PartSum, 0, sizeof(PartSum));
		for (right = left; right < SizeOfArray; ++right)
		{
			//left부터 right까지의 부분합을 구함
			for (i = 0; i < SizeOfArray; ++i)
			{
				PartSum[i] = PartSum[i] + arr[i][right];
			}
			sum = calc(PartSum, &first, &last, SizeOfArray);
			//1차원에서의 최소를 구함
			if (sum > maxSum)
			{
				maxSum = sum;
				R_Left = left;
				R_Right = right;
				R_Up = first;
				R_Down = last;
			}
		}
	}

	printf("\n(%d, %d) (%d, %d)\n", R_Up + 1, R_Left + 1, R_Down + 1, R_Right + 1);
	//첫번째 요소를 1,1로 잡기 위해 1씩 더해서 출력해줌
	printf("MaxSum is: %lf\n", maxSum);
	//printing maxvalue

	//Findidng minvalue
	for (int i = 0; i < SizeOfArray; i++)
	{
		for (int k = 0; k < SizeOfArray; k++)
		{
			arr[i][k] = (-1)*arr[i][k];//음수는 양수로 양수는 음수로 바꿔준다.
		}
	}

	//위의 maxvalue를 찾는것과 같은 코드
	for (left = 0; left < SizeOfArray; ++left)
	{
		memset(PartSum, 0, sizeof(PartSum));
		for (right = left; right < SizeOfArray; ++right)
		{
			//left부터 right까지의 부분합을 구한다.
			for (i = 0; i < SizeOfArray; ++i)
			{
				PartSum[i] += arr[i][right];
			}
			sum = calc(PartSum, &first, &last, SizeOfArray);
			//1차원에서의 최대를 구한다.
			if (sum > minSum)
			{
				minSum = sum;
				R_Left = left;
				R_Right = right;
				R_Up = first;
				R_Down = last;
			}
		}
	}
	minSum = (-1)*minSum; // 양, 음수를 바꿔계산한 결과를 다시 바꿔준다.
	printf("\n(%d, %d) (%d, %d)\n", R_Up + 1, R_Left + 1, R_Down + 1, R_Right + 1);
	printf("MinSum is: %lf\n", minSum);
	//printing minvalue
}

//1차원에서의 maxvalue를 구한다.
double calc(double* arr, int* first, int* last, int arr_size)
{
	double sum = 0, maxSum = LONG_MIN;
	int start_index=0, p=0;
	*last = -1; // 음수일 경우를 검사한다.

	for (int i = 0; i < arr_size; ++i)
	{
		sum += arr[i];
		if (sum < 0)
		{
			sum = 0;
			start_index = i + 1;
		}
		else if (sum > maxSum)
		{
			maxSum = sum;
			*first = start_index;
			*last = i;
		}
	}
	//음수를 검사한다.
	if (*last != -1)
		return maxSum;
	
	//모두 음수일때
	maxSum = arr[0];
	*first = 0;
	*last = 0;

	//가장 큰 원소를 찾는다. 
	for (int i = 1; i < arr_size; i++)
	{
		if (arr[i] > maxSum)
		{
			maxSum = arr[i];
			*first = i;
			*last = i;
		}
	}
	//test 모두 양수일때 minvalue test
	for(int i = 0; i < arr_size; i++)
	{
		for (int j = 0; j < arr_size; j++)
		{
			if (arr[i] >= 0)
				p = 1;
		}
	}
	if (p == 0)
		maxSum = arr[0];
	//test exit
	return maxSum;
}

자세한 설명은 주석을 참조하면 될것같다..


질문은 댓글주세요!

'SW > Algorithm' 카테고리의 다른 글

흑백돌 옮기기 문제  (0) 2017.09.07

HTML5/CSS3/JavaScript 책 공개링크

저자분께서 자신의 블로그에 직접 올려두신 자료입니다.


공개자료로 올려두신거니 활용하시면 좋겠네요!

HTML5 CSS3 Javascript 책 공개링크.xlsx


구글과 네이버에 내 티스토리 블로그 노출시키기

어렵지 않으니 글로 쓰겠다!


구글과 네이버 모두 동일한 방식으로 진행한다.


1. 각 홈페이지의 웹마스터로 들어가 로그인한다(구글웹마스터, 네이버웹마스터)


2. html파일 등록이 아닌 태그 등록을 한다


3. 그러면 html 소스 한줄이 나올텐데 해당 소스를 자신의 티스토리 html소스의 <head> 안에 붙여넣은 후 저장한다.


4. 저장을 한후 다시 웹마스터 홈페이지에 들어가 확인을 한다.


5. RSS등록 탭을 찾는다.


6. 자신의 주소에 rss를 붙여서 등록한다.  (http://yuns-helloworld.tistory.com/rss)




Eclipse 유용한 플러그인

1.    ModelGoon

A.    경로 : http://www.modelgoon.org/update

B.     설명 : Class/Package Drag하면 Diagram 그려준다.

 


2.    Quick Search

A.    경로 : http://dist.springsource.com/release/TOOLS/update/e4.3/Core/Eclipse

B.     설명 : Ctrl + Shift + L 누르면 현재 소스에 필요한 함수들이 나온다.

 


3.    Insta Search

A.    경로 : http://marketplace.eclipse.org/content/more-clipboard

B.     설명 : 위의 Quick Search 비슷하지만 대소문자를 구분하지 않는다.

 


4.    CheckStylus

A.    경로 : http://checkstyle.sourceforge.net/

B.     설명 : Coding convention 검사해 준다.

 


5.    Code Analysis Plugin

A.    경로 : http://cap.xore.de

B.     설명 : Package, file들이 어떠한 구조로 구성된것인지 보여준다.

'SW > JAVA' 카테고리의 다른 글

백준알고리즘 8393번 java  (0) 2017.09.14
Eclipse 단축키 정리  (0) 2017.09.06
이클립스 설치된 플러그인 확인  (0) 2017.09.06
객체지향 프로그래밍 (Object-Orientd-Programming, OOP)  (0) 2017.09.05

Eclipse 단축키 정리


댓글 주시면 PDF 보내드릴게요!



이클립스 설치된 플러그인 확인



1. 아래의 quick access 텍스트박스에 'installation details' 를 입력한다.





2. 하나의 항목이 나오는데 그것을 누르면 아래와 같은 창이 나온다.

이 창에서 installation history 탭을 




3. 그러면 아래와 같은 화면이 나오는데 하단에 configuration contents 항목을 보면 설치된 플러그인 들을 확인할 수 있다.


'SW > JAVA' 카테고리의 다른 글

백준알고리즘 8393번 java  (0) 2017.09.14
Eclipse 유용한 플러그인  (0) 2017.09.06
Eclipse 단축키 정리  (0) 2017.09.06
객체지향 프로그래밍 (Object-Orientd-Programming, OOP)  (0) 2017.09.05

미분방정식 3가지 기법 비교

Modified Euler vs Runge Kutta vs Euler


소스코드

#include <stdio.h>
#include <math.h>

double f(double t, double y)
{
	return(y-(t*t)+1);
}
void meuler2()
{
	int i=1;
	float x, y, x1=0, y1=0.5, xf=2, y2, h=0.05;
	x = x1; 
	y = y1;
	printf("\nModified Euler\n");
	printf("%f\t%f\n", x, y);
	while (x<xf)
	{
		y2 = y + h *f(x, y);
		y1 = y2;
		y2 = y + (h / 2)*(f(x, y) + f(x + h, y2));
		y = y2;
		x = x + h;
		if((i%2)==0 && i<11)
		printf("%f\t%f\n", x, y);
		i++;
	}
}

float runge2()
{
	float x0 = 0, y0 = 0.5,	x = 2, h = 0.1;
	printf("\nRunge_Kutta\n");
	float n = (x - x0) / h;
	float k1, k2, k3, k4, k5;

	float y = y0;
	printf("%f\t%f\n", x0, y);
	for (int i = 1; i <= n; i++)
	{
		k1 = h*f(x0, y);
		k2 = h*f(x0 + 0.5*h, y + 0.5*k1);
		k3 = h*f(x0 + 0.5*h, y + 0.5*k2);
		k4 = h*f(x0 + h, y + k3);
		y = y + (1.0 / 6.0)*(k1 + 2 * k2 + 2 * k3 + k4);;
		x0 = x0 + h;
		if(x0<0.6)
			printf("%f\t%f\n", x0, y);
	}
	return y;
}

void euler()
{
	printf("\nEuler\n");
	float a=0, b=.5, x, y, h=0.025, t=0.5, k;
	int tmp=1, i=4;
	x = a;
	y = b;
	printf("%f\t%f\n", x, y);
	while (x <= t)
	{
		k = h*f(x, y);
		y = y + k;
		x = x + h;
		if (tmp == i)
		{
			printf("%f\t%f\n", x, y);
			i += 4;
		}
		tmp++;
	}
}
int main(void)
{
	euler();
	meuler2();
	runge2();
}


결과


'SW > Numerical analysis' 카테고리의 다른 글

Runge-Kutta vs Trapezoidal (Method)  (0) 2017.09.05

'분류 전체보기'에 해당되는 글 125건

1 ··· 4 5 6 7 8 9 10 ··· 13 →