달력

62025  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30


■ if명령문
하나의 특정한 행동을 수행할 것인지 말것인지 선택해야 할때는 if명령문을 사용한다. if명령문에는 if와 if else가 있다.
if명령문은 조건을 평가한 결과가 참이면 그 다음에오는 하나의 명령문 또는 명령문 블록을 수행하고,
결과가 거짓이면 그것들을 무시하고 건너 뛴다.
if명령문의 구문은 while명령문의 구문과 비슷하다.

if(test-condition)
   statement


test-condition이 참으로 평가되면 statement를 수행한다. statement는 단일명령문또는 블록이 될수 있다.
test-condition이 거짓으로 평가되면 statement를 무시하고 건너뛴다.


●if else명령문
if명령문은 하나의 특정명령문 또는 블록을 수행할것인지 말것인지를 프로그램이 결정한다.
이에 비해 if else명령문은 두개의 명령문 또는 블록중에서 어느 쪽을 수행할 것인지를 프로그램이 결정한다.
if else명령문은 서로 다른 작업 경로를 선택하게 만드는 유용한 명령문이다.
if else 명령문 구문은 다음과 같다.

if(test-condition)
   statement1
else
   statement2

if else 명령문은 test-condition이 참이면 statement1을 수행하고, test-condition이 거짓이면 statement2를 수행한다.
따라서 프로그램의 코드 단편은 다음과 같이 사용한다.

if(answer == 1492)
   cout<<"정답입니다!"<<endl;
else
   cout<<"1장을 다시 읽는것이 좋겠습니다"<<endl;

answer이면 첫번째 메세지를 출력하고, 그렇지 않으면 두번째 메세지를 출력한다.

●if else if esle 구문

if( ch  == 'A')
  a_grade ++;        //선택1
else if(ch == 'B')
  b_grade++;        //선택2
else 
  soso++;           //선택3

ch가 A이면 a_grade 를 ++하고 ch가 B이면 b_grade를 ++하고 A도B도 아니면 else인 soso를 ++함


■논리 표현식
하나 이상의 조건을 검사해야할 경우사용.
 ●논리 OR 연산자(||)
    - 영어에서의 or과 동일하다. 두개의 표현식중에서 적어도 하나가 true이거나 0이 아니면 전체 표현식이 true가 된다.
        5==5 || 5==10  ▶True
        5>8  || 5<10   ▶True
        5>8  || 5>10   ▶False

C++에서 || 연산자는 시퀀스 포인터로 작용한다.
좌변에 지시된 값의 변경은 우변이 평가되기 전에 일어난다.

i++<6  || i==j

처음에 i에 10이 들어있다고 가정한다면, j와 비교가 이뤄질떄는 i는 11로 변해있다. 어느 하나의 표현식이 true이면
전체 논리 표현식이 true가되므로, C++는 좌변의 표현식이 true일 경우에 우변의 표현식은 평가하지도 않는다.



●논리 AND 연산자 (&&)
  &&로 나타내는 논리곱 연산자도 두개의 표현식을 하나로 결합한다. 두개의 표현식이 모두 true일때만 전체 표현식이 true가
  된다.
        5==5 && 5==10  ▶ False
        5>8  &&5<10    ▶False
        5>8  && 5>10   ▶False
        5==5 && 5<10   ▶True



●논리부정 NOT 연산자(!)
!연산자는 뒤따르는 표현식의 값을 반대로 만든다. expression이 true이면 !expression은 false가 된다.
!는 Bang라고 부른다.

if(!(x>5))          //(x<=5)가 더 명확하다.

!연산자를 사용하지않고도 더 명확하게 관계를 표현할수 있다. 그러나 ! 연산자는 true/false값을 리턴하는 함수와 함께
사용한다면 매우 유용하다. strcmp(s1,s2)는 두개의 c스타일 문자열 s1과 s2가 서로 다르면 0이 아닌값(true)를 리턴하고,
같으면 0을 리턴한다. 따라서 !strcmp(s1,s2)는 두 문자열이 같을경우에 true가 된다.


