어디까지나 MFC 에서만 사용이 가능하다.

Java의 split 와 비슷한 개념으로 한번 만들어 봤다.

int splitString(CString str, CString var, CStringArray &strs)
{
int count = 0;

CString tempStr = str;

int length = str.GetLength();

while(length)
{
int find = tempStr.Find(var);
if(find != -1)
{
CString temp  = tempStr.Left(find);
strs.Add(temp);
temp += var;
tempStr.Replace(temp, _T(""));
count++;
}
else
{
strs.Add(tempStr);
length = 0;
}
}
return count;
}

------------------------------------

실행 소스


CString temp = _T("park,,se,,chul");


CStringArray str;


int count = splitString(temp, _T(",,"), str);


if(count)

{

for(int i = 0 ; i <  count  ; i++)

?{

::AfxMessageBox(str.GetAt(i));

}

}

-------------------------------


쓰다 보니 온갖 꽁수를;;;; 소스 정리는 각자 알아서 하는 걸로;;;;;

※ 참고로 개발 환경은 Visual Studio 2008 버전 
신고

'Application > C/C++' 카테고리의 다른 글

QT 제목 표시줄 없애기  (0) 2013.07.03
itoa - Integer TO AscII  (0) 2013.06.11
MFC Split  (0) 2012.09.11
[강좌] 블럭쌓기 만들기 13일차  (0) 2012.06.17
[강좌] 블럭쌓기 만들기 12일차  (0) 2012.06.17
[강좌] 블럭쌓기 만들기 11일차  (0) 2012.03.26

13일차 강좌를 시작하기 전에..

강좌 쓰는것 자체가 어렵긴 하네요..

그냥 시간 좀 남으면 쓰고 그렇게 해도 될 줄 알았는데..

굳이 시간을 내야 하는게 이 강좌네요.

 

자.. 이제 블럭쌓기가 어떻게 돌아가는지부터 알아봅시다..

뭐, 다들 잘 아시겠지만..

10x15 정도의 화면이 있고,

그 안에 블럭 하나를 돌리면서 움직일 수 있겠고..

그 안에 블럭이 바닥에 닿아서 가로줄이 꽉차는게 있다면 지우고 나머지를 밑으로 내립니다.

가로줄을 지우면 점수가 올라가고..

레벨에 따라 블럭 내려오는 속도를 조절합니다..

사실 이게 끝이에요..

만약 이해가 안가는게 있다면 게임을 플레이하면서 익혀봅니다.

뭐 오늘은 여기까집니다..

원래 날로먹는 강좌 맞지요 ㅋㅋ

신고

'Application > C/C++' 카테고리의 다른 글

itoa - Integer TO AscII  (0) 2013.06.11
MFC Split  (0) 2012.09.11
[강좌] 블럭쌓기 만들기 13일차  (0) 2012.06.17
[강좌] 블럭쌓기 만들기 12일차  (0) 2012.06.17
[강좌] 블럭쌓기 만들기 11일차  (0) 2012.03.26
[강좌] 블럭쌓기 만들기 10일차  (0) 2012.01.05

강좌에 들어가기 전에..

으으.. 진짜 1년 넘게 걸릴듯..

진행되는것도 없으면서 이런것 하나 다 못 쓰고 질질 끌리네요..

뭔가 자극이 필요하다고 생각되는 밤입니다..

그래서 커피한잔 하면서 글을 쓰고 있네요..

 

클래스.. 어디서 많이 들어본거 같은데.. 뭐지? / 블럭쌓기 프로그램의 클래스부터 만들어놓아볼까요?

클래스는 음..

무슨 기사 클래스 궁수 클래스 법사 클래스 뭐 이런걸 말하는거같지 않나요?

뭐, 대충 그래요..

좀더 비유를 해보자면.. 기사는 궁수가 활을 쏠 때 손가락 움직임이 어떻게 되는지 알 필요는 없지요.

하지만 어디다 쏠지 말은 할 수 있어야지요?

어찌되었건 함수나 클래스나 비슷한거고.. 뭐 개량형이라고 봐야 하려나요?

강좌 초반엔 C++ 관련으로 하려고 했는데 문제는 저도 C++에 익숙하지가 않아서..

그래도 일단 함수의 나열이나 해보죠.

 

int init();

int title();

int gameover();

int dispose();

 

int kbhit();

int rotate(int direction);

 

이정도가 되려나요..

