본문 바로가기
개인공부/C++ 기초플러스

C++ Primer 06

by 하고싶은건많은놈 2023. 2. 18.

학습목표

  • if 구문
  • 논리 연산자(&&, ||, !)
  • 조건 연산자(? :)
  • continuebreak 구문
  • 기본적인 파일 입력/출력
  • if else 구문
  • 문자 함수들이 들어있는 cctype 라이브러리
  • switch 구문
  • 수를 읽어들이는 루프

6.1 if 구문

if (test-condition)
	statement

if : 조건을 평가한 결과가 참이면 다음에 오는 구문 또는 구문 블록을 수행, 거짓이면 무시하고 건너뜀

  • if 구문의 전체 구조가 하나의 구문으로 취급됨
  • test-condition에는 루프 제어시 사용한 것과 같은 관계 표현식이 주로 사용됨
// if.cpp

#include <iostream>

int main()
{
	using std::cin;
	using std::cout;
	char ch;
	int spaces = 0;
	int total = 0;

	cin.get(ch);
	while (ch != '.')
	{
		if (ch == ' ')
			++spaces;
		++total;
		cin.get(ch);
	}
	cout << "이 문장의 총 문자 수는 " << total << "이고, ";
	cout << "그중에서 빈칸은 " << spaces << "개 입니다.\n";
	return 0;
}

if else 구문

if (test-condition)
	statement1
else
	statement2

if else : 두 개의 구문 또는 블록 중에서 어느쪽을 수행할 것인지를 결정
참이면 statement1, 거짓이면 statement2를 수행함

// ifelse.cpp

#include <iostream>

int main()
{
	char ch;

	std::cout << "타이핑하시면 반복 수행하겠습니다.\n";
	std::cin.get(ch);
	while (ch != '.')
	{
		if (ch == '\n')
			std::cout << ch;
		else
			std::cout << ++ch;
		std::cin.get(ch);
	}
	std::cout << "\n혼란스럽게 해서 죄송합니다.\n";

	return 0;
}

++ch 대신 ch + 1 사용시 cout이 정수형으로 출력함

if else 구문의 작성 스타일

// X
if (...)
	A
	B
else
	C
	D

// O
if (...)
{
	A
	B
}
else {
	C
	D
}

하나 이상의 구문이 요구될 시에는 중괄호로 묶어서 하나의 구문 블록으로 만들어주어야 함
구문들을 잘 묶어주기만 한다면 중괄호의 위치는 상관없음


if / else if / else 구문

// ifelseif.cpp

#include <iostream>
const int Fave = 27;

int main()
{
	using namespace std;
	int n;

	cout << "1부터 100까지 범위에서 하나의 수를 알아맞히는 게임입니다.\n";
	cout << "내가 좋아하는 수는 무엇일까요? ";
	do
	{
		cin >> n;
		if (n < Fave)
			cout << "그것보다 큽니다. 무엇일까요? ";
		else if (n > Fave)
			cout << "그것보다 작습니다. 무엇일까요? ";
		else
			cout << "맞았습니다. 정답은 " << Fave << "입니다.\n";
	} while (n != Fave);
	return 0;
}

else 블록 안에 또다시 if else 구문이 올 수 있음
이를 더 간단하게 if / else if / else 구문으로 사용할 수 있음

==을 사용해야 하는 곳에 =을 사용하는 실수를 줄이기 위해 variable == value가 아닌 value == variable의 형식으로 사용하는 방법이 있음
이럴 경우 실수로 =을 사용해도 리터럴에 값을 대입하는 것은 명백한 오류이므로 컴파일러가 에러 메세지를 출력하여 에러를 쉽게 발견할 수 있음



6.2 논리 표현식

논리합 OR 연산자(||)

// or.cpp

#include <iostream>

