Kevin Dominic의 Studying Rock Drill~

Day 2. 당신의 코딩 스타일부터 점검하라...(#2) 본문

C/C++ 오답줄이기 Articles - 불펌 금지/Week1

Day 2. 당신의 코딩 스타일부터 점검하라...(#2)

Kevin Dominic 2009. 9. 23. 19:28
두번째 날은 기본적인 문법 규칙에 대해서 다루고는 있으나 배경 설명이 같이 들어있습니다.
Day 2의 정답은 따로 주어집니다. 하지만 정답을 보지 않고 스스로 해보시는 것이 중요합니다.
어떠한 프로그램 언어든 사용자가 원하는 것을 맞게 구현하면 바로 정답입니다.
기존에 만들어진 데이터를 올리기 때문에 반어도 약간 섞여있습니다 ^^;;
한글 파일에서 짜깁기로 올리는 것이기 때문에 다소 지저분해 보일 수 있습니다.
한글 파일 공개 여부는 추후 결정하도록 하겠습니다..

과제 1. 다소 지저분하게 쓰여진 코드 정리(주석 달기)

본 문서와 함께 포함되는 파일중 Day2.cpp를 열어서 프로그램 소스를 알아보기 쉽게 수정하도록 한다.

//////////////////////////////////////////////////////////////////////
//
// 1. Basic Collision Checking
//
//////////////////////////////////////////////////////////////////////

#include <stdio.h>#include <stdlib.h>#include <math.h>
void main(void)
{
    int PosAx, PosAy, RadA, PosBx, PosBy, RadB;
    double Dist;

    printf("\n원 A의 중점좌표를 입력받겠습니다."); printf("\n중점좌표 A의 X좌표를 입력하시오 : "); scanf("%d", &PosAx); printf("\n중점좌표 A의 Y좌표를 입력하시오 : "); scanf("%d", &PosAy); printf("\n중점좌표 A의 반지름을 입력하시오 : "); scanf("%d", &RadA);    printf("\n중점좌표 B의 X좌표를 입력하시오 : "); scanf("%d", &PosBx); printf("\n중점좌표 B의 Y좌표를 입력하시오 : "); scanf("%d", &PosBy); printf("\n중점좌표 B의 반지름을 입력하시오 : "); scanf("%d", &RadB);
    Dist = (double)sqrt(PosAx, PosAy, PosBx, PosBy);
    if(Dist > RadA+RadB){printf("\n두 원은 만나지 않습니다.\n");}
    else if(Dist == RadA+RadB){printf("\n두 원은 한점에서 만납니다.\n");}
    else { printf("\n두 원은 두점에서 만납니다.\n");}
    return;
}

기본 개념 설명

ㆍ지금 당장 유용한 코드는 아니지만, 위 코드는 2D 기반 게임 제작시, Unit간의 충돌여부를 체크할 때 유용하게 사용되는 코드이다.(예 : 아군 비행기와 적군 미사일)
ㆍ이 코드의 기본 원리는 두 원의 중심거리와 반지름의 합을 이용한다. 두 원의 중심거리는 피타고라스의 정리를 이용하여 구할 수 있는데, 두 원의 반지름의 합이 이 중심거리보다 크게 되면 물체는 부딪힌 것으로 간주된다.(모르겠으면 직접 원을 그려보라)

사용자 삽입 이미지

  • 그림 실력이 영 아닌 건 그냥 관대한 마음으로 넘어가길 바란다


사용자 삽입 이미지
사용자 삽입 이미지
기초 문법 ::

ㆍ변수(Variable number)란?

   - 변하는 값, 컴퓨터의 메모리에 저장되어 있는 값 ↔ 상수(constant number)
   - 변수는 반드시 그 값을 집어넣을 형틀(Prototype)이 필요하다.(int, char, double, ....)
   - 변수는 선언되기 전에 사용될 수 없다.(a=30; /* a가 뭔데? */)
   
- 변수의 형틀에 값을 집어넣을 수 없다.(ex : int = 3;(x))

ㆍ변수의 종류(임의대로 나눈 종류 - 32비트 컴파일러 기준)

   - 값 변수 : char(1Byte), short/long/int(2/4/4Bytes), float(8Bytes), double(8Bytes)

  * unsigned는 음수값을 쓰지 않겠다는 키워드일 뿐이다. 아주 가끔 int 키워드 없이 unsigned만 선언하는 경우가 있는데, 이는 unsigned int를 통칭한다.

   - 포인터 변수 : char*, ...int*, float*, double*, (struct ...)* - 4Bytes
 
      * 예외 : C++에서의 struct/class는 4Bytes 이상의 크기를 갖는다. C에서는 4Bytes를 갖는다.

ㆍ포인터 변수란?
   - 일반적으로 a라는 변수를 사용한다는 뜻은 메모리의 특정 공간 a라 지칭하는 곳에 어떤 값을 쓰겠다는 뜻임.
   - 포인터 변수는 a라 지칭하는 곳에 어떤 값 A를 집어넣는 것이 아니고, A가 위치에 있는 다른 특정 공간의 주소를 쓰겠다는 뜻임

   - Ex) 일반 변수와 포인터 변수에는 어떤 값이 들어가는가? (빨간 부분을 유심히 볼 것)

변수 이름

주소

A

XX시 XX구

30

                  Vs

변수 이름

주소

*P

OO시 OO구

XX시 XX구

  - 포인터의 표현방법은 뒤쪽에서 배울예정임

ㆍScanf에서의 표현 양식과 인자
   - Scanf의 함수 원형은 다음과 같다 : int _cdcel Scanf(char *s, ...);
  
- 빨간 점 세개는 가변인자를 뜻하는데, 일반적으로 함수가 호출될 때에는 인자의 개수가 정확하게 호출되는 반면에, printf나 scanf와 같은 경우는 인자의 개수가 언제 바뀔지 모른다. 따라서 가변 인자를 쓰게 된다. (가변인자 및 가변함수는 고급 프로그래밍 기법에 속하므로 마지막에 설명하겠음)
   - 중요한 것은 가변인자의 개수는 앞에 선언된 문자열 s에서 이미 다 나와 있어야 한다는 것이다. 그래서 출력양식과 개수를 파악하기 위해 %d와 같은 것을 쓰게 된다.(이 양식의 종류는 다른 책 참고 바람)
   - scanf는 왜 입력받고자 하는 변수를 포인터 형태로 받는가?
    
* 포인터의 사용은 보통 “&변수명”과 같이 쓴다.
    
* printf 함수에서 문자열을 출력한다고 가정하면, 이미 그 문자열은 만들어져있는 상태이다. 따라서 그냥 출력하면 된다.
     * 반면 scanf 함수에서 문자열을 입력받는다고 가정하면, 몇개의 문자가 들어올지 장담할 수 없다. 그래서 포인터를 쓰게 된다. (이 부분은 배열과 포인터에서 다시 한 번 설명한다)