3일차때 미리 잘 구상해두면 함수나 클래스 구성은 쉽습니다.

이제 13일차부터 코딩에 들어가네요 ㅋㅋ

신고

'Application > C/C++' 카테고리의 다른 글

MFC Split  (0) 2012.09.11
[강좌] 블럭쌓기 만들기 13일차  (0) 2012.06.17
[강좌] 블럭쌓기 만들기 12일차  (0) 2012.06.17
[강좌] 블럭쌓기 만들기 11일차  (0) 2012.03.26
[강좌] 블럭쌓기 만들기 10일차  (0) 2012.01.05
[강좌] 블럭쌓기 만들기 9일차  (0) 2012.01.02

강좌에 들어가기 전에..

억지로 억지로 반은 넘겼군요..

앞으로 고비입니다 흐..

사실, 취직을 하기도 했고요..

그래도 시작한김에 끝내버리려고 합니다 히히..

전 강좌까지는 다른 책에도 많이 있는 강좌이기도 하고..

자세한건 레퍼런스북이나 매뉴얼을 보면 다 나오니까요..

이제부터 다른 책에서는 잘 다루지 않는 내용이 조금 나옵니다..

그래봤자 내용이 길거나 하진 않고요..

제가 컴퓨터 언어 관련해서는 주입식 교육을 받지 않았고, 그렇게 교육할 생각도 없습니다..

이해하지 못하고 어떻게 써먹을수가 있나요?

무책임한 강의라고 생각하셔도 상관은 없지만 그렇게 느낀다는건 참으로 생각이 없다는 뜻도 되니까요.

이제 시작하겠습니다.

 

c랑 cc는 뭔 차이여? / makefile.. 응? 이건 뭐임?

자, c / cc는 c / c++입니다.

윈도우에서는 c / cpp지요?

유닉스 계열에서는 보통 gcc를 많이들 쓰실테고..

cc는 g++로 컴파일하는 경우가 보통입니다..

리눅스에서는 확장자는 따로 구분을 하지는 않지만, 그렇다고 여러분도 구분을 안 하면 나중에 본인이 뭔짓을 했는지 엄청나게 후회할겁니다..

그리고.. 확장자는 구분 안하면서 대소문자 구별은 철저합니다..

에또, 그러니까 신경쓸게 두가지겠죠? ㅋㅋ

뭐 사실, 윈도우에 익숙해져 있다는건 gui지 ntfs가 아닐테니..  그냥 버릇을 들여버리세요 ㅋㅋ

암튼!

c랑 cc는 사람이 붙이는거고 리눅스는 조또 모른다고 쌩깐다고 방금 이야기했지요?

그 의미는, c++인데 걍 .c 붙여도 되고, c파일인데 cc나 cpp 붙여도 된다는 이야기것죠?

아 시발 존나 헷갈리네? 아 존나 불편하죠? 리눅스..

근데 이거.. 제게는 애매하지 않아서 좋아요..

헐? 이게 왜 애매하지 않냐고요?

어차피 사람이 다 정해주는건데 뭐가 애매해요? 당신 애매한 사람이었나요?

뭐 어쨌거나 저쨌거나 확장자는 알아서 정하시고요..

gcc로 c와 c++의 컴파일 방법을 알아보겠습니다..

gcc -o exec source.c [-std=c99]            // C
g++ -o exec source.c [-std=c++98]          // C++
gcc -o exec source.c -lstdc++ [-std=c++98] // gcc에서 c++ 컴파일 하실때

3번째것은 가능하면 안 쓰시는게 좋겠죠? 히히

 

자, 이제 Makefile에 대해서 알아볼까요?

다들 존나 어렵대.

근데 사실 어려워요.

(사실 리눅스 쓰는 새끼들중에 변태들이 존나 많아서..)

이건 그냥 기본소스에서 뜯어고쳐서 쓰다보면 어느새 작성할 수 있게 됨미다.

makefile을 보통 프로그래밍 언어에서 많이들 쓰는데, 이녀석은 원래 다른 용도로도 많이들 쓰여요..

그러니까, 컴파일러든 뭐든, 원본이 달라지면 어떤 작업을 해주어야 하는것들 있잖아요?

뭐, 각각의 원본 벡터파일에서 래스터파일로 렌더링해서 UI 파일을 만들어주어야 한다던가 할때도 쓰이고..

Latex로 문서파일같은거 만들때도 쓰이고 해요..

