c언어 연습문제 #1 (국비3일차)

 

문제 1.

 

*
***
*****
***
*

를 출력하시오.

 

A1:

가장 간단한 방법으로는 직접 띄어쓰기를 해서 만드는 방법이 있다. 그러나 그 방법은 하지 않겠다.

첫 번째 방법은 \t를 사용하는 것이다. 탭으로 들여쓰기한 효과를 주는 것이다. 그럼에도 불구하고 스페이스를 몇 번 눌러 공백을 입력했다. 

#include <stdio.h>

void main()
{

printf("\t  * \n");
printf("\t *** \n");
printf("\t***** \n");
printf("\t *** \n");
printf("\t  * \n");

}

A2:

그럼 스페이스바를 사용하지 않고 해 보자.

우리가 배운 서식과 데이터를 넣는 방식으로 사용해서도 풀 수 있고, 그 과정에서 % 과 s 사이에 숫자를 넣어 간격을 맞춰줄 수도 있다.

#include <stdio.h>

void main()
{

printf("\t%3s \n", "*");
printf("\t%4s \n", "***");
printf("\t%s \n", "*****");
printf("\t%4s \n", "***");
printf("\t%3s \n", "*");

}

이 방법에서 각 줄마다 %와 s 사이에 숫자가 다른데 그 이유는 가운데 정렬이 없기 때문이다. 따라서 오른쪽 정렬을 쓴다고 가정할 때, 가장 오른쪽에 있는 별이 몇 번째 칸에 있는지 고려하면서 풀어야 하기 때문에 숫자가 매번 다르다. 

이 외에도 여러 가지 풀이 방법이 있겠지만, 방법의 차이가 대동소이하기 때문에 넘어가겠다.

 

문제 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

구구단 2단을 출력하시오.

A:

가장 쉬운 방법으론 printf("2*1=2"); 와 같은 방식으로 다 적는 방법이 있겠다. 이 방법은 제외해보도록 하겠다.

다른 방법으로는 출력 서식 문자를 이용해 출력하는 방법이 있다. 아래와 같다.

#include <stdio.h>

void main()
{

printf("%d*%d=%d \n", 2, 1, 2*1);
printf("%d*%d=%d \n", 2, 2, 2*2);
printf("%d*%d=%d \n", 2, 3, 2*3);
printf("%d*%d=%d \n", 2, 4, 2*4);
printf("%d*%d=%d \n", 2, 5, 2*5);
printf("%d*%d=%d \n", 2, 6, 2*6);
printf("%d*%d=%d \n", 2, 7, 2*7);
printf("%d*%d=%d \n", 2, 8, 2*8);
printf("%d*%d=%d \n", 2, 9, 2*9);

}

 

문제 3.
다음과 같은 형태로 본인의 이름을 출력하는 프로그램을 작성해 보자.
단, printf(함수)는 한 번만 사용한다.
 홍길동
 홍 길 동
 홍  길  동

A:

 이 문제도 방법은 여러 가지가 있다. 하나하나 입력하는 방식, 서식 출력 문자를 이용하는 방식 등이 있다.

#include <stdio.h>

void main()
{

printf(" %s\n %s\n %s\n", "홍길동","홍 길 동","홍  길  동");

}



문제 4.
본인의 이름, 주소 그리고 전화번호를 모니터에 출력하는 프로그램을 작성하자.
더불어 이스케이프 시퀀스 \n을 적절히 삽입해서 출력형태를 보기 좋게 다듬기 바란다.
총 3번의 printf 함수를 사용한다.

A:

앞으로 이런 유형의 문제들은 그냥 입력하는 것이 아닌, 출력 서식을 사용해서 만드는 방식을 사용하겠다.

#include <stdio.h>

void main()
{

printf("%s\n","홍길동");
printf("%s\n","서울시 서초구 서초3동 ~~");
printf("%s\n","010-1234-5678");

}

 


