[C++ 기초] 조건문, 문자열, 반복문, printf 개요 (+연산자)

라멘커비·2023년 12월 15일
0

CPP 입문

목록 보기
4/25
post-thumbnail

조건문

실제 게임은 조건문으로 만든다
ex) Hp가 0이면 -> 사망 애니메이션을 띄운다.
물건을 사려고 할 때 이 모자르면 -> 경고창을 띄운다.
물건을 사려고 할 때 이 있다면 -> 인벤토리로 물건을 옮긴다.
여기서 Hp와 돈은 명사 => 변수 => 메모리영역 => 램의 x위치에서 x크기로 존재하는 영역

if문

메모리영역을 검사해서 참이면 실행코드를 실행시키고 참이 아니라면 실행코드를 실행시키지 않는다.

    int Hp = 100;
    
    if (Hp /*메모리 영역*/)
    {
        // 플레이어는 살아있다.
        // 실행코드
    }
  • if문은 함수의 실행 메모리 내에서만 사용할 수 있다.
    = 실행될 수 있는 함수의 중괄호{ } 안에서만 쓸 수 있다.
    전역에는 메모리영역이 없다.

  • 보통 비교연산자와 많이 사용된다.

    int Hp = 100;

    // 죽음에 대해서 조건을 잡을 때
    if (0 >= Hp /*메모리 영역*/)
    {
        // 플레이어는 살아있다.
        // 실행코드
    }
  • 이렇게도 사용할 수 있지만 가독성이 좋지 않아 사용하지 않는다.
if (Hp += 10, 0 >= Hp)
{

}

else if

조건을 연계할 때 사용

    // 조건을 연계해야 할 때 else if 사용
    // Hp가 100 이상이면 정상
    // Hp가 99~50 사이라면 부상
    // Hp가 49~10 사이라면 중상
    // Hp가 10~1 사이라면 사망 직전
    // Hp가 0 이하 사망
    if (Hp >= 100)
    {
        // 정상
    }
    // 위 조건이 false라면
    else if (Hp >= 50)
    {
        // 부상
    }
    else if (Hp >= 10)
    {
        // 중상
    }
    else if (Hp >= 1)
    {
        // 사망 직전
    }
    // if를 포함한 모든 조건이 전부 다 실패했다면 else로 들어감
    else
    {
        // 사망
    }

우리반 코딩 스탠다드

  • 전역변수와 지역변수 이름 무조건 다르게 하기. ex) GlobalA, LocalA
  • 무조건 초기값을 설정한다.
  • 함수의 인자에는 앞에 언더바_를 붙인다.
  • 포인터를 초기화할 때 0을 사용하지 않는다.
  • 경로 및 함수 변수 한글 절대 금지
  • 바탕화면에 프로젝트 절대 금지 있으면 평가에 반영하겠음
  • 중괄호 위치 신경 안 씀, 중괄호 생략은 X (한줄로치는거 X)

switch문

  • switch문은 완전히 if문으로 대체될 수 있다.
    아래 두 코드는 같은 의미이다.
if (A == 10){

} 
else {

}
    int A = 10;

    switch (A) {
    case 10:
        break; 
    default:
        break;
    }

switch문에서 break의 의미는 탈출이다.
break는 꼭 써야하는 건 X. 상황에 맞춰서 break를 사용해야 한다.

  • switch문 내부에서 일반적으로는 지역변수를 사용할 수 없다.
코드에러

중괄호 { }를 사용해서 해결할 수 있다.

  • switch문은 조건에서 같다==의 비교밖에 안 된다.
    "메모리 == 상수" 인지만 비교할 수 있다.
    case 상수A: : "조건이 상수A라면" 이라는 뜻

  • case 뒤에 상수만 올 수 있다.

char ch = 'A';

switch (ch) {
case 'A': // 가능
    break;
default:
    break;
}

case 뒤에 모든 변수 불가능.

  • switch문을 활용해서 ch가 대문자인지 소문자인지 확인하는 코드 가능
    switch (ch) {
    case 'A':
        break;
    case 'a':
        break;
    default:
        break;
    }

char