거기다 자동화가 알아서 되다보니 쓰다보면 편한데 처음 보면 ‘시발 이게 뭐야’라는 소리가 나오죠..

그니까 첨엔 그냥 있는거 수정해서 쓰시다가.. 천천히 이해하시는게 좋아요..

#주석은 이렇게 ㅋ
#objects는 변수처럼 쓰인다는거 알겠죠?
 
objects = main.o kbd.o command.o display.o insert.o search.o files.o utils.o
 
edit : $(objects)
        cc -o edit $(objects)
 
$(objects) : defs.h
kbd.o command.o files.o : command.h
display.o insert.o search.o files.o : buffer.h

사실 이것 역시 책으로 낼 정도의 분량이 나오는데..

http://www.gnu.org/software/make/manual/make.html 요기가 매뉴얼 페이지에요..

기본적인 의존성도 만들수 있고.. 뭐..

리눅스에서 쉘이 거의 그렇듯이, 존나 강력해서..

예제 정도만 해도 make 쓸만하고..

까놓고 블럭쌓기 하나 정도 만드는데 코드가 몇메가 되는것도 아니고.. ㅋㅋ

시간이 있다면 좀더 알아두면 나중에 엄청나게 편할겁니다..

오늘 강의는 여기까지..

금방 또 돌아오도록 하겠습니다!!

신고

강좌에 들어가기 전에..

벌써 몇달 지난것 같은데 아직 반도 못 하고 있었군요..

시간이 남지는 않지만 이러다가 정말 20일짜리를 2년동안 쓰고 있게 될듯 싶어서요..

2012년 새해가 밝았으니 어쨌거나 빨리 뭔가 해봐야겠어요..

흑룡의 해인데, PI 변경도 해보고싶고 한데..

아.. 씨바.. 블로그 색깔도 검은색이니 걍 냅둘래연..

우분투 포럼마스터가 블로그 글 쓰는데에는 Windows Live Writer라는 툴을 이용합니다 ㅋㅋ

아 좀 어이없나요? ㅋㅋ

강의.. 시작하도록 하겠습니다..

 

포인터랑 배열이 만나면 내머리가 아파와요..

아우 포인터도 빡세고 배열도 빡센데 씨바..

제목만 봐도 빡치죠?

아나 씨바 이거 설명해야되는 저는 어떻겠어요?

전 둘다 모르는데 썅.

그냥 C와 C++에서 동적배열 할당과 해제에 대해서만 먼저 알고 넘어가야겠어요..

뭐, 포인터와 배열은 거의 동적할당에 쓰인다고 보셔도 되구요..

까놓고 얘기해서 블럭쌓기에 동적배열 쓸일도 없습니다만, 워낙에 처음에 배워두지 않으면 나중에 피보는게 포인터랑 배열이라..

간단한 예제만 보도록 하겠습니다.

char *p = malloc(sizeof(char) *100);
free(p);

 char *p = new char[100];
delete [] p;

동적할당은 이런식으로 이루어집니다.

뭐 별거 없어보이죠?

사용은 배열처럼 쓰면 됩니다.

2차원배열로 넘어가면 아주 짜증납니다.

가변문자열 아주 죽습니다 ㅋㅋ


전시간에도 이야기했듯, 이건 직접 해봐야 할 문제입니다..

무책임하다고 생각하실지도 모르겠습니다만.. 해보지 않으면 이해가 안되는게 이거라서요..


무책임한 강의 여기서 마칩니다 ^^;

그냥 넘어가지 마시고 꼭 해보시기 바랍니다..

신고

강좌에 들어가기 전에..

참으로 오랜만입니다.

이것저것 하느라 바빴네요..

여러가지 행사가 있었어요..

이제 쬐끔 한가해졌으니, 진행하도록 하겠습니다..

배열.. 배열이 뭐여?

메모리를 할당해주는겁니다. 끗.

이라고 하고 싶지만 일단은 뭐.. 간단한 예제를 볼까유

#include <iostream>
int main()
{
  const int SIZE = 10;
  int sum[SIZE] = {0, };
  for(int i =1; i < SIZE; i++)
    for(int j =0; j <= i; j++)
      sum[i] += j;
  for(int i =1; i < SIZE; i++)
    std::cout << "Sum of 1 to " << i << " : " << sum[i] << std::endl;
  return 0;
}
 

