'프로그래밍 기초'에 해당되는 글 57건

  1. 2010.01.24 This 포인터
  2. 2010.01.04 객체지향이란?
  3. 2009.12.17 스케줄링 (라운드 로빈)
  4. 2009.12.17 병합정렬 & 퀵 정렬 비교 및 기수정렬
  5. 2009.12.16 연결리스트더미有
  6. 2009.12.16 퀵 정렬
  7. 2009.11.20 템플릿이란!?

This는 자기 자신을 가르키는 용도로 사용된다. 그래서 자기 참조 포인터라 한다.

class Member 
{

 int Test1;
 int Test2;
public:
 Member(int Test1, int Test2 )
 {
  this->Test1 = Test1;
  this->Test2 = Test2;
 }
 virtual ~Member();
 void View()
 {
  cout<<Test1 <<endl <<Test2<<endl;
 }
 

};
 

int main()
{
 Member M(1, 2);
 M.View();
 return 0;
}


Test1, Test2 은 매개 변수 와 클래스 멤버변수와 이름이 겹친다

하지만 매개변수는 지역변수이므로 그 안에서 멤버변수 Test에는 접근할 수 없다

방법은 this 포인터를 이용해서 해당 객체의 멤버변수를 직접 가르키면 된다


class Member 
{

public:
 
 Member * GetThis()
 {
  return this;
 }
 

};

int main()
{
 Member * p1 = new Member();
 cout<<"포인터 p1 " << p1<<endl;
 cout<<"p1 의 this " << p1->GetThis()<<endl;

 Member * p2 = new Member();
 cout<<"포인터 p2 " << p2<<endl;
 cout<<"p2 의 this " << p2->GetThis()<<endl;

 return 0;
}



'프로그래밍 기초 > C++' 카테고리의 다른 글

반올림함수 만들기  (0) 2010.05.11
가상함수테이블  (0) 2010.03.04
다형성  (0) 2010.03.04
템플릿이란!?  (0) 2009.11.20
Posted by 아몰라
객체란 사물이다.

실제세계에서 볼수 있는 모든 것들 예를 들어 사람, 컴퓨터, MP3 전부 객체가 될 수 있다.

각 객체는 객체마다 속성과 행동이 있다.  객체들끼리는 서로 철저하게 독립적이며  객체들끼리는 서로 연관을 가

질수도 있고 아닐 수도 있다. 이러한 간단한 특징을 가진것이 객체이다.


객체지향 개념은 하나의 사고방식이라고 할 수 있다. 다만 이 사고방식이 몇 가지의 기본적인 원리에 뿌리를 두고 있다

는 점이 중요하다. 아래에 객체지향을 이루는 몇가지 개념들을 적어보겠다.


추상화 - 객체를 모델링할때 자신이 필요로 하는 만큼의 속성과 오퍼레이션을 추출해내는 것이다.

상속 - 가전제품 클래스 (슈퍼클래스)
          세탁기, 냉장고, 전자레인지등 (서브클래스)

 가전제품 클래스는 전원 스위치, 전기 배선의 속성과 켜다, 끄다의 오퍼레이션을 가지고 있다. 따라서, "어떤것 이 가전 제품이다"라는 사실만 알면, "가전제품 클래스가 가진 속성과 오퍼레이션을 가지고 있구나"라고 바로 알아 챌 수 있는 것이다.

이러한 관계를 상속이라고한다.

다형성 - 동일한 이름의 오퍼레이션이라도 그 오퍼레이션이 일어나는 클래스에 따라 각기 다른 행동을 수행하도록 한다.
            (open - open door, open window, open account)

캡슐화 - 객체는 자신이 수행하는 모든 행동의 과정과 속성을 다른 객체와 외부 세계에 보이지 않도록 한다.(이래서 캡슐화를 정보 은닉이라고도 부른다.) 하지만, 모든 것을 숨긴다면 객체는 아무 의미가 없기때문에 다른 객체들에게 얼굴만을 보이게하고 인터페이스를 제공한다. 인터페이스 예를 들자면 TV객체같은경우는 TV본체에 조작 버튼과 리모콘이 해당된다.

