How We Coding

Tutoring/18-1 C Lang +12

<180606>


1) 문자열의 길이 구하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
 
int main()
{
    char str[100];
    int len=0;
    int idx=0;
 
    scanf("%s", str);
 
    while(str[idx++!= 0
        len++;
 
    printf("%d\n", len);
    return 0;
}
cs


>> 문자열의 끝은 널문자이다..!!



2) 문자열 뒤집기


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
 
int main()
{
    char str[100];
    int len=0;
    int idx=0;
 
    char str2[100];
 
    scanf("%s", str);
 
    while(str[idx++!= 0
        len++;
 
    printf("%d\n", len);
 
    idx = 0;
    for(int i=len-1; i>=0; i--)
        str2[idx++= str[i];
    str2[idx] = 0;
 
    printf("%s\n", str2);
 
    return 0;
}
cs


>> 21 라인 : 널문자를 꼭 추가해줘야 한다. 널문자의 아스키코드 값은 0


3) 문자열 이어붙이기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
 
int main()
{
    char str[100];
    char str2[100];
    char str3[100];
    int len=0, len2=0;
    int idx=0;
 
    scanf("%s", str);
    scanf("%s", str2);
 
    while(str[idx++!= 0
        len++;
 
    idx=0;
    while(str2[idx++!= 0
        len2++;
 
    idx=0;
    for(int i=0; i<len; i++)
        str3[i] = str[i];
 
    for(int i=0; i<len2; i++)
        str3[len++= str2[i];
    str3[len] = 0;
 
    printf("%s\n", str3);
 
    return 0;
}
cs


>> 두 문자열의 길이를 구한 다음. 첫번째 문자의 널문자가 있는 위치부터 이어붙이면 된다.

>> 26 라인을 str3[len+i] 로 하고, 27라인을 str3[len+len2] = 0 으로 바꿔도 된다.



4)  배열과 포인터와의 관계

- 배열의 이름은 배열의 시작주소이며, 그 값을 바꿀 수 없는 상수형태의 포인터이다..!!

- 포인터(변수)는 변수이기 때문에 주소를 원할때마다 변경할 수 있다.


'Tutoring > 18-1 C Lang' 카테고리의 다른 글

Week 11  (0) 2018.05.30
Week 10  (0) 2018.05.23
Week 09  (0) 2018.05.16
Week 08  (0) 2018.05.09
Week 07  (0) 2018.05.05

Week 11

Tutoring/18-1 C Lang2018. 5. 30. 23:45

<180530>


1) 1 ~ 7 사이의 데이터를 10번 입력 받았을 때, 1~7사이의 값들이 각각 몇 번씩 입력받았는지 프로그래밍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
 
int main()
{
    int cnt[8]={0};
 
    for(int i=0; i<10; i++) {
        int k;
        scanf("%d"&k);
        cnt[k]++;
    }
 
    for(int i=1; i<8; i++) {
        printf("%d : ", i);
        for(int j=0; j<cnt[i]; j++)
            printf("*");
        printf("\n");
    }
 
    return 0;
}
cs


>> 배열의 크기를 왜 8로 설정했는지 생각해보기.

>> 11번 라인이 끝났을 때, cnt[i] 에는 i 가 몇 번 입력이 들어왔는지에 대한 빈도수가 저장되어 있다..!!


>> input : 1 2 2 3 3 3 6 7 7 7

>> output

1 : *

2 : **

3 : ***

4 : 

5 : 

6 : *

7 : ***



2) -7 ~ 7 사이의 데이터를 10번 입력 받았을 때, 1~7사이의 값들이 각각 몇 번씩 입력받았는지 프로그래밍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
 
int main()
{
    int cnt[15]={0};
 
    for(int i=0; i<10; i++) {
        int k;
        scanf("%d"&k);
        cnt[k+7]++;
    }
 
    for(int i=0; i<15; i++) {
        printf("%d : ", i-7);
        for(int j=0; j<cnt[i]; j++)
            printf("*");
        printf("\n");
    }
 
    return 0;
}
cs

 

>> 1번 문제와 무엇이 달라졌는지 살펴보자. 

>> 배열의 인덱스는 0부터 사용이 가능하다. 즉 -7을 처리하기 위해 1번 문제와 같이 해서는 안된다. 

>> 하지만, -7을 0으로 생각하고 다른 숫자들도 +7 한 값으로 생각을 하면 이를 해결할 수 있다.

>> 10번 라인과 14번 라인처럼 하면 된다. 

>> 13번 라인에서 for문의 횟수는 [-7, 7] 까지이르로 총 15개의 정수에 대해 다루므로..



3) 로또번호 생성하기 (보너스 번호 제외)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int main()
{
    int lotto[46]={0};
    int cnt=0;
    srand(time(NULL));
 
    while(cnt < 6) {
        int k = rand()%45+1;
        if(lotto[k]==0) {
            lotto[k] = 1;
            cnt++;
        }
    }
 
    for(int i=1; i<=45; i++)
        if(lotto[i] == 1)
            printf("%d ", i);
    printf("\n");
    return 0;
}
cs


>> 랜덤함수는 스스로 학습해보기.

>> 1~ 45사이의 숫자를 랜덤으로 추출해야 한다. 임의의 값을 45로 나눈 나머지는 0~44사이의 값이 된다. 1을 더하면 1~45 사이의 값이 된다.

>> 11번를 while(cnt < 6) 으로 한 이유를 잘 생각해보자. for(int i=0; i<6; i++) 로 하면 딱 6번 값을 추출한다. 

>> 하지만 이렇게 되면 중복된 숫자가 나온경우를 처리할 수 없다. 

>> lotto[i] == 1 이라는 것은 i라는 숫자가 한번 나왔었다는 뜻. 그렇기 때문에 13번 라인의 조건식을 만족하지 않아, 카운트도 되지 않는다. 이로써 중복된 숫자를 해결할 수 있다.


>> 배열의 인덱스를 가지고 놀 줄 알아야 한다



4) 2차원 배열 개념

- 2차원 배열의 선언 : int arr[4][5]; // 8x10 크기의 사각형으로 된 방을 만들었다고 생각하면 된다. 8개의 층으로 된 건물(0에서 7층, 각 층마다 10개의 방)

- 참고로 배열의 이름은 배열의 시작주소 이다...!! (중요)





5) 전치행렬 (전치행렬 개념은 모르면 검색해보기..!!)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
#include <stdio.h>
 
int main()
{
    int matrix[3][4];
    
    for(int i=0; i<3; i++
        for(int j=0; j<4; j++)
            scanf("%d"&matrix[i][j]);
 
    for(int i=0; i<3; i++) {
        for(int j=0; j<4; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
    
    for(int i=0; i<4; i++) {
        for(int j=0; j<3; j++) {
            printf("%d ", matrix[j][i]);
        }
        printf("\n");
    }
 
    return 0;
}
cs


>> 12-17 : 행(i)를 고정시키고 열 들을 한줄씩 출력

>> 19-24 : 열(i)를 고정시키고 행 들을 한줄씩 출력


>> 행렬의 합, 행렬의 곱 연산방법 확인 후 문제가 주어졌을 때, 어떻게 하면 될지 고민해보기..!



6) 3차원 배열 개념




7) 포인터 (변수)

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int main()
{
    int n;
    int *p;
    n = 10;
    p = &n;
    *= 20;
    printf("%d %d\n", n, *p);
}
cs


8) 주소 개념잡기

- (1)은 위의 코드에서 5번 라인.

- (2)은 위의 코드에서 6번 라인.

- (3)은 위의 코드에서 7번 라인.

- (4)은 위의 코드에서 8번 라인.

- (5)은 위의 코드에서 9번 라인을 수행했을때의 결과를 그림으로 표기한 것임. 




>> 포인터(변수)도 포인터이다. 다면 변수의 주소를 저장하는 공간이고, 

     변수의 주소를 저장하고 있다는 것은 일반적으로 4, 5그림과 같이 화살표로 표기하며, p라는 포인터(변수)를 통해 변수 n에 접근을 할 수 있다.

>> 8번 라인에서 &는 피연산자인 변수의 주소를 알려주는 연산자 이다. 그렇다면 scanf() 에서 "", 다음 주소가 필요하다는 것을 생각해볼 수 있다.

>> 9번 라인에서 *는 참조 연산다. 포인터 변수 p가 가리키는 변수를 참조하여 값을 저장하거나 읽어올 수 있다. 



9) 문자열


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
int main()
{
    char str[]="Hello World!";
    printf("%s\n", str);
 
    str[6= 'w';
    printf("%s\n", str);
 
    str[5= '\0';
    printf("%s\n", str);
 
    return 0;
}
cs


>> 실행결과

Hello World!

Hello world!

Hello


>> 5 라인 : 배열의 크기를 지정하지 않고 초기화시 자동으로 초기화 한 만큼 크기가 설정된다.

>> 8 라인 : 문자열의 일부 문자를 수정했다. (변수형태의 문자열)

>> 문자열의 끝은 널문자이다. 11번 라인의 경우 중간에 널문자를 삽입했기 때문에 그 중간이 문자열의 끝으로 인식이 된 것이다


- 문자열의 입력

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
int main()
{
    int n;
    char str[100];
 
    scanf("%d"&n);
    scanf("%s", str);
 
    printf("%d : %s\n", n, str);
    return 0;
}
 
cs


- scanf() 를 통해 입력을 받을수 있으며, 공백을 포함하지 않는 문자열(일종의 한 단어)를 입력받을 수 있다.

>> 스캔에프 함수는 공백을 기준으로 입력을 받기 때문이다.

- 8번 라인 : & 연산자는 피연산자(변수)의 주소를 알려주는 연산자이다. 즉 저자리는 주소를 전달하는 자리이다.

- 9번 라인 : 여기서는 &가 없고 배열의 이름만 썼다. 배열의 이름은 배열의 시작주소 이기 때문이다.

'Tutoring > 18-1 C Lang' 카테고리의 다른 글

Week 12 - 종강  (0) 2018.06.06
Week 10  (0) 2018.05.23
Week 09  (0) 2018.05.16
Week 08  (0) 2018.05.09
Week 07  (0) 2018.05.05

Week 10

Tutoring/18-1 C Lang2018. 5. 23. 16:51

<180523>


1) 지역변수

- 사용 간능한 범위는 중괄호 내부.

- 함수의 매개변수도 지역변수이다. >> 함수 내에서 사용 가능.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
 
void f()
{
    int k=0;
    printf("%d\n", k);
    k += 1;
}
 
int main()
{
    int n=5;
    f();
    f();
    
    if(n == 5) {
        int k = 10;
        printf("%d\n", k);
    }
    //printf("%d\n", k);
    return 0;
}
cs


>> 13라인 실행결과 : 0

>> 14라인 실행결과 : 0

>> 18라인 실행결과 : 10

>> 20라인은 주석을 해제하면 오류. K는 if문의 중괄호 내에서만 사용 가능하다..!!



2) 전역변수

- 프로그램이 실행될 때 생성, 프로그램이 종료될 때 소멸.

- 별도로 초기화 하지 않으면 자동으로 0으로 초기화된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
 
int k;
 
void f()
{
    printf("%d\n", k);
    k += 1;
}
 
int main()
{
    f();
    f();   
    return 0;
}
cs


>> 13라인 실행결과 : 0

>> 14라인 실행결과 : 1

>> 14 라인이 끝났을 때 k에는 2가 저장되어있다.



3) 정적(static)변수

