ㅎㅎ시험기간이라 그런지 요즘 학교 후배들이 생성자쪽에 대해서 많이 물어보더라구요...

그래서 한번 복습할겸 포스팅해보겠습니다,


#include <iostream>

using namespace std;

 

int main(){

        int a = 10; // C style

        int b(5); // C++ style

        cout << a << endl;

        cout << b << endl;

        return 0;

}

출력결과 :

10

5 


위 소스를 보게되면 변수 초기화 방법이 두가지가 있다는 것을 볼 수 있는데요 그렇다면 변수가 아닌 객체도 저 두가지 방식으로 초기화를 할 수 있을텐데요. 과연 가능한지 확인해보도록 하겠습니다.


#include <iostream>

using namespace std;


class A{

public:

        A(int _data) { data = _data; } // Constructor

        void getData() { cout << data << endl; }

private:

        int data;

};

int main(){

        A a(5);

        A aa = 5;

 

        a.getData();

        aa.getData();

        return 0;

}

출력결과:

5

5


결과는 모두 5를 출력하겠죠. 그렇기에 객체 또한 초기화 방법이 2가지가 있다는 것을 볼 수 있네요.. 하지만 위에서 A aa = 5; 는 컴파일을 하는 동시에 A aa(5); 로 변환이 이루어지는 과정이기 때문에 동 일하다고 볼수 없네요. 아래 소스를 한번 보도록 하겠습니다.


 #include <iostream>

#include <string>

using namespace std;

 

class A{

public:

        A(char* _data){ strcpy(data, _data); }

        void getData() { cout << data << endl; }

private:

        char data[100];

};

 

int main(){

        A a("Inha Univ.");

        A aa(a); // ?? char * 값이 아닌 객체를 넘겨받았는데 초기화가 되네요

 

        a.getData();

        aa.getData();

 

        return 0;

}

 

출력결과:

Inha Univ.

Inha Univ.


위 소스에서 보면 A 자료형을 받는 생성자 함수를 만들지 않았지만 자동으로 만들어졌다고 생각할 수 밖에 없는데 우리는 이런 자기 자신과 같은 형태의 객체를 인자로 받을 수 있는 생성자가 자동으로 만들어진것을 디폴트 복사 생성자라 합니다. 

자 여기서 복사생성자에 대해서 한번 정의를 해보도록 하겠습니다. 복사 생성자란 자기 자신과 같은 형태의 객체를 받는 것입니다. 

그렇다면 디폴트 복사 생성자라는것이 멤버 변수들을 복사하는 것일텐데 클래스마다 가지고있는 데이터들이 다르기 때문에 디폴트 생성자는 각 클래스마다 다른 형태로 바뀌어서 복사가 된다고 볼 수 있다. 

따라서 매우 편리해보이는 이 디폴트 생성자는 큰 문제점이 존재합니다


 

#include<iostream>

#include<string>

using namespace std;

 

class A{

private:

    char *name; // 값을 참조하는 방식으로..

    char *phone;

    int age;

public:

    A(char *_name, char* _phone, int _age){

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

        strcpy(name,_name);

        phone = new char[strlen(_phone)+1];

        strcpy(phone,_phone);

        age = _age;

    }

    void output(){

        cout<<name<<endl;

        cout<<phone<<endl;

        cout<<age<<endl;

    }

    void modify(char *val){

        strcpy(name,val);

    }

    ~A(){

        delete []name;

        delete []phone;

    }  // 동적할당을 해제

};

 

int main(){

    A *a = new A("Hahahia","010",21);

    A b(*a);

 

 

    a->output();

    a->modify("qwerty");

    b.output();

    delete a;

    b.output();

    return 0;

}

 

 



저렇게 에러메시지가 딱 나타나버렸네요.. 말그대로, 디폴트 복사 생성자는 직접 값을 복사하는것이 아니라 "참조"를 하고 있던거였네요 이를 얕은 복사라 하며, 객체가 실제로 데이터를 가지고 있는것이 아님을 알 수 있겠네요.. 그럼 얕은 복사를 알았으면, 깊은 복사를 해봐야겠죠?? ㅎㅎ아닌가.. 아무튼 위와같이 참조하는 방식이 아닌 복사를 구현하기위해서는 직접 복사생성자를 구현해야 하겠습니다. 