자, 일단 본문과 좀 상관없는 이야기로, const int는 c에서 #define 많이들 쓰실텐데.. 아무래도 const가 좀더 명확하지 않나 싶습니다..

그리고 배열을 쓰는 가장 큰 이유는.. 뭐 아무래도 인덱싱(마땅한 말이 떠오르질 않네요.. 이거보다 알기 쉬운 단어 있으면 추천 받습니다) 때문에 그렇죠..

DB도 마찬가지겠구요..

내부적으로 어떻게 구현되는지는 OS 커널에 관련된 책을 보시면 알 수 있으실테고요(나중에 시간이 좀 많이 나면 이부분은 업데이트 하겠습니다)..

일단은 순차적으로 0부터 시작되는 인덱스가 있는거라고 보시면 돼요..

사실, 다른 언어들은 문자열에 대한 배열도 그냥 쉽게 지정해버립니다만, C와 C++은 그게 좀 어렵습니다..

제가 Java only의 언어스킬을 가지고 있는 사람을 무시하는 경향이 있는 이유가 여기입니다..

물론 개발자가 문자열을 어떻게 배열로 만드는지 꼭 알 필요는 없다고 보기도 합니다만..

그 동적할당과 해제를 경험하면서 효율과 속도라는 목적을 달성하려면 얼마나 많은 고민을 해야 하는데요..

그런 고민 한번도 안 해본 개발자를 개발자라고 말할 수 있을까요?

뭐, 여기서 태클 거실분들이 상당히 많을수 있겠습니다만, 지극히 주관적인 견해라는건 미리 말씀드려놓을게요..

제가 아는 많은 분들도 비슷한 견해를 가지고 있지만 어쨌거나 지극히 주관적인 견해입니다..

어쨌거나, 이미 해당 문제는 아주 많은 프로그램에서 다루고 있습니다..

하지만 한번은 생각하고 넘어가야 할 문제이기도 하지요..

그런데 따지고 보면, Win32 계열에서 요 문제를 고민할 경우, 찾을 수 있는건 추상적인 정보들 뿐이라는거죠..

일반적으로 OS에 대해 공부하는 분들 보면 상당히 광범위하게 공부를 하는데, 그건 파다보니까 그렇게들 되신거고, 초반에는 모르는것만 해당 코드를 뒤지는것부터 시작하는것도 나쁘지 않습니다..

 

배열 자체는 위에도 말씀드렸듯, 메모리를 할당해주고 인덱싱을 해주는것 뿐입니다..

실제로 C에서 사람들이 어렵다고 하는게 포인터랑 동적배열인데..

많은 분들이 본질적인 측면보다는 아무래도 눈에 보이는게 중요할테니 빙빙 돌려가면서 말을 하기 때문이려나요..

기본적인걸 이해하면 응용을 할 수 있습니다..

다들 응용단계로 진입하면, 기본은 너무 기본이라 다들 잘 알거라 생각하는거겠지요..

 

어차피 오프라인 강의입니다..

여러분들은 여러분의 방식대로 가변문자열을 어떻게 배열로 만들 수 있을지 연구해 보세요 ㅋㅋ

존나 어렵습니다..

제가 이거 하나때문에 몇달씩 고민한적도 있었는데, 그게 절대 뻘짓은 아니더군요..

이런게 싫으면 개발자나 뭐 이런 비슷한거 하지 마세요..

시간낭비입니다..

 

오늘의 강의는 이것으로 마칩니다..

신고

강좌에 들어가기 전에..

이야 이번에도 상당히 오랜만에 강좌를 쓰는것 같습니다..

 

드디어 포인터군요..

사실 전 포인터를 잘 모릅니다..

포인터의 정확한 내용은 알지만 응용을 많이 해보지 않은 터라..

그냥 모른다고 이야기하는게 속편하지요..

제가 아는 선에서 이야기하도록 하겠습니다..

 

 

포인터? c 할줄 알면 다 해야함. 물론 malloc이 뭔지도 알아야긋져? cc에서는 new/delete로 함..

자, 이제 메모리에 관련된 이야기군요..

오늘은 코드 없이 간단한 설명만 하겠습니다..

요즘 java 언어를 많이들 이용하는 이유가, 메모리 관리를 신경쓰지 않고 프로그래밍하기 좋게 만들어진 언어라서 그렇습니다만..

사실 메모리관리는 필수로 알아두어야 한다고 생각합니다..