- 지역변수와 전역변수의 특징을 동시에 갖는 변수라고 생각하면 된다

- 전역변수처럼 프로그램이 시작될 때 생성되어, 프로그램이 종료될 때 소멸되고, 자동으로 0으로 초기화 된다.

- 지역변수처름 중괄호 내에서 사용가능하다. 즉 아래의 정적변수 k는 f() 함수 내에서만 사용가능한 전역변수라고 생각하면 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
void f()
{
    static int k;
    printf("%d\n", k);
    k += 1;
}
 
int main()
{
    f();
    f();   
    return 0;
}
cs


>> 13라인 실행결과 : 0

>> 14라인 실행결과 : 1

>> f() 함수가 두번째로 실행되었을 땐 5번 라인은 생략된 상태로 실행된다고 생각하면 된다.



4) 외부변수, 자동변수, 레지스터 변수

참고 : http://jeongchul.tistory.com/342



5) 배열 선언 및 초기화

- 자료형 배열의이름[배열의크기]; 라는 형태로 선언.

- int arr[10]; // 크기가 10인 정수 데이터를 담을 수 있는 배열 arr

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
int main()
{
    int arr[10];
    int arr2[5= {12345};
    int arr3[5= {0};
 
    for(int i=0; i<5; i++)
        printf("%d\n", arr3[i]);
 
    return 0;
}
cs


>> 7 라인 : 배열의 모든 요소를 0으로 초기화 하는 방법.

>> arr3 이란 배열의 요소들은 0으로 채워져있다. 



6) 최대값, 최소값, 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
 
int main()
{
    int arr[10];
    int max, min;
 
    for(int i=0; i<10; i++)
        scanf("%d"&arr[i]);
 
    max = min = arr[0];
    for(int i=1; i<10; i++) {
        if(max < arr[i])
            max = arr[i];
        if(min > arr[i])
            min = arr[i];
    }
    
    printf("max: %d\n", max);
    printf("min: %d\n", min);
 
    return 0;
}
cs


>> i번째 배열요소 값이 최대값일 때, 그때의 값을 갱신


7) 최대값의 인덱스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
 
int main()
{
    int arr[10];
    int max, min;
    int maxI, minI;
 
    for(int i=0; i<10; i++)
        scanf("%d"&arr[i]);
 
    max = min = arr[0];
    maxI = minI = 0;
    for(int i=1; i<10; i++) {
        if(max < arr[i]) {
            max = arr[i];
            maxI = i;
        }
        if(min > arr[i]) {
            min = arr[i];
            minI = i;
        }
    }
    
    printf("maxI: %d\n", maxI);
    printf("minI: %d\n", minI);
 
    return 0;
}
cs


