반복문(loop문)

2011. 8. 8. 19:19 from PROGRAMMING/C

1. while문
특정 조건을 주고 그 조건이 만족될 때까지 계속 반복

while( 반복 조건)
{
반복 내용
}

while문의 중괄호는 둘 이상의 문장을 묶기 위해 사용.
반복하고자 하는 문장이 하나인 경우에는 중괄호를 쓰지 않아도 된다.

while문을 이용한 무한 루프
while(1) //반복의 조건 대신 0 이 아닌 정수를 넣는다.
{
printf("Hello World! \n");
i++;
}
//0 이 아닌 모든 수는 true로 인식되기 대문에 반복의 조건은 항상 true가 되어 무한 루프에 빠진다.
//무한루프에서 빠져나오려면 Ctrl+C



2. do~while문
while문은 조건이 만족되지 않으면 루프를 한번도 실행하지 않게 되지만, do~while문은 반드시 한번은 루프를 실행하게 되어 있다.

do
{
반복 내용
}while( 반복 조건);


3. for문
for문은 초기문, 조건문, 증감문 3개의 문장을 기본적으로 포함하고 있다.

for(초기문; 조건문; 증감문)
{
반복하고자 하는 내용
}
Posted by 마마필로 :


■ 가장 많이 쓰이는 서식 문자들
%c: 단일 문자
%d: 부호 있는 10진 정수
%f: 부호 있는 10진 실수
%s: 문자열

■ 부호 없는 정수형 출력(unsigned가 붙은 자료형의 변수 출력)
%o: 부호 없는 8진 정수
%u: 부호 없는 10진 정수
%x: 부호 없는 16진 정수, 소문자 사용
%X: 부호 없는 16진 정수, 대문자 사용

■ '부동소수점 표현 방식'에 의한 출력(실수 표현)
%e: e 표기법에 의한 실수
%E: E 표기법에 의한 실수

■ 표현하고자 하는 실수의 값이 소수점 이하 6자리인 경우 %f의 형태로 출력.
이 범위를 넘길 경우 %e의 형태로 출력
%g: 값에 따라서 %f, %e 둘 중 하나를 선택
%G: 값에 따라서 %f, %E 둘 중 하나를 선택

%i: 부호 있는 10진 정수, %d와 같음
%%: %기호 출력

■ 필드 폭을 지정하여 출력
%8d: 필드 폭을 8칸 확보하고 오른쪽 정렬해서 출력
%-8d: 필드 폭을 8칸 확보하고 왼쪽 정렬해서 출력
%+8d: 필드 폭을 8칸 확보하고 오른쪽 정렬한 상태에서 양수는 +, 음수는 -를 붙여서 출력

'PROGRAMMING > C' 카테고리의 다른 글

반복문(loop문)  (0) 2011.08.08
논리연산과 비트연산  (0) 2011.08.03
[수업후] Double Pointer, scope연산자  (0) 2011.04.22
[수업후] 포인터, const  (0) 2011.04.21
[수업후] 포인터와 배열  (0) 2011.04.20
Posted by 마마필로 :

1. 논리연산
-논리연산자(&&, ||, !): and, or, not을 표현하는 연산자
-true(1) 나 false(0)로 값을 반환한다.
-논리연산자와 의미

&&: 피연산자가 모두 참이면 true를 반환(and)
||:  피연산자 중 하나라도 참이면 true를 반환(or)
!: 피연산자가 true면 false를, false면 true를 반환(not)


2. 비트단위 연산
2.1 비트 연산자와 의미 (결합성은 모두 → )
&: 비트 단위 AND (ex. a & b)
|: 비트 단위 OR (ex. a | b)
^: 비트 단위 XOR (ex. a ^ b)
~: 비트 단위 NOT (ex. ~a)
<<: 왼쪽으로 이동 (ex. a<<2)
>>: 오른쪽으로 이동 (ex. a>>2)

2.2 & 연산자: 비트 단위 AND
두 개의 비트가 모두 1일 때 1을 반환
0 & 0 → 0을 반환
0 & 1 → 0을 반환
1 & 0 → 0을 반환
1 & 1 → 1을 반환

2.3 | 연산자: 비트 단위 OR
두 개의 비트 중 하나라도 1이면 1을 반환
0 | 0 → 0을 반환
0 | 1 → 1을 반환
1 | 0 → 1을 반환
1 | 1 → 1을 반환