연관 - 객체는 다른 객체와 연관 관계를 가질 수 있다. 연관은 여러 가지 형태로 이루어지며, 하나의 객체는 다중성에 의해 한 개 이상의 객체와 연관될 수 있다. 또 집합연관은 연관 관계의 일종이다. 집합체는 컴포넌트 집합으로 구성된다. 복합연관은 집합연관의 특별한 종류로서, 복합체에서 컴포넌트는 복합체의 일부로써만 존재할 수 있다.
Posted by 아몰라
  
- FCFS에서 짧은 프로세스가 피해보는 현상 완화방법
  : 시간을 정해놓고 프로세스가 일정 시간 이상을 넘어가는 순간 실행을 강제로 중단시킴
-프로세스 실행시간측정방법
  : 클럭(clock) 인터럽트(또는 타이머 인터럽트)
  : 클럭인터럽트는 일정간격으로 주기적으로 발생
-시간할당량(time slicing)기법이라고 함

 






- 시간할당량의 크기(q)가 라운드로빈
   :시간할당량이 너무 작다면  문맥교환 오버헤드 증가
   :시간할당량이 너무 크다면  FCFS와 비슷해짐
- 시간할당량이 얼마나 되어야 하는가?
   :프로세스가 사용자와 최소한 한번 이상 대화하기 충분하거나
   :프로세스 내의 어떤 함수 정도는 실행을 마칠 수 있는 충분한 길이


FCFS(선입선출 방식) 연습코드



void Scheduler::Install()  //프로세스 생성
{
 harddisk.push_back(new Process("A",20,4)); 
 harddisk.push_back(new Process("B",15,5));
 harddisk.push_back(new Process("C",18,3));
 harddisk.push_back(new Process("D",23,4));
}
void Scheduler::SimulationInit()
{
 miter seek = harddisk.begin(); //처음 프로세스 지정
 miter end = harddisk.end();  //마지막 프로세스 지정

 for( ; seek != end; ++seek)
 {
  readyqueue.push(*seek);  //큐에 프로세스 하나 삽입
  (*seek)->IdleToReady();  //삽입한 프로세스를  IdleToReady 로 보냄
 }
 
}

프로세스 클래스

class Process 
{
 char *pname;
 const int tjob; //전체 작업량
 const int cjob; //cpu점유시 수행 가능 최대 작업량
 int ntjob; //현재 남은 작업량
 int ncjob; //현재 cpu점유시 수행 가능 최대 작업량
public:
 Process(const char *_pname,int _tjob,int _cjob);
 virtual ~Process();
 void IdleToReady();
 int Running();
 void EndProgram();
private:
 void InitProcess(const char *_pname);
 
};




void Process::IdleToReady()
{
 ntjob = tjob; //총 작업량을 현재 작업량으로 바꿔놓고 레디상태로!
}


int Process::Running()
{
 ncjob = cjob; 

 while(ntjob!=0 && ncjob!=0) //총 작업량 또는 총 cpu 점유시 총 실행가능시간이 0이되면 프로세스 교체한다
 {
  eout<<pname;
  eout.TimeFlow(4);
  ncjob--;
  ntjob--;
 }
 eout<<endl;
 return ntjob;    //남은 총 작업량을 반환
}


스케쥴 클래스


void Scheduler::Install()  //프로세스 생성
{
 harddisk.push_back(new Process("A",20,4)); 
 harddisk.push_back(new Process("B",15,5));
 harddisk.push_back(new Process("C",18,3));
 harddisk.push_back(new Process("D",23,4));
}
void Scheduler::SimulationInit()
{
 miter seek = harddisk.begin(); //처음 프로세스 지정
 miter end = harddisk.end();  //마지막 프로세스 지정

 for( ; seek != end; ++seek)
 {
  readyqueue.push(*seek);  //큐에 프로세스 하나 삽입
  (*seek)->IdleToReady();  //삽입한 프로세스를  IdleToReady 로 보냄
 }
 
}



void Scheduler::Simulation()
{
 while(!readyqueue.empty())  //큐가 비면 끝낸다
 {
  Process * temp = readyqueue.front(); //큐에 맨앞에 있는 프로세스를 가르킨다.
  readyqueue.pop();      //위에서 가르킨 프로세스를 빼온다.

  if(temp->Running())      //운영체제가 빼온 프로세스를 실행시킨다.
  {
   readyqueue.push(temp);    //큐에 프로세스를 다시 삽입한다.
  }
 }
}