문제 5.
다음의 출력결과를 보이도록 예제를 작성해 보자. 단, 출력되는 숫자들(20,123,456)은
서식문자 %d를 이용하여 출력하도록 하자.
 제 이름은 홍길동입니다.
 제 나이는 20살이고요.
 제가 사는 곳의 번지수는 123-456입니다.

A:

printf 함수를 1번만 써도 되지만 코드의 가독성을 생각해서 3번을 사용하고 %d를 이용하면 간단하다.

#include <stdio.h>

void main()
{

printf("제 이름은 홍길동입니다. \n");
printf("제 나이는 %d살이고요. \n",20);
printf("제가 사는 곳의 번지수는 %d-%d입니다. \n", 123,456);

}

 



문제 6.
다음의 출력결과를 보이도록 예제를 작성해 보자. 이번에도 역시 출력되는 숫자들은 서식
문자 %d를 이용해서 출력하도록 하자.
 4 * 5 = 20
 7 * 9 = 63

A:

앞에 구구단과 풀이는 같다.

#include <stdio.h>

void main()
{

printf("%d*%d=%d\n", 4, 5, 4 * 5);
printf("%d*%d=%d\n", 4, 5, 20);

printf("%d*%d=%d\n", 7, 9,7 * 9);
printf("%d*%d=%d\n", 7, 9, 63);

}

 

 


마지막으로 복습을 위해 해당 코드가 어떻게 출력될지 생각해 보자.

#include <stdio.h>

void main()
{
printf("문자열 출력 : [%20s]\n", "대한민국");
printf("문자열 출력 : [%-20s]\n", "대한민국");
printf("문자 출력 : [%10c]\n", 'a');
printf("문자 정수값 출력 : [%-10d]\n", 'a');
printf("오른쪽 정렬 : [%10d]\n", 1234);
printf("0 삽입 : [%010d]\n", 1234);
printf("음수의 0 삽입 : [%010d]\n", -1234);
printf("부동소수점 출력 : [%8.2f]\n", 123.4567);
printf("부동소수점 출력 : [%-8.2f]\n", 123.4567);
printf("부동소수점 출력 : [%10.2f]\n", 0.0012345);
printf("부동소수점 출력 : [%10.3e]\n", 0.0012345);
printf("부동소수점 출력 : [%10.7g]\n", 0.00012345);
}

 

 

 

A:

 

첫 번째 줄에 대한민국은 2칸씩 차지하고 있다. 그 이유는 아스키코드에 포함되고 있지 않아서이다. 유니코드에 있는 글자들은 2칸씩 차지한다.

그렇다면 %20s를 설정했으나 출력 data가 20칸을 넘게 입력하면 어떻게 될까?

그대로 출력이 된다. 즉 저기서 설정한 필드 폭 값은 최소 값이라는 것이다.

 

printf("부동소수점 출력 : [%8.2f]\n", 123.4567);

이 함수의 해석을 하면 8자리로 필드폭을 설정하되, 소수점은 2번째 자리까지 표시하라는 것이다.

그런데 결과값이 약간 다르다. 그대로 가져오면 결과값이 [  123.45]가 돼야 할 텐데 [  123.46]이 됐다.

즉, float는 반올림을 한다는 사실을 알 수 있다.

 

%e에선 반올림이 특이하게 작용된다.

5에서 반올림하는 게 아니고, 6부터 반올림이 적용된다.

마지막 부동소수점 출력 같은 경우 %e,%f의 법칙과는 다르다고 생각이 들 것이다.

그 이유는 %g는 유효 숫자 값부터 칸수를 세는 법칙을 가지고 있기 때문이다.

0.00012345에서 유효한 숫자는 1부터 시작이기 때문에 1을 기준으로 칸을 세는 법칙이라는 것이다.

 

 

느낀 점:

아직 처음이라 무엇을 어떻게 시도해봐야할지는 모르겠지만

다양한 데이터 값을 넣어보고 차이가 있는지 확인해봐야 할 것 같다.