2.4 ^연산자: 비트 단위 XOR
두 개의 비트가 서로 다를 경우 1을 반환
0 ^ 0 → 0을 반환
0 ^ 1 → 1을 반환
1 ^ 0 → 1을 반환
1 ^ 1 → 0을 반환

2.5 ~연산자: 비트 단위 NOT
보수 연산. 비트를 반전 시킴
~0 → 1을 반환
~1 → 0을 반환

2.6 <<,>> 연산자: 비트 이동(shift)
<< 연산자: 왼쪽 쉬프트(shift) 연산 (1칸 왼쪽 이동 → *2)
ex.
a<<b → a의 비트들을 b칸씩 왼쪽으로 이동한 값을 반환
8<<2 → 8의 비트들을 왼쪽으로 2칸씩 이동한 값을 반환

>> 연산자: 오른쪽 쉬프트(shift) 연산 (1칸 오른쪽 이동 → /2)
ex.
a>>b → a의 비트들을 b칸씩 오른쪽으로 이동한 값을 반환
8>>2 → 8의 비트를 왼쪽으로 2칸씩 이동한 값을 반환





'PROGRAMMING > C' 카테고리의 다른 글

반복문(loop문)  (0) 2011.08.08
서식 문자(Conversion Specifier)의 종류와 그 의미  (0) 2011.08.04
[수업후] Double Pointer, scope연산자  (0) 2011.04.22
[수업후] 포인터, const  (0) 2011.04.21
[수업후] 포인터와 배열  (0) 2011.04.20
Posted by 마마필로 :

Double Pointer(중첩 포인터)

 

int **ppA;

더블 포인터가 가리키는 것은 Single Pointer



scope연산자

::

'PROGRAMMING > C' 카테고리의 다른 글

서식 문자(Conversion Specifier)의 종류와 그 의미  (0) 2011.08.04
논리연산과 비트연산  (0) 2011.08.03
[수업후] 포인터, const  (0) 2011.04.21
[수업후] 포인터와 배열  (0) 2011.04.20
[수업후] 포인터  (0) 2011.04.18
Posted by 마마필로 :

포인터로 함수의 파라미터로 전달

 

call by value //변수의 사본이 복사, 원본은 변하지 않는다

call by reference //주소값으로 호출

 

#include <stdio.h>

void swap(int *a, int *b);

 

int main()
{
     int a=10;
     int b=20;

 

     swap(&a, &b);
     printf("%d %d\n", a, b);

     return 0;
}

 

void swap(int *pa, int *pb)
{
     int temp;

 

     temp=*pa;

     *pa=*pb;
     *pb=temp;

}

 

scanf("%c", &a)

'PROGRAMMING > C' 카테고리의 다른 글

논리연산과 비트연산  (0) 2011.08.03
[수업후] Double Pointer, scope연산자  (0) 2011.04.22
[수업후] 포인터와 배열  (0) 2011.04.20
[수업후] 포인터  (0) 2011.04.18
[수업후] 배열  (0) 2011.04.15
Posted by 마마필로 :

배열이름값을 정수로 출력하면=첫번째 요소의 주소값

포인터로 첫번째 배열을 가리켰을 때와 같은 값이 출력됨

-> 배열과 포인터의 역할이 동일함을 알 수 있다.

 

*ptr =a; 은 *ptr=&a[0]; 과 같은 의미이다.

 

int a[5]={0, 1, 2, 3, 4}

 

for(int i=0;i<sizeof(a)/sizeof(int);i++) // 배열의 길이가 변해도 for문을 수정하지 않아도 되도록 sezeof를 이용하여 조건식을 작성해준다.

{

}

 

arr[i] = *(arr+i)

 

int main(int argc, char *argv[]) // char *argv[] = char **argv

// argc, argv 콘솔에서만 사용됨

// 콘솔 프로그램: 표준 입력(키보드)/출력(모니터) 장치만 사용하여 입력 또는 출력 받는 프로그램

{

}

 

char형 배열 -> 문자열 상수 표현에 사용

 

#include <stdio.h>

int main()
{
     char str[5]="stop"; // 임시객체, 다음문장이 실행되면 메모리에서 사라진다.
     char *str1="start";


     printf("%c\n", str[0]);
     printf("%d\n", sizeof(str));
     printf("%c\n", *str1);

 

     return 0;

}

'PROGRAMMING > C' 카테고리의 다른 글

