130821.12일차

|

헤더




#include <stdio.h>

#include <stdlib.h>

#include <conio.h>

#include <string.h>

#include <iostream>

#include <iomanip>





메인




#include "130821.h"




/*


class Score

{


private : // 구조체는 기본이 public이다 class는 기본이 private

// 멤버 변수

char name[10];

int kor;

public : // 함수는 public

//멤버 함수 선언

void setName( char * n );

void setKor( int k ) ;

char * getName();

int getKor();


}; // 클래스 구현부



void Score::setName( char * n ) {

if ( strlen(n)+1 > 10) {

puts("네 글자까지만 입력하세요.");

strcpy(name," ");

} else { 

strcpy(name,n);

}

}



void Score::setKor( int k ) {

if ( k < 0 || k > 100 ) {

puts("0~100 사이만 입력하세요.");

kor = 0;

} else {

kor = k;

}

}


char * Score::getName() {

return name;

}


int Score::getKor() {

return kor;

}


void main() 

{

Score kim; // 스택에 할당

kim.setName("홍길동");

kim.setKor(50);

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

printf("국어 : %d\n", kim.getKor() );

//kim.getName();

//kim.getKor();


printf("\n");


Score lee;

lee.setName("홍길동만세"); // 네글자까지만 입력하세요

lee.setKor(-50); // 0~100 사이만 입력하세요.

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

printf("국어 : %d\n", lee.getKor() );

//lee.getName();

//lee.getKor();


printf("\n");


// 객체 동적할당


Score * ap = new Score;

ap->setName("이순신");

ap->setKor( 30 );

printf("이름 : %s\n", ap->getName() );

printf("국어 : %d\n", ap->getKor() );


delete ap;


// 객체 배열

//Score m[3] = { {"홍길동",30} , {"이순신",40} , {"김유신",50} } // 안됨

Score m[3];

m[0].setName("홍길동");

m[0].setKor( 30 );



}


*/




/* 생성자 constructor / 소멸자 destructor


자동호출 된다.



생성자 - 객채 생성시 - 객체 초기화에 사용

소멸자 - 객체 소멸시 - 메모리 반환에 사용


생성자/소멸자는 클래스 명과 동일하다

소멸자 앞에는 ~를 붙인다.

결과형이 없다. // return을 안함


생성자가 없으면 default constructor가 실행된다.

소멸자는 오버로드 할 수 없다.

반드시 public 선언이고 const 할 수 없다.

상속 할 수 없다.




*/



/*


// 선언부

class Person {

private:

char * name;

int age;


public:

//Person(); // 디폴트 생성자

Person(char * n, int a); // 디폴트 생성자

~Person(); // 디폴트 소멸자

void setName( char * n);

void setAge( int a );

char * getName();

int getAge();

};


Person::Person(char * n=" "  , int a=0) {

puts("생성자");

name = new char[strlen(n)+1];

strcpy(name,n);

age=a;

}


//Person::Person() {

// puts("디폴트 생성자");

// strcpy(name,"");

// age=0;

//}


Person::~Person() {

puts("디폴트 소멸자");

}



void Person::setName( char * n ){

strcpy(name,n);

}


void Person::setAge( int a ) {

age=a;

}


char * Person::getName() {

return name;

}


int Person::getAge() {

return age;

}




// 메인

void main()

{

Person kim; // 생성자 호출

//kim.setName("홍길동");  // 생성자는 이런짓 하지말자고 있는것

//kim.setAge(30);

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

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


printf("\n");


Person lee("홍길동",30); 


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

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


printf("\n");


Person park("김유신",50); 


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

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


// park lee kim 순으로 반납됨.

// 3개 만들어서 소멸자도 3개 출력


printf("\n");


// 객체 동적 할당

Person * ap = new Person("대조영",50);

printf("이름:%s\n",ap->getName());

printf("나이:%d\n",ap->getAge());

// heap동적할당에 잡으면 소멸자가 없다.

// heap영역에 잡힌 데이터가 반납이 안됐다.

delete ap; // 동적할당은 꼭 반납


printf("\n");

// 객체 배열

Person m[3] = { Person("홍길동",30) , // 생성자를 호출함

Person("이순신",40) , 

Person("김유신",50) };


int i;

for (i=0 ; i<3 ; i++) {

printf("이름:%s\n",(m+i)->getName());

printf("나이:%d\n",(m+i)->getAge());

}

printf("\n");


// 객체 배열을 포인터로


Person * w[3] = { new Person("홍홍홍",60) , // 생성자를 호출함

 new Person("이이이",70) , 

 new Person("김김김",80) };

for (i=0 ; i<3 ; i++) {

printf("이름:%s\n",w[i]->getName());

printf("나이:%d\n",w[i]->getAge());

}

for (i=0 ; i<3 ; i++) {

delete w[i]; // 반납은 따로따로 해줘야함

}


}



*/