>> i번째 배열요소 값이 최대값일 때, 그때의 인덱스 i도 갱신


8) 재귀함수 호출 과정


8-1) 1부터 n까지 출력하는 함수
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
void f(int n)
{
    if(n < 1return ;
    f(n-1);
    printf("%d\n",  n);
}
 
int main()
{
    f(5); 
    return 0;
}
cs

>> f(n) 은 1부터 n까지 출력하는 함수.
>> 1부터 n까지 출력을 하는 것은 1부터 n-1까지 출력한 다음 n을 출력한 것과 같다.

>> f(5) 가 호출되었을 때, 5번 라인의 조건을 만족하지 않아, 6번 라인인 f(4)가 실행된다. f(5) 에서 7번 라인은 아직 실행되지 않은 상태.
>> f(4) 가 호출되었을 때, 5번 라인의 조건을 만족하지 않아, 6번 라인인 f(3)가 실행된다. f(4) 에서 7번 라인은 아직 실행되지 않은 상태.
>> f(3) 가 호출되었을 때, 5번 라인의 조건을 만족하지 않아, 6번 라인인 f(2)가 실행된다. f(3) 에서 7번 라인은 아직 실행되지 않은 상태.
>> f(2) 가 호출되었을 때, 5번 라인의 조건을 만족하지 않아, 6번 라인인 f(1)가 실행된다. f(2) 에서 7번 라인은 아직 실행되지 않은 상태.
>> f(1) 가 호출되었을 때, 5번 라인의 조건을 만족하지 않아, 6번 라인인 f(0)가 실행된다. f(1) 에서 7번 라인은 아직 실행되지 않은 상태.

>> f(0) 이 호출되었을 때, 5번 라인의 조건을 만족하므로 함수가 종료된다.

>> f(1) 에서 아직 실행되지 않은 7번 라인이 실행(1출력)되고, 더이상 실행할 것이 없으므로 f(1) 은 종료된다. 종료 후 f(1)을 호출한 곳으로 돌아간다.

>> f(2) 에서 아직 실행되지 않은 7번 라인이 실행(2출력)되고, 더이상 실행할 것이 없으므로 f(2) 은 종료된다. 종료 후 f(2)을 호출한 곳으로 돌아간다.

>> f(3) 에서 아직 실행되지 않은 7번 라인이 실행(3출력)되고, 더이상 실행할 것이 없으므로 f(3) 은 종료된다. 종료 후 f(3)을 호출한 곳으로 돌아간다.

>> f(4) 에서 아직 실행되지 않은 7번 라인이 실행(4출력)되고, 더이상 실행할 것이 없으므로 f(4) 은 종료된다. 종료 후 f(4)을 호출한 곳으로 돌아간다.

>> f(5) 에서 아직 실행되지 않은 7번 라인이 실행(5출력)되고, 더이상 실행할 것이 없으므로 f(5) 은 종료된다. 종료 후 f(5)을 호출한 곳(여기서는 main() 함수의 12번 라인)으로 돌아간다.



9) 빈도수

- 다음주..!!




'Tutoring > 18-1 C Lang' 카테고리의 다른 글

Week 12 - 종강  (0) 2018.06.06
Week 11  (0) 2018.05.30
Week 09  (0) 2018.05.16
Week 08  (0) 2018.05.09
Week 07  (0) 2018.05.05

Week 09

Tutoring/18-1 C Lang2018. 5. 16. 20:18

< 180516 >


0) 

- break : 가장 가까이에 있는 반복문 하나를 빠져나간다.

- continue : 가장 가까이에 있는 반복문으로 돌아간다.

>> 보통 continue 문을 사용하지 않고 코딩이 가능하다..!!



1) 라이브러리 함수 vs 사용자 정의 함수

- 라이브러리 함수 : 이미 누군가가 만들어 놓은 함수 

>> 우리는 가져다 쓰면 된다. 보통 어딘가의 헤더파일에 들어있다.

>> printf() 도 함수이다. stdio.h 라는 헤더파일에 들어있다. 문자열의 갯수를 리턴한다.

>> scanf() 도 함수이다. 어떤 값을 리턴하는지 검색해보길 바람..^^


- 사용자 정의 함수는 우리가 직접 만들어서 사용하는 함수..!!



2) 사용자 정의 함수의 종류는 크게 네종료


1
2
3
4
5
6
7
void f1(void);
 
void f2(int a);
 
int f3(void);
 
int f4(int a);
cs


>> f1 함수는 함수의 결과로 아무것도 돌려주지 않고, 어떤 값도 전달 받지 않는 함수.

>> f2 함수는 함수의 결과로 아무것도 돌려주지 않고, 함수가 호출될 때 정수 데이터 한개를 전달받는 함수

>> f3 함수는 함수의 결과로 정수값을 리턴하고, 함수가 호출될 때 어떤 값도 전달받지 않는 함수

>> f4 함수는 함수의 결과로 정수값을 리턴하고, 함수가 호출될 때 정수 데이터 한개를 전달받는 함수


>> f1, f2 함수는 매개변수를 받지 않는 함수이다. 이런경우 void 를 쓰지만, 매개변수자리의 void 는 생략 가능하다.

>> 여기서 f2, f4 의 경우 변수 a를 매개변수라고 하며, 매개변수를 필요시 여러개를 설정할 수 있다.

>> f3, f4 는 리턴타입이 있는 함수로, 필요에 따라 우리가 알고 있는 자료형으로 대체해서 정의할 수 있다.



3) 위 함수들의 사용 예


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
 
void f1(void)
{
    printf("Hello world\n");
}
 
void f2(int a)
{
    for(int i=1; i<=a; i++)
        printf("%d\n", i);
}
 
int f3(void)
{
    int k;
    scanf("%d"&k);
    return k;
}
 
int f4(int a)
{
    int sum=0;
    for(int i=1; i<=a; i++)
        sum += i;
    return sum;
}
 
int main()
{
    f1();
    f2(10);
    printf("%d\n", f3());
    printf("%d\n", f4(10));
}
cs


>> f1 함수는 "Hello world" 를 출력하는 함수

>> f2 함수는 1부터 전달받은 값까지 출력하는 함수

>> f3 함수는 값 하나를 입력한 다음 그 값을 리턴하는 함수

>> f4 함수는 1부터 전달받은 값까지의 합을 리턴하는 함수



4) 함수의 원형(프로토타입) 선언


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
 
void f1(void);
void f2(int a);
int f3(void);
int f4(int a);
 
int main()
{
    f1();
    f2(10);
    printf("%d\n", f3());
    printf("%d\n", f4(10));
}
 
void f1(void)
{
    printf("Hello world\n");
}
void f2(int a)
{
    for(int i=1; i<=a; i++)
        printf("%d\n", i);
}
int f3(void)
{
    int k;
    scanf("%d"&k);
    return k;
}
int f4(int a)
{
    int sum=0;
    for(int i=1; i<=a; i++)
        sum += i;
    return sum;
}
 
