'C++프로그래밍'에 해당되는 글 45건

#define SWAP(x,y,t) ((t)=(x),(x)=(y),(y)=(t))

void bubble_sort(int* list,int n){
 int i,j,temp;
 for(i=n-1; i>0; i--){
  for(j=0; j<i; j++)
   if(list[j]>list[j+1])
    SWAP(list[j],list[j+1],temp);
 }
}
블로그 이미지

百見 이 不如一打 요 , 百打 가 不如一作 이다.

,
void insertion_sort(int* list,int n){
 int i,j,key;
 for(i=1; i<n; i++){
  key=list[i];
  for(j=i-1; j>=i && list[j]>key; j--)
   list[j+1]= list[j];
  list[j+1]=key;
 }
}
블로그 이미지

百見 이 不如一打 요 , 百打 가 不如一作 이다.

,

void shell_sort(int* list, int n){
 int i,gap;
 for(gap=n/2;gap>0;gap=gap/2){
  if((gap%2) == 0 ) gap++;
  for(i=0;i<gap;i++)
   insertion_sort(list,i,n-1,gap);
 }
}
void insertion_sort(int* list,int first,int last,int gap)
{
 int i,j,key;
 for(i=first+gap;i<=last;i=i+gap){
  key=list[i];
  for(j=i-gap;j>=first && key<list[j];j=j-gap)
   list[j+gap]=list[j];
  list[j+gap]=key;
 }
}


블로그 이미지

百見 이 不如一打 요 , 百打 가 不如一作 이다.

,

13장정리

C++프로그래밍/C++ 2007. 7. 29. 14:21

1. 기존의 예외처리 방식

int main(){
 int a,b;
 cout<<"두개의 숫자입력 :";
 cin>>a>>b;

 if(b==0) //예외상황이 발생을 한다면
  cout<<"오류"<<endl;
 else{
  cout<<"a/b의 몫 :"<<a/b<<endl;
  cout<<"a/g의 나머지 : "<<a%b<<endl;
 }
 
 return 0;
}


if문은 예외 처리 이외의 기능도 하기때문에 다른사람이 그 소스코드를 봤을때 분석하기가 힘들다.

2. C++ 예외처리 메커니즘
기본적인 예외 처리 메커니즘 (try,catch,throw)

try{
   //예외 발생 예상 지역
}
catch(처리되어야 할 예외의 종류){
   //예외를 처리하는 코드가 존재할 위치
}


catch블록은 항상 try 블록의 바로 뒤에 등장한다 try와 catch는 한문장으로 간주한다.
try블록 내에서 발생하는 예외 상황은 catch블록에 의해서 처리된다.