//생성자 소멸자 호출

//멤버함수나 생성자일때 매개변수는 변수*this로 주소를 받아준다.

//this를 쓰면 함수를 하나만 만들어서 사용하기 때문에 메모리 낭비를 줄여줌

//this를 안쓰면 쓰레기 값나온다.


/*


class Plus

{

private :

int a, b, res;


public : 

Plus( int a=0, int b=0 );

void disp();

~Plus();

} ;


Plus::Plus( int a , int b )

{

puts("생성자");

this->a = a;

this->b = b;

this->res = a+b;

}


Plus::~Plus()

{

puts("소멸자");


}



void Plus::disp()

{

printf("%d + %d = %d\n", this->a, this->b, this->res);


}



void sub();


void main()

{

puts("메인시작");


Plus m(5,2);

m.disp();


Plus w(3,7);

w.disp();



sub();


puts("메인 끝");

}



void sub(){


puts("sub 시작");

Plus z(10,20);

z.disp();


puts("sub 끝");

}


*/


// 연산자 멤버 함수 ( operator 함수 )



/*

// 선언부

class Oil

{

char name[12];

int price; 


public : 

Oil( char * name="no", int price=0 );

void set( char * name );

void set( int price );

void up( int price );

void down( int price );

void disp();

/// operator 함수

void operator  = ( char * name );

void operator  = ( int price );

void operator += ( int price );

void operator -= ( int price );

};







Oil::Oil( char * name , int price) {

strcpy(this->name,name);

this->price=price;

}


/// operator 함수

void Oil::set( char * name ) {

strcpy(this->name,name);

}

void Oil::set( int price ) {  // 오버로드

this->price=price;

}

void Oil::up( int price ) {

this->price+=price;

}

void Oil::down( int price ) {

this->price-=price;

}

void Oil::disp() {

printf("%s의 가격은 %d원 입니다.\n", name, price);

}


// class 함수


void Oil::operator = ( char * name ) {

strcpy(this->name, name);

}

void Oil::operator = ( int price ) {

this->price = price;

}


void Oil::operator += ( int price ) {

this->price += price;

}


void Oil::operator -= ( int price ) {

this->price -= price;

}



// 메인

void main()

{

Oil soil("휘발유",2000);

soil.disp();

soil = "경유"; // operator함수 사용

soil.disp();

soil = 1500;

soil.disp();

soil += 100;

soil.disp();

soil -= 50;

soil.disp();


printf("\n");


//Oil oil("휘발유",2000); // operator함수가 아님

//oil.disp();

//oil.set("경유");

//oil.disp();

//oil.set(1500);

//oil.disp();

//oil.up(100);

//oil.disp();

//oil.down(50);

//oil.disp();


}


*/



// 문자열 정리


/*

class String

{

char str[255];


public : 

String( char * str = "\0");

void disp();

String operator + ( char * str );

void operator = ( String & w ) ;

String operator + (String & w );

void operator += ( char * str );

};




String::String( char * str ) {

strcpy( this->str, str ); // ABC

}


void String::disp() {

printf("문자열 : %s\n", str );

}


String String::operator + ( char * str ) {

strcat(this->str,str); // DEF

return *this;

}


void String::operator = ( String & w ) {

strcpy(this->str,str); // DEF

}


String String::operator + (String & w ) {

strcat(this->str,w.str); // 주의

return *this; // GHI

}


void String::operator += ( char * str ) {

strcat(this->str,str); //JKL

}



void main() {

String m("ABC");

m.disp();


m = m + "DEF"; // ABCDEF

m.disp();


String z("GHI");

m = m + z;

m.disp();


m += "JKL";

m.disp();


}


*/