int main()
{
	using namespace std;
	
	cout << "이 프로그램은 하드디스크를 다시 포맷합니다.\n"
		 << "하드디스크에 있는 모든 데이터가 지워집니다.\n"
		 << "계속하시겠습니까? <y/n> ";
	char ch;
	cin >> ch;
	if (ch == 'y' || ch == 'Y')
		cout << "당신에게 분명히 경고를 했습니다.\a\a\n";
	else if (ch == 'n' || ch == 'N')
		cout << "현명한 선택입니다. 프로그램을 종료합니다.\n";
	else
		cout << "y나 n을 입력하지 않았습니다.\n"
			 << "지시사항을 따를 수 없습니다."
			 << " 휴지통을 비우고 디스크를 정리하겠습니다.\n";
	return 0;
}

|| : 논리합 연산자로 두 개의 표현식을 하나로 결합함

  • 두 개의 표현식 중 적어도 하나 이상이 ture이거나 0이 아니면 전체 표현식이 true가 됨
  • 그렇지 않을 경우 전체 표현식이 false가 됨
  • 관계 연산자보다 우선순위가 낮음
  • 시퀀스 포인트(sequence point)로 작용하여 좌변에 지시된 값의 변경이 우변이 평가되기 전에 일어남
    즉, 좌변의 표현식이 이미 true라면 우변의 표현식은 확인하지 않음

논리곱 AND 연산자(&&)

// and.cpp

#include <iostream>
const int ArSize = 6;

int main()
{
	using namespace std;
	float naaq[ArSize];

	cout << "동료들의 뉴에이지 자각 지수 (NAAQ)를 입력하십시오.\n"
		 << ArSize << "명의 데이터를 모두 입력했거나, 음수를 입력하면\n"
		 << "while 루프를 탈출합니다.\n";
		
	int i = 0;
	float temp;
	cout << "첫 번째 값 : ";
	cin >> temp;
	while (i < ArSize && temp >= 0)
	{
		naaq[i] = temp;
		++i;
		if (i < ArSize)
		{
			cout << "그 다음 값 : ";
			cin >> temp;
		}
	}
	if (i == 0)
		cout << "입력한 데이터가 없으므로 프로그램을 종료합니다.\n";
	else
	{
		cout << "당신의 NAAQ를 입력하십시오 : ";
		float you;
		cin >> you;
		int count = 0;
		for (int j = 0; j < i; j++)
			if (naaq[j] > you)
				++count;
		cout << "동료들 중에서 " << count;
		cout << "명이 당신보다 NAAQ가 높습니다.\n";
	}
	return 0;
}

&& : 논리곱 연산자로 두 개의 표현식을 하나로 결합함

  • 두 개의 표현식이 모두 true일 때에만 전체 표현식이 true가 됨
  • 그 외의 경우 모두 false가 됨
  • ||와 마찬가지로 시퀀스 포인트로 작용

&&를 이용한 범위 설정

// more_and.cpp

#include <iostream>
const char * qualify[4] =
{
	"만미터 달리기",
	"모래사장 씨름",
	"비치발리볼",
	"부메랑 던지기"
};

int main()
{
	using namespace std;

	int age;
	cout << "나이를 입력하십시오 : ";
	cin >> age;

	int index;
	if (age > 17 && age < 35)
		index = 0;
	else if (age >= 35 && age < 50)
		index = 1;
	else if (age >= 50 && age < 65)
		index = 2;
	else
		index = 3;

	cout << "당신은 " << qualify[index] << "에 참가할 수 있습니다.\n";
	return 0;
}

범위 검사시 어떤 값이 누락되거나 중복되지 않도록 주의해야함
char형 데이터를 지시하는 포인터 배열을 이용하여 일련의 문자열을 인식할 수 있음


논리부정 NOT 연산자(!)

// not.cpp

#include <iostream>
#include <climits>
bool is_int(double);

int main()
{
	using namespace std;
	double num;

	cout << "정수 값을 하나 입력하십시오 : ";
	cin >> num;
	while (!is_int(num))
	{
		cout << "int형에 대입할 수 없는 값입니다. 다시 입력하십시오 : ";
		cin >> num;
	}
	int val = int (num);
	cout << "당신이 입력한 정수는 " << val << "입니다.\n";
	return 0;
}

bool is_int(double x)
{
	if (x <= INT_MAX && x >= INT_MIN)
		return true;
	else
		return false;
}

