U E D R , A S I H C RSS

Yggdrasil/가속된씨플플/2장

2장

잘 모르던 용어, 개념정리

  • 블록: 중괄호로 감싸인 연속적인 구문들
  • 루프불변식(loop invariant): while문이 그 조건식을 검사하는 매 경우에 하여 참일 것이라고 가정하는 속성. 처음에 이걸 보고, 이런 개념도 있었냐고 생각했음. 루프불변식은 코드는 아니고 주석에 해당하며, while문이 진행되면서 while문의 제일 처음과 끝에서 루프의 내용이 의도한 로 돌아간 건지를 정의한 문장이다.(말로 설명하기 애매한 듯...) 하여튼 이것을 쓰는 이유는 루프문을 제로 설계하기 위해서. 아래의 코드는, 책에 있는 코드로, 불변식의 예이다.

~cpp 
//불변식: 지금까지 r개의 행을 출력함
int r=0;
//r을 0으로 세팅하면 불변식을 참으로 만든다
while(r!=rows)
{
//여기에서 불변식이 참이라고 가정할 수 있다
//한행을 출력하면 불변식이 거짓이 된다(바로 아랫줄)
std::cout<<std::endl;
//r을 증가시키면 불변식을 다시 참으로 만든다
++r;
}
//여기서 불변식이 참이라고 확신할 수 있다
  • 단락평가(short-circuit): 그러니까 if(a==0||b==0){...}에서 왼쪽의 a==0이면 b==0인지는 보지도 않고 괄호 안을 실행한다는 뜻. 자바에선 ||기호와 |기호를 구분하던 것 같았다. 아마 전자는 전부 평가, 후자는 단락평가였던 것 같다.
  • 복합입연산자: 이름이 복잡해서 무슨 말인가 했는데, a+=b처럼, a=a+b를 요약해서 쓰는 형태.
  • 반개범위: 루프의 범위를 설정할때, for(i=0;i<3;i++)처럼, 시작인 0은 포함하나 3은 포함하지 않고 2에서 끝난다. 이것을 [0,3)으로 표현하는데, 3은 루프 범위에 표현되지 않는 "끝을 벗어난 값"이다.

클래스 string


~cpp 
std::string::size_type//unsigned형의 멤버변수로, 담을 수 있는 최 문자 갯수를 저장한다. 글자수에 알맞는 type으로 알아서 정의하는 듯.
  • 루프에서 1이 아닌 0부터 시작하는 이유
    • 프로그래밍을 처음 배울 때 "프로그래밍을 하려면 숫자를 셀 때 1부터가 아니라 0부터 세라"는 말을 들어왔을 때, 단지 컴퓨터의 숫자 체계가 그러니까 막연히 그렇게 하는 것인 줄 알았다.
    • 칭적 범위(반개범위)를 사용하므로, [0,5)이면 루프가 5번 돈다는 것을 쉽게 알 수 있다. 1,5면 5번 돈다는 것을 파악하기 힘들다.
    • 루프 불변식을 이해하기 쉽다.

연습문제

2-1

  • pad를 0으로 초기화하면 된다.

2-2

  • pad를 가로, 세로에 각각 다른 변수로 분리시킨다. 혹은, rows, cols 초기화식을 변화시킨다.

2-3


~cpp 
#include<iostream>
#include<string>

using std::cin;
using std::cout;
using std::endl;
using std::string;

int main()
{

	int pad_rows, pad_cols;
	cout<<"Please input blank of rows and cols:";
	cin>>pad_rows;
	cin>>pad_cols;
	cout<<"Please enter your first name: ";
	
	string name;
	cin>>name;

	const string greeting="Hello, "+name+"!";

	const int rows=pad_rows*2+3;
	const string::size_type cols=greeting.size()+pad_cols*2+2;

	cout<<endl;

	for(int r=0;r!=rows;++r)
	{
		string::size_type c=0;
		while(c!=cols)
		{
			if(r==pad_rows+1&&c==pad_cols+1)
			{
				cout<<greeting;
				c+=greeting.size();
			}
			else
			{
				if(r==0||r==rows-1||c==0||c==cols-1)
					cout<<"*";
				else
					cout<<" ";
				++c;
			}
		}
		cout<<endl;
	}
	return 0;
}

2-6

  • 1부터 10을 각 줄에 출력한다.

2-7

  • for(int i=10;i>-6;i--) std::cout<

2-8


~cpp 
#include<iostream>
#include<string>
int main()
{
	int sum=1;
	for(int i=1;i<10;i++)
		sum*=i;
	std::cout<<sum;
	return 0;
}

2-10

  • using std::cout 선언을 괄호 안에서 해주었으니 밖에선 단축형으로 쓸 수 없다.


Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:28:28
Processing time 0.0127 sec