#include <stdio.h>
int main(void)
{
//삼각형
int x, y, i, a, c;
 c = 3, a = 0;
 for(x = 0 ; x <= 3 ; x++)
 {
  for(y = 0 ; y <= c-1 ; y++)
  {printf(" ");}
  for(i = 0 ; i <= x+a ; i++)
  {
   printf("*");
  }
  printf("\n");
  c -= 1;
  a++;
 }
 /* 역삼각형
int x, y, i, a, c,d;
 d = 6, c = 6, a = 0;
 
 
 for(x = 0 ; x <= 3 ; x++)
 {
 for(y = 0 ; y <= d-a ; y++)
 {
  printf("*");
 }
 printf("\n");
 
 if(x<3)
 for(i = 0 ; i <= d-c  ; i++)
   printf(" ");
 a += 2;
 c--;
}*/

 return 0;
}

아마도 이것은 대학교 과제로 종종 등장하는 문제인 것 같다. 위의 코드는 2년 여전에 네이버 지식인 답변으로 코딩한 것.


//2014년 1월 28일 : 어떤 C언어 책의 연습문제로 비슷한 것이 있어서 풀어보았다. for문 3개의 조잡함은 그대로지만 변수가 훨씬 깔끔하고 알아보기 쉽게 변했다.

#include <stdio.h>

int main()
{
    int n,i,j,k=0;

    for(n=0;n<5;n++)
    {
        for(j=0;j<k-n;j++)
        {
            printf(" ");
        }
        for(i=0;i<9-k;i++)
        {

            printf("*");
        }
        printf("\n");
        k+=2;
    }

    return 0;




'프로그래밍 > C' 카테고리의 다른 글

배열과 포인터의 관계  (0) 2010.10.09
포인터 (Pointer)  (0) 2010.10.09
선택정렬 (Selection Sort)  (0) 2010.10.09
배열 (array)  (0) 2010.10.09
비트 연산자  (0) 2010.10.03
형변환 (type conversion)  (0) 2010.10.03
삼항 연산자를 이용한 최대값 구하기  (0) 2010.10.03
 형변환은 정수형이 실수형이 되거나 혹은 그 반대의 경우가 일어나는 것을 말한다.
이러한 형변환에는 크게 두가지가 있는데 컴파일러에 의해서 자동으로 변환되는 암시적인 형변환이 있고
프로그래머가 형변환 연산자를 이용해서 강제로 처리하는 명시적인 형변환이 있다.

1.암시적인 형변환 (자동 형변환)

일단 예를 들어보자.
'정수 + 실수 = ?' 에서 ?에는 어떤 데이터형이 적합할까?
'10 + 5.5'라고 가정하면 우리는 쉽게 답이 15.5라는 것을 알 수 있다.
그런데 결과값이 만약 정수형 데이터에 저장된다면 15라는 값이 출력될 것이다.

#include <stdio.h>

int main(void)
{
int a=10;
double b=5.5;
int sum=0;

sum = a+b;

printf("%d",sum);

return 0;
}

바로 위와 같은 코드가 그러한 예이다.
실제로 컴파일해보면 알겠지만 당연히 15라는 값이 나온다.

이러한 경우에 일어난 것이 바로 암시적인 형변환이다.
일단 'int + double'을 계산할 때 int형을 double형으로 변환해서 'double + double'로 계산한다.
그러면 결과값도 당연히 double형인데 이것을 int형으로 변환해서 저장하는 것이다. (이 경우 컴파일 경고가 발생한다.)

위의 경우에는 두종류의 암시적인 형변환이 일어난 것인데 먼저 작은 크기(int, 4바이트)의 데이터형을 큰 크기
(double, 8바이트)의 데이터형으로 변환하는 것은 승진(promotion)에 의한 형변환이고 결과값인 15.5를 int형인
sum에 대입하는 것은 대입에 의한 형변환이다.

#include <stdio.h>

int main(void)
{
int a=10;
double b=5.5;

printf("%f",a+b);

return 0;
}

앞서 'int + double'을 계산할 때 int형을 double형으로 변환해서 'double + double'로 계산한다고 했는데 위의 코드가
 그 증거이다. int형인 변수 a를 double형으로 변환해서 계산하여 결과값(15.500000)도 실수형으로 나오게 된다.

2.명시적인 형변환

일단 명시적인 형변환의 형식부터 살펴보자.
형식 : (데이터형) 수식
ex) (int) 3.14

프로그래머가 위와 같은 형식으로 형변환 연산자를 이용해서 직접 형변환을 명시적으로 형변환시킬 수 있다.
왜 명시적인 형변환이 필요할까? 아래의 코드를 보면 프로그래머의 형변환의 결정이 다른 결과를 도출할 수 있다는
것을 알게 될 것이다.

#include <stdio.h>

int main(void)
{
int a=0;
float b=0;

a = (int)(10.6 + 15.7); // 10.6+15.7을 먼저 계산하면 26.3이 되고 이것을 int형으로 변환하면 26이 된다.
printf("a = %d\n",a);

a = (int) 10.2 + (int) 15.3; // 10.2를 int형으로 변환해서 10이 되고 15.3도 마찬가지로 15가 되어 25가 된다.
printf("a = %d\n",a);

b = 10 / 3; // '정수/정수'이므로 몫 역시 정수 값이 된다. 따라서 3이 된다.
printf("b = %f\n",b);

b = (float) 10 / 3; // 하나만 실수형이 되도 암시적인 형변환에 의해서 '실수/실수'로 처리된다.
printf("b = %f\n",b);

b = (float) 10 / (float) 3; // '실수/실수'이므로 실수형의 값을 가진다.
printf("b = %f\n",b);

return 0;
}


'프로그래밍 > C' 카테고리의 다른 글

배열과 포인터의 관계  (0) 2010.10.09
포인터 (Pointer)  (0) 2010.10.09
선택정렬 (Selection Sort)  (0) 2010.10.09
배열 (array)  (0) 2010.10.09
비트 연산자  (0) 2010.10.03
삼각형 출력하기  (0) 2010.10.03
삼항 연산자를 이용한 최대값 구하기  (0) 2010.10.03
지금도 초보지만 한참 더 초보일 때는 달랑 if else문 하나로 대부분의 과제나 기타 문제들을 해결하려고 했다.
삼항 연산자를 쓰면 더 간단하게 해결될 일도 익숙하고 쉬운 if else문 외에는 시도한 적이 없었다.
정말 별 것 아닌 것인데 왜 그때는 이런 생각을 못했는지 한심스럽다.


#include <stdio.h>

int main(void)
{
int a=10,b=20;
int max=0;

if(a>b)
{
max=a;
}
else
{
max=b;
}

printf("%d",max);

return 0;
}

항상 위와 같이 코딩했었는데 다음의 코드를 보면 훨씬 간결해진다.

#include <stdio.h>

int main(void)
{
int a=10,b=20;
int max=0;

max = a>b?a:b;

printf("%d",max);

return 0;
}

틀림없이 ?:연산자가 익숙하지 않았기 때문일 것이다.
그만큼 공부를 안했다는 증거이기도 하다.

'프로그래밍 > C' 카테고리의 다른 글

배열과 포인터의 관계  (0) 2010.10.09
포인터 (Pointer)  (0) 2010.10.09
선택정렬 (Selection Sort)  (0) 2010.10.09
배열 (array)  (0) 2010.10.09
비트 연산자  (0) 2010.10.03
삼각형 출력하기  (0) 2010.10.03
형변환 (type conversion)  (0) 2010.10.03

+ Recent posts