cs


>> 이런식으로 함수를 main함수 아래에 적어도 된다. 

하지만 이럴경우 함수의 원형을 위에 미리 선언을 해둬야 한다. (뒤에 세미콜론 주의!!)



5) 절대값을 출력하는 함수 vs 절대값을 리턴하는 함수

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
 
int myAbs(int n)
{
    return n > 0 ? n : -n;
}
 
void printAbs(int n)
{
    int k = n > 0 ? n : -n;
    printf("%d\n", k);
}
 
int main()
{
    int n;    
    scanf("%d"&n);
    printAbs(n);
    printf("%d\n", myAbs(n));
}
cs



6) 정수를 거꾸로 뒤집는 결과를 리턴하는 함수 

ex) 1234 를 입력하면 4321 을 리턴한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
 
int reverseDigit(int n)
{
    int ret=0;
    while(n) {
        ret *= 10;
        ret += n%10;
        n /= 10;
    }
    return ret;
}
 
int main()
{
    int n;
    scanf("%d"&n);
    printf("%d\n", reverseDigit(n));
}
cs




###  재귀함수 ###


- 자기가 자기 자신을 호출 하는 함수

- 탈출조건이 필요하다. 없으면 무한루프.

- 함수는 함수 고유의 기능이 있다. 그 기능을 어떻게 쪼개서 생각할지가 중요하다.

- 점화식을 알고 있으면 그대로 표현하면 된다.


1) fac(n) : n! 을 구하는 함수


1
2
3
4
5
int fac(int n)
{
    if(n == 0return 1;
    return n * fac(n-1);
}
cs


>> n! = n * (n-1)! 이다 

>> 0! = 1


2) Sum(n) : 1부터 n까지의 합을 구하는 함수.

1
2
3
4
5
int Sum(int n)
{
    if(n < 1return 0;
    return n + Sum(n-1);
}
cs


>> 1부터 n까지의 합은 1부터 n-1까지의 합에 n을 더하면 된다.

>> 1보다 작은 수가 들어오면 0을 리턴하면 될 것 같다.


3) Pow(a, n) : a의 n승을 구한ㄴ 함수

1
2
3
4
5
int Pow(int a, int n)
{
    if(n == 0return 1;
    return a * Pow(a, n-1);
}
cs


>> a의 n승은 a*(a의 n-1승)과 동일하다.

>> a의 0승은 1..!!


4) print1(n) : 1부터 n까지 출력하는 함수

1
2
3
4
5
6
void print1(int n)
{
    if(n < 1return ;
    print1(n-1);
    printf("%d\n", n);
}
cs


>> 1부터 n까지 출력하는 것은 1부터 n-1까지 출력한 다음에 n만 출력하는 것과 같다.


5) print2(n) : n부터 1까지 거꾸로 출력하는 함수.

1
2
3
4
5
6
void print2(int n)
{
    if(n < 1return ;
    printf("%d\n", n);
    print1(n-1);
}
cs


>> n부터 1까지 거꾸려 출력하는 것은 n을 먼저 출력하고 n-1부터 1까지 거꾸로 출력하는 것과 같다.


'Tutoring > 18-1 C Lang' 카테고리의 다른 글

Week 11  (0) 2018.05.30
Week 10  (0) 2018.05.23
Week 08  (0) 2018.05.09
Week 07  (0) 2018.05.05
Week 06  (0) 2018.04.23

Week 08

Tutoring/18-1 C Lang2018. 5. 9. 19:56

< 180509 >


1. 구구단 출력하기. (한행에 하나의 단이 출력되도록)

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
int main()
{
    for(int dan=2; dan<=9; dan++) {
        printf("%d단 : ", dan);
        for(int i=1; i<=9; i++) {
            printf("%d*%d=%2d ", dan, i, dan*i);
        }
        printf("\n");
    }
    return 0;
}
cs


>> 실행결과

2단 : 2*1= 2 2*2= 4 2*3= 6 2*4= 8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18 

3단 : 3*1= 3 3*2= 6 3*3= 9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27 

4단 : 4*1= 4 4*2= 8 4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36 

5단 : 5*1= 5 5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45 

6단 : 6*1= 6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 6*7=42 6*8=48 6*9=54 

7단 : 7*1= 7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 7*8=56 7*9=63 

8단 : 8*1= 8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 8*9=72 

9단 : 9*1= 9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81



2. 구구단 출력하기. (한열에 하나의 단이 출력되도록)

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
int main()
{
    for(int i=1; i<=9; i++) {
        for(int j=2; j<=9; j++) {
            printf("%d*%d=%2d ", j, i, j*i);
        }
        printf("\n");
    }
    return 0;
}
cs


>> 실행결과

2*1= 2 3*1= 3 4*1= 4 5*1= 5 6*1= 6 7*1= 7 8*1= 8 9*1= 9 

2*2= 4 3*2= 6 4*2= 8 5*2=10 6*2=12 7*2=14 8*2=16 9*2=18 

2*3= 6 3*3= 9 4*3=12 5*3=15 6*3=18 7*3=21 8*3=24 9*3=27 

2*4= 8 3*4=12 4*4=16 5*4=20 6*4=24 7*4=28 8*4=32 9*4=36 

2*5=10 3*5=15 4*5=20 5*5=25 6*5=30 7*5=35 8*5=40 9*5=45 

2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 7*6=42 8*6=48 9*6=54 

2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 8*7=56 9*7=63 

2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 9*8=72 

2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81 



3. 구구단 while 문을 이용해서만 짜보기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
 
int main()
{
    int dan = 2;
    
    while(dan <= 9) {
        int i=1;
        while(i<=9) {
            printf("%d*%d=%2d ", dan, i, dan*i);
            i++;
        }
        printf("\n");
        dan++;
    }
 
    return 0;
}
 
cs


>> 8행에서 i를 다시 1로 만들어줘야 함에 주의하자..!! 

>> for문은 초기식 이라는 곳이 있어서 당연하듯이 초기식을 작성하지만, while문은 명시적으로 해줘야함.



4. 별찍기1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
int main()
{
    int i, j, n;
    scanf("%d"&n);
 
    for(i=1; i<=n; i++) {
        for(j=1; j<=i; j++)
            printf("*");
        printf("\n");
    }
 
    return 0;
}
cs


>> n 이 5일대의 실행결과

*

**

***

****

*****


>> 첫째줄에 하나, 둘째줄에 두개, 셋째 줄에 세개...



5. 별찍기2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
int main()
{
    int n;
    scanf("%d"&n);
 
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=n-i+1; j++)
            printf("*");
        printf("\n");
    }
    return 0;
}
cs


>> n이 5일 때 실행결과

*****

****

***

**

*



6. 별찍기 3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
 
int main()
{
    int n;
    scanf("%d"&n);
 
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=n-i+1; j++)
            printf("*");
        for(int j=1; j<i; j++)
            printf("@");
        printf("\n");
    }
    return 0;
}
cs


>> n이 5일 때 실행결과

