C++/기초를 탄탄히 세워주는 C++ 프로그래밍 입문(황준하 저)

기초를 탄탄히 세워주는 C++ 프로그래밍 입문 11장 연습문제

꾸준함. 2017. 7. 10. 18:39

[11.1]

/*

int형 값 하나와 double형 값 하나를 입력받은 후 int 값은 10진수, 8진수, 16진수로 출력하고

double 값은 과학적 표기법과 부동소수점 표기법으로 출력해 본다

*/

#include <iostream>

using namespace std;

 

int main(void)

{

        int i;

        double d;

        cout << "10진수 입력: ";

        cin >> i;

 

        cout << "10진수: " << i << endl;

        cout.unsetf(ios_base::dec); //10진수 해제

        cout.setf(ios_base::hex); //16진수 설정

        cout << "16진수: " << i << endl;

        cout.unsetf(ios_base::hex); //16진수 해제

        cout.setf(ios_base::oct); //8진수 설정

        cout << "8진수: " << i << endl;

 

        cout << "실수 입력: ";

        cin >> d;

        cout.setf(ios_base::scientific, ios_base::floatfield); //과학적표기법

        cout << "과학적 표기법: " << d << endl;

        cout.setf(ios_base::fixed, ios_base::floatfield); //부동소수점 표기법

        cout << "부동 소수점 표기법: " << d << endl;

        return 0;

}

[11.2]

/*

다음 프로그램에서 5라인의 unsetf 함수를 추가했을 때와 추가하지 않았을 때의 실행 결과를 확인하고

skipws 플래그의 의미에 대해 설명해 본다.

6라인에서 입력을 받아들이고 있다. 여기서 입력은 "a b c"로 한다

*/

#include <iostream>

using namespace std;

 

int main(void)

{

        char ch1, ch2, ch3;

 

        //cin.unsetf(ios_base::skipws);

        //5행을 주석처리해야 정상적인 출력값인 a b c가 출력이 된다.

        //skipws(공백 무시) unsetf로 끄게 되면 공백도 하나의 데이터로 입력되어진다.

        //따라서 a, 공백, b가 각각 ch1 ch2 ch3에 입력이 되는 것이다.

        //, skipws를 설정해야지만 공백이 데이터로 간주되지 않아 a, b, c가 출력이 된다

        cin >> ch1 >> ch2 >> ch3;

 

        cout << ch1 << endl;

        cout << ch2 << endl;

        cout << ch3 << endl;

        return 0;

}

[11.3]

/*

연습문제 1.2와 동일한 문제이다.

당시에는 printf scanf를 사용하였다.

이번에는 cin cout을 사용해서 프로그램을 작성해 본다.

2개의 int형 값(x, y)을 입력받고 x y 사이의 값들에 대한 제곱값과 나누기 3을 한 값을 각각

출력해 본다. 각 출력값들에 대해 적절한 크기의 필드를 지정하고 오른쪽 정렬로 출력하도록 한다.

나누기 3을 한 값의 결과는 실수로 처리될 수 있어야 하며, 소수점 이하 첫번째 자리까지만 출력하도록 한다.

*/

#include <iostream>

using namespace std;

 

int main(void)

{

        int x, y;

        int square;

        double divide;

        cout << "2개의 정수 입력: ";

        cin >> x >> y;

        for (int i = x; i <= y; i++)

        {

               square = i*i;

               divide = i / 3.0;

               cout.width(10);

               cout.setf(ios_base::fixed, ios_base::floatfield); //부동소수점 표시

               cout.precision(1); //소숫점 한자리

               cout << i << "\t" << square << "\t" << divide << endl;

        }

        return 0;

}

[11.4]

/*

연습문제 11.3의 프로그램을 입출력 조작자를 사용하여 구현해 본다

*/

#include <iostream>

#include <iomanip>

using namespace std;

 

int main(void)

{

        int x, y;

        int square;

        double divide;

        cout << "2개의 정수 입력: ";

        cin >> x >> y;

        for (int i = x; i <= y; i++)

        {

               square = i*i;

               divide = i / 3.0;

               cout.setf(ios_base::fixed, ios_base::floatfield); //부동소수점 표시

               cout.precision(1); //소숫점 한자리

               cout << "\t"<< i << setw(3) << "\t"; //필드 설정

               cout << square << setw(3) << "\t";

               cout << divide << setw(3) << endl;

        }

        return 0;

}

[11.5]

/*

키보드로 입력받은 각 알파벳 대문자들의 개수를 세는 프로그램을 작성해 본다.

알파벳 대문자가 아니라면 skip해야 한다.

다음 실행화면을 참고한다.

*/

#include <iostream>

using namespace std;

 

int main(void)

{

        char ch;

        int alphabet[26] = { 0, };

 

        while (cin.get(ch)) //문자를 입력받는다(CTRL+Z 전까지)

        {

               if (ch >= 65 && ch <= 90)

               {

                       alphabet[ch - 65]++;

               }

        }

        for (int i = 0; i < 26; i++)

        {

               char character = i + 65;

               cout <<  character << ": "<< alphabet[i] << " ";

               if (i!=0 && i % 10 == 0)

                       cout << endl;

        }

        cout << endl;

        return 0;

}

[11.6]

/*

getline 함수를 사용하여 한 줄을 한꺼번에 입력받은 후 단어 단위로 한 줄씩 출력하는 프로그램을 작성한다

한 줄은 80자를 넘지 않는다고 가정한다. 다음 실행 결과를 참고한다

*/

#include <iostream>

#include <cstring>

using namespace std;

 

int main(void)

