두개의 정수를 입력받음, 첫번째 정수를 입력받아 16진수로 변환

두번째 정수를 입력받아 그 회수 만큼 2를 곱해 간다.

만약 2를 곱해 가다가 정수의 최대값이나 최소값을 벗어나는지 검사후 벗어나면 종료

두번째 정수는 양수여야 함.


#include <stdio.h>

#include <string.h>


#define MAX_SIZE 8 // 16진수문자열의최대길이

#define INT_MAX 2147483647 // INT값의최대값

#define INT_MIN -2147483647 // INT값의최소값


char strwork1[MAX_SIZE + 1] = "";

char strwork2[MAX_SIZE + 3] = ""; // OX~

char *genhexchars(unsigned long num, int byte); // 함수원형


int main()

{

int num=0, count=0, i=0;

printf("\n>> Program Start <<\n");

printf("Enter the first integer(num) : ");

scanf("%d", &num);


/* num이0,overflow, underflow 인지체크후0이면다시입력받음*/

while((num == 0) || (num > INT_MAX) || (num < INT_MIN)) 

{

printf("Try again!! \n");

printf("Enter the fisrt integer(num) : ");

scanf("%d", &num);

}


printf("Enter the second integer(count) : ");

scanf("%d", &count);


/* count가양수인지체크후음수이면다시입력받음*/

while(count < 0

{

printf("count < 0 !! Try again!! \n");

printf("Enter the second integer(count) : ");

scanf("%d", &count);

}


printf("----------------------------------------------------\n");

printf("%d => hex value: %s \n", num, genhexchars(num, 4)); // num값을16진수로출력

printf("%d times double........ \n", count); // count회2씩곱함


for(i=1; i<=count; i++) 

{

/* num가양수이면INT의최대값초과를확인*/

if(num>0

{

if(num > (INT_MAX/2)) 

{

printf("++++Overflow!!++++ \n");

break;

}

}

/* num가음수이면INT의최소값미만을확인*/

else 

{

if(num < (INT_MIN/2)) 

{

printf("++++Underflow!!++++ \n");

break;

}

}


printf("%d : \t", i);

num = num << 1; // 2씩곱함: 왼쪽시프트이용

printf("%d => hex value: %s \n", num, genhexchars(num, 4));

}


printf("----------------------------------------------------\n");

printf(">> Program Exit <<\n");

return 0;

}

/* unsigned long형의정수로부터16진수문자열을생성하는함수*/

char *genhexchars(unsigned long num, int bytes)

{

int i = 0, j, length, halfbytecount = 0;

unsigned char ch;

/* 16진수용의문자배열*/

static unsigned char hexchars[] = { '0', '1', '2', '3',

'4', '5', '6', '7', '8', '9', 'A', 'B', 'C',

'D', 'E', 'F' };


/* strwork2의앞부분에문자열을복사한다*/

strcpy(strwork2, "0x");


/* 숫자를16진수의문자열로변환한다*/

while (i < MAX_SIZE

{

/* 16의나머지를구한다*/

ch = (unsigned char) num % 16;

/* 하프바이트를16진수로표현한다*/

strwork1[i++] = hexchars[ch & 0x0f];

/* 4비트오른쪽으로쉬프트한다*/

num >>= 4;

/* 자료형별로바이트처리가끝나면종료한다*/

if (++halfbytecount / 2 == bytes)

break;

}


/* 끝에널문자를대입한다*/

strwork1[i] = '\0';

/* 문자열의길이를조사한다*/

length = strlen(strwork1);


/* 문자열을역순서으로재배치한다*/

for (i = 0, j = length - 1; i < j; i++, j--) 

{

ch = strwork1[i];

strwork1[i] = strwork1[j];

strwork1[j] = ch;

}

/* 결과를strwork2에연결한다*/

strcat(strwork2, strwork1);

return strwork2;

}


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

팩토리얼 수 구하기 (재귀함수)  (0) 2014.10.24
피라미드 별찍기  (0) 2014.10.12
정수부분, 소수부분 2진수 변환  (0) 2014.10.11
이진검색  (0) 2014.10.11
파일 복사 하기  (0) 2014.10.11
학생 정보 입력 받아 성적순으로 내림차순 정렬 출력  (1) 2014.10.11
진법 계산  (0) 2014.10.11
대소문자 바꿔서 출력  (0) 2014.10.11
3n + 1 문제 (The 3n+1 Problem)  (0) 2014.10.11