*****

****@

***@@

**@@@

*@@@@


7. 별찍기4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
 
int main()
{
    int n;
    scanf("%d"&n);
 
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=n-i; j++)
            printf(" ");
        for(int j=1; j<=i; j++)
            printf("*");
        printf("\n");
    }
    return 0;
}
cs


>> n이 5일 때 실행결과

    *

   **

  ***

 ****

*****

>> 첫째줄에 공백 n-1개, 별 한개, 둘째줄에 공백 n-2개, 별 두개 ...



8. 별찍기 5

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
 
int main()
{
    int n;
    scanf("%d"&n);
 
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=n-i; j++)
            printf(" ");
        for(int j=1; j<=(i*2)-1; j++)
            printf("*");
        printf("\n");
    }
    return 0;
}
cs


>> n이 4일 때 실행결과

   *

  ***

 *****

*******



9. 별찍기 6

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
 
int main()
{
    int n;
    scanf("%d"&n);
 
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=n-i; j++)
            printf(" ");
        for(int j=1; j<=(i*2)-1; j++)
            printf("*");
        printf("\n");
    }
 
    for(int i=n-1; i>=1; i--) {
        for(int j=n-1; j>=i; j--)
            printf(" ");
        for(int j=1; j<=(i*2)-1; j++)
            printf("*");
        printf("\n");
    }
    return 0;
}
cs

 

>> n이 4일 때 실행결과

   *

  ***

 *****

*******

 *****

  ***

   *



'Tutoring > 18-1 C Lang' 카테고리의 다른 글

Week 10  (0) 2018.05.23
Week 09  (0) 2018.05.16
Week 07  (0) 2018.05.05
Week 06  (0) 2018.04.23
Week 05  (0) 2018.04.18

Week 07

Tutoring/18-1 C Lang2018. 5. 5. 17:46

<180502>



- 반복문의 세계..!!


- for 문의 작동 원리


for(초기식; 조건식; 증감식) {

바디

}


1. 초기식

2. 조건식

>> 조건식이 참이면, 바디 - 증감식 후 다시 조건식으로.

>> 조건식이 거짓이면 for 문 종료.



- while 문 vs for 문

반복횟수를 알고 있는경우 for 문을, 얼마나 반복해야 할 지 모르는 경우 while 문을 추천.



- while 문 vs do ~ while 문

>> do ~while() : 바디를 일단 한번 실행 시키고 나서 조건식에 따라 반복여부 결정

>> while() :  조건식에 따라 반복




< 프로그래밍 연습 >


1. 0이 입력되기 전까지 입력된 정수들의 합과 평균 구하기.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
 
int main()
{
    int n, sum=0;
    int count=0;
    double avg;
 
    while(1) {
        scanf("%d"&n);
        if(n == 0
            break;
        sum += n;
        count++;
    }
 
    avg = (double)sum/count;
 
    return 0;
}
cs


>> 12 번 줄의 break 문은 가장 가까이에 있는 반복문 하나를 탈출한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
int main()
{
    int n, sum=0;
    int count=0;
    double avg;
 
    do {
        scanf("%d"&n);
        sum += n;
        count++;
    } while(n != 0);
 
    avg = (double)sum/(count-1);
   
    return 0;
}
cs


>> do ~ while() 을 이용.



2. 1~10 까지의 합 구하기. 

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
int main()
{
    int i, sum=0;
    for(i=1; i<=10; i++)
        sum += i;
    printf("%d\n", sum);
    return 0;
}
cs



3. 1~n 까지의 합 구하기

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
int main()
{
    int n;
    int i, sum=0;
    scanf("%d"&n);
    for(i=1; i<=n; i++)
        sum += i;
    printf("%d\n", sum);
    return 0;
}
cs



4. 1~n 까지의 수들 중 홀수의 합 구하기.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
int main()
{
    int n;
    int i, sum=0;
    scanf("%d"&n);
    for(i=1; i<=n; i++) {
        if(i%2 == 1) {
            sum += i;
        }
    }
    printf("%d\n", sum);
    return 0;
}
cs



5. 'A'~'Z' 까지 출력하기

1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
int main()
{
    char ch;
    for(ch='A'; ch<='Z'; ch++)
        printf("%c\n", ch);
    return 0;
}
cs



6. 아래의 실행결과가 나오는 프로그래밍

1
2
3
4
5
6
7
8
9
1
22
333
4444
55555
666666
7777777
88888888
999999999
cs


1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
int main()
{
    int line, n;
    for(line=1; line<=9; line++) {
        for(n=1; n<=line; n++)
            printf("%d", line);
        printf("\n");
    }
    return 0;
}
cs



7.  아래의 실행결과가 나오는 프로그래밍

1
2
3
4
5
6
7
8
9
1
12
123
1234
12345
123456
1234567
12345678
123456789
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
int main()
{
    int line, n;
    for(line=1; line<=9; line++) {
        for(n=1; n<=line; n++)
            printf("%d", n);
        printf("\n");
    }
    return 0;
}
 
cs


>> 6번과 7번 소스코드가 어떻게 다른지 비교해보기..!!



8. 아래의 실행결과가 나오는 프로그래밍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
A
AB
ABC
ABCD
ABCDE
ABCDEF
ABCDEFG
ABCDEFGH
ABCDEFGHI
ABCDEFGHIJ
ABCDEFGHIJK
ABCDEFGHIJKL
ABCDEFGHIJKLM
ABCDEFGHIJKLMN
ABCDEFGHIJKLMNO
ABCDEFGHIJKLMNOP
ABCDEFGHIJKLMNOPQ
ABCDEFGHIJKLMNOPQR
ABCDEFGHIJKLMNOPQRS
ABCDEFGHIJKLMNOPQRST
ABCDEFGHIJKLMNOPQRSTU
ABCDEFGHIJKLMNOPQRSTUV
ABCDEFGHIJKLMNOPQRSTUVW
ABCDEFGHIJKLMNOPQRSTUVWX
ABCDEFGHIJKLMNOPQRSTUVWXY
ABCDEFGHIJKLMNOPQRSTUVWXYZ
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
int main()
{
    char ch, start;
    for(ch='A'; ch<='Z'; ch++) {
        for(start='A'; start<=ch; start++)
            printf("%c", start);
        printf("\n");
    }
    return 0;
}
 
cs



9. 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXY
ABCDEFGHIJKLMNOPQRSTUVWX
ABCDEFGHIJKLMNOPQRSTUVW
ABCDEFGHIJKLMNOPQRSTUV
ABCDEFGHIJKLMNOPQRSTU
ABCDEFGHIJKLMNOPQRST
ABCDEFGHIJKLMNOPQRS
ABCDEFGHIJKLMNOPQR
ABCDEFGHIJKLMNOPQ
ABCDEFGHIJKLMNOP
ABCDEFGHIJKLMNO
ABCDEFGHIJKLMN
ABCDEFGHIJKLM
ABCDEFGHIJKL
ABCDEFGHIJK
ABCDEFGHIJ
ABCDEFGHI
ABCDEFGH
ABCDEFG
ABCDEF
ABCDE
ABCD
ABC
AB
A
cs


1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
int main()
{
    char ch, start;
    for(ch='Z'; ch>='A'; ch--) {
        for(start='A'; start<=ch; start++)
            printf("%c", start);
        printf("\n");
    }
    return 0;
}
cs



10. 구구단 몇단??


1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
int main()
{
    int i, n;
    scanf("%d"&n);
    for(i=1; i<=9; i++)
        printf("%d * %d = %d\n", n, i, n*i);
    return 0;
}
cs



11. 기본 별찍기.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
int main()
{
    int i, j, n;
    scanf("%d"&n);
 
    for(i=1; i<=n; i++) {
        for(j=1; j<=i; j++)
            printf("*");
        printf("\n");
    }
 
    return 0;
}
cs


>> n 이 5일대의 실행결과

*

**

***

****

*****

'Tutoring > 18-1 C Lang' 카테고리의 다른 글

Week 09  (0) 2018.05.16
Week 08  (0) 2018.05.09
Week 06  (0) 2018.04.23
Week 05  (0) 2018.04.18
Week 04  (0) 2018.04.11

Week 06

Tutoring/18-1 C Lang2018. 4. 23. 00:11

< 180420 >


중간고사 대비 모의고사



'Tutoring > 18-1 C Lang' 카테고리의 다른 글

Week 08  (0) 2018.05.09
Week 07  (0) 2018.05.05
Week 05  (0) 2018.04.18
Week 04  (0) 2018.04.11
Week 03  (0) 2018.04.04

Week 05

Tutoring/18-1 C Lang2018. 4. 18. 16:20

< 180418 >


1) if ~else if~ 를 활용한 학점 계산.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
int main()
{
    int n;
    scanf("%d"&n);
 
    if(90 <= n) printf("A\n");
    else if(80 <= n) printf("B\n");
    else if(70 <= n) printf("C\n");
    else printf("D\n");
 
    return 0;
}
cs


