For Loops, Strings, and Arrays : Word Jumble

 

For 반복문

계수 및 시퀀스를 이동하는 데 적합하다.

 

for (초기화; 테스트; 동작) 문장;

초기화는 루프의 초기 조건을 설정하는 문장

표현식 테스트는 루프 몸체가 실행되기 전에 매번 테스트된다.

프로그램이 실행되고, 동작이 실행된다 ( 종종 카운터 변수가 증가함 )

테스트가 거짓이 될 때까지 이 사이클이 반복되고, 그 시점에서 루프가 종료된다.

 

// Counter
// Demonstrates for loops

#include <iostream>
using namespace std;

int main() {
    cout << "Counting forward:\n";
    for (int i=0; i<10; i++)
    {
        cout << i <<" ";
    }
    cout << "\n\nCounting backward:\n";
    for (int i=9; i>=0; i--)
    {
        cout << i << " ";
    }

    cout << "\n\nCounting by fives:\n";
    for (int i=1; i<=50; i+= 5)
    {
        cout << i << " ";
    }

    cout << "\n\nCounting with null statements:\n";
    int count = 0;
    for (; count<10;)
    {
        cout << count << " ";
        ++count;
    }

    cout << "\n\nCounting with nested for loops:\n";
    const int ROWS = 5;
    const int COLUMNS = 3;
    for (int i=0; i < ROWS; ++i)
    {
        for (int j=0; j < COLUMNS; ++j)
        {
            cout << i << "," << j << " ";
        }
        cout << endl;
    }
    return 0;
}

초기화문은 int i=0으로 i를 선언하고 0으로 초기화

표현식 i < 10은 i가 10보다 작은 동안 루프가 계속되도록 한다.

마지막 동작 문은 루프 본문이 완료될 때마다 i가 증가결과적으로 루프는 0~9까지의 값에 대해 10번 반복된다.

 

카운터 변수를 초기화하고 테스트 조건을 만든 후 카운터 변수를 원하는 값으로 업데이트할 수 있다.for 루프에서도 무한 루프에 대한 주의가 동일하게 적용된다,루프가 언젠가는 종료될 수 있는 루프를 만들어야 한다.for(;;)은 무한 루프를 만들 수 있다. 조건식이 비어있기 때문에 루프는 종료문을 만날 때까지 계속된다.

 

중첩된 for 루프

프로그램은 첫번째 외부 루프의 반복을 마지고 endl을 cout으로 보내어 첫번째 행을 종료한다.내부 루프가 외부 루프의 각 반복에 대해 전체적으로 실행된다.

 

객체 Object 이해

데이터와 함수를 결합하는 소프트웨어 object를 사용할 수 있다.오브젝트의 데이터 요소는 data member라고 하고, 함수는 member function이라고 한다.동일한 유형의 모든 객체는 동일한 기본 구조를 가지므로 각 개체는 동일한 데이터 멤버와 멤버 함수 세트를 가질 것이다.그러나 개별적으로 각 객체는 자체 데이터 멤버의 값을 가진다.객체의 좋은 점은 객체들을 사용하기 위해 구현 세부 정보를 알 필요가 없다는 것이다.예를 들어 자동차를 운전하기 위해서 자동차를 어떻게 만들 지 알 필요가 없다.객체의 데이터 멤버와 멤버 함수만 알면 된다.

 

내장 타입과 같이 객체들도 변수에 저장할 수 있다.멤버 선택 연산자 (.)를 사용하여 데이터 멤버와 멤버 함수에 액세스할 수 있다.

// ship is an object of Spacecraft type 
if (ship.energy > 10)
{
    ship.fireWeapons()
}

ship.energy는 객체의 에너지 데이터 멤버에 엑세스하고,

ship.fireWeapons()는 객체의 fireWeapons() 멤버 함수를 호출한다.

 

String Object

문자열 객체는 단어 퍼즐 게임을 작성하거나 단순히 플레이어의 이름을 저장하는 등 문자 시퀀스를 처리하는 방법이다.