#include<iostream>

#include<string>

using namespace std;

 

class A{

private:

    char *name;

    char *phone;

    int age;

public:

    A(char *_name, char* _phone, int _age){

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

        strcpy(name,_name);

        phone = new char[strlen(_phone)+1];

        strcpy(phone,_phone);

        age = _age;

    }

    A(const A& Obj){

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

        strcpy(name,Obj.name);

        // private 접근가능하니 const 해둡시다

        phone = new char[strlen(Obj.phone)+1];

        strcpy(phone,Obj.phone);

       

        age = Obj.age;

    }

    void output(){

        cout<<name<<endl;

        cout<<phone<<endl;

        cout<<age<<endl;

    }

    void modify(char *val){

        strcpy(name,val);

    }

    ~A(){

        delete []name;

        delete []phone;

    }

};

 

int main(){

    A *a = new A("Hahahia","010-7549-2870",21);

    A b(*a);

    a->output();

    delete a;

    b.output();

}





 ㅎㅎ 참 쉽네영.. 이크 내번호 ㅋ



신고

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

C++ 복사생성자(생성자에 관한 이해 및 얕은,깊은 복사)  (0) 2012.10.20
Template Function(템플릿 함수)  (0) 2012.09.01
C++ 상속(inheritance)  (0) 2012.09.01
C++ 포함  (0) 2012.09.01
Operator Overloading(연산자 오버로딩)  (0) 2012.09.01
1주차  (0) 2011.06.27

Template Function

- 인수나 반환값의 형을 모호한 상태로 정의

- 호출하는 쪽에서 지정한 인수의 형에 맞춰 함수 내에서 사용하는 변수의 형을 바꿀 수 있다.



템플릿 사용을 안할 경우

=> 함수 오버로딩 기능을 이용(OOP, 다형성)하여 각각 형태에 따른 이름이 같지만 리턴형이 다른 함수를 각각 만들어줘야 합니다.

 

/* not use Template function

made by hahahia */

#include <iostream>

using namespace std;


int getMax(int a, int b){

        int buf;

 

        if(a > b) buf = a;

        else buf = b;

        return buf;

}

double getMax(double a, double b){

        double buf;

 

        if(a > b) buf = a;

        else buf = b;

        return buf;

}

int main(){

        int n1 = 1, n2 = 3, ret1;

        double r1 = 4.5, r2 = 3.5, ret2;

        ret1 = getMax(n1, n2); /* int */

        ret2 = getMax(r1, r2); /* double */

        cout << "ret1 : " << ret1 << endl;

        cout << "ret2 : " << ret2 << endl;

        return 0;

}


실행결과

ret1 : 3

ret2 : 4.5


하지만 템플릿 함수를 쓰는 경우 한번만 정의를 해두면 어느 형태가 오더라도 바로 함수의 기능을 수행할 수 있겠죠.


/* Template function

made by hahahia */

#include <iostream>

using namespace std;


template<class T>

T getMax(T a, T b){ /* getMax template */

        T buf;

        if(a < b) buf = b;

        else buf = a;

        return buf;

}

 

int main(){

        int n1 = 1, n2 = 3, ret1;

        double r1 = 4.5, r2 = 3.5, ret2;

        ret1 = getMax(n1, n2); /* int */

        ret2 = getMax(r1, r2); /* double */

        cout << "ret1 : " << ret1 << endl;

        cout << "ret2 : " << ret2 << endl;

        return 0;

}


실행결과

ret1 : 3

ret2 : 4.5

신고

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

C++ 복사생성자(생성자에 관한 이해 및 얕은,깊은 복사)  (0) 2012.10.20
Template Function(템플릿 함수)  (0) 2012.09.01
C++ 상속(inheritance)  (0) 2012.09.01
C++ 포함  (0) 2012.09.01
Operator Overloading(연산자 오버로딩)  (0) 2012.09.01
1주차  (0) 2011.06.27