! : 논리부정 연산자로 뒤따르는 표현식의 값을 반대로만듬

  • 표현식의 값이 ture였다면 false로 바꿈
  • 표현식의 값이 false였다면 true로 바꿈
  • !연산자를 사용하지 않고 더 명확하게 관계를 표현할 수 있으나, strcmptrue/false값을 리턴하는 함수와 함께 사용시 유용함

논리 연산자의 고려사항

논리합 연산자 ||와 논리곱 연산자 &&는 관계 연산자보다 우선순위가 낮음
그러나 논리부정 연산자 !는 어떠한 관계 연산자나 산술 연산자보다 우선순위가 높음
사용자의 의도를 프로그램에 확실히 알리기 위해서는 괄호를 사용하는 것이 권장됨

C++은 논리 표현식을 평가시 왼쪽에서 오른쪽으로 평가를 진행하다가 전체 표현식의 값이 결정되는 순간 평가를 멈춤


논리 연산자의 대체 표기

C++ 표준은 논리 연산자의 대체 표기를 허용함

  • &&and
  • ||or
  • !not
  • 해당 표기들은 C++의 예약어이며, 변수 이름 등으로 사용할 수는 없으나 키워드로 간주되지는 않음
  • C언어에서는 iso646.h 헤더파일을 포함시 연산자로 사용 가능함


6.3 문자 함수를 위한 ccytpe 라이브러리

문자 관련 함수들의 원형은 ccytpe 헤더파일에 정의되어있음
isalpha, ispunct등의 함수들은 논리 연산자를 사용하는 것보다 더 편리하며, 더 일반적으로 사용 가능함

// cctypes.cpp

#include <iostream>
#include <cctype>

int main()
{
	using namespace std;
	cout << "분석할 텍스트를 입력하십시오. "
		 << "입력의 끝을 @으로 표시하십시오.\n";
	char ch;
	int whitespace = 0;
	int digits = 0;
	int chars = 0;
	int punct = 0;
	int others = 0;

	cin.get(ch);
	while (ch != '@')
	{
		if (isalpha(ch))
			chars++;
		else if (isdigit(ch))
			digits++;
		else if (ispunct(ch))
			punct++;
		else
			others++;
		cin.get(ch);
	}

	cout << "알파벳 문자 " << chars << ", "
		 << "화이트스페이스 " << whitespace << ", "
		 << "숫자 " << digits << ", "
		 << "구두점 " << punct << ", "
		 << "기타 " << others << endl;
	return 0;
}

isalnum() : 매개변수가 알파벳 문자이거나 숫자이면 true
isalpha() : 매개변수가 알파벳 문자이면 true
isblank() : 매개변수가 공백 또는 수평 탭 문자이면 true
iscntrl() : 매개변수가 제어 문자이면 true
isdigit() : 매개변수가 십진 숫자이면 true
isgraph() : 매개변수가 공백 아닌 인쇄 가능한 문자이면 true
isprint() : 매개변수가 공백을 포함하여 인쇄 가능한 문자이면 true
islower() : 매개변수가 소문자이면 true
isupper() : 매개변수가 대문자이면 true
ispunct() : 매개변수가 구두점 문자이면 true
isspace() : 매개변수가 표준 화이트스페이스에 포함되는 문자이면 true
isxdigit() : 매개변수가 16진 숫자이면 true
toupper() : 매개변수가 소문자이면 대문자로 바꾸어 리턴, 아니면 그대로 리턴
tolower() : 매개변수가 대문자이면 소문자로 바꾸어 리턴, 아니면 그대로 리턴



6.4 ?: 연산자

// condit.cpp

#include <iostream>

int main()
{
	using namespace std;
	int a, b;
	
	cout << "두 개의 정수를 입력하십시오 : ";
	cin >> a >> b;
	cout << "둘 중에서 더 큰 정수는 ";
	int c = a > b ? a : b;
	cout << c << "입니다.\n";
	return 0;
}

?! : 조건 연산자로 피연산자를 3개 사용하는 유일한 연산자임

  • expression1 ? expression2 : expression3 형태로 사용
  • 표현식1이 true이면 표현식2가 전체 조건 표현식의 값이 됨
  • 표현식1이 false면 표현식3이 전체 조건 표현식의 값이 됨

