Presentation is loading. Please wait.

Presentation is loading. Please wait.

루프와 카운트 Looping and counting

Similar presentations


Presentation on theme: "루프와 카운트 Looping and counting"— Presentation transcript:

1 루프와 카운트 Looping and counting
Chapter 2 루프와 카운트 Looping and counting

2 출력을 융통성 있게 만들기 인사말 테두리에 빈 행 개수를 임의로 출력하기 예 1. 예 2.
Please enter your first name: Estragon ******************** * * * Hello, Estragon! * 항 행 비우고, 한 칸 비우고 Please enter your first name: Estragon ********************** * * * Hello, Estragon! * 두 행 비우고, 두 칸 비우고 지역변수에 각 라인을 저장하지 않고, 각 출력문자를 독립적으로 생성해 보자

3 전체 구조 그대로 사용해도 되는 부분 #include <iostream> #include <string>
******************** * * * Hello, Estragon! * #include <iostream> #include <string> int main( ) { // 이름을 입력 받음 std::cout << “Please enter your first name: ”; std::string name; std::cin >> name; // 출력할 메시지를 구성 const std::string greeting=“Hello, ”+name +“!”; // 인사말 출력 부분.. // 이 부분을 다시 작성해야 합니다 return 0; } ********************** * * * Hello, Estragon! * ************************ * * * Hello, Estragon! *

4 임의 개수의 행 출력하기 행의 개수만큼 출력 const int pad = 1; // 인사말 주위의 빈 행 개수
const int rows = pad * 2 + 3; // 출력할 총 행(row) 개수 행의 개수만큼 출력 ******************** * * * Hello, Estragon! * // 입력과 출력을 구분하는 행 출력 std::cout << std::endl; // rows 만큼의 행을 출력 int r=0; // 불변식: 지금까지 r개의 행을 출력함 while(r != rows) { // 하나의 행을 출력 ++r; }

5 while 문 while (condition) statement Bool type
매번 condition을 검사해서 true인 경우 statement를 반복 실행 condition(조건식)은 bool타입으로, true(참) 또는 false(거짓) 값을 가짐 statement는 구문(statement) 또는 블록(block) block은 중괄호 { }로 묶인 0개 이상의 구문 Bool type bool flag=true; if (flag) { … } bool flag2 = 1; // ERROR! 유효한 값은 true 또는 false while (condition) { statement1 statement2 }