상속(Inheritance)의 사전적 의미는 자식이 부모가 가진 모든 것을 물려 받는 것을 의미하는데 OOP의 상속도 기본적인 의미는 동일하다. 이미 정의되어 있는 클래스의 모든 특성을 물려 받아 새로운 클래스를 작성하는 기법을 상속이라고 한다. 흔히 상속은 이미 만들어진 클래스를 재활용하기 위한 기법으로 소개되며 재활용이 상속의 가장 큰 장점이기는 하지만 상속에 의해 부차적으로 발생하는 효과도 있다. 상속을 하는 목적 또는 상속에 의한 효과는 다음 세가지로 간략하게 요약할 수 있다.

 

① 기존의 클래스를 재활용한다. 가장 기본적인 효과이다.

② 공통되는 부분을 상위 클래스에 통합하여 반복을 제거하고 유지, 보수를 편리하게 한다.

③ 공동의 조상을 가지는 계층을 만듬으로써 객체의 집합에 다형성을 부여한다.

- 출처(http://www.winapi.co.kr)



지금 예제에서는 

circle 객체는 point 객체를 포함 하여, 중심 좌표를 가지며 figure 객체를 상속하고 있습니다. 즉 circle 객체는 figure의 모든 public, protect 멤버에 대해서 접근이 가능합니다(public 상속)

그중 protect는 상속받는 객체만이 public처럼 접근이 가능하지만, 외부에서 protect변수는 private처럼 접근이 불가능합니다. (circle이 figure을 상속받게 되는거겠죠)


/*

Class 상속 예제

made by hahahia

*/

 

#include <iostream>

#include <string>

using namespace std;

 

class point{ /* x,y 좌표를 나타내는 간단한 클래스 */

private:

    int x,y;

public:

    point(int _x,int _y): x(_x),y(_y) {}; /* C++ Style(= {x = _x; y = _y;} */

    int getX() const { return x; }

    int getY() const { return y; }

};

 

class figure{

private:

    string Name;

protected:

    string protect;

public:

    figure(string _Name){

        Name = _Name;

    }

    const string getName() const{

        return Name;

    }

};

 

class circle : public figure // <--  

{

private:

    point center;

    int radius;

public:

    circle(int x,int y,int _radius)

        :center(x,y),figure(""),radius(_radius){}; // constructor에서 figure 클래스에 대해 "" public 속성에 있는 figure 생성자로 설정

    void showData(){

        cout << getName() << " 입니다" << endl; //<-- figure 객체의 함수를 사용!

        cout << " (" << center.getX() << ", " << center.getY() << ")" << endl;

        cout << "Radius : " << radius << endl;

        protect = " protect 마치 public처럼 접근이 가능~~~!! // protect변수 접근가능

cout << protect << endl;

    }

};

 

int main(){

    circle myCircle(1,23,5);

    myCircle.showData();

    return 0;

}

 


실행결과


신고

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

C++ 복사생성자(생성자에 관한 이해 및 얕은,깊은 복사)  (0) 2012.10.20
Template Function(템플릿 함수)  (0) 2012.09.01
C++ 상속(inheritance)  (0) 2012.09.01
C++ 포함  (0) 2012.09.01
Operator Overloading(연산자 오버로딩)  (0) 2012.09.01
1주차  (0) 2011.06.27

사실 포함을 설명하는 이유는 다음에 이어갈 상속과 관련해서 볼 때 도움이 될꺼같아서 이렇게 포스팅을 합니다....

객체가 다른 객체를 멤버변수로 사용하고 있는 것을 포함 이라고 합니다

/*

Class 포함 예제

made by hahahia

*/

 

#include<iostream>

 

using namespace std;

 

class point{ /* x,y 좌표를 나타내는 간단한 클래스 */

private:

    int x,y;

public:

    point(int _x,int _y): x(_x),y(_y) {}; /* C++ Style(= {x = _x; y = _y;} */

    int getX() const { return x; }

    int getY() const { return y; }

};

class rectangle{ // rectangle class(사실 클래스도 간단하네요....ㅎㅎ)

private:

    point topLeft;

    point bottomRight; //point 객체를 포함

public:

    rectangle(int a, int b, int c, int d) : topLeft(a,b), bottomRight(c,d){};

    void print(){

               cout << "Top Left : (" << topLeft.getX() << ", " << topLeft.getY() << ")\n";

               cout << "Bottom Right : (" << bottomRight.getX() << ", " << bottomRight.getY() << ")\n";

        }

};

 

int main(){

    rectangle myRec(1,2,3,4);

    myRec.print();

    return 0;

}


실행결과


 

신고

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

Template Function(템플릿 함수)  (0) 2012.09.01
C++ 상속(inheritance)  (0) 2012.09.01
C++ 포함  (0) 2012.09.01
Operator Overloading(연산자 오버로딩)  (0) 2012.09.01
1주차  (0) 2011.06.27
Class GradeBook Using an Array to Store Grades  (0) 2011.05.25
연산자 오버로딩(Operator Overloading) 이란?
- C++에서 연산자가 하는 일을 함수로 개인의 필요에 맞게 구현한 것.
- operator<연산자> 형태. 이항 연산자의 경우 좌측의 연산자의 피연산자는 호출하는 객체가 될 것이고, 우측의 피연산자는 인수가 된다.


지금 예제에서는 간단히 입력하는 연산자 >> 와 출력하는 << 연산자에 대해서 입출력 오버로딩을 구현해 보았습니다.

/* made by hahahia */

#include <iostream>

#include <string>

using namespace std;

 

class Student{

        friend istream &operator >> (istream &, Student &); /* Operator overloading(input, output) */

        friend ostream &operator << (ostream &, const Student &);

public:

        string getName() const { return Name; } /* Get Function */

        int getNumber() const { return Number; }

private:

        string Name; /* student name, number */

        int Number;

};

 

istream &operator >> (istream & in, Student & stu){

        cout << "student name : ";

        in >> stu.Name;

        cout << "student number : ";

        in >> stu.Number;

        return in;

}

ostream &operator << (ostream & out, const Student & stu){

        out << "Student Name : " << stu.Name << "\n"

               << "Student Number : " << stu.Number << "\n" ;

        return out;

}

int main(){

        Student stu1;

        cout << "input Student Name and Number\n";

        cin >> stu1;

        cout << stu1;

 

        cout << "getFunction Student Name : " << stu1.getName() << "\n"

               << "getFunction Student Number : " << stu1.getNumber() << "\n";

}

 

실행결과



신고

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

C++ 상속(inheritance)  (0) 2012.09.01
C++ 포함  (0) 2012.09.01
Operator Overloading(연산자 오버로딩)  (0) 2012.09.01
1주차  (0) 2011.06.27
Class GradeBook Using an Array to Store Grades  (0) 2011.05.25
재귀함수를 이용한 fibonacci  (0) 2011.05.17

#include <iostream>

using namespace std;

 

typedef unsigned short int USHORT;

typedef unsigned long int ULONG;

enum BOOL {FALSE, TRUE};

enum CHOICE {DrawRect = 1, GetArea, GetPerim, ChangeDimensions, Quit};

 

class Rectangle{

public:

        Rectangle(USHORT width, USHORT height);

        ~Rectangle();

 

        USHORT GetHeight() const

        {

               return itsHeight;

        }

        USHORT GetWidth() const

        {

               return itsWidth;

        }

        ULONG GetArea() const

        {

               return itsHeight * itsWidth;

        }

        ULONG GetPerim() const

        {

               return 2*itsHeight + 2*itsWidth;

        }

        void SetSize(USHORT newWidth, USHORT newHeight);

 

 

        void DrawShape() const;

 

private:

        USHORT itsWidth;

        USHORT itsHeight;

};

void Rectangle::SetSize(USHORT newWidth, USHORT newHeight)

{

        itsWidth = newWidth;

        itsHeight = newHeight;

}

Rectangle::Rectangle(USHORT width, USHORT height)

{

        itsWidth = width;

        itsHeight = height;

}

Rectangle::~Rectangle()

{

}

USHORT DoMenu();

void DoDrawRect(Rectangle);

void DoGetArea(Rectangle);

void DoGetPerim(Rectangle);

 

void main()

{

        Rectangle theRect(30, 5);

 

        USHORT choice = DrawRect;

        USHORT fQuit = FALSE;

 

        while(!fQuit)

        {

               choice = DoMenu();

               if(choice < DrawRect || choice > Quit)

               {

                       cout << endl << "Invalid Choice, please try again." << endl ;

                       continue;

               }

               switch(choice)

               {

               case DrawRect:

                       DoDrawRect(theRect);

                       break;

               case GetArea:

                       DoGetArea(theRect);

                       break;

               case GetPerim:

                       DoGetPerim(theRect);

                       break;

               case ChangeDimensions:

                       USHORT newLength, newWidth;

                       cout << endl << "New width: " ;

                       cin >> newWidth;

                       cout << "New height: " ;

                       cin >> newLength;

                       theRect.SetSize(newWidth, newLength);

                       DoDrawRect(theRect);

                       break;

               case Quit:

                       fQuit = TRUE;

                       cout << "Exiting... " << endl;

                       break;

               default:

                       cout << "Error in choice! " << endl;

                       fQuit = TRUE;

                       break;

               }

        }

}

 

USHORT DoMenu()

{

        USHORT choice;

        cout << endl << "***Menu*** " << endl;

        cout << "(1) Draw Rectangle " << endl;

        cout << "(2) Area " << endl;

        cout << "(3) Perimeter " << endl;

        cout << "(4) Resize " << endl;

        cout << "(5) Quit " << endl;

 

        cin >> choice;

        return choice;

}

 

void DoDrawRect(Rectangle theRect)

{

        USHORT height = theRect.GetHeight();

        USHORT width = theRect.GetWidth();

 

        for(USHORT i = 0; i<height; i++)

        {

               for(USHORT j=0; j<width; j++)

               {

                       cout << "*";

               }

               cout << endl;

        }

}

 

void DoGetArea(Rectangle theRect)

{

        cout << "Area: " << theRect.GetArea() << endl;

}

 

void DoGetPerim(Rectangle theRect)

{

        cout << "Perimeter : " << theRect.GetPerim() << endl;

}

 


신고

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

C++ 포함  (0) 2012.09.01
Operator Overloading(연산자 오버로딩)  (0) 2012.09.01
1주차  (0) 2011.06.27
Class GradeBook Using an Array to Store Grades  (0) 2011.05.25
재귀함수를 이용한 fibonacci  (0) 2011.05.17
간단한 Class프로그램을통한 Class의 개념과 특징  (0) 2011.05.10

#include <iostream>

#include <string>

#include <iomanip>

using namespace std;

 

class GradeBook{

public:

 static const int students = 10;

 GradeBook(string, const int []);

 void setCourseName(string);

 string getCourseName();

 void displayMessage();

 void processGrades();

 int getMinimum();

 int getMaximum();

 double getAverage();

 void outputBarChart();

 void outputGrades();

private:

 string courseName;

 int grades[students];

};

 

GradeBook::GradeBook(string name, const int gradesArray[])

{

 setCourseName(name);

 

 for(int grade=0; grade < students; grade++)

  grades[grade] = gradesArray[grade];

}

 

void GradeBook::setCourseName(string name)

{

 courseName = name;

}

string GradeBook::getCourseName()

{

 return courseName;

}

 

void GradeBook::displayMessage()

{

 cout << "Welcome to the grade book for\n" << getCourseName() << "!" << endl;

}

 

void GradeBook::processGrades()

{

 outputGrades();

 

 cout << "\nClass average is " << setprecision(2) << fixed <<

  getAverage() << "\nLowest grade is " << getMinimum() <<

  "\nHighest grade is " << getMaximum() << endl;

 outputBarChart();

}

int GradeBook::getMinimum()

{

 int lowGrade = 100;

 

 for(int grade = 0; grade < students; grade++)

 {

  if(grades[grade] < lowGrade)

  {

   lowGrade = grades[grade];

  }

 }

 return lowGrade;

}

int GradeBook::getMaximum()

{

 int MaxGrade = 0;

 

 for(int grade = 0; grade < students; grade++)

 {

  if(grades[grade] > MaxGrade)

  {

   MaxGrade = grades[grade];

  }

 }

 return MaxGrade;

}

double GradeBook::getAverage()

{

 int total = 0;

 

 for(int grade = 0; grade < students; grade++)

  total += grades[grade];

 

 return static_cast<double>(total)/students;

}

 

void GradeBook::outputBarChart()

{

 cout << "\nGrade distribution:" << endl;

 

 const int frequencySize = 11;

 int frequency[frequencySize] = {};

 for(int grade = 0; grade < students; grade++)

 {

  frequency[grades[grade] / students ] ++;

 }

 for(int count=0; count < frequencySize; count++)

 {

  if(count == 0)

  {

   cout << "0~9: ";

  }

  else if(count == 10)

  {

   cout << "100: " ;

  }

  else

  {

   cout << count * 10 << "~" << count*10 + 9 << ": " ;

  }

  for(int stars = 0 ; stars < frequency[count]; stars++)

  {

   cout << "*";

  }

 cout << endl;

 }

}

void GradeBook::outputGrades()

{

 cout << "\nThe grades are:\n\n";

 

 for(int student = 0; student < students; student++)

 {

  cout << "Student : " << setw(2) << student + 1 << ": " << setw(3)

   << grades[student] << endl;

 }

}

int main()

{

 int gradesArray[GradeBook::students] = {87, 68, 94, 100, 83, 78, 85, 91, 76, 87};

 

 GradeBook myGradeBook("CS101 Introduction to C++ Programming", gradesArray);

 myGradeBook.displayMessage();

 myGradeBook.processGrades();

 return 0;

}

 

신고

/* made by hahahia */

 

#include <iostream>

 

using namespace std;

int count;

int fibonacci(int num1, int num2)

{

 cout << " " << num1+num2 ;

 count--;

 if(count==0)

  return 0;

 else

  fibonacci(num2, num1+num2);

}

 

void main()

{

 cin >> count;

 cout << "0 1" ;

 count = count - 2;

 fibonacci(0,1);

 cout << endl;

}

 

신고


클래스의 정의 :
부류를 형성하는 데이터들을 하나로 묶어 그 데이터들을 조작할 변수나 함수들을 포함

클래스의 장점 :
 1) 데이터의 은닉(information hiding) : 정보를 은닉할 수 있다.
 2) 데이터의 캡슐화(Encapsulation) : 같은 부류의 데이터나 메소드를 묶어서 프로그래밍 할 수 있음.