스케줄링 - 큐 대기시간이 적을수록 성능이 좋다!

'프로그래밍 기초 > 자료구조 & 알고리즘' 카테고리의 다른 글

지뢰찾기  (0) 2010.05.03
3n+1  (0) 2010.05.03
병합정렬 & 퀵 정렬 비교 및 기수정렬  (0) 2009.12.17
연결리스트더미有  (0) 2009.12.16
퀵 정렬  (0) 2009.12.16
Posted by 아몰라


병합 정렬

1. 분할!! 정렬이 안된 배열을 쪼갠다 [ 7, 5, 12, 18, 4, 9, 11] - 최소원소들이 될때까지 계속 병합정렬 호출

2. 병합!! 최소원소들을 합쳐가면서 병합시킨다.


퀵 정렬과 비교!

퀵 - 역순 , 적당히 정렬에서는 느리고 굉장히 어지러운 정렬에서는 효과를 발휘한다. 일반적으로 빠른 소트로 알려져있다.
     컴퓨터상에서는 평균보다 최악의 상황이 더 중요하다.

병합 - 실질적으로 빠른 정렬 ,  단점 : 메모리 사용량 ↑




count 정렬 

1

2

3

4

1

3

1

정렬전!


 

1

2

3

4

3개

1개

2개

1개

cnt =3

cnt =4

cnt =6

cnt =7

분석법을 이용해 표 작성

 

1

2

3

4

1

3

1

 

 

 

 

 

 

4

cnt--

1

2

3

4

1

3

1

 

 

 

 

 

3

4

cnt--
 

1

2

3

4

1

3

1

 

 

 

 

3

3

4

 cnt--

1

2

3

4

1

3

1

 

 

 

2

3

3

4

cnt--

1

2

3

4

1

3

1

 

 

1

2

3

3

4

cnt--

1

2

3

4

1

3

1

 

1

1

2

3

3

4

cnt--

1

2

3

4

1

3

1

1

1

1

2

3

3

4

cnt--

cnt==0 이 되고 정렬 끝  1 , 1, 1 ,2 ,3 ,3, 4




count
 카운트 소트를 이용한 radix sort(기수정렬)

121     121    121    121
753     753    753    275
275     473    473    473
473     275    275    753
      첫자리 두번째 세번째

'프로그래밍 기초 > 자료구조 & 알고리즘' 카테고리의 다른 글

지뢰찾기  (0) 2010.05.03
3n+1  (0) 2010.05.03
스케줄링 (라운드 로빈)  (0) 2009.12.17
연결리스트더미有  (0) 2009.12.16
퀵 정렬  (0) 2009.12.16
Posted by 아몰라

연결리스트


노드 - 데이터를 보관해준다!

head - 맨앞의 노드를 지칭
tail - 맨뒤의 노드를 지칭
head랑 tail은 위치정보만 가지고있다.(링크다!)

단일연결 - 어떠한 노드의 위치를 알수없다. (Stoker)
이중연결 - 어떠한 노드의 위치를 알수있다.


seek를 이용 seek<노드의값 이면 앞에 삽입하자!

Dummy 노드 있는게 더 좋다. 특정한 노드 사이에 저장이된다!


pushback - 맨 뒤에 보관한다.

1. in을 보관하는 노드 생성
2. tail 앞에 보관



Ehlist()                               //헤드랑 테일 초기화~
  {
   head = new EhNode();       //시작을 가르킬더미 생성
   tail = new EhNode();          //마지막을 가르킬 더미 생성
   head->af = tail;                
   tail->be = head;
   usage = 0;                      // 연결리스트의 개수를 알려준다
   
  }
  virtual ~Ehlist()
  {
   EhNode * ehnode = tail->be;  // 테일이 가르키는 노드의 옆에노드를 가르킨다.

   while(usage!=0)
   {
    tail->be = tail->be->be;       // 테일을 왼쪽왼쪽 가르키게 한다. 
    delete tail->be;                  // 테일 옆에 노드를 삭제
    usage--;
    
   }

   delete tail,head;
  }

  
  void push_back(T data)
  {
   EhNode * ehnode;
   ehnode = new EhNode(data);
   HangNode(ehnode, end().now); //노드를 넣을 데이터와 마지막 노드의 위치를 넘겨준다.
   usage++;

  }
  
  void insert(iterator at,T data)
  {
   EhNode * ehnode;
   ehnode = new EhNode(data);
   HangNode(ehnode, at.now);  //노드를 넣을 데이터와 선택위치를 넘겨준다.
   usage++;
  }

  
  void erase(iterator at)
  {
   EhNode * ehnode = at.now;
   ehnode->be->af = ehnode->af;
   ehnode->af->be = ehnode->be;
   usage--;
  }

