How We Coding

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