How We Coding

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