'프로그래밍 기초 > 자료구조 & 알고리즘' 카테고리의 다른 글

지뢰찾기  (0) 2010.05.03
3n+1  (0) 2010.05.03
스케줄링 (라운드 로빈)  (0) 2009.12.17
병합정렬 & 퀵 정렬 비교 및 기수정렬  (0) 2009.12.17
퀵 정렬  (0) 2009.12.16
Posted by 아몰라


퀵 정렬

1. pivot을 선택한다.

2. pivot을 맨 앞(L)뒤(R)의 요소와 교환

3. pivot 보다 (L)에서 큰원소들을 찾는다.

4. pivot 보다 (R)에서 작은원소들을 찾는다.

5. 3~4에서 둘다 값을 찾으면 서로 값 교환한다.

6. L 과 R 이 만나게되면 pivot과 만나는 점을 교환하고 pivot을 확정한다.

7. pivot 왼쪽 quick sort - 원소 개수가 2개이상

   pivot 오른쪽 quick sort - 원소 개수가 2개이상

8. pivot이 다 확정되면 종료

'프로그래밍 기초 > 자료구조 & 알고리즘' 카테고리의 다른 글

지뢰찾기  (0) 2010.05.03
3n+1  (0) 2010.05.03
스케줄링 (라운드 로빈)  (0) 2009.12.17
병합정렬 & 퀵 정렬 비교 및 기수정렬  (0) 2009.12.17
연결리스트더미有  (0) 2009.12.16
Posted by 아몰라

//템플릿이란!!?? 함수를 템플릿화하면 자료형은 결정되지않는다! 자료형을 자유롭게!!!

////////////////////////////////////////////////////////////////////////////////////

#include <iostream>
using::std::endl;
using::std::cout;

template <typename T>   //템플릿은 모형자!

T Add(T a, T b)
{
 return a+b;
}

int main(void)
{
 cout<<Add(10,20)<<endl;  //한번 모형자로 펜을 잡고(함수를 시작한다) 도형을 그리기 시작하면 펜을 놓기전(함수종료)에는 다른 펜을 사용할수없다
 cout<<Add(1.1,2.2)<<endl; //펜을 바꾼다 ( 자료형을 바꾼다 )
 return 0;
}

*/


///////////////////////////////////////////////////////////////////////////////////////


//함수 템플릿!!

// "함수 템플릿" 이라고 부른다는 것은 템플릿임을 강조하는 것이다.(함수가 아니라는 뜻이 아니다).
// 함수이기 전에 템플릿의 정의해 해당된다는 것을 의미한다.

 


template <typename T1, typename T2> //이것은 한 함수에 펜을 2개 사용할수 있게 해준다!

void ShowData(T1 a, T2 b) 
{
 cout<<a<<endl;
 cout<<b<<endl;
}

int main(void)
{
 ShowData(1, 2);
 ShowData(3, 2.5);
 return 0;
}


////////////////////////////////////////////////////////////////////////////////////

//함수 템플릿 특수화 선언

 

#include <iostream>
using::std::endl;
using::std::cout;

template <typename T> //함수 템플릿 정의
int SizeOf(T a)
{
 return sizeof(a);
}
/*
                   다음과 같이 한 줄에 표현하는 것이 보통이다.

template<>    //함수 템플릿 특수화 선언       선언1:template<> int SizeOf(char *a)
                   선언2:template<> int SizeOf<>(char *a)
int SizeOf(char *a)  //전달 인자가 char *인 경우에는 이 함수를 호출  선언3:template<> int SizeOf<char*>(char *a)
{                   선언3의 형태가 가장 정확한 표현이고, 선언1과 2는 선언3을 줄여서 표현한
 return strlen(a);              형태이다. 그러므로 선언 3의 표현 방법도 기억하자!!!
}

*/
int main(void)
{
 int i=10;
 double e=7.7;
 char * str= "Good Morning!";

 cout<<SizeOf(i)<<endl;
 cout<<SizeOf(e)<<endl;
 cout<<SizeOf(str)<<endl;
 
 return 0;
}