클래스의 구성 :
 데이터(멤버변수) + 메소드(멤버함수)

클래스의 접근 :

1.public
 - 어느곳에서나 접근가능
 - 멤버변수에 접근하는 검증된 메소드들을 public로 선언함.

2. private
 - 클래스 내부에서의 접근만 허용함
 - 데이터은닉을 위해 멤버변수를 private로 선언함

클래스의 사용 :
 클래스를 사용하기위해서는 정의된 클래스로부터 객체를 생성해야한다(object)
 ex )
 int a;  ==================== Date date;

멤버함수의 정의 :
 - 선언은 클래스 내부에서 하며 정의는 코드의 가독성을 위해
    외부에서 한다.
  ex ) Date::getDay()
        {
              함수의 내용;
         }




#include <iostream>

#include <string>

using namespace std;

 

class Date{

        public:

        Date(int ,int , int);  // Constructor

        void setMonth(int);    // member Function

        int getMonth();

        void setDay(int);

        int getDay();

        void setYear(int);

        int getYear();

        void DisplayDate();

        private: // members

               int month;

               int day;

               int year;

};

 

Date::Date(int a, int b, int c)

{

        setMonth(a);

        setDay(b);

        setYear(c);

}

void Date::setMonth(int a){

        if(a>= 1 && a<=12)

               month=a;

        else

               month=1;

}