■문자 함수를 위한 cctype 라이브러리
문자 관련 함수들의 원형은 cctype에 정의되어있다. 그 함수들은 어떤 문자가 대문자인지, 숫자인지, 구두점ㅇ 문자인지 등을 판별하는 작업들을 간단하게 처리한다.예를 들어 isalpha(ch) 함수는 ch가 알파벳문자이면 0이 아닌값을, 그렇지 않으면 0을 
리턴한다.그리고 ispunct(ch)는 ch가 콤마나 마침표와 같은 구두점 문자이면 참값을 리턴한다.

if((ch>='a' && ch <= 'z') || (ch >= 'A' && ch<= 'Z'))

위함수식을 isalpha()함수를 사용하여 구현하면,
if(isalpha(ch)) 가된다.
cctype계열에 속하는 몇가지 문자 관련 함수중,
알파벳문자인지 판별하는 isalpha(),숫자인지 판별하는 isdigit().개행문자,빈칸문자, 탭문자와 같은 화이트 스페이스인지 판별하는 isspace(),구두점 문자인지 판별하는 ispunct()등이 있다.

 함수이름 리턴값
 isalnum() 전달인자가 영숫자, 알파벳이거나 숫자이면 true
 isalpha() 전달인자가 알파벳이면 true
 isblank() 전달인자가 빈칸문자 또는 수평 탭문자이면 true
 iscntrl() 전달인자가 제어 문자이면 true
 isdigit() 전달인자가 십진숫자이면(0~9) true
 isgraph() 전달인자가 빈칸이 아닌 인쇄할수 있는문자면 true
 islower() 전달인자가 소문자이면 true
 isprint() 전달인자가 빈칸을 포함하여 인쇄할수있는 문자면 true
 ispunct() 전달인자가 구두점 문자이면 true
 isspace() 전달인자가빈칸,개행,캐리지리턴,수평탭,수직탭 문자면true
 isupper() 전달인자가 대문자이면 true
 isxdigit() 전달인자가 16진수이면 true
 tolower() 전달인자가 대문자면 소문자로 바꿔리턴, 그렇지 않으면 
전달인자를 변경하지 않고 그대로 리턴한다.
 toupper() 전달인자가 소문자이면 대문자로 바꾸어 리턴,그렇지 않으면
전달인자를 변경하지 않고 그대로 리턴.


■?: 연산자
C++에서는 if else 명령문대신에 사용할수 있는 연산자를 제공한다.
?:로 표기하는 이연산자를 조건 연산자라 부른다. 조건연산자는 C++에서 피연산자를 3개 사용하는 유일한 연산자이다. 
일반적인 사용 형식은 다음과 같다.

expression1 ? expression2 : expression3



■switch 명령문
다음 switch 명령문을 사용하는 기본형식이다.

switch(integer-expression)
   case label1: statement(s)
   case label2: statement(s)
    ...
   default    :statement(s)


switch 명령문은 다음에 수행할 명령문이 어느행인지 알려주는 경로 결정기처럼 행동한다. switch 명령문에 도달하면 
intger-expression의 값에 해당하는 레이블이 붙어있는 행으로 프로그램이 점프한다.
intger-expression은 그이름이 의미하듯이 하나의 정수값이 될수 있는 표현식이다. 또한 각 레이블은 정수 상수 표현식이다.
대부분의 경우에, 레이블은 1이나 'q'또는 열거자 처럼 단순한 int또는 char형 상수이다. integer-expression에 대응하는
레이블이 없으면 default라는 레이블이 붙어있는 행으로 프로그램이 점프한다. defalut레이블은 생략할수 있다.
default를 사용하지않고 대응되는 레이블도 없을때는 switch명령문은 다음에 오는 명령문으로 프로그램이 점프한다.
각각의 case레이블은 행 레이블로만 작용하고, 선택의 경계로는 작용하지않는다. 따라서, 프로그램이 switch의 특정 행으로 점프하면 명시적으로 흐름을 제어하지않는 한 그 행 이후의 모든 명령문들을 순차적으로 수행한다.
다시말해서, 다음 case가 있는 위치에서 수행을 자동으로 멈추지 않는다. 특정 명령문들을 집합을 처리한후 수행을
멈추게 하려면 특정 명령문들의 집합끝에 break 명령문을 사용한다. break 명령문은 switch명령문 바로 뒤에 오는 명령문
으로 프로그램을 점프시킨다.