[수업후] Double Pointer, scope연산자  (0) 2011.04.22
[수업후] 포인터, const  (0) 2011.04.21
[수업후] 포인터  (0) 2011.04.18
[수업후] 배열  (0) 2011.04.15
[수업후] while, for, 상수, 함수  (0) 2011.04.14
Posted by 마마필로 :

[수업후] 포인터

2011. 4. 18. 03:35 from PROGRAMMING/C

포인터변수

 

5개의 메모리영역

스택 | 큐 | 데이터 | 코드 | 힙

중 힙 영역에 들어감

 

포인터 연산자

* : 값(포인터 값 연산자)

& : 주소(포인터 주소 연산자) -> 자기값의 주소

중첩포인터

int a=10;

int* pA = &a;

int* ppA = &pA;

 

a=10

&a=0x1234

 

pA=0x1234

*pA=10

&=0x5678

 

ppA=0x5678

&ppA=0x3690

*ppA=0x3690

**ppA=10

 

포인터의 출력

*사용시: 실제 원하는 값의 형식(%d, %c, %f, %lf)

&: %p(주소값)

 

 

포인터 오류

int *pA;

*pA=10;

 

Heap에 저장되어 있는 값은 pA의 주소값인데 초기화 되어 있지 않기 때문에 쓰레기값이 들어있다.

따라서 Stack에 값 10을 넣기위한 주소가 명확하지 않기 때문에 오류가 발생한다.

 

이런 오류를 예방하기 위해 포인터 선언과 동시에 초기화 시켜주는 것이 좋다.

int a=10;

int *pA = &a;

'PROGRAMMING > C' 카테고리의 다른 글

[수업후] 포인터, const  (0) 2011.04.21
[수업후] 포인터와 배열  (0) 2011.04.20
[수업후] 배열  (0) 2011.04.15
[수업후] while, for, 상수, 함수  (0) 2011.04.14
[기초] 재귀함수  (0) 2011.04.12
Posted by 마마필로 :

[수업후] 배열

2011. 4. 15. 03:34 from PROGRAMMING/C

■ 배열: 같은 자료형의 데이터 묶음

 

인덱스: [ ] 안에 들어가는 숫자

정수형 배열 선언시, 배열공간이 남을 때, 남은 공간에는 '0'이 채워진다

캐릭터형 배열 선언시, 배열공간이 남을 때, 쓰레기값이 쌓인다.

 

문자열 상수(pritf()함수에서 " " 안에 바로 입력하는 출력하는 이름없는 문자

문자열 변수(문자값을 바꿀 수 있는 변수)

 

배열자체는 주소값을 가리키는 포인터

 

C에는 문자열을 표현하는 데이터타입인 string이 없음. C++로 넘어가면서 사용 가능

두 글자 이상을 출력시에는 '%s' 사용.

 

■ 5층짜리 건물 1-5층의 사람수를 입력받아 건물의 총 인원을 출력. 함수는 연산함수 별도 사용

#include <stdio.h>

int Add(int num, int sum)
{

     sum+=num;
     return sum;
}


int main(void)
{
     int i, num, sum=0;

     

     for(i=0; i<5; i++)
     {
          printf("%d층의 인원은?", i+1);
          scanf("%d", &num);
          sum = Add(num, sum);

     }
     printf("건물의 총 인원은 %d입니다", sum);

}

 




int sum()

{

return total;  //totol이 sum()함수값으로 넣어 main함수의 result값에 들어가게 된다.

}

 

int main()

{

     int result;

     result=sum();

     printf("총인원%d", result);

}

 

**배열 이용해서 다시 해보기

 

 

■ 문자열배열의 끝에는 항상 null('\0') 이 붙는다

 

■ "hello"를 "olleh"로 출력(치환)

'PROGRAMMING > C' 카테고리의 다른 글

[수업후] 포인터와 배열  (0) 2011.04.20
[수업후] 포인터  (0) 2011.04.18
[수업후] while, for, 상수, 함수  (0) 2011.04.14
[기초] 재귀함수  (0) 2011.04.12
[수업후] 기본연산자, printf()  (0) 2011.04.07
Posted by 마마필로 :

■ n!값 구하기

#include <stdio.h>

 

int main(void)
{
     int i,j,fac;
     printf("수 입력:");
     scanf("%d", &i);

     j=i;
     fac=1;

 

     for (;;)
     {
          fac=fac*i;
          i--;

       if (i==1)
           break;
     }
 printf("%d! = %d", j, fac);

}

 

■ 상수

1. 리터럴 상수

2. 매크로 상수

3. const

 

■ 함수

함수로 따로 빼는 이유: 프로그램의 유지/보수가 용이하다

 

전달인자와 반환값의 유무에 따라 4종류로 나눌 수 있다.

→ 전달인자 유, 반환값 유 /  전달인자 유 , 반환값 무 / 전달인자 무 , 반환값 유 / 전달인자 무, 반환값 무  

 

반환값이 없어도 될때

출력, 포인터로 넘길때, 구조체로 넘길때 등

 

하나의 함수 안에는 하나의 리턴값만 존재 가능

 

■ 구조체

여러 타입의 데이터를 함께 묶어 놓은 것. 이 때 멤버는 관련있는 정보들이어야 함

(배열은 같은 데이터형을 갖는 여러개의 묶음임. 배열이 확장된 개념이 구조체)

 

typedef int UINT;와 같이 구조체를 typedef 로 선언해 놓으면

 

typedef struct{

int x;

char y;

}MYSTRUCT;

 

MYSTRUCT MyType; 과 같이 사용가능하다. 

 

멤버에 접근: .과 -> 사용가능

 

■ 재귀함수

계속 변하는 파라미터 값을 받아서 반복해서 연산해야할 필요가 있을 때 사용

 

tip.

계속 변하는 값 안에서 일정하게 유지되어야 하는 값이 있을때 static지정자를 붙여 사용할 수 있음

 

 

■ 3개의 수 입력받아 최대값, 최소값 구하기

 

#include <stdio.h>

 

int a,b,c, max, min;
int Max(int a, int b, int c)
{
     max = a > b ? a : b;
     max = max > c ? max : c;
     // (a>b?a:b)><?(a>b>a:b);
 
     return max;
}

 

int Min(int a, int b, int c)
    {
     min = a > b ? b : a;
     min = min > c ? c : min;

 

     return min;
    }

 

int main(void)

     printf("3개의 수 입력:");
     scanf("%d %d %d", &a, &b, &c);
 
     printf("최대값: %d, 최소값: %d", Max(a,b,c), Min(a,b,c));

     

     return 0;

}

 

