[C언어] 프개 Lec02 자습자료2 풀이(210922)

자습자료2

(1)

#include<stdio.h>
main() {
        int     m;
        char    c;

        for (m = 97; m <= 122; m++)
                 putchar(m);
        putchar('\n');

        for (m = 'a'; m <= 'z'; m++)
                 putchar(m);

        putchar('\n');
        for (m = 'a', c = 'a'; m <= 'd'; m++, c++)
                 printf("(%c %d %c %d)", m, m, c, c);
        putchar('\n');

        printf("%d\n", 97 / 'a');
        printf("%c(%d) %c(%d) %c(%d) %c(%d)\n", '\101', '\101', '\x42', '\x42', 0103, 0103, 0x44, 0x44);
}

실행 결과

 

abcdefghijklmnopqrstuvwxyz

abcdefghijklmnopqrstuvwxyz

(a 97 a 97) (b 98 b 98) (c 99 c 99) (d 100 d 100)

1

A(65) B(66) C(67) D(68)

 

<코드 설명>

int m;

char c;

: 변수 m, c 선언

for (m = 97; m <= 122; m++)

putchar(m);

putchar('\n');

: for문 이용하여 m이 97부터 122까지 1씩 증가하도록 한다. 그리고 문자 단위 출력 함수 putchar() 이용하여 m을 출력한다.

이때 97부터 122까지 증가하는 m은 10진수이고, putchar() 안의 m은 10진수를 16진수로 변환한 값을 아스키코드 문자로 표현하므로, 0x61(97)부터 0x7A(122)에 해당하는 아스키 문자 a부터 z를 출력하게 된다. 줄 변환

for (m = 'a'; m <= 'z'; m++)

putchar(m);

putchar('\n');

: for문 이용하여 a부터 z까지 문자 단위로 출력한다. 줄 변환

for (m = 'a', c = 'a'; m <= 'd'; m++, c++)

printf("(%c %d %c %d)", m, m, c, c);

putchar('\n');

: %c로 문자인 알파벳 출력, %d로 정수인 10진수 출력. for문 이용하여 m과 c 1씩 증가. 따라서 (a 97 a 97)부터 (d 100 d 100)까지 출력한다.

printf("%d\n", 97 / 'a');

: %d로 정수인 10진수를 출력하므로 아스키코드 a에 해당하는 0x41, 즉 97이 ‘a’값에 들어가 출력된다. 97/97=1이므로 1 출력.

printf("%c(%d) %c(%d) %c(%d) %c(%d)\n", '\101', '\101', '\x42', '\x42', 0103, 0103, 0x44, 0x44);

: \ooo 표현은 8진법을 나타내므로 \101은 10진법으로 65, 즉 0x41이다. 따라서 A(65) 출력.

\xhh 표현은 16진법을 나타내므로 \x42는 10진법으로 66, 따라서 B(66) 출력.

숫자 0으로 시작되는 정수는 8진법 표현을 나타내므로 0103은 10진법으로 67, 즉 0x43이다. 따라서 C(67) 출력.

0x44는 10진법으로 68이므로 D(68) 출력.

 

 

(2)

#include <stdio.h>

main() {

double d;

float f;

d = f = 12.3456789;

printf("%f\n", d);

printf("%f\n", f);

printf("%f\n", 1234);

printf("%f %f\n", d, d);

printf("%f %f\n", f, f);

printf("%f %f %f\n", f, d, 1234);

printf("%f %f %f\n", d, f, 1234);

printf("%f %f %f\n", f, 1234, d);

printf("%f %f %f\n", d, 1234, f);

printf("%f %f %f\n", 1234, d, f);

printf("%f %f %f\n", 1234, f, d);

printf("%d %d %d\n", 1234, d, f);

printf("%d %d %d\n", d, 1234, f);

}

<코드 설명>

float와 double은 모두 실수 타입이지만 전자는 4바이트, 후자는 8바이트 크기를 가진다.

printf("%f\n", d); printf("%f\n", f); 에서 %f는 소수점 아래 6자리까지 출력하므로 12.3456789의 소수점 아래 7번째 자리에서 반올림하여 12.345679가 출력된다.

이때 %f는 부호 있는 1진 실수를 나타내므로 1234가 들어가면 0이 출력된다. (아마 오류..?)

 

 

(3)

#include<stdio.h>

void printstring(char s[]) {

int i;

for (i = 0; i < 10; i++)

printf(" s[%d]", i);

printf("\n");

for (i = 0; i < 10; i++)

printf("%5c"s[i]);

printf("\n");

for (i = 0; i < 10; i++)

printf("%5X"s[i]);

printf("\n");

printf("\n");

}

main() {

printstring("I am beautiful");

printstring("beautiful");

printstring("");

}

실행 결과

Visual studio에서는 마지막 printstring이 오류난다.

<코드 설명>

main함수 전에 배열 형태 출력하는 printstring함수를 정의한다.

char s[]와 변수 i를 선언하고, i가 0부터 9까지 반복되는 for문을 이용한다.

첫줄에서 몇 번째 s[]인지 나열하고, 두번째 줄에서 %5c로 5자리수임을 알리고 main함수의 문자를 하나씩 출력한다.

“ s[1]”에서 볼 수 있듯 5번째 자리에 문자가 출력되면 ] 밑에 문자가 위치하게 된다.

세번째 줄에서는 %5X로 아스키코드에 해당하는 문자를 16진수로 출력한다.

“”는 null로, 0으로 출력된다. 이때 Visual studio에서는 에러가 난다.

 

 

 

 

 

 

채널톡 아이콘