>> 9 라인의 경우 else if(80 <= n && n < 90) 으로 써도 되지만, 위와 같이 써도 된다.


2) 위 문제를 switch case 문으로.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
int main()
{
    int n;
    scanf("%d"&n);
 
    switch(n/10)
    {
    case 10printf("A\n"); break;
    case 9printf("A\n"); break;
    case 8printf("B\n"); break;
    case 7printf("C\n"); break;
    defaultprintf("D\n"); break;
    }
 
    return 0;
}
cs



3) switch case 문의 실행흐름

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
int main()
{
    int n;
    scanf("%d"&n);
 
    switch(n/10)
    {
    case 10printf("A\n"); 
    case 9printf("A\n"); break;
    case 8printf("B\n"); break;
    case 7printf("C\n"); break;
    defaultprintf("D\n"); break;
    }
 
    return 0;
}
cs


>> 10 라인에서 break; 를 삭제하였다. 그다음 100을 입력받아 n에 저장하면 AA 가 출력된다..!!

>> 90 을 입력하면 A가 출력된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
int main()
{
    int n;
    scanf("%d"&n);
 
    switch(n/10)
    {
    case 10printf("A\n"); 
    case 9printf("A\n"); 
    case 8printf("B\n"); break;
    case 7printf("C\n"); break;
    defaultprintf("D\n"); break;
    }
 
    return 0;
}
cs


>> 11 라인에 break; 도 삭제해보자. 그다음 100을 입력하면  AAB 가 출력된다.

>> 즉, 해당하는 case 번호를 만나면, 해당라인에서 break; 를 만날때까지 실행이 된다.

    (90 을 입력하면 AB 가, 80을 입력하면 B가 출력된다.)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
 
int main()
{
    int n;
    scanf("%d"&n);
 
    switch(n/10)
    {
    case 10case 9printf("A\n"); break;
    case 8printf("B\n"); break;
    case 7printf("C\n"); break;
    defaultprintf("D\n"); break;
    }
 
    return 0;
}
cs


>> 2) 문제의 경우 위와같이 작성하면 된다.



4) 대문자 A 인지 소문자 a 인지, switch case 문으로

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
int main()
{
    char ch;
    scanf("%c"&ch);
 
    switch(ch)
    {
    case 'A'printf("대문자 A\n"); break;
    case 'a'printf("소문자 a\n"); break;
    }
 
    return 0;
}
cs


>> case 다음에는 정수가 와야한다. 하지만 문자도 올 수 있다. 문자의 정체는 정수이기 때문이다..!!



5) 입력한 문자가, 대문자인지, 소문자인지, 숫자인지, 특수문자인지

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
int main()
{
    char ch;
    scanf("%c"&ch);
 
    if('A' <= ch && ch <= 'Z'printf("대문자\n");
    else if('a' <= ch && ch <= 'z'printf("소문자\n");
    else if('0' <= ch && ch <= '9'printf("숫자\n");
    else printf("특수문자\n");
 
    return 0;
}
cs


>> && 연산자의 활용, 아스키 코드값의 특징 확인.



6) 임의의 숫자를 입력받아 실수형 숫자이면 소수 이하 숫자만 출력하고, 정수형 숫자면 짝수, 홀수를 구분하여 출력하는 프로그램 (7.7)

 

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
int main()
{
    double d;
    scanf("%lf"&d);
 
    if(d - (int)d > 0printf("%lf\n", d-(int)d);
    else (int)d%2 == 1 ? printf("odd\n") : printf("even\n");
 
    return 0;
}
cs




7) printf() 에서의 증감연산자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
int main()
{
    int a = 4, b = 7;
 
    printf("%d\n", a + a++);        // 8
    printf("%d\n"+++ a);        // 12
    printf("%d\n", (++a) + (++a));  // 15 , VS >> 16
    printf("%d\n", b + b--);        // 14 
    printf("%d\n", b + --b);        // 11 , VS >> 10
 
    return 0;
}
cs


>> 9라인의 결과가 Mac 에서 진행한 것과, Visual Studio 에서 진행한 것이 다르다....

'Tutoring > 18-1 C Lang' 카테고리의 다른 글

Week 07  (0) 2018.05.05
Week 06  (0) 2018.04.23
Week 04  (0) 2018.04.11
Week 03  (0) 2018.04.04
Week 02  (2) 2018.03.28

Week 04

Tutoring/18-1 C Lang2018. 4. 11. 23:40

< 180411 >


Week 04



1) 1의 보수, 2의 보수.


- 10은 2진수로 00001010 (8비트 기준)

- 1의 보수를 취하면 11110101 이 된다. (0은 1로, 1은 0으로)

- 2의 보수는 1의 보수의 결과에 1을 더하면 된다. 11110110


>> 2의 보수의 결과는 -10이 된다. 

>> 검증 : -1은 11111111 이다. 여기에서 9인 00001001 을 빼면 11110110 이 된다.



2) 삼항연산자( ? 연산자)


- 삼항 연산자의 폼은 (조건식) ? 식1 : 식2; 이다.

- 조건식의 결과는 참 혹은 거짓이다.