●레이블로 열거자 사용하기
   일반적으로 cin은 열거체를 인식하지않는다. 그러므로 프로그램은 사용자가 선택 사항을 입력하면 그것을 int값으로 읽어 
   들인다. int값을 switch 명령문이 열거자중의 하나에 대응하는 case 레이블과 비교할때, 열거자가 int형으로 승급된다.
   또한 열거자들은 while루프 조건 검사에서도 int형으로 승급된다.


●switch 와 if else
   if else 는 값의 범위를 다룰수 있다.

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;

한편, switch명령문은 값의 범위를 다룰수 없다. switch의 각 case 레이블은 단일 값이어야한다. 또한 그값이 (char형을 포함한)int형이어야 한다. 그래서 switch명령문은 부동 소수점수의 조건 검사 처리를 할수 없다. 그리고 case레이블 의 값도 상수
여야 한다. 따라서 값의 범위를 포함하는 경우나, 부동소수점 수의 조건 검사, 두개의 변수를 비교할때는 if else를 사용해야한다.
그러나 모든 선택 사항들이 정수형 상수로 인식될수 있다면, switch나 if else 를 둘다 사용할수 있다. switch명령문은 바로
이러한 상황을 처리하기 위해 설계된 것이기 때문에, 일반적으로 선택사항의 수가 2개가 아니라면 switch가 코드 크기나
실행속도면에서 if else 보다 훨씬 효율적이다.

■break와 continue명령문
break와 continue 명령문은 프로그램이 코드의 일부를 무시하고 건너뛰게 만든다. break 명령문은 switch 명령문과, 모든 
종류의 루프에 사용할수 있다. break는 switch나 루프의 바로 뒤에 오는 명령문을 실행하도록 만든다.
continue 명령문은 루프에만 사용할수 있다. continue는 루프 몸체의 나머지를 무시하고, 새로운 루프 주기를 시작하게 만든다.


■수를 읽어 들이는 루프

int n;
cin>>n;

위경우 사용자가 수를 입력하는 대신에 단어를 입력한다면 네가지 일이 벌어진다.
ⓐn의값은 변하지않는다.
ⓑ입력 큐에 잘못된 입력이 그대로 유지된다.
ⓒcin 객체의 에러 플래그가 설정된다.
ⓓcin메서드 호출이 false(bool형으로 변환된다면)를 리턴한다.
cin메서드가 false를 리턴한다는 사실은, 수를 읽어들이는 루프를 종료시키기 위해 수가 아닌 입력을 사용할수 있다는 것을 
의미한다. 또한 수가 아닌 입력이 에러 플래그를 설정한다는 사실은, 프로그램이 다시 입력을 받기 전에 그 에러 플래그를 
초기화 해야한다는 것을 의미한다. 파일끝(EOF) 조건을 초기화하는 clear()메서드는 불량입력 플래그도 초기화한다.


*불량입력제거
사용자가 잘못된 데이터를 입력했다는 사실을 프로그램이 알게 된다고 가정하면, 프로그램은 다음과 같은 세단계를 취할 필요
가있다.
ⓐ새로운 입력을 받아 들일수 있도록 cin을 초기화한다.
ⓑ입력 큐에 남아있는 불량 입력을 제거한다.
ⓒ사용자에게 다시 입력할것을 요구한다.
불량입력을 제거하기 전에 프로그램은 먼저 cin을 초기화 해야한다.