/*


class Score {

char * name;

int kor, eng, mat, tot; 

double avg;

public : 

Score( char * name, int kor, int eng, int mat);

~Score();

//void calc(); // 총점 평균 계산

char * getName();

int getKor();

int getEng();

int getMat();

//int getTot();

//double getAvg();

};


Score::Score( char * n="" , int kor=0 , int eng=0 , int mat=0) {

name = new char[strlen(n)+1];

strcpy(name,n);

this->kor=kor;

this->eng=eng;

this->mat=mat;

}


//void Score::calc( int tot, double avg ) {

// this->tot=kor+eng+mat;

// this->avg=(this->tot)/3.;

//

//}


char * Score::getName() {

return name;

}


int * Score::getKor() {

return kor;

}


int * Score::getEng() {

return eng;

}


int * Score::getMat() {

return mat;

}


//int * Score::getTot() {

// return tot;

//}

//

//double * Score::getAvg() {

// return avg;

//}


void main() {

// 객체 배열로 관리

// 출력 // 메인에서 출력

// 이름 국어 영어 수학 총점 평균

// 홍길동 00 00 00 00 00.00

// 김길동 00 00 00 00 00.00

// 이길동 00 00 00 00 00.00

// 박길동 00 00 00 00 00.00


Score * m[4] = { new Score("김태연",34,25,64) , // 생성자를 호출함

new Score("티파니",65,38,24) , 

new Score("최수영",45,62,85) , 

new Score("서주현",83,40,14) };

printf("이름\t국어\t영어\t수학\t총점\t평균\t");


for (int i=0 ; i<4 ; i++) {

printf("%s\t%d\t%d\t%d\t%d\t%.2lf\t",

m[i]->getName(),

m[i]->getKor(),

m[i]->getEng(),

m[i]->getMat() ); //,

//m[i]->getTot(),

//m[i]->getAvg() );

}

}


*/


class Score {

private:

char * name;

int kor;

int eng;

int mat;

int tot;

double avg;

public:

Score(char * n, int kor, int eng, int mat);

~Score();


void calc();

char * getName();

int getKor();

int getEng();

int getMat();

int getTot();

double getAvg();



};


Score::Score(char * n=" ", int kor=0, int eng=0, int mat=0) {

name = new char[strlen(n)+1];

strcpy(this->name,n);

this->kor=kor;

this->eng=eng;

this->mat=mat;

}

Score::~Score() {

delete name;

}



char * Score::getName() {

return this->name;

}


int Score::getKor() {

return this->kor;

}

int Score::getEng() {

return this->eng;

}

int Score::getMat() {

return this->mat;

}

void Score::calc() {

this->tot = this->kor + this->eng + this->mat;

this->avg = this->tot/3.;

}

int Score::getTot() {

return this->tot;

}

double Score::getAvg() {

return this->avg;

}




void main() {

// 객체 배열로 관리

// 출력 // 메인에서 출력

// 이름 국어 영어 수학 총점 평균

// 홍길동 00 00 00 00 00.00

// 김길동 00 00 00 00 00.00

// 이길동 00 00 00 00 00.00

// 박길동 00 00 00 00 00.00


Score * m[4] = { new Score("김태연",34,25,64) , // 생성자를 호출함

new Score("티파니",65,38,24) , 

new Score("최수영",45,62,85) , 

new Score("서주현",83,40,14) };

printf("이름\t국어\t영어\t수학\t총점\t평균\t\n");


for (int i=0 ; i<4 ; i++) {

m[i]->calc();

printf("%s\t%d\t%d\t%d\t%d\t%.2lf\t\n",

m[i]->getName(),

m[i]->getKor(),

m[i]->getEng(),

m[i]->getMat(), 

m[i]->getTot(),

m[i]->getAvg());

}


for (int i=0 ; i<4 ; i++) {

delete m[i];

}

}


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

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

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
130816.9일차  (0) 2013.08.19
Trackback 0 And Comment 0

티스토리 툴바