1) 지식 창고는 본인이 작성한 콘텐츠(팁/노하우/리소스/강좌 등)을 무료 혹은 가상화폐인 납포인트를 통해 공유하는 공간입니다.
2) 본인이 작성한 콘텐츠에 대해서만 지식 창고에 등록할 수 있으며, 저작권에 위배되는 콘텐츠는 사전경고 없이 삭제될 수 있습니다.
3) 콘텐츠 구매 및 첨부파일 다운로드는 회원그룹 '연구원' 이상 가능하오니, 경험치를 쌓아 진급한 후에 이용 부탁드립니다.
4) 무료 콘텐츠의 본문은 구매절차 없이 즉시 이용할 수 있으며, 판매 납포인트가 있는 콘텐츠는 구매 후 이용할 수 있습니다.
5) 콘텐츠 판매에 따른 납포인트 수익은 지정한 비율(50%)에 따라 판매자에게 지급하며, 납포인트 수익을 통해 진급을 빨리할 수 있습니다.
6) 구매 후 평가를 하면 구매 납포인트의 20%를 돌려 드립니다.
판매자 | 프리미엄 | 판매 납포인트 | 무료 | 평점 | 0점 / 총 0명 참여 |
---|
***************************< 캠퍼스 C 강좌 >**************************
[제목] :
[코드] : campusc1-007 (초급)
[교재] : CAMPUS C (초급, Third edition) [출판사 : 책과스승]
[알림] :이 파일은 "캠퍼스 C"에서 모든 분께 공개한 "초급 강좌"입니다.
이 [알림]의 내용을 지우지 않는다면 누구에게나 임의로 복사해 줄
수 있습니다.그러나 이 강좌 내용에 대한 저작권은 "캠퍼스 C"에 있습
니다.
[연락처] : 605-8662 (서울) ("캠퍼스 C", 도서출판 "책과 스승")
천리안 : go campusc
나우콤 : go lcampc
하이텔 ID : campusc
***************************<< 목 차 >>*********************************
<1> 배열에 대해서
1> 배열이란
<2> 제어문
1>. for
2>. switch
3>. break,continue
***************************< 내용 시작 >*******************************
<1> 배열에 대해서
1> 배열이란
***********************************************************************
1> 배열이란
다음과 같은 예를 직접 보자
main()
{
char piano;
char rambo[3];
piano = 'd';
rambo[0] = 'a';
rambo[1] = 'b';
rambo[2] = 'c';
piano = rambo[2];
}
이제는 piano 가 변수명이라는 것을 아실 것이다. 물론 내 맘대로
지었다. 영화 제목에서 따온 것이다 rambo 도 변수 명이다.이건 rambo 1 2 3
까지 나왔다.어떤 영화가 제일 재미있었는지는 모르겠지만 나름대로 등급을
매겨서 a,b,c,d를 집에다 넣어 주었다. 제일 좋은 등급은 rambo[0] 이 받았
다. 우리는 지금 4 편의 영화 얘기를 하고 있다. 그러나 rambo 1,2,3 는 일
종의 쌍둥이 같이 별개의 영화라고 느껴지지 않는다. 이럴 때 우리는 배열
(array)을 쓴다. 즉 각각 독립적으로 쓰일 수도 있지만 내용에 공통점이 있
고, 따라서 일괄적으로 처리할 일이 많은 경우 배열을 쓴다. 배열을 선언하
는 것은 간단히 대괄호("[ ]") 를 변수명 옆에 붙이는 것이다.
[157쪽]의 그림을 보시고 몇 가지 상식을 외자.
1. [ ] 사이의 숫자는 몇 쌍둥이 인가를 나타낸다.즉 a[4] 는 4 쌍둥이
2. 쌍둥이라도 이름은 [0]부터 시작하여 i[0], i[1],i[2] 이고 마지막 이
i[3] 가 아니라는 것을 주의.
3. 그리고 각각의 i[0],i[1],i[2], 크기는 1 바이트씩 할당됨.
char i[3]이라는 표현에서 앞부분의 "char"가 그 각각의 크기를 보여줌.
4. 위의 경우 "i" 들이 쓰는 집은 3 채 즉 3 명 x 1채씩
다음의 결과가 위의 설명을 더욱 명쾌하게 한다.
main()
{
char rambo[3];
printf(" size = %d", sizeof(char));
printf(" size = %d", sizeof(rambo));
printf(" size = %d", sizeof(rambo[2]));
}
<답>
size = 1
size = 3
size = 1
즉 배열의 낱낱의 요소 크기는 배열 앞에 선언된 변수형(type) 과 같다. 그
러면 아래는 어떤가 (int type이다)
-------------
main()
{
int robocop[3];
printf(" size = %d", sizeof(robocop));
printf(" size = %d", sizeof(robocop[2]));
}
<답>
size = 6 3개 x 2채( int type)
size = 2 2 채
크기에 대한 이해가 확실해야 한다. 이제 직접 주소(address)를 따
져 보자. 일단 "주소는 먼저 선언된 순으로 할당된다"고 보자. 그러면 다시
rambo 예를 보면
-------------------
main()
{
char piano;
char rambo[3];
}
piano 가 처음 왔으므로 일단 100호를 주자 그러면
rambo[0] 은 101호
rambo[1] 은 102호
rambo[2] 은 103호
아무 문제없다. 그럼 이제 robocop을 보자
main()
{
int robocop[3];
}
robocop[0] -> 100호
robocop[1] -> 102호
robocop[2] -> 104호
robocop[] 하나 마다 두 채씩(int) 쓰므로 번지수는 두개씩 증가되었다.
<문> long type 은 4 바이트(4 채)씩 할당된다. 다음의 주소를 찾아 줘라
----------------
main()
{
long terminator[3];
}
terminator[0] -> 100호
terminator[1] ->
terminator[2] ->
앞으로는 이와 같이 "주소 찾아 주는 일"을" memory map을 그린다"
고 얘기하자. 이제는 남이 이 강좌를 보면 너무 유치하다고 하지 않을까 걱
정이다.용어를 점점 제대로 쓰자."memory 아파트에 누가 어디 있는지 지도에
표시"하자는 말이다. 자 이제 당분간 배열을 써먹을 수 있게 되었다.
***********************************************************************
<2> 제어문
1>. for
2>. switch
3> break,continue
***********************************************************************
1> for
for문은 while 문의 표기법을 더욱 간단하게 표시한 것이다. 기능은
똑같다.따라서 이 for 문은 정말 빈번하게 쓰인다. 지난 회에서 while문을
제대로 쓰려면 3 박자가 맞아야 한다고 했다.즉
age = 10; <-- 1. 시작 나이를 초기화
while( age < 20) { <-- 2. 나이 비교.
printf("No");
age++; <-- 3. 나이 증가
}
위와 같은 내용을 for문을 써서 한 문장으로 표기하면 다음과 같다.
for(age = 0; age < 20; age++) {
printf("No");
}
5줄이 3줄로 줄었다. 하고 싶은 말을 간결하게 썼기 때문이다.표기법을 이해
하리라 믿는다. 위의 두 예를 항상 비교 기억해야 한다. 여기서도 단문인 경
우 { } 를 생략할 수 있다. 여기서 반드시 기억할 것은 다음과 같다.
1) for문도 3 박자를 맞추어야 하므로 반드시 for(;;)내부에 두개의
";"을 써서 3부분으로 나눈다는 것이다. 따라서 for문을 보면 만사 제쳐놓고
";" 두개를 찾아라.-> for( ; ; ). 없으면 error다.
2) 필요하면 for의 머리 부분 for( ; ; ) 에서 ","를 써서 첫 부
분과 셋째 부분을 여러 개 쓸 수도 있고 생략도 가능하다. 그러나 가운데 부
분은 생략은 가능하나 여러 개 쓸 수는 없다. [126쪽] <머리 부분 표현법 >
참조.
<문> 왜 가운데 부분에 콤마 연산자를 쓸 수 없을까 ? 이유를 생각해 보라.
이제 배열을 써먹어 보자. rambo 형제 집에다 각각 0,1 2 을 넣자.
main() {
int i,rambo[3];
for(i= 0; i < 3; i++) { /* <-- 3 보다 작다 */
rambo[i] = i;
}
}
rambo 형제 집에다 각각 400 500 600 을 넣자
main() {
int i,rambo[3];
for(i= 0; i < 3; i++) { /* <-- 3 보다 작아야 한다 */
rambo[i] = (i + 4)*100;
}
}
[문] for 문을 써서 1 부터 100 까지 더하는 프로그램을 작성하라.
[문] 다음의 결과를 써라
main()
{
int i,j;
for(i=0; i <= 3; i++) {
if(i== 1) break;
for(j=0; j <= 3; j++) {
if(j == 2) break;
}
}
printf("i = %d j = %d\n",i,j);
}
-----------------------------------------------------------------------
2> switch
이것은 if else문을 간결히 하기 위해 만든 표현법이다. if,else는
양자 택일밖에 못한다. 다중 택일을 하려면 if else, if else를 여러 개 사
용해야 한다.그것은 자칫하면 표현이 복잡해 질 수 있으므로 표현법을 간단
히 하기 위해 아예 switch 문을 만들었다 이것은 비교적 표현이 복잡하다.
따라서 [119쪽]의 완전한 사용 예를 항상 참조하기로 하자.
이제 다음 말을 각각 if 와 switch로 써서 구현하고 비교하자.
-----------------------------------------------------
" 한 문자를 받고 그 키가 'q'이면 quit , 'b'이면 bell,
'p'이면 print,'w'이면 write 라고쓰고 그 이외의 것은
"I_don't_know" 라고 쓰자
-----------------------------------------------------
[120쪽]의 비교 테이블을 보자.
여러분이 보기에는 어떤 표현이 보기 좋은지 모르겠다. 길이가 더
짧아지지는 않았다.그러나 좌측(switch문) 표현법이 간결하고 짜임새 있다
는걸 느낄 것이다. 새로운 예약어 switch, case, break,default가 새로 나왔
다. [55쪽]에 형광펜으로 그어 보자. 그리고 ":" 표시가 처음 나온 것 같
다. 다소 복잡하게 보일지도 모르겠지만 이건 표기법이기 때문에 특별히 설
명할 것이 없다. 그냥 외우는 수밖에...
개념적으로는 도박 "black Jack" 이나 "도리 짓고 땡"(이런 예를 들
어서 어떨지...)을 아는 사람은 이해가 빠를 것이다. 이런걸 전혀 모르는 청
소년을 위해서 잠깐 설명을 하면, 블랙 잭은 패 나눠주는 사람(딜러) 한 명
이 손님을 동시에 여러 사람을 상대한다. 패를 자기도 갖고 손님 여러 명에
게 나눠 준 후 한사람씩 순서대로 비교해 나간다. 즉 [딜러 - 손님 1], [딜
러 - 손님 2], [딜러 - 손님 3] 이런 식으로 한사람 씩 비교해 나가는 것이
다.
지금 나오는 switch()에서는 딜러와 [손님 1]과 손에 든 카드가
"똑같은지 만" 비교한다.(크고 작고를 비교 하는 게 아니다)(중요). 만일 틀
리면 그 다음 [손님 2]와 비교한다.이런 식으로 손님 끝까지 간다.여기서
딜러의 역할은 변수 ch의 내용이다.손님은 case 'q', case 'b',...들이다.
이때, 손님과 똑같은 카드를 못찾으면 "에라 모르겠다" 하면서 가는곳이
"default" 다. 이 표현법은 얘기 할 것이 많다.
1)
case 'q' 에서 'q'자리에는 반드시 상수가 와야 한다. 즉 'q' 같은 문자 상
수나 12 같은 숫자 상수 가 와야지 변수 명을 써서는 안된다는 것이다(중요)
2)
위의 ch 가 'p'따위와 비교해서 "값이 같은 경우만" 그 줄부터 수행한다
실행하다가 break문을 만나면 즉각 switch 블럭 { } 을 빠져 바로 아래로 가
고 못 만나면 계속해서 이어지는 문장들을 실행하다가 결국 switch 의 끝 }
를 만나면 그 블록을 빠진다. break의 역할은 "실행문이 내려오다 자기한테
걸리기만 하면 switch 블럭 { } 밖으로 집어던지는 것"이다.무서운 놈이다.
<숙제> 위 switch 프로그램에서 break를 전부 빼고 키보드에서 'q'를 쳤다면
어떤 결과 ?
3)
default 는 위에서는 "아무것에도 해당하지 않으면"이란 뜻이다. 이 용어는
좀더 알아야 할 필요가 있는데 일반적으로 컴퓨터 세계에서는 "별 말이 없
으면 으레 하던 데로(또는 있던 데로)하게 되있는" 이라는 뜻이다. 말이 더
어려운데, 예를 들면 어린애가 집에 가다 동네 아줌마 그룹을 만났다. 그 중
에 엄마도 있다면 그 애는 "디폴트"로 엄마에게로 간다 그러나 딴 아줌마가
먼저 나가서 애를 가로챈다면 물론 엄마와 접촉할 수 없다. 위의 경우도 마
찬가지다. 'q' 'p' 따위가 먼저 나가서 채 가면 할 수 없고 아니면 나에게
"디폴트(default)로 오기로 되있는 이라는 의미로 쓴 것 이다. 그래서 통상
default의 위치는 switch의 맨 아래 쪽이고 없어도 상관없다. default의 개
념을 위해 예를 더 들어보면.
(1) 컴퓨터를 키면 default로 C: 드라이브에서 부팅을 한다.
(2) "캠퍼스 C" 강좌에서는 "디폴트"로 "조합형 한글"을 사용한다.
<문제> [120쪽] ( 예제 1)번의 의미를 아는 것은 중요하다. 꼭 풀어보시기
바란다.
<숙제> 성적등급을 매기는데 90 ~ 99점 은 'A' 80 ~ 89점은 'B' 70 ~ 79점은
'C' 60 ~ 69점 은 'D' 그 아래는 'F' 를 표시하는 프로그램을 switch 문을
써서 짜 보자. 여기서 switch문은 어느 값이 서로 같은 지만을 비교하지 범
위를 따지는 게 아님을 기억하고 나머지 연산자 "/"를 이용하라
( [121쪽] (예제 2) 참조. )
-----------------------------------------------------------------------
3> break, continue
break를 또 다룬다. 이것의 기능은 간단하지만 실행 문의 순서를 제
어 한다는 측면에서 보면 아주 중요하다. 기능은 정확하게 말해서 다음과 같
다.
1. 무식하게 말해서
" 누구든 내려오다 나(break)한테 걸리면 "나를 감싸고 있는 제일
가까운 블럭"{ } 밖으로 집어 던져 버린다. 단 블럭은 while,for,
do-while, switch 의 블럭 4 가지다.(if 블럭 { } 은 상관없다)
([129쪽] 박스에 해당)
2. 유식하게 말해서
"break문은 중첩된 while,do-while,for,switch의 4가지 루프의 가장
안쪽 루프를 하나만 벗어나게 한다"
continue문은 break처럼 밖으로 집어던지지 않고 프로그램의 제어가
루프의 조건식을 검사하는 부분으로 되돌아간다. 즉 for 와 while은 맨 처음
으로 가고do-while문에서는 맨 뒤로 간다. 여기서 switch문은 관계없다.
[130쪽] 아래 박스에 해당)
두 예를 비교하자
while(1) { /* 무한루프 */
printf("\n press 'q' : ");
if(getch() == 'q')
break;
}
printf(" Yes Quit !");
--------------------------
while(1) { /* 무한루프 */
printf("\n press 'q' : ");
if(getch() != 'q')
continue;
else
break;
}
printf(" Yes Quit !");
************************< 끝 맺으며 >*********************************
직접 컴파일을 많이 해 보세요.
**********************************************************************