Week 11
<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; *p = 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 |