int Date::getMonth() { return month; }

void Date::setDay(int b) { day=b; }

int Date::getDay() { return day; }

void Date::setYear(int c) { year=c; }

int Date::getYear() { return year; }

void Date::DisplayDate() { cout << month << "/" << day << "/" << year << endl; }

int main()

{

        Date date(123, 2, 2011); // make Object

        cout << "Month : " << date.getMonth() << endl;

        cout << "Day : " << date.getDay() << endl;

        cout << "Year : " << date.getYear() << endl;

        date.DisplayDate();

        return 0;

}

 

신고

5.10
#include <iostream>
using namespace std;
int main()
{
 int result=1;

 for(int i=1; i<=5; i++)
 {
  for (int j=1; j <= i; j++)
  {
    result *= j;
  }
  cout<< i << "! " <<result<<endl;
  result = 1;
 }
 return 0;
} // 팩토리얼 출력
5.15
#include <iostream>
#include <string>
using namespace std;

class GradeBook
{
private:
 string courseName;
 int aCount;
 int bCount;
 int cCount;
 int dCount;
 int fCount;
public:
 GradeBook (string);
 void setCourseName (string);
 string getCourseName ();
 void displayMessage();
 void inputGrades();
 void displayGradeReport();
};

GradeBook::GradeBook(string name)
{
 setCourseName(name);
 aCount=0;
 bCount=0;
 cCount=0;
 dCount=0;
 fCount=0;
}
void GradeBook::setCourseName(string name)
{
 
 if (name.length() <= 25)
  courseName=name;
 else
 {
  courseName = name.substr (0,25);
  cout<<"Name\""<<name<<"\" exceeds m,aximum length (25).\n"<<"Limiting courseName to first 25 characters.\n"<<endl;
 }
}