물론 몰라도 고급언어 프로그래밍(고급 프로그래밍이 절대 아닙니다)은 가능하겠습니다만..

고성능을 요구하는 프로그램은 아무래도 만들기 어려울겁니다..

 

자, 포인터란 뭘까요?

정확히 말하자면, 어떤 변수의 주소값을 말하는거라고 할 수 있겠습니다.

사실, 포인터의 동작 원리를 설명하려면 OS의 메모리 할당에서부터 커널단계까지 들어갑니다만, 그건 나중에 알아서 찾아보세요.

간단한 프로그램 작성하는데 그렇게 스케일이 크면 입을 쩌억 벌리면서 십중팔구 ‘아 씨바 프로그래밍 존나 어렵네’하고 끝날겁니다.

오늘은 그냥.. “포인터는 주소값”이라는 것만 알면 됩니다.

다들 중요하다고 하면서도 어째서 책에는 포인터가 설명이 안되어있는건지 보면 더이상 설명할것이 없어서 그런거지요 ?ㅅ-;;

지금 제가 작성하고 있는 블럭쌓기 프로그램도 요거하나 만드는데 동적할당/해제가 들어가는것도 웃기잖아요..

퍼포먼스 향상을 위한 프로그래밍을 하실때즈음이면 이미 어떤식으로 해결해야 될거다라는 기본적인 개념을 가지고 어디서든 자료를 찾아볼 수 있으시겠지요.

그래도 알아두어야 할것 하나는.. 포인터는 주소값이라는겁니다..

그러므로 32비트용 프로그램하고 64비트용 프로그램하고 달라지는게 뭘까요?

자, 32비트와 64비트 프로그래밍의 차이는 주소의 차이입니다.

달라지는건 포인터가 OS가 32비트면 32비트의 크기, 64비트면 64비트의 크기를 가진다는것만 알면 되겠지요.

 

malloc이란 뭘까요? 말록이란 사람도 있나?

Memory ALLOCation 의 약자입니다.

쉽게 얘기하자면 9일차에 나올 배열을 내킬때마다 할당하는겁니다.

으, 아무래도 초반에 스케쥴을 잘못 잡았습니다 ㅋㅋ

어쨌거나 배열과 malloc이 하는 짓은 OS한테 이야기를 하는겁니다. 공간확보를 하라고.

배열과의 차이점은, 물건(데이터)를 싸야 되는데 나이롱끈(배열)로 묶을것인지 고무줄(malloc)로 묶을것인지 결정하는거구요.

그리고 고무줄은 존나 잘 끊어지죠.. 끊어지면 존나 아픕니다..

뭐, 좀더 부연설명을 하자면 배열은 ‘미리 확보’를 해두니 에러의 확률은 거의 없습니다만..

malloc은 깡패처럼 OS한테 무조건 ‘내놔’하고 드러눕습니다..

malloc으로 확보한 메모리를 다 사용하고 나면 free로 해제를 해주어야 합니다..

그러지 않으면 깡패가 잡고 안 놔줍니다.

 

C++에서는 new/delete라는 명령으로 사용하는데, 이것도 뭐 배열이나 malloc과 마찬가지지요..

 

C / C++이 다른 언어에 비해 어렵다고 느껴지는 이유는 메모리관리때문일텐데요..

메모리관리를 잘 하는 습관이 쓸모없다고 생각하는 사람도 있지만, 제 생각에는 굉장히 중요한 스킬중의 하나라고 생각합니다..

 

메모리 관련이 워낙에 쉽게 설명하기 어려운 것들이라 고민하다보니 많이 늦어졌습니다..

다음 강의는 조금 여유를 두고 작성하도록 하겠습니다..

신고

강좌에 들어가기 전에..

어떠신가요? 이제 슬슬 뭔가 해볼만 하지요? 1주차는 걍 하품만 하셨을거고 ㅎㅎ

뭐.. 해보고싶은걸 해봐야 재미가 있을텐데..

이거 뭐 중요한건 안 가르쳐 주는거 같고.. 우려먹기만 하는것처럼 보일수도 있겠습니다만.. ㅎㅎ

전 길잡이만 해드리는거지, 밥을 떠 먹여드리는게 아니라서 말이죠..

떠먹여주는 프로그래밍을 하시려면 큰 학원으로 가십시오.

아무것도 모른다 해도, 취업도 잘 시켜줄겁니다.

