진법연산기...
닫기 Code Type : C
/////////////////////////////////////////
// 2007년 03월 25일 고급프로그래밍 //
// Coded By 오형탁 Ohyung (2002711158) //
// ohyung@ohyung.com http://ohyung.com //
/////////////////////////////////////////
// 각 문제의 주석마다 * / 를 붙이시면됩니다. (붙여서) ^^
/*
========================================
<진법연산>
1) 10 -> 2
2) 10 -> 8
3) 10 -> 16
4) 2 -> 10
5) 2 -> 16
========================================
* 계산하고자 하는 진법연산의 번호를 입력하시오. : 1 ☜ (입력)
* 10진수 : 10 ☜ (입력)
========================================
<결과>
10진수 : 10 -> 2진수 : 1010
========================================
/* 1번문제 */
#include< stdio.h>
int dectobin(int dec) // 펑션으로 10진수를 2진수로 바꾸는것입니다.
{
int a[1000],i=0,j=0;
while(dec>0) // 10진수를 2로 나누고 나머지를 a라는 변수에 차례대로 넣습니다.
{
a[j]=dec%2;
dec/=2;
j++;
}
for (i=j-1;i>=0;i--) // a라는 변수를 역순으로 출력하게 되면 2진수가 표협됩니다.
printf("%d",a[i]);
return 0;
}
int dectooct(int dec) // 펑션으로 10진수를 8진수로 바꾸는것입니다.
{
int a[1000],i=0,j=0;
while(dec>0) // 10진수를 8로 나누고 나머지를 a라는 변수에 차례대로 넣습니다.
{
a[j]=dec%8;
dec/=8;
j++;
}
for (i=j-1;i>=0;i--) // a라는 변수를 역순으로 출력하게 되면 8진수가 표협됩니다.
printf("%d",a[i]);
return 0;
}
int dectohex(int dec) // 펑션으로 10진수를 16진수로 바꾸는것입니다.
{
int a[1000],i=0,j=0;
while(dec>0) // 10진수를 16로 나누고 나머지를 a라는 변수에 차례대로 넣습니다.
{
a[j]=dec%16;
dec/=16;
j++;
}
for (i=j-1;i>=0;i--) // a라는 변수를 역순으로 출력하게 되면 16진수가 표협됩니다. 이때 9이하는 그냥 출력되고 10이상은 각각 ABCDEF로 바꾸어 출력합니다.
{
if(a[i]<=9)
printf("%d",a[i]);
else if(a[i]==10)
printf("A");
else if(a[i]==11)
printf("B");
else if(a[i]==12)
printf("C");
else if(a[i]==13)
printf("D");
else if(a[i]==14)
printf("E");
else if(a[i]==15)
printf("F");
}
return 0;
}
int bintodec(char bin[100]) // 펑션으로 2진수를 10진수로 바꾸는것입니다.
{
int dec=0,b=1,leng=0,i;
for(i=0;bin[i];i++)leng++; // i 값을 증가시키면서 bin 배열의 크기를 구하여 leng에 넣습니다.
for(i=leng-1;i>=0;i--) // i 값을 leng으로 한뒤 감소 시킵니다. 즉 2진수의 자리수 만큼 실행이 됩니다..
{
dec+=b*(bin[i]-48); //숫자의 ASCII는 0(48)~9(57)입니다. bin[i]-48을 하게 되면 그 자리의 문자열이 숫자로 변환됩니다.
b*=2; // 2진수 구하는 방법은 1*첫번째자리 2*두번째자리 2^2*세번째 자리순으로 하기때문에 2를 곱하여 b를 늘려준다.
}
printf("%d",dec);
return 0;
}
int bintohex(char bin[100]) // 펀션으로 2진수를 16진수로 바꾸는것입니다.
{
int a[100],dec=0,b=1,leng=0,i,j=0;
for(i=0;bin[i];i++)leng++; // i 값을 증가시키면서 bin 배열의 크기를 구하여 leng에 넣습니다.
for(i=0;leng>0;i++,leng--) // i 값을 증가시키면서 leng의 값은 감소시킨킵니다. 즉 2진수의 자리수 만큼 실행이 됩니다.
{
dec+=b*(bin[i]-48); //숫자의 ASCII는 0(48)~9(57)입니다. bin[i]-48을 하게 되면 그 자리의 문자열이 숫자로 변환됩니다.
b*=2; // 2진수 구하는 방법은 1*첫번째자리 2*두번째자리 2^2*세번째 자리순으로 하기때문에 2를 곱하여 b를 늘려주면 됩니다.
}
i=0; // 2진수를 10진수로 변환시킨뒤 i값을 0으로 초기화 시킵니다.
while(dec>0) // 10진수를 16진수로 변환합니다. 16으로 나눈뒤 a라는 배열에 나머지값을 넣습니다.
{
a[j]=dec%16;
dec/=16;
j++;
}
for (i=j-1;i>=0;i--) // a라는 배열에서 역순으로 출력하되 10~15의 값은 ABCDEF로 각각 출력합니다.
{
if(a[i]<=9)
printf("%d",a[i]);
else if(a[i]==10)
printf("A");
else if(a[i]==11)
printf("B");
else if(a[i]==12)
printf("C");
else if(a[i]==13)
printf("D");
else if(a[i]==14)
printf("E");
else if(a[i]==15)
printf("F");
}
return 0;
}
// 2진수를 16진수로 바꾸는법은 뒤에서부터 4자리씩 잘라 수를 16진으로 계산한뒤 차레대로 해주시면 됩니다.
int bintohex2(char bin[100]) // 펑션으로 2진수를 16진수로 바꾸는것입니다.
{
int hex[100],dec=0,b=1,leng=0,i,k=0,l=0,j=0;
for(i=0;bin[i];i++)leng++; // i 값을 증가시키면서 bin 배열의 크기를 구하여 leng에 넣습니다.
for(i=leng;i>0;i-=4) // i 값을 leng의 4자리 마다 끊습니다.
{
for(k=leng-1;k>leng-5;k--) // 할당받은 4자리를 한자리씩 분석합니다.
{
if(k<0) // 만약 k가 음수라면 브레이크로 빠져 나옵니다.
break;
dec+=b*(bin[k]-48); //숫자의 ASCII는 0(48)~9(57)입니다. bin[i]-48을 하게 되면 그 자리의 문자열이 숫자로 변환됩니다.
b*=2; // 2진수 구하는 방법은 1*첫번째자리 2*두번째자리 2^2*세번째 자리순으로 하기때문에 2를 곱하여 b를 늘려주면 됩니다.
}
hex[l]=dec; // hex라는 배열에 dec으로 4자리씩 끊은뒤 16진으로 바뀐값을 넣습니다.
l++,b=1,leng-=4,dec=0; // 기타 값들을 변경해둔뒤 처음의 포문으로 돌아갑니다.
}
for (i=l-1;i>=0;i--) // hex라는 배열에서 역순으로 출력하되 10~15의 값은 ABCDEF로 각각 출력합니다.
{
if(hex[i]<=9)
printf("%d",hex[i]);
else if(hex[i]==10)
printf("A");
else if(hex[i]==11)
printf("B");
else if(hex[i]==12)
printf("C");
else if(hex[i]==13)
printf("D");
else if(hex[i]==14)
printf("E");
else if(hex[i]==15)
printf("F");
}
return 0;
}
int main()
{
int input,mode,i;
char bin[100];
printf("========================================\n"
"<진법연산>\n"
"1) 10 -> 2\n"
"2) 10 -> 8\n"
"3) 10 -> 16\n"
"4) 2 -> 10\n"
"5) 2 -> 16\n"
"========================================\n"
"* 계산하고자 하는 진법연산의 번호를 입력하시오. : ");
while(scanf("%d",&mode)) // 원하는 값이 나올때까지 루프를 돌리며 입력을 받습니다.
{
if(mode<=3&&mode>=1) // 1과 3사이의 모드가 선택이 되면 10진수라고 출력후 브레이크
{
printf("* 10진수 : ");
scanf("%d",&input); //문자는 자동으로 걸러진다.
break;
}
else if(mode>=4&&mode<=5) // 4와 5중 하나가 선택되면 2진수라고 출력후 브레이크
{
printf("* 2진수 : ");
scanf("%s",&bin);
for(i=0;bin[i];i++) // 반복 횟수 지정 , 변수[i]가 끝날때까지 알아서 반복
{
if(47>= bin[i]||50<= bin[i]) // 0,1만 받아들이고 아닐경우 경고 메시지 출력후 exit로 강제종료!
{
printf("2진수가 아닙니다.\n");
exit();
}
}
break;
}
printf("* 계산하고자 하는 진법연산의 번호를 입력하시오. : "); //1~5가 아니라면 다시 루프
}
printf("\n========================================\n<결과>\n");
if(mode==1) // 모드에 따라 현재 변환되는 진법을 표현하고 입력받은 수를 함수를 호출하여 출력 합니다.
printf("10진수 : %d -> 2진수 : ",input),dectobin(input);
else if(mode==2)
printf("10진수 : %d -> 8진수 : ",input),dectooct(input);
else if(mode==3)
printf("10진수 : %d -> 16진수 : ",input),dectohex(input);
else if(mode==4)
printf("2진수 : %s -> 10진수 : ",bin),bintodec(bin);
else if(mode==5)
printf("2진수 : %s -> 16진수 : ",bin),bintohex2(bin);
printf("\n========================================\n");
return 0;
}
/**/
/*
========================================
입력 : Hello, My name is hong gil ja.
========================================
출력 : hELLO, mY NAME IS HONG GIL JA.
입력글자수 : 00
========================================
/* 2번문제 */
#include< stdio.h>
int main(void)
{
char str[1000]; // 입력받을 공간을 할당합니다. str이라는 공간에 1000개의 글자 ( 충분하다고봅니다. )를 할당해 줍니다.
int i,count=0; // str이라는 변수를 배열로 지정한뒤 배열의 번호를 메기는데 사용할 i라는 int값을 선언합니다.
printf("========================================\n입력 : "); // 프로그램 시작과 동시에 ' = ' 로 이루어진 줄과 '입력 : ' 이라는 글자를 출력해 줍니다.
gets(&str); // gets 명령으로 str을 입력받습니다. 문자열로 입력받아지며 각각의 배열에 할당되어 입력되어집니다.
printf("========================================\n출력 : "); // 입력이 끝난뒤 ' = ' 로 이루어진 줄과 ' 출력 : ' 이라는 글자를 출력해 줍니다.
for(i=0;str[i];i++) // 포문을 사용하여, 배열의 순서대로 내용을 수행합니다.
{
if ('A'<= str[i] && str[i]<= 'Z') // 만약에 지금 str[i]에 있는 값이 대문자 라면 아래 명령을 수행합니다.
putchar(str[i]-'A'+'a'),count++; // 대문자를 소문자로 고친뒤 putchar로 출력해주며 카운트를 합니다.
else if ('a'<= str[i] && str[i]<= 'z') // 만약에 지금 str[i]가 대문자가 아니고, 소문자이라면 아래 명령을 수행합니다.
putchar(str[i]+'A'-'a'),count++; // 소문자를 대문자로 고친뒤 putchar로 출력하며 카운트 합니다..
else if (str[i] == 32) // 공백의 경우 다음 명령을 수행합니다. 공백의 ASCII 번호는 32입니다.
putchar(str[i]); // 그대로 출력하되 입력글자수의 변동을 하지 않습니다.
else // 대문자도, 소문자도 공백도 아닐경우 다음 명령을 수행합니다.
putchar(str[i]),count++; // 받은 문자를 그대로 출력해 주며 카운트 합니다.
}
printf("\n========================================\n입력글자수 : %d\n",count); // 마지막을 ' = ' 로 이루어진 줄로 출력한뒤 입력글자를 출력합니다. 입력글자는 i의 값이 for문을 빠져나온후 의 값을 이용하여 출력합니다.
return 0;
}
/**/
/*
첨부파일 참조.
(반복문을 사용하세요.)
*/
/* 3번 */
#include< stdio.h>
int main()
{
int mode;
int a,b,c;
printf("input : "); // 모드를 선택하여 1~4까지를 입력받습니다.
while(scanf("%d",&mode))
{
if(mode<=4&&mode>=1)
break;
printf("input : ");
}
printf("\n%d) 도형\n\n",mode); // 몇번째 도형인지 표현하고 각각의 모드에 따라 출력을 합니다.
if (mode==1)
{
for(a=0;a<=4;a++) //a를 0부터 4까지 총 5번 실행하게 되며 이것은 줄을 표현합니다.
{
for(b=0;b<=a;b++) // b가 0부터 a까지 즉 첫번째줄은 1번실행 2번째줄은 2번 실행... 의 형태로 출력됩니다.
printf("*");
printf("\n");
}
}
else if (mode==2)
{
for(a=4;a>=0;a--) // a를 4부터 0까지 총 5번 실행됩니다.
{
for(c=4;c>=a;c--) // 공백을 표현하기 위해서 c가 4부터 a와 비례하여 감소 됩니다. 즉 1,2,3,4,5번 공백이 출력됩니다.
printf(" ");
for(b=0;b<=a;b++) // b는 0부터 a까지 실행되며, 처음에 a가 4이므로 5,4,3,2,1번 *가 표시됩니다.
printf("*");
printf("\n");
}
}
else if (mode==3)
{
for(a=0;a<=4;a++) // a를 0부터 4까지 총 5번 실행시킵니다.
{
for(c=4;c>=a;c--) // 공백을 표현합니다. c가 4 부터 a와 비례하여 감소 됩니다. 즉 5,4,3,2,1 개의 공백이 출력됩니다.
printf(" ");
for(b=0;b<=2*a;b++) // *을 표시합니다. 1,3,5,7,9개씩 출력되기 위해 2*a까지의 영역을 잡았습니다.
printf("*");
printf("\n");
}
}
else if (mode==4)
{
for(a=0;a<=3;a++) // 도형의 윗부분을 표현하기 위해 0부터 3까지 총 4번 실행시킵니다.
{
for(c=3;c>=a;c--) // 공백을 표현합니다. 방법은 모드3과 동일합니다.
printf(" ");
for(b=0;b<=2*a;b++) // *를 표시합니다. 방법은 모드 3과 동일합니다.
printf("*");
printf("\n");
}
for(a=2;a>=0;a--) // 도형의 아랫부분을 표현하기위해 2부터 0까지 총 3번 실행시킵니다.
{
for(c=3;c>=a;c--) // 공백을 넣습니다. 공백은 3부터 a와 비례하여 줄어듭니다. 하지만 표시는 2,3,4번되게 됩니다.
printf(" ");
for(b=0;b<=2*a;b++) // *를 출력합니다. 모드 3과 마찬가지 방법이되, 줄어드는 방식이 됩니다. 5,3,1 번 출력되게 됩니다.
printf("*");
printf("\n");
}
}
return 0;
}
/**/
닫기
좀 짜증났던것은 조건이 계속 바뀌었다는것...
2진수를 다이렉트로 16진수로 바꿀수도 있음...