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.0164 sec