조건 연산자는 하나의 표현식을 만들지만, 코드가 복잡해질 경우 if else 구문을 사용하는 것이 의도를 더 명확하게 나타낼 수 있음



6.5 switch 구문

switch (integer-expression)
{
	case label1 : statements
	case label2 : statements
	...
	default : statements
}

switch : if else if else 구조를 길게 확장하는 대신 사용 가능

  • switch구문에 도달하면 integer-expression에 해당하는 값이 있는 label으로 프로그램이 점프함
  • 레이블은 단순한 int형 또는 char형 상수
  • interger-expression에 대응하는 레이블이 없으면 default 행으로 이동하고, default를 생략했을 경우에는 switch 구문을 빠져나와 다음 구문으로 이동함
  • 특정 레이블로 이동하면 그 행 이후의 모든 구문들을 순차적으로 수행하기 때문에 break구문을 적절하게 설정해주어야 함
// switch.cpp

#include <iostream>
using namespace std;
void showmenu();
void report();
void comfort();

int main()
{
	showmenu();
	int choice;
	cin >> choice;
	while (choice != 5)
	{
		switch (choice)
		{
			case 1 :	cout << "\a\n";
							break;
			case 2 :	report();
							break;
			case 3 :	cout << "사장님은 오늘 회사에 계셨습니다.\n";
							break;
			case 4 :	comfort();
							break;
			default : 	cout << "그것은 선택할 수 없습니다.\n";
		}
		showmenu();
		cin >> choice;
	}
	cout << "프로그램을 종료합니다!\n";
	return 0;
}

void showmenu()
{
	cout << "1, 2, 3, 4, 5번 중에서 하나를 선택하십시오:\n"
			"1) 경고음		2) 보고서\n"
			"3) 알리바이	4) 격려사\n"
			"4) 종료\n";
}

void report()
{
	cout << "이번 분기는 경영 실적이 아주 좋습니다.\n"
			"판매량은 120% 늘어났고, 비용은 35% 줄었습니다.\n";
}

void comfort()
{
	cout << "사원들은 당신을 업계 최고의 CEO라고 생각하고있습니다.\n"
			"이사회도 당신을 업계 최고의 CEO라고 생각하고있습니다.\n";
}

레이블로 열거자 사용하기

// enum.cpp

#include <iostream>
enum {red, orange, yellow, green, blue, violet, indigo};

int main()
{
	using namespace std;
	cout << "컬러 코드(0,1,2,3,4,5,6)를 입력하십시오 : ";
	int code;
	cin >> code;
	while (code >= red && code <= indigo)
	{
		switch (code)
		{
			case red	: cout << "입술은 붉었습니다.\n"; break;
			case orange	: cout << "머리카락은 귤색이었습니다.\n"; break;
			case yellow	: cout << "신발은 노란색이었습니다.\n"; break;
			case green	: cout << "손톱은 초록색이었습니다.\n"; break;
			case blue	: cout << "스웨터는 파란색이었습니다.\n"; break;
			case violet	: cout << "눈은 보라색이었습니다.\n"; break;
			case indigo	: cout << "분위기는 쪽빛이었습니다.\n"; break;
		}
		cout << "컬러 코드(0,1,2,3,4,5,6)를 입력하십시오 : ";
		cin >> code;
	}
	cout << "프로그램을 종료합니다.\n";
	return 0;
}

일반적으로 cin은 열거체를 인식하지 않으므로 사용자가 선택 사항을 입력하면 int값을 읽어들임
해당 int값을 switch구문이 case의 레이블과 비교할 때 열거자가 int형으로 승급됨


switch와 if else

switch 구문은 값의 범위를 다룰 수 없고, 반드시 레이블이 int형이어야 함
그러나 모든 선택 사항들이 정수형 상수로 인식 가능하고, 선택 사항의 수가 2개보다 많다면 switchif else보다 코드 크기나 실행 속도 면에서 훨씬 효율적임



6.6 break와 continue 구문

// jump.cpp