{

        char str[80], result[80], space_flag = 0;

        int idx = 0;

 

        cout << "문자열 입력: ";

        cin.getline(str, 80);

 

        for (int i = 0; i < (int)strlen(str); i++)

        {

               if (space_flag == 0 && str[i] == ' '|| str[i] == '\t') //flag가 꺼져있고 공백이나 tab일 경우

               {

                       result[idx++] = '\n';

                       space_flag = 1;

               }

               else if (space_flag == 1 && str[i] == ' ' || str[i] == '\t') //flag가 켜져있는 상태에서 공백이나 tab일 경우

               {

                       continue;

               }

               else // 공백이나 tab이 아닐 경우

               {

                       space_flag = 0;

                       result[idx++] = str[i];

               }

        }

 

        result[idx] = 0; //끝 널문자

        cout << result << endl; //출력

 

        return 0;

}

 

[11.7]

/*

int형 변수로 정수값 하나를 읽어 들이려고 한다.

만약 숫자가 입력되지 않으면 숫자가 입력될 때까지 재입력을 요구하도록 한다.

숫자는 공백을 사이에 두고 나타난다고 가정한다

*/

#include <iostream>

#include <string>

using namespace std;

 

int main(void)

{

        string str;

        string result;

        string token = " ";

 

        bool check = false;

        int At;

        int index = 0;

        while (!check)

        {

               cout << "숫자 입력: ";

               fflush(stdin);

               getline(cin, str);

 

               while ((At = str.find_first_of(token)) != str.npos)

               {

                       if (At > 0)

                       {

                              result = str.substr(0, At);

                              const char *temp = result.c_str();

                              if (atoi(temp))

                              {

                                      check = true;

                                      break;

                              }

                              str = str.substr(At + 1);

                       }

               }

               if (str.length() > 0)

               {

                       result = str.substr(0, At);

                       const char *temp = result.c_str();

                       if (atoi(temp))

                       {

                              check = true;

                              break;

                       }

                       str = str.substr(At + 1);

               }

        }

        cout << "입력값: " << result << endl;

        return 0;

}

[11.8]

/*

사용하고 있는 컴파일러의 도움말(VC++의 경우 MSDN)을 참고하여 string 클래스의 replace

멤버 함수와 erase 멤버 함수에 대한 예제를 직접 만들고 테스트 해본다.

C언어도 마찬가지지만 프로그램을 작성하기 위해서는 MSDN의 도움이 절대적으로 필요하다

*/

#include <iostream>

#include <string>

using namespace std;

 

void Print(string &s1, string title)

{

        cout << title << endl;

        cout << "str1: " << s1 << endl;

}

 

int main(void)

{

        string str1 = "Hello! Programming";

        string str2 = "C++";

        string str3;

        Print(str1, "<< 적용 전 >>");

 

        str3 = str1.replace(5, 1, "C"); //5번째 index에 있는 글자를 대체한다

        Print(str3, "<< replace >>");

 

        str1.erase(0, 7); //index 0부터 7까지의 글자를 지운다

        Print(str1, "<< erase >>");

        return 0;

}

[11.9]

/*

C++ 표준 라이브러리에서 제공하는 complex를 사용하지 않고 (예제 11.12)가 수행될 수 있도록 직접

CComplex라는 클래스를 만들어 보도록 한다.

실수부와 허수부는 double 값으로 가정하고 템플릿으로 만들 필요는 없다.

complex<double> 부분만 CComplex로 대체하면 바로 수행될 수 있도록 만들어본다

*/

#include <iostream>

using namespace std;

 

class CComplex

{

private:

        double num1;

        double num2;

public:

        CComplex(double a, double b) :num1(a), num2(b)

        {

        }

        CComplex operator+(CComplex copy)

        {

               return CComplex(num1 + copy.num1, num2 + copy.num2);

        }

        CComplex operator-(CComplex copy)

        {

               return CComplex(num1 - copy.num1, num2 - copy.num2);

        }

        CComplex operator*(CComplex copy)

        {

               return CComplex(num1*copy.num1-num2*copy.num2, num1*copy.num2+num2*copy.num1);

        }

        CComplex operator/(CComplex copy)

        {

               return CComplex((num1*copy.num1+num2*copy.num2)/(copy.num1*copy.num1+copy.num2*copy.num2), ((copy.num1*num2-num1*copy.num2)/(copy.num1*copy.num1+copy.num2*copy.num2)));

        }

        friend ostream &operator<<(ostream &out, CComplex Co);

};

 

ostream &operator<<(ostream &out, CComplex Co)

{

        out << "(" << Co.num1 << ", " << Co.num2 << ")";

        return out;

}

 

int main(void)

{

        CComplex comp1(1.0, 2.0);

        CComplex comp2(3.0, 4.0);

 

        cout << "+: " << comp1 + comp2 << endl;

        cout << "-: " << comp1 - comp2 << endl;

        cout << "*: " << comp1*comp2 << endl;;

        cout << "/: " << comp1 / comp2 << endl;

        return 0;

}



개발 환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~


[참고] 기초를 탄탄히 세워주는 C++ 프로그래밍 입문 황준하 저


6번 문제

http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=68264805&qb=YysrIGdldGxpbmUg7ZWo7IiY66W8IOyCrOyaqe2VmOyXrCDtlZzspITsnYQg7ZWc6rq867KI7JeQIOyeheugpQ==&enc=utf8&section=kin&rank=5&search_sort=0&spq=0


7번 문제

http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=71967893&qb=QysrIOyIq+yekOuKlCDqs7XrsLHsnYQg7IKs7J207JeQIOuRkOqzoCDrgpjtg4Drgpzri6Tqs6Ag6rCA7KCV7ZWY7J6Q&enc=utf8&section=kin&rank=1&search_sort=0&spq=0


생소한 함수이다 보니 지식인을 참고 많이했습니다

반응형