1바이트 문자형 char
''안에서 초기화해서 표현해야 한다.
문자형 상수표현식

char Ch = 'A';

배열 초기화

// 내가 일일이 원소를 넣어줘야 한다.
int Arr[5] = { 10, 20, 30, 40, 10 };
//생략하면 나머지를 0으로 채운다.
int Arr[5] = { 10, }; 	// 10, 0, 0, 0, 0
int Arr[5] = { };		// 0, 0, 0, 0, 0

문자열

    'A'; // <- 문자 상수표현식
    "AAAAAAA"; // <- 문자열 상수표현식

문자열은 예외가 많다.

  • 문자 처리 규칙이 있다. 마지막은 무조건 0을 넣어줘야 한다가 규칙이다.
char String0[5] = "AAAA"; //{ 'A', 'A' , 'A' , 'A' , 0 }
char String1[5] = { 'A', 'A' , 'A' , 'A' , 'A' }; //이렇게 할 필요 없음
  • printf_s은 문자열을 넣으면 글자를 출력해주는 함수이다. 핵심은 0이 나오면 멈춘다.
    문자열 끝에 0이 없으면 메모리에 운좋게 0이 나올 때까지 다른 부분도 읽게 된다.(메모리 침범)
    매번 결과값이 달라지는 모습을 확인할 수 있다.
    • 문자열 끝에 0이 없으면 0이 나올때까지 스택메모리를 쭉 읽어오는 것

문자열을 잘 사용(자르거나 붙이거나 다른 문자로 치환하거나)하는 능력은 기본기

  • putchar
putchar('A'); //글자 1 개를 출력할 수 있는 함수.
  • char는 1바이트 문자형인데 숫자로 바꿀 수 있음
    'A' => 65

연산자

복합 할당 연산자

Value += 10; // Value = Value + 10 과 같음
Value -= 1;
  • 이게 복합 할당 연산자의 원리(?)
void PlusSub(int& _left, int _right) {
    _left = _left + _right;
}

전위증감

int Value = 0;
int Result = 0;
Result = ++Value; // Value : 1, Result : 1
// 전위 증감 함수 만들어보기
int PPFirst(int& _Value) {
    _Value = _Value + 1;
    return _Value;
}

후위증감

int Value = 0;
int Result = 0;
Result = Value++; // Value : 1, Result : 0
// 후위 증감 함수 만들어보기
int PPBack(int& _Value) {
    int Result = _Value;
    _Value = _Value + 1;
    return Result;
}

반복문

While

while(메모리영역)문은 메모리영역의 조건이 true라면 실행코드를 1번 실행하고 다시 조건문으로 돌아간다. 조건문 > 실행문 > 조건문 > 실행문 ... 순서

while(메모리영역) 조건문 {
	실행코드
}

아래 코드는 조건이 항상 true이기때문에 'A'를 무한히 출력하는 코드이다.

while(true) {
    putchar('A');
}

다음과 같이 변수를 썼을 때 메모리영역이 거짓이라면 while문을 빠져나온다.

int Count = 5;
while (Count) {
    putchar('A');
    Count = Count - 1;
}

이것도 가능하긴 하다.
,로 여러가지 구분 가능.

while (Count = Count - 1, Count) {

}
  • char 배열(=문자열) while문으로 하나씩 출력하기
char String0[5] = "AAAA";
char String1[5] = { 'A', 'A' , 'A' , 'A' , 'A' };
int Count = 0;
while (String0[Count]) {
    putchar(static_cast<int>(String0[Count]));
    Count = Count + 1;
}
  • MyPrintf 함수 만들어보기
#include <iostream>

//함수의 인자로 정적배열을 쓸 수 없음
//정적배열 => 상수로 크기가 정해진 배열 ex) int Arr[10]
//그래서 포인터로 받을 수밖에 없는데 그럼 크기를 알 수 없음
void MyPrintf(char* _Ptr) {
    int Count = 0;
    //char* CurPtr = _Ptr + 0;
    //char CurCh = *(_Ptr + 0);
    //char CurCh = _Ptr[0];
    while (_Ptr[Count]) {
        char ch = _Ptr[Count];
        putchar(ch);
        Count = Count + 1;
    }
}
int main()
{
    char String1[5] = "ABCD";
    MyPrintf(String1);
    return 0;
}

