130822.13일차

|
헤더


#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <iostream>
#include <iomanip>




메인



#include "130822.h"




// Stack 구조

/*

#define MAX 3


class Stack

{

char data[MAX];

int top;

public:

void init(); // top을 0번쨰 스택으로 옮긴다. 데이터가 현재 없다.

void push( char ch );

char pop();


// 데이터가 넘으면 overflow

// 꺼낼 데이터가 없으면 underflow

};


void Stack::init() {

top = 0;

}


void Stack::push( char a ) {

if( top == MAX ) {

puts("overflow");

return;

} else {

data[top] = a;

top++;

}


char Stack::pop() {

if (top == 0 ) {

puts("underflow");

return NULL;

} else {

return data[ --top ];

//top--;

}

}




void main() 

{

Stack s;

s.init();

s.push('A');

s.push('B');

s.push('C');

s.push('D');


printf("%c\n",s.pop());

printf("%c\n",s.pop());

printf("%c\n",s.pop());

printf("%c\n",s.pop());

}


*/



// 복사 생성자와 멤버 동적할당

/*

class Person

{

char * name;

int age;

public:

Person( char * name = "no", int age = 0 );

Person( Person & m);

char * getName();

int getAge();

void disp();

~Person();

void operator = ( Person & m );

};


Person::Person( char * name, int age) {

this->name = new char[strlen(name)+1];

strcpy(this->name,name);

this->age = age;

}

Person::Person( Person & m ) {

this->name = new char[strlen(m.name)+1];

strcpy( this->name , m.name );

this->age = m.age;

}


char * Person::getName() {

return name;

}


int Person::getAge() {

return age;

}


void Person::disp() {

printf("주소 : %p\n",name);

}


Person::~Person(){

   delete name;

}


void Person::operator = ( Person & m ) {

this->name = new char[strlen(m.name)+1];

strcpy( this->name , m.name );

this->age = m.age;

}


void main() 

{


Person kim("김유신",30);

printf("이름 : %s\n",kim.getName());

printf("나이 : %d\n",kim.getAge());

kim.disp();


printf("\n");


Person lee(kim); // 복사 생성자

printf("이름 : %s\n",lee.getName());

printf("나이 : %d\n",lee.getAge());

lee.disp();


// 복사 생성자와 operator = 

// 객체 뒤에 연산자가 올때만 가능

printf("\n");

Person park = kim;

printf("이름 : %s\n",park.getName());

printf("나이 : %d\n",park.getAge());

park.disp();


printf("\n");


Person hong;

hong = kim; // 이건또 안됨. Person hong에서 소멸

// operator = 으로 호출. 주소 복사

printf("이름 : %s\n",hong.getName());

printf("나이 : %d\n",hong.getAge());

hong.disp();


}

*/



// friend


// const


// 포함객체


// (직접 보기)





/* ★★★ 상속 Inheritance


아버지의 것은 내 것

접근 지정자 / 생성자 / 소멸자는 상속할 수 없다.

재활용 / 재사용으로 시간과 비용을 단출할 수 있다.


CellPhone 전화 기능

char model[20]; 모델명

char tel[20]; 전화번호


CaPhone 전화 기능 + 카메라 기능

int pixel; 픽셀


Mp3Phone 전화 기능 + 카메라 기능 + Mp3 기능

int chord; 화음


 

*/


// ★★★★★ 전화

/*  

class CellPhone { // 전화 기능

private : // 자식이 직접 접근할때는 protected, 부모에게 부탁할때는 private으로 둬도 된다.

char model[20];

char tel[30];

public :

CellPhone( char * model = "no", char * tel = "no" );

char * getModel();

char * getTel();


};


CellPhone::CellPhone( char * model , char * tel ) {

strcpy( this->model,model );

strcpy( this->tel,tel );

}


char * CellPhone::getModel() {

return model;

}


char * CellPhone::getTel() {

return tel;

}





class CaPhone : public CellPhone { // 카메라 기능 + 전화 기능

private : 

int pixel;

public : 

CaPhone( char * model = "no", char * tel = "no" , int pixel = 0 );

int getPixel();

};


CaPhone::CaPhone( char * model , char * tel , int pixel ) : CellPhone( model, tel ) { // : CellPhone() 부모호출 

//strcpy( this->model,model ); // 카메라 기능만 하려면 CellPhone이 해야하는 일을 넣으면 안된다.

//strcpy( this->tel,tel );

this->pixel = pixel;

}


int CaPhone::getPixel() {

return pixel;

}


// 초기화는 각자처리한다. 

// 기능별로 따로 구현.

// 부모부터 먼저 호출함. ( 초기화 때문에 )

// 부모에 초기값 없이 자식에게만 주소값 있으면 오류남.

// 부모 생성자에 초기값있어야함.






class Mp3Phone : public CaPhone { // 전화 기능 + 카메라 기능 + mp3기능

private : 

int chord;

public : 

Mp3Phone( char * model = "no", char * tel = "no" , int pixel = 0, int chord = 0 );

int getChord();

};


Mp3Phone::Mp3Phone( char * model , char * tel , int pixel , int chord) : 

CaPhone( model, tel, pixel ) { 

this->chord = chord;

}


int Mp3Phone::getChord() {

return chord;

}






void main() {


//CellPhone cp("I-500","010-9491-5006");

//printf("모 델 명 : %s\n", cp.getModel() );

//printf("전화번호 : %s\n", cp.getTel() );


//CaPhone ca( "I-500","010-9491-5006",500 );

//printf("모 델 명 : %s\n", ca.getModel() );

//printf("전화번호 : %s\n", ca.getTel() );

//printf("화    소 : %d\n", ca.getPixel() );


Mp3Phone mp( "I-500","010-9491-5006",500,64 );

printf("모 델 명 : %s\n", mp.getModel() );

printf("전화번호 : %s\n", mp.getTel() );

printf("화    소 : %d\n", mp.getPixel() );

printf("화    음 : %d\n", mp.getChord() );


}


*/