하지만 장담하건대, 이것조차 “이해하기 싫어서”(어려워서가 아닙니다) 하지 않으시는거라면, 뭘 하시더라도 성공하기 어려우실겁니다..

공부든 요리든 프로그래밍이든간에 하면 할수록 숙달됩니다.

뭐든 하면 할수록 어려워지고 또 재미있어지는게 인생입니다.

 

반복문. 내가 제일 하기 싫은게 똑같은일 계속 하는건데!! 시키자.

똑같은일 계속 하는거 싫으시죠?

그러니, 논리적 계산은 사람이 하고 산술적 계산은 컴퓨터를 시키면 되는겁니다.

그냥 반복되는거 다 하기싫겠지만 컴터한테 ‘야 이거 해’라고 하면 ‘어떻게?’라고 물어보지요.

근데 컴터는 ‘몰라’라는 말은 모릅니다 ㅋㅋ

어쨌거나 반복을 시키는 방법은 여러가지가 있습니다.

1부터 100까지 세는 프로그램을 3회째 우려먹기하고 있기는 한데, 또 우려먹겠습니다 ㅎㅎ

가장 일반적인 for 가 있지요.

#include <stdio.h>
int main()
{
  const int min = 1, max = 100;
  int i, sum = 0, oddsum = 0, evensum = 0;
  for(i = min; i <= max; i++)
    sum += i;
  printf("%d~%d까지 모두 더한 결과는 %d입니다.\n", min, max, sum);
  return 0;
}

for ( 변수초기화; true일때 실행; 변수값 변화 ) 명령or블럭

 

그리고 while이 있겠구요..

#include <stdio.h>
int main()
{
        const int min = 1, max = 100;
        int i = 0, sum = 0;
        while(i<max)
        {
                i++;
                sum+=i;
        }
        printf("%d~%d까지 모두 더한 결과는 %d입니다.\n", min, max, sum);
        return(0);
}

while ( 조건문, true 일 경우 실행 ) 명령or블럭

 

do-while 도 있지요.

#include <stdio.h>
int main()
{
        const int min = 1, max = 100;
        int i = 0, sum = 0;
        do 
        {
                i++;
                sum+=i;
        } while(i<max);
        printf("%d~%d까지 모두 더한 결과는 %d입니다.\n", min, max, sum);
        return(0);
}

뭐 걍 while이 앞에 오냐 뒤에 오냐 차이긴 한데.. 일단 한번 하고 보느냐 안 하느냐 차이입니다..

논리적으로 그림이 잘 그려졌다면 둘중의 하나를 선택할 이유도 없겠습니다만, 둘다 알고 있으면 도움되는것이 상당할겁니다..

 

매우 비추하지만 goto 를 이용하는 방법도 있습니다..

#include <stdio.h>
int main()
{
  const int min = 1, max = 100;
  int i = 0, sum = 0;
plus:
  i++;
  sum+= i;
  if(i<max) goto plus;
  printf("%d~%d까지 모두 더한 결과는 %d입니다.\n", min, max, sum);
  return(0);
}

goto 한두개 쓸때야 모르겠습니다만, 여러개 쓰다보면 헷갈리기 시작합니다.

요즘은 아예 쉘 스크립트에서도 함수를 지원하는 경우가 많으니 goto는 가능하면 안 쓰도록 합시다.

 

반복문을 설명하자면 또 빠질수 없는것이, continue와 break입니다.

#include <stdio.h>
int main()
{
  const int min = 1, max = 100;
  int i, sum = 0;
  for(i = min; i <= max; i++)
  {
     if(i == 50) continue;
     sum = sum + i;
  }
  printf("%d~%d까지 50번째를 빼고 모두 더한 결과는 %d입니다.\n", min, max, sum);
  return 0;
}

continue는 이렇게 쓰고..

#include <stdio.h>
int main()
{
  const int min = 1, max = 100;
  int i, sum = 0;
  for(i = min; i <= max; i++)
  {
     if(i == 50) break; 
     sum = sum + i;
  }
  printf("%d~%d까지 50 전까지만 더한 결과는 %d입니다.\n", min, max, sum);  
  return 0;
}

요것이 break 입니다.

설명하기가 좀 거시기하므로, 실행해서 확인해보시는게 빠를겁니다.

continue와 break는 유용하게 사용되지만, 생각보다 논리 오류가 많이 발생하니 가능하면 그림을 많이 그려보도록 하세요.

 