////////////////////////////////////////////////////////////////////////////////////

 


template <typename T>
class Data      //클래스 템플릿도 선언과 정의를 분리하는 것이 가능하다.
{
 T data;

 public:

  Data(T d);
  void SetData(T d);
  T GetData();
};

template <typename T>
Data<T>::Data(T d)
{
 data = d;
}

template <typename T>
void Data<T>::SetData(T d) // Data<T> 이것은 T타입에 대해서 템플릿으로 정의되어 있는 "Data
{       // 클래스 템플릿"을 의미

       // Data::SetData 는 Data클래스의 멤버 함수를 정의하는 것이지
 data = d;    // "Data 클래스 템플릿"의 멤버 함수를 정의하는 것이 아니다.
}

template <typename T>
T Data<T>::GetData()
{
 return data;
}


////////////////////////////////////////////////////////////////////////////////////////


//스택 클래스의 템플릿화!!


template <typename T>
class Stack{
 private:
  int topidx;   // 마지막 입력된 위치의 인덱스
  T *stackPtr;  // 스택 포인터

 public:
  Stack(int s=10);
  ~Stack();
  void Push(const T& pushValue);
  T Pop();
};

template <typename T>
Stack<T>::Stack(int len)
{
 topIdx=-1;    // 스택 인덱스 초기화
 stackPtr=new T[len];
}

template <typename T>
Stack<T>::~Stack()
{
 delete[] stackPtr;
}

template <typename T>
void Stack<T>::Push(const T& pushValue)  // 스택에 데이터 입력
{
 stackPtr[++topIdx]=pushValue;
}

template <typename T>
T Stack<T>::Pop()    //스택에서 꺼냄
{
 return stackPtr[topIdx--];
}


int main()
{
 Stack<char> stack1(10);     // char형 데이터를 저장하기 위한 stack 객체를 생성!
 stack1.Push('A');
 stack2.Push('B');
 stack3.Push('C');

 for(int i=0; i<3; i++)
 {
  cout<<stack1.Pop()<<endl;
 }

 Stack<int> stack2(10);     // int형 데이터 저장을 위한 stack 객체를 생성!
 stack2.Push(10);
 stack2.Push(20);
 stack2.Push(30);

 for(int j=0; j<3; j++)
 {
  cout<<stack2.Pop()<<endl;
 }

 return 0;
}

// stack 클래스 처럼 템플릿화하면 , 하나의 자료형에 종속되지 않는다!
// 이런식으로 자주 사용되는 자료 구조와 알고림을 템플릿으로 정의해 놓으면, 여러모로 유용할 것이다!

 


///////////////////////////////////////////////////////////////////////////////////////////////////

//템플릿 함수 or 템플릿 클래스!!!


template <typename T>  //함수 템플릿 정의!
T Add(T a, T b)
{
 return a+b;
}

 

int main(void)
{
 cout<<Add(10,20)<<endl;    // 함수 템플릿의 T가 int로 해석되어서 호출되기를 바라고있다. 그러나 실제로는 컴파일러가 int형 함수를만든다. 그것을 호출한다.
 cout<<Add(1.1,2.2)<<endl;   // 위와 동일하고 Double형 함수를 만든다!
 cout<<Add(10,20)<<endl;    // 첫번째줄에서 만든 함수를 호출해온다!
 return 0;     

 // 이처럼 함수 템플릿을 기반으로 해서 만들어지는, 실제 호출이 가능한 함수들을 가리켜 템플릿 함수라고 부른다!
 // 또한 템플릿 함수가 생성되는 현상을 가리켜서 "함수 템플릿의 인스턴스화"라고 부른다!
}

'프로그래밍 기초 > C++' 카테고리의 다른 글

반올림함수 만들기  (0) 2010.05.11
가상함수테이블  (0) 2010.03.04
다형성  (0) 2010.03.04
This 포인터  (0) 2010.01.24
Posted by 아몰라