// 상속 방식

// public / protected / private


/*

class AA

{

private :

int aa;

protected : 

int ab;

public : 

int ac;

};




class BB : protected AA

{

private :

int ba;

protected :

int bb;

public : 

int bc;

};



class CC : public BB

{

private :

int ca;

protected :

int cb;

public : 

int cc;

void disp();

};



void CC::disp()

{

//aa = 10;  // private 이라 접근 못함

ab = 20;

ac = 30;

//ba = 40;  // private 이라 접근 못함

bb = 50;

bc = 60;

ca = 70; 

cb = 80; 

cc = 90;

}




void main() {


CC t;

//t.ac = 10; // BB클래스가 상속받을때 protected로 상속 받기 때문에 막힘

// 상속을 private으로 바꾸면 내 자식은 부모에게 아예 못가고 나만 갈 수 있음

t.bc = 20;

t.cc = 30;


AA m;

m.ac=10;

}

*/





// 오버라이드

// 오버로드(다중정의) // 오버라이드(재정의)


/*

class Name // 이름 관리

{

char name[12];

public :

Name( char * name="no");

void dispName(); // 이름 출력

void disp(); // 이름 출력

};


Name::Name( char * name ) {

strcpy( this->name, name );

}

void Name::dispName() {

printf("이름 : %s\n", name );

}


void Name::disp() {

printf("이름 : %s\n", name );

}





class Year : public Name // 이름 / 나이 관리

{

int age;

public : 

Year( char * name="no", int age=0 );

void dispYear(); // 나이 출력

void disp(); // 나이 출력

};


Year::Year( char * name, int age ) : Name( name ) {

this->age = age;

}


void Year::dispYear() {

printf("나이 : %d\n", age );

}


void Year::disp() {

printf("나이 : %d\n", age );

}



class Body : public Year

{

double ki;

public : 

Body( char * name="no", int age=0, double ki=0 );

void dispBody(); // 키 출력

void disp(); // 키 출력

};


Body::Body( char * name, int age, double ki ) : Year( name, age ) {

this->ki = ki;

}


void Body::dispBody() {

printf("나이 : %.lf\n",ki );

}


void Body::disp() {

printf("나이 : %.lf\n",ki );

}




void main()

{

Body hong("홍길동",40,175.5);

hong.dispName();

hong.dispYear();

hong.dispBody();

hong.disp();

hong.Name::disp();

hong.Year::disp();

hong.Body::disp();


}


*/




class Shape {

protected : 

int a, b; // 밑면 높이 or 반지름

double area; // 넓이

public : 

void disp(); // 출력

};


void Shape::disp() {

printf("넓이 : %.2lf\n", area );

}






class Rect : public Shape {

public : 

void input(); // 밑변 높이 입력

void calc(); // 넓이 계산

//Rect( int a, int b );

};


void Rect::input() {

puts("사각형의 넓이" );

printf( "밑변 : " );

scanf( "%d", &a );

printf( "높이 : " );

scanf( "%d", &b );

}

void Rect::calc()  {

area = a * b;

}




class Tri : public Rect {

public : 

void input(); // 반지름 입력

void calc(); // 넓이 계산

};


void Tri::input()

{

puts("삼각형의 넓이" );

printf( "밑변 : " );

scanf( "%d", &a );

printf( "높이 : " );

scanf( "%d", &b );

}

void Tri::calc()

{

area = a * b / 2.0;

}





class Circle : public Tri {

public : 

void input(); // 반지름 입력

void calc(); // 넓이 계산

};


void Circle::input()

{

puts( "원의 넓이" );

printf( "반지름 : " );

scanf( "%d", &a );

}

void Circle::calc()

{

area = a * a * 3.14;

}





void main() {

// Circle 클래스 객체로 모든 넓이를 출력

Circle c;


c.Rect::input();

c.Rect::calc();

c.Rect::disp();


printf("\n");


c.Tri::input();

c.Tri::calc();

c.Tri::disp();


printf("\n");

c.input();

c.calc();

c.disp();


printf("\n");


//c.input();

//c.calc();

//c.disp();


}

저작자 표시 비영리 변경 금지
신고

'Study > C, C++' 카테고리의 다른 글

130826.15일차  (0) 2013.08.26
130823.14일차  (0) 2013.08.26
130822.13일차  (0) 2013.08.22
130821.12일차  (0) 2013.08.22
130820.11일차  (0) 2013.08.22
130819.10일차  (0) 2013.08.22
Trackback 0 And Comment 0

티스토리 툴바