이런식으로 반복문을 이용하시면 됩니다.

멀티코어(프로세싱)에서는 조금 다를수 있겠습니다만, 그건 나중에 쓸때 생각하셔도 되고..

어차피 openMP라던가 Threading Building Block같은 툴들이 있으니 나중에 그런것들 사용법을 익히세요..

 

한번씩 해보셔도 좋고, 그냥 눈으로만 보셔도 상관없습니다.

오늘 강좌는 이것으로 끝입니다.

신고

강좌에 들어가기 전에..

으힠 3달 걸려서 1주차 자료를 준비하였었군요..

이제 2주차입니다.

죄송합니다. 속도를 좀 내겠습니다.

진짜 강좌 하나 하는데 1년 걸릴 기세..

고급스킬 배우시려면 다른데 가십쇼 ?_- 전 걍 길잡이 정도나 할렵니다 ㅎㅎ

자 부담없이 또 시작하시지요.

 

조건문, 무조건 뭘 하냐고요?

자. 조건문입니다.

일단 조건문은 if 입니다.

if x 명령어; [elseif y 명령어] [else 명령어]

이런식이지요.

근데 보통 쓰는 방식은

if (a>b) { c=a-b; } else { c=b-a; }

요런식으로 많이들 쓰신단 말이죠.

x와 y는 형식이 어떻든간에 0이면 false, 0이 아니면 true 입니다.

하지만 되도록 bool 타입으로 쑈부 치시는게 좋으실거에요..

이분법적 사고가 좋지 않다고들은 하는데, 컴터한테 복잡한거 설명해봐야 이눔은 뼛속부터 이분법적인 사고를 가지고 있어서 말이죠.

 

어쨌거나, 컴터 이놈은 x가 0이 아니면 뒤에 명령어를 실행합니다.

x가 0이면 걍 넘어가지요.

근데 뭐 조건식이라는게 있잖아요?

… 근데 조건식이라는게 또 웃긴게.. 연산이에요.. 걍 논리연산..

true는 1이라는 값을 가지고 있어요.

긍게 “스위치가 켜져있다”라는게 1이고, 그건 즉 true를 의미합니다.

꺼진거는 0이고 false고요. 여기까진 쉽죠?

x = 1>2;

라고 하면 에러가 날까요?

뭐, 저건 한번 해보시길 바래요.

 

어쨌거나, 조건식을 알흠답게 구현하는것이 프로그래머라고 생각하셔도 큰 무리는 없을겁니다..

자, 이제 샘플코드를 한번 보여드리죠.

#include <stdio.h>
int main()
{
  const int min = 1, max = 100;
  int i, sum = 0, oddsum = 0, evensum = 0;
  for(i = min; i <= max; i++)
  {
    sum += i;
    if(i%2)
    {
      oddsum += i;
    }
    else
    {
      evensum += i;
    }
  }
  printf("%d~%d까지 모두 더한 결과는 %d입니다.\n", min, max, sum);
  printf("%d~%d까지중에 홀수를 더한 결과는 %d입니다.\n", min, max, oddsum);
  printf("%d~%d까지중에 짝수를 더한 결과는 %d입니다.\n", min, max, evensum);
  return 0;
}

전에 했던거에서 조금 추가를 했지요.

저기에 % 연산자는 앞엣것을 뒤엣것으로 나눴을때 나머지 입니다.

if 뒤의 괄호 안엣것을 맘대로 바꿔가면서 해보시면.. 뭐 대충 이해가 될겁니다..

 

이건 뭐 바로바로 결과가 나오고, 좀더 고급 스킬을 쓰고 싶으시면 전에도 말씀드렸듯이 gcc manual이나 msdn을 참조하시면 됩니다.

다들 하는 얘기 또 하면 지겹기만 하잖아요 ㅋㅋ

뭐, 지금은 블럭쌓기 만드는데 알아야 할 것만 알면 되지 않을까 싶어서 말이죠..

 

 

오늘 강의도 이것으로 마칩니다.

그냥 쓱 읽으면 몇분도 안 걸리지만, 그럴거면 뭐하러 봐요 ㅎㅎ

나름대로 한번씩 해보시는게 좋습니다.

그리고 언제나 태클은 환영입니다 Array

신고

강좌에 들어가기 전에..

정~~~말 오랜만입니다.

7월에 한국우분투 사용자모임에서 발표를 하느라 조금 바빴습니다..