#include <iostream>
const int ArSize = 80;

int main()
{
	using namespace std;
	char line[ArSize];
	int spaces = 0;

	cout << "한 행의 텍스트를 입력하십시오 : \n";
	cin.get(line, ArSize);
	cout << "전체 텍스트 : \n" << line << endl;
	cout << "첫 마침표까지의 텍스트 : \n";
	for (int i = 0; line[i] != '\0'; i++)
	{
		cout << line[i];
		if (line[i] == '.')
			break;
		if (line[i] != ' ')
			continue;
		spaces++;
	}
	cout << "\n빈칸 문자는 " << spaces << "개입니다.\n";
	cout << "종료.\n";
	return 0;
}

break : switch 구문 및 모든 종류의 루프에 사용 가능, 해당 구문을 종료함
continue : 루프에만 사용 가능, 루프 몸체의 나머지를 무시하고 새로운 루프 주기를 시작시킴



6.7 수를 읽어들이는 루프

// cinfish.cpp

#include <iostream>
const int Max = 5;

int main()
{
	using namespace std;
	double fish[Max];
	cout << "오늘 낚은 물고기의 무게를 입력하십시오.\n";
	cout << "물고기는 최대 " << Max << "마리까지 낚을 수 있습니다.\n"
		 << "<입력을 끝내려면 q를 누리십시오.>\n";
	cout << "fish #1 : ";
	int i = 0;
	while (i < Max && cin >> fish[i])
	{
		if (++i < Max)
			cout << "fish #" << i+1 << " : ";
	}

	double total = 0.0;
	for (int j = 0; j < i; j++)
		total += fish[j];
	
	if (i == 0)
		cout << "물고기를 한마리도 낚지 못하셨군요.\n";
	else
		cout << "물고기 " << i << "마리의 평균 무게는 "
			 << total / i << "그램입니다.\n";
	cout << "프로그램을 종료합니다.\n";
	return 0;
}

cin으로 숫자형 변수에 입력을 받을 때사용자가 수를 입력하는 대신 단어를 입력할 경우

  • 변수의 값은 변하지 않음
  • 입력 큐에 잘못된 입력이 그대로 유지됨
  • cin 객체의 에러 플래그가 설정됨
  • cin 메서드 호출이 false(bool형으로 변한될 시)를 리턴함
// cingolf.cpp

#include <iostream>
const int Max = 5;

int main()
{
	using namespace std;
	int golf[Max];
	cout << "골프 점수를 입력하십시오.\n";
	cout << "총 " << Max << " 라운드 점수를 입력해야합니다.\n";
	int i;
	for (i = 0; i < Max; i++)
	{
		cout << "round #" << i+1 << " : ";
		while (!(cin >> golf[i]))
		{
			cin.clear();
			while (cin.get() != '\n')
				continue;
			cout << "골프 점수를 입력하십시오 : ";
		}
	}

	double total = 0.0;
	for (i = 0; i < Max; i++)
		total += golf[i];
	cout << "총 " << Max << "라운드의 평균 점수 = "
		 << total / Max << endl;
	return 0;
}

잘못된 데이터가 입력되었을 경우

  • cin.clear()를 통해 cin을 초기화하여 다시 입력을 받을 수 있도록 함
  • while문에서 cin.get()을 사용하여 입력 큐에 남아있는 불량 입력을 제거
  • 사용자에게 다시 입력할 것을 요구


6.8 간단한 파일 입력/출력

텍스트 I/O와 텍스트 파일

cin 사용시 프로그램은 입력을 연속된 바이트들로 인식
각각의 바이트는 하나의 문자 코드로 해석되며, 목적지 데이터형이 무엇이든지 간에 입력은 텍스트 데이터로 시작함
이후 cin 객체가 텍스트를 다른 데이터로 변환함

