Tech & IT/프로그래밍

C에서 C++로 진화하는 단계 밟아보기

해피콧 2009. 12. 10. 09:45
'); }
'); }
.cpp파일로 

1단계 : 
#include <stdio.h>

typedef struct _sData
{
int num ;
char str[100] ;
} sData ;


void init(sData *pm, char *pstr) ;
void add(sData *pm, char *pstr) ;
void out(sData *pm) ;
void add_int(sData *pm, int num) ;
int number(sData *pm) ;
void array(sData *pm) ;
int check(sData *pm, char ch) ;
void sub(sData *pm, char ch) ;

void main()
{
sData data = { 0, "\0" } ;
sData obj = { 0, "\0" } ;
int k ;

printf("[ Data fun ]\n") ;
init(&data, "CArA") ;
add(&data, "a7A") ; out(&data) ;

k = number(&data) ; printf("k : [ %d ]\n", k) ;
array(&data) ; out(&data) ;
printf("[ Num : 701450 ]\n") ;
add_int(&data, 701450) ; out(&data) ;

k = check(&data, 'A') ; printf("k : [ %d ]\n", k) ;
sub(&data, 'A') ; out(&data) ;

printf("\n\n[ Obj fun ]\n") ;
init(&obj, "Ellias") ; out(&obj) ;
}


int check(sData *pm, char ch)
{
int u, d ;
for(u=0, d=0 ; pm->str[u] !='\0' ;u++)
if(pm->str[u] == ch)
d++ ;
return d ;
}

void sub(sData *pm, char ch)
{
int u, d ;
for(u=0, d=0 ; pm->str[u]!='\0' ; u++, d++)
((pm->str[u]==ch)?(d--):(pm->str[d]=pm->str[u])) ;
pm->str[d]='\0' ;
pm->num=d ;
}

void add_int(sData *pm, int num)
{
int n = num ;
while(num>10) {
int u ;
for(u=1 ; n>10 ; n=n/10, u = u*10) ;
pm->str[pm->num++] = n + '0' ;
num = num - n*u ;
if((!((u/10 <= num) && (num < u)))&&((num!=0)))
pm->str[pm->num++] = '0' ;
n = num ;
}
pm->str[pm->num++] = num + '0';
pm->str[pm->num] = '\0' ;
}

int number(sData *pm)
{
int u, d ;
for(u=0, d=0 ; u<pm->num ; u++)
if(('0'<=pm->str[u])&&(pm->str[u]<='9'))
d = d * 10 + (pm->str[u]-'0') ;
return d ;
}

void array(sData *pm)
{
char temp ;
int u ;
for(u=0 ; u<pm->num-1 ; u++) {
int d ;
for(d=1 ; d<pm->num-u ; d++)
if(pm->str[d-1] > pm->str[d]) {
temp = pm->str[d-1] ;
pm->str[d-1] = pm->str[d] ;
pm->str[d] = temp ;
}
}
}

void init(sData *pm, char *pstr)
{
int u ;
for(u=0 ; pstr[u]!='\0' ; pm->str[u]=pstr[u++]) ;
pm->str[u]='\0' ;
pm->num=u ;
}

void add(sData *pm, char *pstr)
{
int u, n ;
for(u=0, n=pm->num ; pstr[u]!='\0' ; u++, n++)
pm->str[n]=pstr[u] ;
pm->str[n]='\0' ;
pm->num=n ;
}

void out(sData *pm)
{
printf("[ Num ] : %d\t[ Str ] : %s\n", pm->num, pm->str) ;
}



2단계 : 
C++의 구조체에는 함수를 포함할 수 있으므로 함수를 구조체 안에 넣었음
그리고 scope연산자를 이용해서 함수들의 scope를 sData로 지정

void sData::init(char *pstr)을 compiler는 void sData::init(sData * this, char *pstr)로 인식한다.
m.init("ABC")를 실제로 compiler는 m.init(&m, "ABC")로 인식

#include <stdio.h>