그전에는 임베디드쪽에서 일주일간 일을 하였고..

월초에는 회원목록 뽑는걸 만드느라 좀 시간좀 걸렸었습니다..

어후.. 암튼 진행하도록 하겠슴다..

 

변수? 요게 바로 프로그래밍의 핵심이거덩..

자, 변수에 대해서 알아보기 전에..

변수 말고도 상수라는게 있어요..

상수가 뭐고 변수가 뭐냐!

그냥 쉽게 말해서 상수는 안 변하는 값이에요.

변수는 시시때때로 변화를 줄 수 있는거고요.

어쨌거나 둘다 메모리를 씁니다.

 

뭐, 이건 프로그램을 보면서 설명하는게 좋겠네요..

아주 간단한, 1에서 100까지 더하는 프로그램이에요.

#include <stdio.h>
int main()
{
  const int min = 1, max = 100;
  int i, sum = 0;
  for(i = min; i <= max; i++)
  {
     sum = sum + i;
  }
  printf("%d~%d까지 모두 더한 결과는 %d입니다.\n", min, max, sum);
  return 0;
}

 

여기서는, 변수를 일단 i라는 변수랑 sum이라는 변수를 선언했지요.

int i, sum=0;

요 코드는 선언입니다.

선언은, “내가 i랑 sum을 변수로 쓰겠다!'”라는 표현이죠.

int는 “숫자를 저장하겠다!” 라는거구요.

char 이라고 쓰면 “문자를 저장하겠다!”라는건데요,

근데 요즘같은 unicode 세상에서 “문자”라는건 이미 char의 범위를 넘습니다만, 그냥 영어는 char 범위안에 있고 문자열은 또 따로 쓰는게 있으니 넘어가도록 합시다(누구맘대로)

bool이라고 하는녀석도 있는데, 이녀석은 flag(있거나 없거나 둘중하나) 같은걸로 많이들 이용하지요.

그리고 보시면 i는 걍 있고 sum은 0이라고 했지요?

초기값을 지정해줄수가 있어요.

지정 안해주면 어떻게 되냐구요?

지가 알아서 랜덤으로 잡아요 ㅋㅋ

signed, unsigned 뭐 이런것도 있는데, 부호가 있냐없냐 차이고.. 양수로만 계산할거면 unsigned가 좀더 메모리도 덜 먹고(사실 요즘 세상에 1비트 차이야 있겠습니까만은) 조금이나마 실수할 확률을 줄여주죠..

 

빼먹은게 있다구요? 어디어디?

아~ const 요놈?

요놈은 변수임에도 불구하고 안 바뀔것들을 선언하는겁니다.

뭐.. const를 붙이건 안 붙이건 그닥 상관은 없긴 하지만, 요게 또 실수를 좀 줄여주는 놈이에요.

바꿀라 그러면 컴터가 못해먹겠다고 하거든요.

컴터 때려봐야 손만 아픕니다. 걍 에러 수정 하세요 ㅋ

컴파일러가 에러 뱉어줄때가 좋을때입니다.

나중에 무슨 memory leak이나 컴터가 감지하기 애매한 논리오류같은거 생기는거에 비하면 컴파일 에러는 정말 별 승질 안 나는 에러죠.

 

변수 형식 졸라 많고 상수 형식도 졸라 많고 무슨 Generic이니 포인터니 배열이니 하는거 많은데..

포인터와 배열은 조금 지나서 설명을 해드릴거고, 나머지는 컴파일러에 종속된것들이지만 쓸일이 그렇게 많진 않고..

블럭쌓기 게임에 그런것까지 생각하면 머리아프니, 혹시라도 더 알고 싶으시면 gcc manual이나 msdn을 참조하시면 됩니다..

뭐, 다른 책들에서는 표까지 그려가며 친절하게 설명을 해주긴 하지만..

여기서 당장 써먹긴 좀 그렇고, 2차 강의때 좀더 다루도록 하겠습니다..

 

 

뭐 아무것도 배운게 없는것 같은데 5일차 마무립니다..

저는 뭐 정확하게 이게 뭐다! 하고 가르칠 수 있는 능력은 안 됩니다.

그런 것들은 다른 좋은 강사님들이 쓰신것도 많지요..

제 강의는 그냥 길잡이 정도로 생각하시면 됩니다.

 

수고 많으셨습니다. 다음 6일차에서 뵙도록 하겠습니다.

신고

+ Recent posts