■ 아래와 같이 출력

*****

 ****

  ***

   **

    *

 

#include <stdio.h>

 

int main(void)
{
     int i,j,k;

 

     for(i=0;i<5;i++)
     {
          for(j=0;j<i;j++)
          {
               printf(" ");
          }

  

     for(k=5;k>i;k--)
      {
           printf("*");
      }
      printf("\n");  
 }

 return 0;
}

 

■ for문을 돌리기 위한 변수는 굳이 따로 선언하지 않아도 됨. for문의 초기화 값을 for문 내의 지역변수로 볼 수 있음.

예) for(int i=1; i<4; i++)

'PROGRAMMING > C' 카테고리의 다른 글

[수업후] 포인터  (0) 2011.04.18
[수업후] 배열  (0) 2011.04.15
[기초] 재귀함수  (0) 2011.04.12
[수업후] 기본연산자, printf()  (0) 2011.04.07
[기초] 문자열 처리함수(strcpy, strcat, strlen, strcmp)  (0) 2011.04.03
Posted by 마마필로 :

[기초] 재귀함수

2011. 4. 12. 03:32 from PROGRAMMING/C

재귀함수

자기 자신을 다시 호출하는 형태의 함수

C언어는 재귀적인 함수호출을 허용한다.

Recursive

재귀함수는 언제 이용?

Process를 이해(Process의 구성과 실행)하고 있는 것이 프로그래밍할때 아주 도움됨

컴퓨터구조/OS 이해(컴퓨터구조 먼저 듣고 다음 OS)

 

stack overflow: 재귀적 함수호출이 끝나지 않고 계속 이어져 메모리 부족으로 이어지는 문제

무한 재귀 호출을 피하기 위해 탈출 조건이 필요함!

적절한 탈출 조건을 만들어 주는것이 중요하다.

 

재귀 함수를 공부하는 이유

자료구조(데이터를 표현하는 방식)나 알고리즘(데이터를 효율적으로 해결하는 방법)을 공부할 때 재귀함수의 유용성을 알 수 있음

 

재귀 함수 Design 사례

1. 팩토리얼(factorial) 계산을 위한 알고리즘

ex.)

5! = 5 x 4x 3 x 2 x 1

0! = 1

 

n! = nx(n-1)x(n-2)x(n-3).....x2x1

n! = nx(n-1)!

 

f(n) = n x f(n-1) // n<=1

f(n) = 1 // n=0

Posted by 마마필로 :