string GradeBook::getCourseName()
{
 return courseName;
}

void GradeBook::displayMessage()
{
 cout<<"Welcome to the grade book for\n"<<getCourseName()<<"!\n"<<endl;
}

void GradeBook::inputGrades()
{
 int grade;
 cout<<"Enter the letter grades."<<endl<<"Enter the EOF charcter to end input"<<endl;
 
 while ( ( grade = cin.get() ) != EOF )
 {
  switch ( grade )
  {
  case 'A':
  case 'a':
   aCount++;
   break;

  case 'B':
  case 'b':
   bCount++;
   break;

  case 'C':
  case 'c':
   cCount++;
   break;
     
  case 'D':
  case 'd':
   dCount++;
   break;

  case 'F':
  case 'f':
   fCount++;
   break;

  case '\n':
  case '\t':
  case ' ':
   break;

  default:
   cout<<"Incorrect letter grade entered."<<"Enter a new grade."<<endl;
   break;
  }
 }
}

void GradeBook::displayGradeReport()
{
 cout<<"\n\nNumber of students who received each letter grade.\n"
  <<"\nA: "<<aCount
  <<"\nB: "<<bCount
  <<"\nC: "<<cCount
  <<"\nD: "<<dCount
  <<"\nF: "<<fCount
  <<endl;
 cout<<"Grade average : "<<(double)(4*aCount+3*bCount+2*cCount+1*dCount+0*fCount)/(aCount+bCount+cCount+dCount+fCount)<<endl;
}