- 조건식의 결과가 참이면 식1이, 거짓이면 식2가 수행된다.



3-1) 두 수를 입력받아, 두수의 차이의 절대값을 출력하는 프로그래밍

1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
int main()
{
    int a, b;
    scanf("%d%d"&a, &b);
    printf("%d\n", a > b ? a-b : b-a);
    return 0;
}
cs



3-2) 세 수를 입력받아, 가장 큰값과 가장 작은 값을 출력하는 프로그래밍

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
int main()
{
    int a, b, c;
    int max, min;
    scanf("%d%d%d"&a, &b, &c);
    max = a > b ?(a > c ? a : c) : (b > c ? b : c);
    min = a < b ?(a < c ? a : c) : (b < c ? b : c);
    printf("%d %d\n", max, min);
    return 0;
}
cs


>> 중첩된 삼항연산자 이해해보기..!!



4) 조건식에서의 참과 거짓.

- 거짓은 0으로 표현된다.

- 참은 0이 아닌 모든값, 즉 0이 아닌 모든 정수값이 된다.


1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int main()
{    
    0 ? printf("A") : printf("B");
    1 ? printf("A") : printf("B");
    13 ? printf("A") : printf("B");
    -2 ? printf("A") : printf("B");
 
    return 0;
}
cs

>> 실행결과 : BAAA



5) && 연산자 

- (조건식) && (조건식) 의 형태를 이룬다.

- 두 조건식이 참이면 참이 된다.


1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
int main()
{
    1 && 1 ? printf("A") : printf("B");
    1 && 0 ? printf("A") : printf("B");
    0 && 1 ? printf("A") : printf("B");
    0 && 0 ? printf("A") : printf("B");
    return 0;
}
cs


>> 실행결과 : ABBB



6) 문자 하나를 입력받아, 해당 문자가 알파벳 대문자인지 판단하는 프로그래밍.


1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
int main()
{
    char ch;
    scanf("%c"&ch);
    'A' <= ch && ch <= 'Z' ? printf("TRUE") : printf("FALSE");
    return 0;
}
cs


>> 아스키코드값의 특징, && 의 특징, 삼항연산자를 쓸 줄 알면 풀 수 있는 문제이다.



7) || 연산자.

- (조건식) || (조건식) 의 형태를 가지며, 두 조건식 중 하나의 조건식만 참이면 참이 된다.


1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int main()
{
    1 || 1 ? printf("A") : printf("B");
    1 || 0 ? printf("A") : printf("B");
    0 || 1 ? printf("A") : printf("B");
    0 || 0 ? printf("A") : printf("B");
    return 0;
}
 
cs


>> 실행결과 : AAAB



8) 대입연산자


1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
int main()
{
    int a, b;
    a = b = 0;
    printf("%d %d\n", a, b);
    return 0;
}
cs


>> 6 번 라인을 보자. b = 0; 이라는 식은 b 에 0을 대입하고, 그 식 자체의 결과는 또한 0이 된다.

>> 그렇기 때문에 a = b = 0; 은 a = (b = 0); 에서 a = (0); 으로 이어지며, 

>> 결과적으로 a 와 b 두 변수 모두에 0이 대입된다. 



9) || 연산의 단축연산


- 아래의 프로그래밍의 실행결과를 에측해보자.


1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
int main()
{
    int a, b;
    a = b = 0;
    
    (a = 5) || (b = 3) ? printf("A") : printf("B");
    printf(" %d %d\n", a, b);
 
    return 0;
}
cs



10) ! 연산자 (NOT 연산자)


- 참을 거짓으로, 거짓을 참으로 만드는 연산자 이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
int main()
{
    int a=0;
    int b=3;
        
    !a ? printf("A") : printf("B");
    !b ? printf("A") : printf("B");
    !0 ? printf("A") : printf("B");
    !1 ? printf("A") : printf("B");
 
    return 0;
}
cs


>> 실행결과는 ABAB



11) Shift 연산자 >>, <<


- << 는 비트단위로 왼쪽으로 한칸씩 밀어낸다.

- >> 는 비트단위로 오른쪽으로 한칸씩 밀어낸다.


- 10을 2진수로 표현하면 00001010 이다.

- a = 10; a = a >> 1; 이 수행되면, 00000101 이 된다. 즉 a 에는 5가 저장지며, 결과적으로 2로 나눈 몫이 된다.

- a = 10; a = a << 1; 이 수행되면, 00010100 이 된다. 즉 a 에는 20이 저장되며, 결과적으로 2가 곱해진 결과가 된다.


- a = 10; a = a >> 2; 가 수행되면 a 는 2가 된다.

- a = 10; a = a << 2; 가 수행되면 a 는 40이 된다.



12) 기타.

- 콤마연산자

- 연산자 우선순위

- 단항, 2항, 3항, 대입, 콤마 연산자.

- 컴퓨터는 뺄셈, 곱셈, 나눗셈을 보수를 이용해서 덧셈으로 처리한다는 내용. >> 10 - 3 => 10 + (-3)

- 나눗셈의 경우에 피제수와 보수를 더하여 100이 될 때까지 더해진 횟수가 몫이 된다는 내용


>> Self...^^

'Tutoring > 18-1 C Lang' 카테고리의 다른 글

Week 06  (0) 2018.04.23
Week 05  (0) 2018.04.18
Week 03  (0) 2018.04.04
Week 02  (2) 2018.03.28
Week 01  (0) 2018.03.21

Week 03

Tutoring/18-1 C Lang2018. 4. 4. 18:51

< 180404 >


1) 과제풀이.


1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
int main()
{
    int t, s;
    int bits, bytes;
    scanf("%d%d"&t, &s);
 
    bits = 2 * t * s * 4000;
    bytes = bits/8;
    return 0;
}
cs


>> 7 : scant() 에서 %d 는 10진수 정수를 입력받기 위한 서식문자.

>> 7 : &변수명 인 경우, &는 변수의 주소를 반환해주는 연산자..!!



2) %d 와 %c ..

- 숫자를 입력하고, 엔터를 친 다음, 문자를 입력하고 엔터를 쳤을때, 어떤 결과를 원한다.

- 아래 코드의 문제점은..??


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
int main()
{
    int n;
    char ch;
 
    scanf("%d"&n);
    scanf("%c"&ch);
 
    printf("%d %c\n", n, ch);
    printf("End\n");
 
    return 0;
}
cs

 

>> 숫자를 입력하고 엔터를 치면, 해당 숫자는 n에 저장되는데, 

     다음에 문자를 치기전에 쳤던 엔터도 문자로 인식이 되어 %c 에 저장이 된다.


- 해결책 1.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
 
int main()
{
    int n;
    char ch;
 
    scanf("%d"&n);
    getchar();
    scanf("%c"&ch);
 
    printf("%d %c\n", n, ch);
    printf("End\n");
 
    return 0;
}
cs


>> 스캔에프 사이에 getchar() 을 추가한다. 이유가 궁금하면 검색을... 

     getchar() 을 검색하기전에 '입력버퍼' 라는 것에 대해 검색을 먼저 해보자.