38.5 19.2를 입력할 경우

  • char ch; cin >> ch; : ch에는 숫자 3에 해당하는 문자 코드가 대입되고, 입력 큐에는 다음 문자인 숫자 8이 남음
  • int ch; cin >> ch; : 숫자가 아닌 첫 문자가 나올 때까지 읽기 때문에 38을 읽고 소수점을 입력 큐로 남겨둠
  • double x; cin >> x; : 부동소수점 수의 일부가 아닌 첫 문자가 나올때까지 읽기 때문에 38.5를 읽고 다음 문자인 공백을 입력 큐에 남겨둠
  • char word[50]; cin >> word; : 공백 문자가 나올때까지 읽기 때문에 38.5를 읽어 배열에 저장하고 끝에 널 문자를 추가한 뒤 다음 문자인 공백을 입력 큐에 남겨둠
  • char word[50]; cin.getline(word,50); : 개행 문자가 나올때까지 읽기 때문에 마지막 숫자 2까지의 모든 문자들을 읽어 배열에 저장하고 끝에 널 문자를 추가한 뒤 개행 문자는 폐기함

콘솔 입력과 텍스트 파일을 통한 입력은 동등함


텍스트 파일에 쓰기

C++는 파일 출력을 cout과 비슷한 방식으로 처리

  • fstream 헤더 파일을 포함시켜야 함
  • fstream 헤더 파일은 출력을 처리하는 ofstream 클래스를 정의함
  • 하나 이상의 ofstream 변수 또는 객체를 선언해야하고, 이 때 사용자가 원하는 이름을 지정할 수 있음
  • std 이름 공간을 지정해야 함
  • 특정 ofstream 객체와 특정 파일을 연결시켜야 하며, 이는 open() 메서드를 사용하는 방식 등을 활용함
  • 파일을 다루는 작업이 끝나면 close() 메서드로 해당 파일을 닫아야 함
  • ofstream 객체를 << 연산자와 함께 사용하여 다양한 유형의 데이터를 출력할 수 있음
// outfile.cpp

#include <iostream>
#include <fstream>

int main()
{
	using namespace std;

	char automobile[50];
	int year;
	double a_price;
	double d_price;

	ofstream outFile;
	outFile.open("carinfo.txt");

	cout << "자동차 메이커와 차종을 입력하시오 : ";
	cin.getline(automobile, 50);
	cout << "연식을 입력하시오 : ";
	cin >> year;
	cout << "구입 가격을 입력하시오 : ";
	cin >> a_price;
	d_price = 0.913 * a_price;

	cout << fixed;
	cout.precision(2);
	cout.setf(ios_base::showpoint);
	cout << "메이커와 차종 : " << automobile << endl;
	cout << "연식 : " << year << endl;
	cout << "구입 가격 $" << a_price << endl;
	cout << "현재 가격 $" << d_price << endl;

	outFile << fixed;
	outFile.precision(2);
	outFile.setf(ios_base::showpoint);
	outFile << "메이커와 차종 : " << automobile << endl;
	outFile << "연식 : " << year << endl;
	outFile << "구입 가격 $" << a_price << endl;
	outFile << "현재 가격 $" << d_price << endl;
	outFile.close();
	return 0;
}

open()시 이미 같은 이름의 파일이 존재할경우 원래 있던 파일을 삭제하고 새로 생성함
ofstream 객체를 설정한 후, cout과 정확히 같은 방식으로 사용할 수 있음


텍스트 파일 읽기

파일 입력 또한 콘솔 입력과 유사함

  • fstream 헤더 파일을 포함시켜야 함
  • fstream 헤더 파일은 입력을 처리하는 ifstream 클래스를 정읳마
  • 하나 이상의 ifstream 변수 또는 객체를 선언해야하고, 이 때 사용자가 원하는 이름을 지정할 수 있음
  • std 이름 공간을 지정해야 함
  • 특정 ifstream 객체와 특정 파일을 연결시켜야 하며, 이는 open() 메서드를 사용하는 방식 등을 활용함
  • 파일을 다루는 작업이 끝나면 close() 메서드로 해당 파일을 닫아야 함
  • ifstream 객체를 get() 메서드와 함께 사용하여 개별 문자들을 읽을 수 있고, getline() 메서드와 함께 사용하여 한번에 한 행의 문자들을 읽을 수도 있음
  • ifstream 객체에 eof()fail()같은 메서드를 사용해 입력시 시도가 성공했는지 감시할 수 있음
  • ifstream 객체 자체가 검사 조건으로 사용될 시 마지막 읽기 시도가 성공이면 true, 실패면 false로 변환됨