int main()
{
 GradeBook myGradeBook( " CS101 C++ Programming ");

 myGradeBook.displayMessage();
 myGradeBook.inputGrades();
 myGradeBook.displayGradeReport();
} // class를 이용한 성적입력후 학점평균계산 프로그램

5.19
#include <iostream>
using namespace std;
int main()
{
 double a=4;
 double t=0;
 for(double i=1; i<=1000; i++)
 {
  if((int)i%2==1)
  {
   a = a - (4 / (2*i+1));
  }
  else
  {
   a = a + (4 / (2*i+1));
  }
 }
 cout << a << endl;
 return 0; // π값 계산
}
5.23
#include <iostream>
using namespace std;
int main()
{
 int a;
 cout << "input a : " ;
 cin >> a ;
 for(int i=0; i<a; i++)
 {
  for(int j=a-i; j>0; j--)
  {
   cout << " ";
  }
  for(int k=0; k<=i*2; k++)
  {
   cout << "*";
  }
  cout << endl;
 }
 for(int i=0; i<a-1; i++)
 {
  for(int j=a-i-2; j<=a-1; j++)
  {
   cout << " " ;
  }
  for(int k=0; k<2*(a-1-i)-1; k++)
  {
   cout << "*";
  }
  cout << endl;
 }
 return 0;
} // diamond 모양 출력
5.29
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;

int main()
{
 double amount;
 double principal = 24.0;
 double rate = .05;

 for (int i = 0; i<=5; i++)
 {
  for ( int year=1; year <= 384; year++)
  {
    amount = principal * pow ( 1.0 + rate, year);
  }
 cout << fixed << setprecision( 2 );
  cout << rate*100 << "% = "<< amount << endl;
  rate += .01;
  amount = 0;
 } // 원리합계
}

신고

+ Recent posts