do while

실행문 > 조건문 > 실행문 > 조건문 ... 순서.
while문과 첫실행순서만 바뀐느낌.
어떤 실행코드든 최초에 1번은 실행되기를 원한다면 do while문을 사용한다.

do {

} while (true);

for문

  • for문은 while문에 어떠한 변수를 초기화하는 초기화문과 그 변수를 증감시키는 증감문이 합쳐진 형태이다.

for 치고 > tab, tab 하면 이렇게 나온다. size_t는 나중에.

for (size_t i = 0; i < length; i++) 
{
}
  • 초기화문 > (조건문 > 실행코드 > 증감문) > (조건문 > 실행코드 > 증감문) ... 순서
for (
    int i = 0;  // 초기화문
    i < 10; 	// 조건문
    i++         // 증감문
    ) 
{
	// 실행코드
}
  • while문과 똑같이 만들 수 있다.
    하지만 정석 사용법대로 쓰는 것을 추천. (이렇게 할거면 while문을 쓰자)
for(; true;){
	putchar('A');
}
//또는
for(;;){
	putchar('A');
}

break

for문이나 while문 등 반복문 안에서 break하면 즉시 반복문을 종료한다.

    int Count = 0;
    while (true) {
        ++Count;
        if (10 < Count) {
            break;
        }
    }

    int Hp = 100;
    for (int i = 0; i < 5; i++) {
        Hp -= 80;
        if (Hp <= 0) {
            break;
        }
    }

continue

반복문에서 continue를 만나면 다시 조건문이나 증감문으로 바로 이동한다.

    for (int i = 0; i < 10; i++) { 
        // 짝수일 때만 뭔가를 하고 싶을 때
        // 홀수이면 바로 continue -> 곧바로 증감문으로 이동
        if (i % 2 == 1) {
            continue;
        }
        // 짝수일 때
        int a = i;
    }

    int Value = 0;
    while (Value < 100) {  //0부터 99까지 숫자
        ++Value;
        //짝수가 아니면 continue
        if (Value % 2 != 0) {
        	//바로 조건문으로 이동
            continue;
        }
        //짝수일 때
        int a = Value;
    }

printf 개요

printf는 C에서 사용하던 출력 함수다. 내부 내용이 C스타일로 짜여져 있다.

  • extern "C" : 이부분을 컴파일 C스타일로 컴파일 해줘.
  • inline : 치환(해줄 수 있니?라는 느낌). 컴파일러의 판단하에 이 함수의 내용을 그대로 복사해서 넣을 수 있다면 이 함수가 실행된 위치에 코드를 복사하고 실행시킴. (가장 빠른 프로그램은 main에 모든 코드를 집어넣은 프로그램이다라는 농담이 있다고 함)
  • int : 리턴값
  • __cdecl
  • printf_s : 이름
  • const char* _Format,
  • ...
    (나중에 더)

문제

  • 두 가지 함수 만들기
#include <iostream>

int StringCount(char* _Ptr) {
    int Count = 0;
    while (*(_Ptr + Count)) { // *(_Ptr + Count) == _Ptr[Count]
        Count++;
    }
    return Count;
}

int StringReverse(char* _Ptr) {
    int Length = StringCount(_Ptr);
    int HalfLength = Length / 2;

    for (int i = 0; i < HalfLength; i++) {
        char tmp = _Ptr[i];
        _Ptr[i] = _Ptr[Length - i - 1];
        _Ptr[Length - i - 1] = tmp;
    }
    return 0;
}

int main()
{
    {
        char Arr[10] = "123456789";
        int Result = StringCount(Arr); // Result에 문자열의 글자 수가 나오도록(마지막 0 제외)
        int a = 0;
    }
    {
        char Arr[10] = "ABCDEFGH";
        StringReverse(Arr); // Arr에 문자열이 뒤집어서 들어가도록
        int a = 0;
    }
    return 0;
}
profile
일단 시작해보자

0개의 댓글

관련 채용 정보