6 while문과 for문 for statement while statement
for(init-statement; condition; expression) { statement } for(r=0; r != rows; ++r) { // 하나의 행을 출력 } init-statement while(condition) { statement expression; } r=0; while(r != rows) { // 하나의 행을 출력 ++r; }

7 증가 연산자와 상등 연산자 증가연산자(increment operator) ++
r++; // r = r + 1; ++r; 감소연산자(decrement operator) -- r--; // r = r - 1; --r; 상등 연산자(equality operator) == r==0은 r의 값이 0과 같은지 판별하여, 같으면 true값을 가지고, 다르면 false값을 가짐 부등 연산자(inequality operator) != r!=rows 는 r 값이 rows값과 같지 않으면, true값을 가짐.

8 if 문 if(condition) statement1 if(condition) statement1 else statement2
condition을 평가하여 true(참)이면 statement1을 수행 if(condition) statement1 else statement2 condition 을 평가하여 true(참)이면 statement1을 수행, false(거짓)이면 statement2를 수행 if (condition) { statement1 } if (condition) { statement1 } else { statement2

9 논리 연산자 r == 0 || r == rows -1 || c==0 || c == cols -1
논리합 연산자(logical-or operator) || condition1 || condition 2 두 조건식 중의 어느 하나라도 true이면 연산결과는 true이다 왼쪽 결합 우선: condition1을 평가하고, condition2를 평가함 단축평가(short-circuit evaluation): condition1이 참이면, condition2를 평가하지 않고 연산 결과를 true로 결정함. 논리연산자는 관계연산자 보다 우선순위가 낮다 관계 연산자(relational operator): <, >, <=, >=, ==, != 관계연산자는 산술연산자 보다 우선순위가 낮다. 산술연산자(arithmetic operator): +, -, *, / , % p.76 참조: 연산자 우선순위

10 size_type string::size_type
******************** * * * Hello, Estragon! * size_type std::string은 std라는 네임스페이스의 string임 string::size_type은 size_type이 string클래스로부터 왔음 string::size_type std::string 타입은 string이 담을 수 있는 최대 문자 개수를 저장할 수 있는 타입의 이름으로 size_type을 정의하고 있다. size_type은 unsigned 타입으로, 음수 값을 저장하지 못함. string::size_type cols = greeting.size() greeting의 문자 개수가 얼마든 간에 상관없이 저장하기 위함 const std::string::size_type cols = greeting.size() + pad*2 + 2; 빈 칸을 앞뒤로 ‘*’을 양쪽에

11 using 선언 std::의 반복적인 사용을 축약 또는 using namespace std; using std::cout;
using std::cin; using std::endl; using std::string; 또는 using namespace std; using 선언을 하면, 그 다음부터는 cout은 std::cout을 의미한다.

12 행 출력하기 string::size_type c = 0; // 불변식: 지금까지 현재 행에 c개의 문자를 출력함
while (c != cols) { // 하나 이상의 문자를 출력 // c값을 조정하여 불변식을 유지 } 얼마나 많은 문자들을 한 행에 출력할지 계산한 후 while문을 이용하여 한 행을 출력 1) 경계문자 ‘*’ 출력하기 2) 비 경계문자 출력하기 ******************** * * * Hello, Estragon! *

13 1) 경계 문자 출력하기 첫 행(r==0)과 마지막 행(r==rows-1)은 모두 ‘*’을 출력
string::size_type c = 0; // 불변식: 지금까지 현재 행에 c개의 문자를 출력함 while (c != cols) { if (r == 0 || r == rows - 1 ||c == 0 || c == cols - 1) { // 경계에 있다면 cout << "*"; ++c; } else { // 하나이상의 비경계 문자들을 출력 // c값을 조정하여 불변식을 유지 ******************** * * * Hello, Estragon! * 첫 행(r==0)과 마지막 행(r==rows-1)은 모두 ‘*’을 출력 첫 열(c==0)과 마지막 열(c==cols-1)은 ‘*’을 출력

14 2) 비경계 문자 출력하기 논리곱 연산자(logical-and operator) &&
if (r == pad + 1 && c == pad + 1) { // 인사말을 출력할 차례라면 cout << greeting; c += greeting.size(); } else { cout << “ ”; ++c; } ******************** * * * Hello, Estragon! * 논리곱 연산자(logical-and operator) && condition1 && condition 2 두 조건식이 모두 true일 때 연산결과는 true 이다 복합-대입(compound-assignment) += c += greeting.size(); // c = c + greeting.size();

15 테스트 합치기 for (int r = 0; r != rows; ++r) { string::size_type c = 0;
while (c != cols) { if (인사말을 출력할 차례라면) { cout << greeting; c += greeting.size(); } else { if(경계에 있다면) cout << “*”; else cout << “ ”; ++c; } cout << endl;

16 완전한 테두리를 갖는 프로그램 #include <iostream> #include <string>
using namespace std; int main() { cout << "Please enter your first name: "; // ask for the person's name string name; // read the name cin >> name; // build the message that we intend to write const string greeting = "Hello, " + name + "!"; // the number of blanks surrounding the greeting const int pad = 1; // the number of rows and columns to write const int rows = pad * 2 + 3; const string::size_type cols = greeting.size() + pad * 2 + 2; // write a blank line to separate the output from the input cout << endl;

17 // write `rows' rows of output
// invariant: we have written `r' rows so far for (int r = 0; r != rows; ++r) { string::size_type c = 0; // invariant: we have written `c' characters so far in the current row while (c != cols) { // is it time to write the greeting? if (r == pad + 1 && c == pad + 1) { cout << greeting; c += greeting.size(); } else { // are we on the border? if (r == 0 || r == rows - 1 || c == 0 || c == cols - 1) cout << "*"; else cout << " "; ++c; } cout << endl;


Download ppt "루프와 카운트 Looping and counting"

Similar presentations


Ads by Google