진법연산기...
대소문자 바꾸기 및 문자의 갯수세기
기초적인 for문 별출력
닫기 소스 코드 타입 : 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진수로 바꾸는법은 2진수를 10진수로 바꾸었다가 다시 16진수로 바꾸면되지만
2진수를 다이렉트로 16진수로 바꿀수도 있음...
bintohex2가 다이렉트 bintohex가 10진 거친뒤 16진으로...
그리고 2번문제에서 공백의 경우 문자로 취급하는데 그것을 하지 말라고 하니 -.-;
원래 공백은 ASCII코드 32번의 엄현한 문자지만 빼라고 하면 빼야함 -.-;
뭐 까라고 하면 까는게 공돌이니까 ㅜㅜ