int main(){
 int a,b;
 cout<<"두개의 숫자입력:";
 cin>>a>>b;

 try{
  if(b==0)
   throw b;  // b를 가리켜 예외라고 한다
  cout<<"a/b의 몫 : "<<a/b<<endl;
  cout<<"a/b의 나머지 : "<<a%b<<endl;
 }
 catch(int exception){
  cout<<exception<<"입력."<<endl;
  cout<<"입력오류"<<endl;
 }


try블록에서 발생한 예외의 상황은 throw에 의해서 catch로 전달되어 처리된다.
전달이 되는 예의와 받아주는 변수의 자료형이 일치를 해야한다.

예외가 발생되면 try블록의 나머지 블록은 실행되지 않는다. 아래문장들은 실행이 되지 않고 catch의 블록 문장이 실행된후 종료된다.

3. 스택풀기
사용자 삽입 이미지

예외가 발생하였는데 그 예외를 처리해줄 try~catch문이 없다면 발생한 예외는 호출발생시킨 함수를 호출한 영역으로 전달된다.
----------------------------------------------------------------------------------------
사용자 삽입 이미지

위의 예제와 같은 예외의 처리방식은 스택에서 메모리가 해제 되는 방식과 같다하여 스택풀기
라고도 한다.
별..-_-;;

예외가 처리가 되지 않으면 stdlib 헤더 파일에 있는 abort함수가 호출되면서 프로그램은 종료된다

catch블록에 예외가 전달되는 방식
사용자 삽입 이미지


블로그 이미지

百見 이 不如一打 요 , 百打 가 不如一作 이다.

,

12장정리

C++프로그래밍/C++ 2007. 7. 28. 11:36
1. 템플릿(template)에 대한 이해
int add(int a, intb)
{
   return a+b;
}
위의 add함수를 템플릿으로 구현하면 다음과 같다
template <typename T> //typename T에 대해 다음에  정의하는
T add(T a, T b)                 //대상을 템플릿으로 선언한다.
{
   return a+b;
}


template <typename T> == template <class T>
같은 의미이다 그러나 과거에 주로 사용되던 방식이 후자이다.
T는 자료형을 결정짓지 않겠다는 의미로 사용된것이다.

#include <iostream>

using std::cout;
using std::endl;

template <typename T>
T Add(T a, T b){
 return a+b;
}

int main(){
 cout<<Add(10,20)<<endl;
 cout<<Add(1.1,2.2)<<endl;

 return 0;
}


첫번째 Add함수 호출시에는 전달되는 인자가 int형 데이터이다 .이런경우 템플릿으로 정의되어
있는 Add함수의 T는 int로 인식이 된다.
두번째 Add함수 호출시에는 double형이기때문에 double로 인식된다.

템플릿으로 정의된 함수의 자료형이 결정되는 시점은 인자가 전달되는 순간이다.

2. 함수 템플릿
둘이상의 타입에 대해 템플릿화 하기
template <typename T1,typename T2>  //함수 템플릿 정의
T1과T2라는 이름에 대해 다음에 정의하는 대상을 템플릿으로 선언한다. 라는 의미.

함수템플릿의 특수화
template <> //함수 템플릿의 특수화 선언

template <typename T>
int sizeOf(T a){
 return sizeof(a);
}
template<>
int sizeOf(char* a){
 return strlen(a);
}

int main(){
 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<> int sizeOf(char* a)
template<> int sizeOf<>(char* a)
template<> int sizeOf<char*>(char* a)
모두 같은의미 이므로 다 알아둘것.

클래스 템플릿
template <typename T>
class Data{
 T data;
public:
 Data(T d){
  data=d;
 }
 void SetData(T d){
  data=d;
 }
 T GetData(){
  return data;
 }
};


template 다음에 정의하는 대상을 T라는 이름에 대해서 템플릿화 하겠다.
클래스 템플릿의 개체를 생성할때는
Data dd(10); 이 아니라 Data<int> dd(10); 으로 해주어야 한다.
객체는 1)메모리공간 할당 2)생성자 호출의 순으로 생성이 되는데 Data dd(10)을 하면 T의 자료형
이 무엇인지 모르기 때문에 메모리 공간의 할당을 얼만큼 해줘야 하는지 모른다.그렇기때문에
객체를 생성할때 명시적으로 선언을 해주어야 한다. Data<int> dd(10);

클래스 템플릿의 선언과 정의 분리

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=d;
}
template <typename T>
T Data<T>::GetData(){
 return data;
}


Data<T>::Data(T d)
typename T로 정의된 템플릿의 생성자 및 멤버함수를 정의하는것이다.
Data::Data(T d) 와는 엄연히 다르다. 이것은 Data클래스의 정의이고
Data<T>::Data(T d)는 Data 클래스 템플릿의 정의이다.

4. 템플릿의 원리 이해
template <typename T> //typename T에 대해 다음에  정의하는
T add(T a, T b)                 //대상을 템플릿으로 선언한다.
{
   return a+b;
}

호출이 가능한 함수를 만들기 위한 하나의 틀이다. 템플릿은 컴파일러에 의해 처리가 된다.
템플릿을 기반으로 해서 만들어지는 실제 호출이가능한 함수를 가리켜 템플릿 함수라고 한다.
또한 템플릿 함수가 생성되는 현상을 함수 템플릿의 인스턴스화 라고 부른다.
사용자 삽입 이미지

<내가 돈주고 산 열혈강의 C++ ppt자료에서 캡춰>


템플릿을 처리해 주는 것은 컴파일러 이기 때문에 템플릿 클래스는 선언과 정의를 각각 다른 파일에 분리 시켜 놓을수 없다. 따라서 클래스 템플릿은 하나의 파일안에 선언과 정의가 함께 있어야 한다.
블로그 이미지

百見 이 不如一打 요 , 百打 가 不如一作 이다.

,

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

#define MAX_SIZE 10000
#define SWAP(x,y,t) ((t)=(x),(x)=(y),(y)=(t))

int list[MAX_SIZE];
int n;

void selection_sort(int* list,int n){
 int i,j,least,temp;
 for(i=0; i<n-1; i++){
  least = i;
  for(j=i+1; j<n; j++)
   if(list[j]<list[least]) least =j;
  SWAP(list[i],list[least],temp);
 }
}

void main(){
 int i;
 n = MAX_SIZE;
 for(i=0; i<n; i++)
  list[i] = rand()%n;

 selection_sort(list,n);
 for(i=0; i<n; i++)
  printf("%d\n",list[i]);
}

블로그 이미지

百見 이 不如一打 요 , 百打 가 不如一作 이다.

,