■간단한 파일 입/출력
  C++에서는 키보드 입력과 디스플레이 출력에서 배운 기술을 파일 입력과 출력 파일(I/O)에 적용하는것이 간단하다.
  ●텍스트 I/O와 텍스트 파일
    입력을 위해 cin을 사용할때, 프로그램은 그 입력을 연속된 바이트들로 인식한다. 이때 각각의 바이트는 하나의문자
    코드로 해석된다. 목적지 데이터형이 무엇이든지 간에, 그 입력은 문자 데이터, 즉 텍스트 데이터로 시작한다. 그러고나서
    cin객체가 텍스트를 다른 데이터형으로 변환하는 책임을 맡는다. 이것이 어떻게 동작하는지 보기 위하여, 서로다른 코드가 
    동일한 입력행을 어떻게 처리하는지 보자. 샘플 입력행은 다음과 같다.

38.5     19.2

cin이 동일한 입력 행을 서로 다른 데이터형에 어떻게 처리하는지 살펴보자.
먼저.char형

char ch;
cin>>ch;

입력 행에 있는 첫문자가 ch에 대입된다. 이경우에, 첫문자는 숫자3이고, 이숫자에 해당하는 문자 코드가(바이너리로)ch에
대입된다. 입력과 목적지가 둘다 문자다. 그래서 따로 변환이 필요없다. (저장되는것이 수치 값 3이 아니라는것에 주의.
그것은 숫자3에 해당하는 문자코드이다) 그입력 명령문이 끝난후에, 입력 큐에있는 다음 문자 숫자는 8이고, 그것이 다음입력
동작이 적용되는 대상이다.
다음에,int형으로 시도해보자.

int n;
cin>>n;

이경우에, cin은 숫자가 아닌 첫문자가 나올때까지 읽는다. 즉, 숫자3과 숫자8을 읽고, 다음에 읽을 문자로 소수점을 입력큐에 남겨둔다. 그러고 나서 cin은 이 두문자가 수치값 38에 해당한다고 계산하고, 38에 해당하는 바이너리 코드를 n에 대입한다.
다음은,double형

double x;
cin>>x;

이경우에, cin은 부동소수점 수의 일부가 아닌 첫문자가 나올때까지 읽는다. 즉, 숫자3,숫자8,소수점(.)문자,숫자5를 읽고,
다음에 읽을 문자로 빈칸을 입력 큐에 남겨둔다. 그러고 나서 cin은 이 네문자가 수치값 38.5에 해당한다고 계산하고,
38.5에해당하는 바이너리코드(부동소수점 형식)를 x에 복사한다.
다음은,char형 배열

char word[50];
cin>>word;

이경우, cin은 빈칸 문자가 나올때까지 읽는다. 즉, 숫자3,숫자8,소수점문자(.), 숫자5를 읽고, 다음에 읽는 문자로 빈칸을 입력 큐에 남겨둔다. 그리고나서 cin은 이 네문자에 해당하는 문자 코드들을 배열 word에 저장하고, 끝에 널문자를 추가한다.변환은 필요없다.
끝으로, char형 배열에 대해 다른 방식의 입력으로 시도해보자.

char word[50];
cin.getline(word,50);

이경우, cin은 개행 문자가 나올때까지 읽는다. 마지막 숫자 2까지의 모든 문자들을 배열 word에 저장하고, 끝에 널 문자를
추가한다. 개행 문자는 폐기한다. 다음 행의 첫문자가 입력큐에서 다음에 읽을 문자가 된다. 변환은 필요없다.

출력에서는 정반대의 변환이일어난다. 즉,정수들이 숫자 문자들의 시퀀스로 변환되고, 부동소수점 수들이 숫자 문자와 기타 문자들의 시퀀스로(예를들면 284,53또는 -1.587E+06)변환된다. 문자데이터는 변환이 필요없다.
여기서 중요한점은, 모든 입력이 텍스트로 시작한다는것이다. 그러므로, 콘솔 입력과 동등한 파일도 텍스트 파일이다.