// sumafile.cpp

#include <iostream>
#include <fstream>
#include <cstdlib>
const int SIZE = 60;

int main()
{
	using namespace std;
	char filename[SIZE];
	ifstream inFile;

	cout << "데이터 파일의 이름을 입력하시오 : ";
	cin.getline(filename, SIZE);
	inFile.open(filename);
	if (!inFile.is_open())
	{
		cout << filename << " 파일을 열 수 없습니다." << endl;
		cout << "프로그램을 종료합니다.\n";
		exit(EXIT_FAILURE);
	}
	double value;
	double sum = 0.0;
	int count;

	inFile >> value;
	while (inFile.good())
	{
		++count;
		sum += value;
		inFile >> value;
	}
	if (inFile.eof())
		cout << "파일 끝에 도달했습니다.\n";
	else if (inFile.fail())
		cout << "데이터 불일치로 입력이 종료되었습니다.\n";
	else
		cout << "알 수 없는 이유로 입력이 종료되었습니다.\n";

	if (count == 0)
		cout << "데이터가 없습니다.\n";
	else
	{
		cout << "읽은 항목의 개수 : " << count << endl;
		cout << "합계 : " << sum << endl;
		cout << "평균 : " << sum / count << endl;
	}
	inFile.close();
	return 0;
}

ifstream 객체를 선언하고 파일에 연결한 후에는 cin과 동일한 방식으로 사용 가능함
is_open() 메서드는 파일이 성공적으로 열리면 true, 실패하면 false를 리턴함
exit()함수는 프로그램을 종료하는데 사용하는 함수로 cstdlib 헤더파일에 원형이 있으며 매개변수 값으로 EXIT_FAILURE를 정의함

  • eof() 메서드는 마지막 읽기 시도에서 EOF 도달하면 true를 리턴
  • fail() 메서드는 마지막 읽기 시도에서 데이터형 불일치를 만나면 true를 리턴
  • bad() 메서드는 마지막 읽기 시도에서 파일 깨짐, 하드웨어 실패 등의 문제를 만날시 true를 리턴
  • good() 메서드는 위의 모든 경우들을 포함하여 아무런 문제가 없으면 true를 리턴


연습문제

  1. 버전2는 처음 if문의 조건에 부합할경우 뒤의 else if문은 검사하지 않고 넘어가기 때문에 속도가 더 빠름
  2. 정수형으로 출력됨
  3. H$i$!$ 
    $S$e$n$d$ $ctl = 9, ct2 = 9
  4. a) weight >= 115 && weight < 125
    b) ch == q || ch == Q
    c) x % 2 == 0 && x != 26
    d) x % 2 == 0 && x % 26 != 0
    e) (donation >= 1000 && donation <= 2000) || guest == 1
    f) (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')
  5. x가 bool형 변수일 경우에만 같음
  6. (x >= 0) ? x : -x
  7. switch (ch)
    {
    	case 'A' : a_grade++;
    			break;
    	case 'B' : b_grade++;
    			break;
    	case 'C' : c_grade++;
    			break;
    	case 'D' : d_grade++;
    			break;
    	default : f_grade++;
    			break;
    }
  8. 정수 레이블 사용시 cin으로 정수형이 아닌 것을 입력받으면 프로그램이 정상적으로 진행되지 않음
    그러나 문자 레이블을 사용시 정수형 수가 입력받아지더라도 cin이 문자로 처리하여 정상적으로 작동됨
  9.  
int line = 0;
char ch;
while (cin.get(ch) && ch != 'Q')
{
	if (ch == '\n')
		line++;
}

'개인공부 > C++ 기초플러스' 카테고리의 다른 글

C++ Primer 07  (0) 2023.02.19
C++ Primer 06 Exercise  (0) 2023.02.18
C++ Primer 05 Exercise  (0) 2023.02.18
C++ Primer 05  (0) 2023.02.18
C++ Primer 04 Exercise  (0) 2023.02.18

댓글