Week 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) 배열과 포인터와의 관계
- 배열의 이름은 배열의 시작주소이며, 그 값을 바꿀 수 없는 상수형태의 포인터이다..!!
- 포인터(변수)는 변수이기 때문에 주소를 원할때마다 변경할 수 있다.
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 |
Week 10
<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] = {1, 2, 3, 4, 5}; 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) 재귀함수 호출 과정
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include <stdio.h> void f(int n) { if(n < 1) return ; f(n-1); printf("%d\n", n); } int main() { f(5); return 0; } | cs |
>> 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
< 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 == 0) return 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 < 1) return 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 == 0) return 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 < 1) return ; 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 < 1) return ; printf("%d\n", n); print1(n-1); } | cs |
>> n부터 1까지 거꾸려 출력하는 것은 n을 먼저 출력하고 n-1부터 1까지 거꾸로 출력하는 것과 같다.
Week 08
< 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일 때 실행결과
*
***
*****
*******
*****
***
*
Week 07
<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 |
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일대의 실행결과
*
**
***
****
*****
Week 06
< 180420 >
중간고사 대비 모의고사
Week 05
< 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 10: printf("A\n"); break; case 9: printf("A\n"); break; case 8: printf("B\n"); break; case 7: printf("C\n"); break; default: printf("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 10: printf("A\n"); case 9: printf("A\n"); break; case 8: printf("B\n"); break; case 7: printf("C\n"); break; default: printf("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 10: printf("A\n"); case 9: printf("A\n"); case 8: printf("B\n"); break; case 7: printf("C\n"); break; default: printf("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 10: case 9: printf("A\n"); break; case 8: printf("B\n"); break; case 7: printf("C\n"); break; default: printf("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 > 0) printf("%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 + 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 에서 진행한 것이 다르다....
Week 04
< 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...^^
Week 03
< 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 = ++a + 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%