●텍스트 파일에 쓰기
  -iostream헤더파일을 포함시켜야한다.
  -iostream헤더 파일은 출력을 처리하는 ostream클래스를 정의한다.
  -iostream헤더 파일은 cout이라는 ostream변수 또는 객체를 선언한다.
  -std이름 공간을 지정해야한다. cout과 enld과같은 요소들을 사용하기 위해 using지시자 또는 std::접두사를 사용할수있다.
  -cout을  << 연산자와 함께 사용하여 다양한 유형의 데이터를 출력할수 있다.

파일출력은 이와 매우 비슷한 방식으로 처리된다.
   -fstream헤더 파일을 포함시켜줘야한다.
   -fstream헤더 파일은 출력을 처리하는 ofstream클래스를 정의한다.
   -하나이상의 ofstream변수 또는 객체를 선언할필요가있다. 일반적인 이름짓기 관례를 준수하는 한, 사용자는 원하는이름을
    지정할수 있다.
   -std 이름 공간을 지정해야한다. ofstream과 같은 요소들에 대해 using지시자 또는 std::접두사를 사용할수있다.
   -특정ofstream객체와 특정파일을 연결시킬 필요가있다. 그렇게 하는 한가지 방법은, open()메서드를 사용하는것이다.
   -ofstream 객체를 << 연산자와 함께 사용하여 다양한 유형의 데이터를 출력할수있다.

iostream헤더파일이 cout이라는 미리정의된 ostream객체를 제공할지라도, 사용자 자신의 ofstream객체를 선언하고, 그것에 적당한 이름을 부여하고, 그것을 파일과 연결시켜야 한다는것에 주의해야한다.

ofstream outFile;       //outFile은 ofstream 객체
ofstream foutl           //fout은 ofstream객체


객체를 특정파일에 연결하는 방법은 다음과 같다.

outFile.open("fish.txt");     //fish.txt에 쓰는데 outFile사용
char filename[50];
cin >> filename;              //사용자가 이름을 지정한다.
fout.open(filename);        //지정된 파일을 읽는데 fout사용


open()메서드는 전달인자로 C스타일 문자열을 요구한다. 리터럴 문자열이나 배열에 저장된 문자열을 전달인자로 사용할수 있다. 객체를 사용하는 방법은 다음과 같다.

double wt=125.8;
outFile << wt;          //fish.txt에 하나의 수를 쓴다.
char line[81] = "Objects are closer than they appear.";
fin<<line<<endl;     //한 행의 텍스트를 쓴다.

여기서 중요한 점은, ofstream객체를 선언하고, 그것을 파일에 연결한후에, 그것을 cout과 동일한 방식으로 사용한다는 것이다. cout에 사용할수 있는 <<. endl, setf()과 같은 모든 동작과 메서드들은, 앞의 outFile과 fout과 같은 ostream객체를
사용할수 있다.

파일출력을 사용하는 기본절차는 다음과 같다.
ⓐfstream 헤더 파일을 포함시킨다.
ⓑofstream 객체를 생성한다
ⓒofstream 객체를 파일에 연결한다
ⓓofstream 객체를 cout과 동일한 방식으로 사용한다.


●텍스트 파일 읽기
   -fstream헤더 파일을 포함시켜야한다
   -fstream헤더 파일은 입력을 처리하는 ifstream클래스를 정의한다.
   -하나 이상의 ifstream변수 또는 객체를 선언할 필요가 있다. 일반적인 이름짓기 관례를 준수하는한, 사용자가 원하는
    이름을 지정할수 있다.
   -std이름 공간을 지정해야한다. ifstream과 같은 요소들을 사용하기 위해 using지시자 또는 std::접두사를 사용할수 있다.
   -특정 ifstream 객체와 특정파일을 연결시킬 필요가 있다. 그렇게 하는 한가지 방법은 open()메서드를 사용하는것이다.
   -파일을 다루는 작업이 끝나면, close() 메서드를 사용하여 그 파일을 닫아야한다.
   -ifstream객체를 >>연산자와 함께 사용하여 다양한 유형의 데이터를 읽을수 있다.
   -ifstream객체를 get()메서드와 함께 사용하여, 개별적인 문자들을 읽을수 있다.
    ifstream객체를 getline()메서드와 함께사용하여, 한번에 한행의 문자를 읽어들일수도있다.
   -ifstream객체를 eof()과 fail()과 같은 메서드와 함께 사용하여, 입력시도가 성공했는지 감시할수있다.
   -ifstream객체 자체가 검사조건으로 사용되었을때, 마지막 읽기 시도가 성공이면 bool값 true로 변환,아니면 false