문자열은 사실 객체이며, 문자열 객체를 사용하여 여러 작업을 수행할 수 있다.

// String Tester
// Demonstrates string objects

#include <iostream>
#include <string>
using namespace std;

int main() {
    string word1 = "Game";
    string word2("Over");
    string word3(3, '!');

    string phrase = word1 + " " + word2 + word3;
    cout << "The phrase is: " << phrase << "\n\n";

    cout << "The phrase has " << phrase.size() << "characters in it.\n\n";

    cout << "The character at position 0 is: " << phrase[0] << "\n\n";

    cout << "Changing the character at position 0.\n";
    phrase[0] = 'L';
    cout << "The phrase is now: " << phrase << "\n\n";

    for (unsigned int i=0; i <phrase.size(); ++i)
    {
        cout << "Character at position " << i << " is: "<< phrase[i] << endl;
    }

    cout << "\nThe sequence 'Over' begins at location ";
    cout << phrase.find("Over") << endl;

    if (phrase.find("eggplant") == string::npos)
    {
        cout << "'eggplant' is not in the phrase.\n\n";
    }

    phrase.erase(4,5);
    cout << "The phrase is now: " << phrase << endl;

    phrase.erase(4);
    cout << "The phrase is now: " << phrase << endl;

    phrase.erase();
    cout << "The phrase is now: " << phrase << endl;

    if (phrase.empty())
    {
        cout << "\nThe phrase is no more.\n";
    }
    return 0;
}

 

 

string word3(3, '!');   -> !!!

세 문자열 객체를 연결하여 새로운 문자열 객체 phrase 생성

phrase == "Game Over!!!"

+ 연산자를 오버로드하여 문자열과 함께 사용하면 문자열 객체 연결을 의미

연산자 오버로딩은 익숙한 연산자를 새롭게 정의하여 새로운 컨텍스트에서 다르게 작동하도록 만드는 것

 

문자열 객체 phrase의 size() 멤버 함수를 연산자(.) 을 통해 호출

문자열 객체의 크기 즉 문자 수를 반환 ( 공백 포함 모든 문자 카운트 ) // length() 동일

 

문자열 객체는 char 값의 시퀀스를 저장

[]에 인덱스 번호를 제공하여 개별 char 값을 액세스할 수 있다.

 

size() 반환 값이 unsigned int 이기에 i도 unsigned int로 초기화

 

 

find() 함수를 사용하여 두 개의 문자열 리터럴이 phrase에 포함되어 있는 지 확인

find() 함수는 호출하는 문자열 객체에서 인수로 제공된 문자열을 검색한다.

문자열 객체에서 찾고 있는 문자열이 시작하는 첫 번째 발생 위치 인덱스를 반환한다.

 

eggplant가 phrase에 존재하지 않기 때문에 find()는 string 헤더 파일에서 정의된 특수한 상수를 반환한다.

이를 string::npos로 액세스한다.

string::npos를 통해 액세스하는 상수는 문자열 객체의 가능한 가장 큰 크기를 나타내므로 문자열 객체의 가능한 모든 유효한 인덱스보다 크다. 즉 한 문자열이 다른 문자열에서 찾을 수 없음을 나타낸다.

find("eggplant", 5);  ->  phrase의 인덱스 5부터 eggplant를 찾기 시작한다.

 

erase() 함수는 문자열 객체에서 지정된 서브 문자열을 제거한다.

phrase.erase(4,5);  ->  인덱스 4에서 시작하는 5 글자의 서브 문자열을 제거한다.

phrase.erase(4);   ->   인덱스 4에서 시작하는 객체의 모든 문자를 제거한다.

phrase.erase();   ->   모든 문자가 제거

 

empty() 함수는 bool 값이다.

문자열 객체가 비어 있으면 true를 반환하고 그렇지 않으면 false를 반환한다.

+ Recent posts