typedef struct _sData
{
int num ;
char str[100] ;
void init(char *pstr) ;
void add(char *pstr) ;
void out() ;
void add_int(int num) ;
int number() ;
void array() ;
int check(char ch) ;
void sub(char ch) ;
} sData ;



void main()
{
sData m = { 0, "\0" } ;
sData n = { 0, "\0" } ;
int k ;

printf("[ Data fun ]\n") ;
m.init("CArA") ;
m.add("a7A") ; m.out() ;

k = m.number() ; printf("k : [ %d ]\n", k) ;
m.array() ; m.out() ;
printf("[ Num : 701450 ]\n") ;
m.add_int(701450) ; m.out() ;

k = m.check('A') ; printf("k : [ %d ]\n", k) ;
m.sub('A') ; m.out() ;

printf("\n\n[ Obj fun ]\n") ;
n.init("Ellias") ; n.out() ;
}


int sData::check(char ch)
{
int u, d ;
for(u=0, d=0 ; str[u] !='\0' ;u++)
if(str[u] == ch)
d++ ;
return d ;
}

void sData::sub(char ch)
{
int u, d ;
for(u=0, d=0 ; str[u]!='\0' ; u++, d++)
((str[u]==ch)?(d--):(str[d]=str[u])) ;
str[d]='\0' ;
num=d ;
}

void sData::add_int(int num)
{
int n = num ;
while(num>10) {
int u ;
for(u=1 ; n>10 ; n=n/10, u = u*10) ;
str[this->num++] = n + '0' ;
num = num - n*u ;
if((!((u/10 <= num) && (num < u)))&&((num!=0)))
str[this->num++] = '0' ;
n = num ;
}
str[this->num++] = num + '0';
str[this->num] = '\0' ;
}

int sData::number()
{
int u, d ;
for(u=0, d=0 ; u<num ; u++)
if(('0'<=str[u])&&(str[u]<='9'))
d = d * 10 + (str[u]-'0') ;
return d ;
}

void sData::array()
{
char temp ;
int u ;
for(u=0 ; u<num-1 ; u++) {
int d ;
for(d=1 ; d<num-u ; d++)
if(str[d-1] > str[d]) {
temp = str[d-1] ;
str[d-1] = str[d] ;
str[d] = temp ;
}
}
}

void sData::init(char *pstr)
{
int u ;
for(u=0 ; pstr[u]!='\0' ; str[u]=pstr[u++]) ;
str[u]='\0' ;
num=u ;
}

void sData::add(char *pstr)
{
int u, n ;
for(u=0, n=num ; pstr[u]!='\0' ; u++, n++)
str[n]=pstr[u] ;
str[n]='\0' ;
num=n ;
}

void sData::out()
{
printf("[ Num ] : %d\t[ Str ] : %s\n", num, str) ;
}


3단계 : 
기본성격이 public인 struct에서는 수납된 data의 접근을 막을 방법이 없음
data의 접근을 제한할 수 있는 class로 바꿔주겠음

#include <stdio.h>

class sData
{
protected : 
int num ;
char str[100] ;

public:
void init(char *pstr) ;
void add(char *pstr) ;
void out() ;
void add_int(int num) ;
int number() ;
void array() ;
int check(char ch) ;
void sub(char ch) ;
};

void main()
{
sData m;
sData n;
int k ;
printf("[ Data fun ]\n") ;
m.init("CArA") ;
m.add("a7A") ; m.out() ;
k = m.number() ; printf("k : [ %d ]\n", k) ;
m.array() ; m.out() ;
printf("[ Num : 701450 ]\n") ;
m.add_int(701450) ; m.out() ;

k = m.check('A') ; printf("k : [ %d ]\n", k) ;
m.sub('A') ; m.out() ;
printf("\n\n[ Obj fun ]\n") ;
n.init("Ellias") ; n.out() ;
}


4단계 : 
이제부터는 class설계 잘하면 된다 ㅎ
C++의 기능들 잘 활용해가면서 ㅎ