※객체를 선언 하는 방법

ifstream inFile;     //inFile은 ifstream객체
ifstream fin;         //fin은 ifstream객체

※객체를 특정 파일에 연결하는 방법

inFile.open("bowling.txt");    //bowling.txt파일을 읽는데 inFile사용
char filename[50];
cin>>filename;                   //사용자가 이름을 지정
fin.open(filename);             //지정된 파일을 읽는데 fin사용


open()메서드는 전달인자로 C스타일 문자열을 요구한다. 리터럴 문자열이나 배열에 저장된 문자열을 전달인자로 사용할수 있다. 사용방법은 다음과 같다.

double wt;
inFile >> wt;           //bowling.txt에서 하나의 수를 읽는다.
char line[81];
fin.getline(line,81);   //한행의 텍스트를 읽는다.

ifstream객체를 선언하고 그것을 파일에 연결한후에, 그것을 cin과 동일한 방식으로 사용한다. cin에서 사용할수 있는 모든 
동작과 메서드들을, inFile과 fin같은 ifstream객체에 사용할수 있다.
어떤파일이 성공적으로 열렸는지 확인하는 방법은 is_open()메서드를 사용하는것이다.

inFile.open("bowling.txt");
if(!inFile.is_open())
{
   exit(EXIT_FAILURE);
}

is_open 메서드는 파일이 성공적으로 열렸으면 true를 리턴한다. 표현식 !inFile.is_open()은 그시도가 실패하면 true를
리턴한다. exit()함수는 cstdlib헤더 파일에 원형이있다. 운영체제와 커뮤니케이션하는데 사용하는 전달인자값으로 EXIT_FAILURE를 정의한다.exit()함수는 프로그램을 종료한다.




================================요   약===============================================
C++에서는 선택을 다루는 도구로 if명령문,if else명령문,switch명령문을 제공한다. if명령문은 단일 명령문이나, 명령문 블록을 조건에 따라 수행하게 만든다. 이것은 특정한 조건이 만족될 떄에만 그 단일 명령문이나 명령문블록을 수행한다는 말이다.
if else명령문은 두개의 단일 명령문이나 명령문 블록 중에서 어느것을 실행할것인지 선택하게 만든다. 여러가지 선택사항중에
선택하게 하려면, 그와 같은 하나의 if else명령문에 원하는 만큼의 if else 를 추가할수 있다. switch명령문은 선택 사항의 
목록에서 하나의  특정한 경우를 선택하게 만든다.
if와 if else명령문은 일반적으로 관계 연산자를 사용하여 조건을 검사한다. 논리연산자(&&,||,!)를 사용하여 관계 표현식들을 결합 하거나 수정하여 더욱 정교한 조건검사를 수행할수 있다. 조건 연산자(?:)는 두값중에 하나를 선택하는 간결한 방법을 
제공한다. 문자 관련 함수들이 들어있는 cctype라이브러리는 문자 입력을 분석하는 매우 편리하고 강력한 도구를 제공한다.
루프와 선택 명령문은, 콘솔I/O와 매우 유사한 파일 I/O에 유용하게 쓸수 있는 도구다. ifstream과 ofstream객체를 선언하고 그들을 파일과 연결한 후에, 이 객체들을 cin과 cout을 사용하는것과 동일한 방식으로 사용할수 있다.

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

함수 오버로딩  (0) 2014.03.17
함수 - C++의 프로그래밍 모듈  (0) 2014.03.17
루프와 관계 표현식  (0) 2014.03.17
복합 데이터형  (0) 2014.03.17
데이터 처리  (0) 2014.03.17
Posted by 레이드리안
|