- 해결책2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
int main()
{
    int n;
    char ch;
 
    scanf("%d"&n);
    scanf(" %c"&ch);
 
    printf("%d %c\n", n, ch);
    printf("End\n");
 
    return 0;
}
cs


>> 9 : "%c" 를 " %c" 라 바꿧다. 즉 빈칸이 엔터키를 포함시켜, 정상적으로 문자를 입력받을 수 있게된다. 

>> 이 원리가 궁금하면 스캔에프 사용법에 대해 검색을 해보자..

>> 해결책 2를 권함..^^



3) 입력 프롬프트에서 1을 입력했다. 프로그램은 이 1이란 것을 숫자 1인지, 문자 '1' 인지 어떻게 구분을 하여 저장을 할까??


1
2
3
scanf("%d"&n);
 
scanf("%c"&ch);
cs


>> 서식문자를 무엇으로 지정했는지에 따라 구분이 가능하다.



4) 10진수 정수를 입력받아, 8진수, 16진수로 출력하기. 문자를 입력받아 그 문자의 아스키코드값 출력하기


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
 
int main()
{
    int n;
    char ch;
 
    scanf("%d"&n);
    printf("10진수: %d\n", n);
    printf("8진수: %o\n", n);
    printf("16진수: %x\n", n);
 
    printf("\n");
    scanf(" %c"&ch);
    printf("%c의 ASCII 코드값: %d\n", ch, ch);
 
    return 0;
}
 
cs


>> 실행결과

1
2
3
4
5
6
7
10
10진수: 10
8진수: 12
16진수: a
 
A
A의 ASCII 코드값: 65
cs



5) 10진수 vs 8진수 vs 10진수


10진수 : 1    2    3    4    5    6    7    8    9    10    11    12    13    14    15    16    17 ...

 8진수 : 1    2    3    4    5    6    7    10   11    12    13    14    15    16   17    20   21 ...

16진수 : 1    2    3    4    5    6    7    8    9    10    A    B    C    D    E    F    G    10 ...



6) 4자리 정수(1000 ~ 9999) 까지의 정수를 입력받았을 때, 이를 거꾸로 출력해보기.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
 
int main()
{
    int n, res;
    scanf("%d"&n);
 
    res = n%10;
    n /= 10;
 
    res = res*10 + n%10;
    n /= 10;
 
    res = res*10 + n%10;
    n /= 10;
    
    res = res*10 + n%10;
    printf("%d\n", res);
    return 0;
}
cs


>> 1234 를 입력하면, 4321 이 출력된다.

>> 8 : res 에는 4가 저장된다.

>> 9 : n 에는 123 이 들어있다.

>> 11 : res 에는 43 이 저장된다.

>> 12 : n 에는 12 가 저장된다.

>> 14 : res 에는 432 가 저장된다.

>> 15 : n 에는 1 이 저장된다.

>> 17 : res 에는 4321 이 저장된다.



7) 증감 연산자. a++ vs ++a


1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
int main()
{
    int a, b, c;
 
    a = 5;
    b = a++;
    c = +++ b++;
    printf("%d %d %d\n", a, b, c);
 
    return 0;
}
cs


>> 실행결과 : 7 6 12


>> 8라인이 끝나기 전에는 a에는 5가, b에도 5가 저장되어 있다. 

>> 8라인이 끝나고 나서야 a에 값이 6으로 증가한다.


>> 9번 라인이 끝나기 전에는 a는 1이 증가한 7이, b에는 5가, c에는 그 둘의 합인 12가 저장된다.

>> 9번 라인이 끝나고 나서야 b의 값은 1이 증가하여 6이된다.


>> 그렇기 때문에 10라인에서 최종적으로 7 6 12 라는 결과가 출력된다. 



8) scanf() 에서의 서식문자 %lf vs %f


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
 
int main() 
{
    float 키1, 키2, 키3, 키4;
    char 혈1, 혈2, 혈3, 혈4;
 
    printf("학생1의 키와 혈액형:");
    scanf("%f %c"&키1,&혈1);
  
    printf("학생2의 키와 혈액형:");
    scanf("%f %c"&키2, &혈2);
    
    printf("학생3의 키와 혈액형:");
    scanf("%f %c"&키3, &혈3);
    
    printf("학생4의 키와 혈액형:");
    scanf("%f %c"&키4, &혈4);
    
    printf("평균 키:%.1lf\n", (키1 + 키2 + 키3 + 키4) / 4);
    return 0;
}
cs


>> 문제 없이 출력된다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
 
int main() 
{
    double 키1, 키2, 키3, 키4;
    char 혈1, 혈2, 혈3, 혈4;
 
    printf("학생1의 키와 혈액형:");
    scanf("%f %c"&키1,&혈1);
  
    printf("학생2의 키와 혈액형:");
    scanf("%f %c"&키2, &혈2);
    
    printf("학생3의 키와 혈액형:");
    scanf("%f %c"&키3, &혈3);
    
    printf("학생4의 키와 혈액형:");
    scanf("%f %c"&키4, &혈4);
    
    printf("평균 키:%.1lf\n", (키1 + 키2 + 키3 + 키4) / 4);
    return 0;
}
cs


>> 원하지 않는 결과가 출력될 것이다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
 
int main() 
{
    double 키1, 키2, 키3, 키4;
    char 혈1, 혈2, 혈3, 혈4;
 
    printf("학생1의 키와 혈액형:");
    scanf("%lf %c"&키1,&혈1);
  
    printf("학생2의 키와 혈액형:");
    scanf("%lf %c"&키2, &혈2);
    
    printf("학생3의 키와 혈액형:");
    scanf("%lf %c"&키3, &혈3);
    
    printf("학생4의 키와 혈액형:");
    scanf("%lf %c"&키4, &혈4);
    
    printf("평균 키:%.1lf\n", (키1 + 키2 + 키3 + 키4) / 4);
    return 0;
}
cs


>> 원하는 결과가 출력될 것이다.


>> 결론 : scarf() 에서의 서식문자 %lf 는 double 형 변수에 , %f 는 float 형 변수에 맞는 서식문자이다.



9) 기타


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
 
int main() 
{
    int a=20, b=10;
 
    a = a+b;
    a += b;
 
    a = a-b;
    a -= b;
 
    a = a*b;
    a *= b;
 
    a = a/b;
    a /= b;
 
    return 0;
}
cs


>> 7, 8과 10, 11과 13, 14와 16, 17은 같은 연산이다.


- printf() 함수를 통해 %를 출력하고 싶으면 %% 를 써야한다.


1
2
3
4
5
6
7
#include <stdio.h>
 
int main() 
{
    printf("%d%%\n"10);
    return 0;
}
cs


>> 실행결과 : 10%

'Tutoring > 18-1 C Lang' 카테고리의 다른 글

Week 06  (0) 2018.04.23
Week 05  (0) 2018.04.18
Week 04  (0) 2018.04.11
Week 02  (2) 2018.03.28
Week 01  (0) 2018.03.21