|
|
공학용계산기 소스
등록자 : a99jsh (정상혁), 2008-09-09
글수정 | 글삭제
--- 간단한 공학용 계산기 소스입니다.----
#include
#include
#include
#include
#include
#define pi 3.14159265358979323846
int ErrorCheck(char *kim, int jung);
/******************Error Check 2진수 ,16진수*****************************/
/* 에러 체크를 하기위해서 만든 함수 */
/************************************************************************/
int ErrorCheck(char *kim, int jung)
{
int it = 0, i;
while(kim[it] != '\0')
it++;
for(i = 0; i < it; i++)
{
switch(jung)
{
case 2:
switch(kim[i])
{
case '0': break;
case '1': break;
default: return 0;
}
break;
case 16:
switch(kim[i])
{
case '0': break;
case '1': break;
case '2': break;
case '3': break;
case '4': break;
case '5': break;
case '6': break;
case '7': break;
case '8': break;
case '9': break;
case 'a': break;
case 'A': break;
case 'b': break;
case 'B': break;
case 'c': break;
case 'C': break;
case 'd': break;
case 'D': break;
case 'e': break;
case 'E': break;
case 'f': break;
case 'F': break;
default: return 0;
}
break;
}
}
return 1;
}
/***********************평균, 분산 ,표준편차 구하기******************/
/* 17번문제를 풀기위해서 만들어준 함수 */
/******************************합계**********************************/
float ssum(float jumsu[10])
{
int num;
float sum=0;
for(num=0;num<10;num++)
{
sum =sum + jumsu[num]; //합계를 구한다.
}
return sum;
}
/***************************평균***************************************/
float aavg(float sum)
{
float avg;
return (avg = sum/10);// 평균 값
}
/********************************분산**********************************/
float ddis(float jumsu[10])
{
int num;
float dis,sum=0,avg;
for(num = 0; num < 10 ; num++)
{
sum = sum +jumsu[num];
}
avg = (sum/10);
for(num=0, dis=0; num<10; num++)
{
dis = dis + pow((jumsu[num]-avg),2);//분산 값
}
dis= dis/10;
return dis;
}
/**************************표준편차************************************/
float ddev(float i)
{
float dev;
dev = (sqrt(i));//dev에 i의 제곱근을 넣는다.(표준편차)
return dev;
}
/*********************************************************************/
/***************비트이동하여 값구하기*****************************/
/* 16번 문제 */
/* *오른쪽 쉬프트* */
int bit_move1( int x, int y )
{
return (x >> y);
}
/********************왼쪽 쉬프트***********************************/
int bit_move2( int x, int y )
{
return (x << y);
}
/**************10진수를 16진수로 변환하기 **************************/
/* 8번 문제 */
char *itoh(unsigned deci, char *hexa)
{
int n, i, j;
for(n = 0; deci; n++) {
hexa[n] = (deci % 16) + '0';
if(hexa[n] > '9') hexa[n] += 7;
deci /= 16;
}
if(n == 0) hexa[n++] = '0';
hexa[n] = '\0'; // 널문자
// 스트링 뒤집기
for(i = 0, j = n - 1; i < j; i++, j--) {
char ch;
ch = hexa[i];
hexa[i] = hexa[j];
hexa[j] = ch;
}
return hexa;
}
/**************16진수를 10진수로 변환하기 **************************/
/* 11번 문제 */
int htoi(char *hexa)
{
int count=0,decimal=0;
while(hexa[count] != EOF)
{
if(hexa[count]>='0' && hexa[count]<='9')
{
decimal *= 16;
decimal += hexa[count]-'0';
}
else if(hexa[count]>='A' && hexa[count]<='F')
{
decimal *= 16;
decimal += hexa[count]-'A'+10;
}
else if(hexa[count]>='a' && hexa[count]<='f')
{
decimal *= 16;
decimal += hexa[count]-'a'+10;
}
else break;
count++;
}
return decimal;
}
/***************2진수를 10진수로*********************************/
/* 13번 문제 */
int btod(char *strB)
{
int lResult=0,i=0;
while(strB[i]=='1' || strB[i]=='0')
{
lResult<<=1;
lResult+=(strB[i]-'0');
i++;
}
return lResult;
}
/****************16진수를 2진수로**********************************/
/* 10번 문제 */
char *htob(char *hexa)
{
int dec;
char bin[100];
dec=htoi(hexa);
itoa(dec, bin, 2);
return bin;
}
/****************************2진수를 16진수로**********************/
/* 14번 문제 */
char *btoh(char *bin)
{
int dec;
char hexa[100];
dec=btod(bin);
itoh(dec, hexa);
return hexa;
}
/*************************log,ln값 구하기************************/
/* 5,6번 문제 */
double log(double x);
double log10(double x);
double llog( double i)
{
return (log(i));
}
double llog10(double i)
{
return (log10(i));
}
/*******************************10진수를 2진수로 변환 ************/
/* 7번 문제 */
char *PrintBin(int in)
{
char bin[100];
itoa(in, bin, 2);
return bin;
}
/****************************제곱근 구하기*******************************/
/* 4번 문제 */
double pow(double x,double y);
double ppow(double i,double j)
{
return pow(i,j);
}
/****************************************삼각함수 구하기*******************/
/* 1,2,3번 문제 */
double sin(double x);
double tan(double x);
double cos(double x);
double ssin( double i )
{
return (sin(i*pi/180));
}
double ccos( double i )
{
return (cos(i*pi/180));
}
double ttan( double i )
{
return (tan(i*pi/180));
}
/******************************16진수의 사칙연산************************************************/
// 12번 문제
/************ 덧셈 ***********************/
char *sumhexa1(char *hexa1, char *hexa2)
{
int sum;
char hexasum[100];
sum=htoi(hexa1)+htoi(hexa2);
itoh(sum,hexasum);
return hexasum;
}
/************ 뺄셈**************************/
char *sumhexa2(char *hexa1, char *hexa2)
{
int sum;
char hexasum[100];
sum=htoi(hexa1)-htoi(hexa2);
itoh(sum,hexasum);
return hexasum;
}
/***************곱셈 *********************/
char *sumhexa3(char *hexa1, char *hexa2)
{
int sum;
char hexasum[100];
sum=htoi(hexa1)*htoi(hexa2);
itoh(sum,hexasum);
return hexasum;
}
/****************나눗셈********************/
char *sumhexa4(char *hexa1, char *hexa2)
{
int sum;
char hexasum[100];
sum=htoi(hexa1)/htoi(hexa2);
itoh(sum,hexasum);
return hexasum;
}
/******************************2진수의 사칙연산*************************************************/
//15번
/****************덧셈*********************/
char *sumbin1(char *bin1, char *bin2)
{
int sum;
sum=btod(bin1)+btod(bin2);
return PrintBin(sum);
}
/*************뺄샘***********************/
char *sumbin2(char *bin1, char *bin2)
{
int sum;
sum=btod(bin1)-btod(bin2);
return PrintBin(sum);
}
/*************곱셈************************/
char *sumbin3(char *bin1, char *bin2)
{
int sum;
sum=btod(bin1)*btod(bin2);
return PrintBin(sum);
}
/**************나눗셈*********************/
char *sumbin4(char *bin1, char *bin2)
{
int sum;
sum=btod(bin1)/btod(bin2);
return PrintBin(sum);
}
/********************************************메인함수**********************************************/
main()
{
int k, h, c, in,d,deci,x, n, p, result,count, total, num, st_number[10];
double a,w,g;
char strB[80]={0,},hexa[100],hexa2[100],u,e;
long lResult=0,i=0;
float jumsu[10], sum, avg ,dis , dev;
printf("*****상혁이의공학용계산기****** \n");
printf("* 1, sin 의 값 구하기. * \n");
printf("* 2, cos 의 값 구하기. * \n");
printf("* 3, tan 의 값 구하기. * \n");
printf("* 4, x^y승수구하기. * \n");
printf("* 5, ln 의 값 구하기. * \n");
printf("* 6, log 의 값 구하기. * \n");
printf("* 7, 10진수를 2진수로 바꾸기. * \n");
printf("* 8, 10진수를 16진수로 바꾸기. * \n");
printf("* 9, 10진수의 사칙연산(구현 X). * \n");
printf("*10, 16진수를 2진수로 바꾸기. * \n");
printf("*11, 16진수를 10진수로 바꾸기. * \n");
printf("*12, 16진수의 사칙연산. * \n");
printf("*13, 2진수를 10진수로 바꾸기. * \n");
printf("*14, 2진수를 16진수로 바꾸기. * \n");
printf("*15, 2진수의 사칙연산. * \n");
printf("*16, 비트이동하여 값구하기. * \n");
printf("*17, 평균,분산,표준편차 구하기. * \n");
printf("*18, 종료 * \n");
printf("********************************* \n");
printf("구하고자하는 위의 번호를 치세요.\n");
scanf("%d",&k);
fflush(stdin);
// TEST
switch(k)
{
case 1:
printf("1번을 선택하셨습니다.\n");
printf("sin");
scanf("%lf",&a);
/* if(fabs(a) > 1000000)
{
printf("잘못입력하셨습니다..\n아무키나 누르면 다시 메뉴로 갑니다");
e = getche();
break;
}*/
fflush(stdin);
w = ssin(a);
printf("sin%lf = %lf\n",a,w);
break;
case 2:
printf("2번을 선택하셨습니다.\n");
printf("cos");
scanf("%lf",&a);
/* if(fabs(a) > 1000000)
{
printf("잘못입력하셨습니다..\n아무키나 누르면 다시 메뉴로 갑니다");
e = getche();
break;
}*/
fflush(stdin);
w = ccos(a);
printf("cos%lf = %lf\n",a,w);
break;
case 3:
printf("3번을 선택하셨습니다.\n");
printf("tan");
scanf("%lf",&a);
/* if(fabs(a) > 1000000)
{
printf("잘못입력하셨습니다..\n아무키나 누르면 다시 메뉴로 갑니다");
e = getche();
break;
}*/
fflush(stdin);
w = ttan(a);
printf("tan%lf = %lf\n",a,w);
break;
case 4:
printf("4번을 선택하셨습니다.\n");
printf("실수와 그승수 값을 입력하세요(예:x^y):\n");
scanf("%lf^%lf",&a,&w);
fflush(stdin);
g = ppow(a,w);
printf("%lf^%lf = %lf \n",a,w,g);
break;
case 5:
printf("5번을 선택하셨습니다.\n");
printf("ln");
scanf("%lf",&a);
/* if(fabs(a) > 1000000)
{
printf("잘못입력하셨습니다..\n아무키나 누르면 다시 메뉴로 갑니다");
e = getche();
break;
}*/
fflush(stdin);
w=llog(a);
printf("%lf\n",w);
break;
case 6:
printf("6번을 선택하셨습니다.\n");
printf("log");
scanf("%lf",&a);
/* if(fabs(a) > 1000000)
{
printf("잘못입력하셨습니다..\n아무키나 누르면 다시 메뉴로 갑니다");
e = getche();
break;
}*/
fflush(stdin);
w=llog10(a);
printf("%lf\n",w);
break;
case 7:
printf("7번을 선택하셨습니다.\n");
printf("2진수로 바꿀 10진수를 입력하세요: ");
scanf("%d",&in);
fflush(stdin);
printf("2진수의 값은 %s 입니다. \n", PrintBin(in));
break;
case 8:
printf("8번을 선택하셨습니다.\n");
printf("16진수로 바꿀 10진수를 입력하세요 : ");
scanf("%d",&in);
fflush(stdin);
itoh(in, hexa);
printf("16진수의 값은 %s 입니다. \n", hexa);
break;
case 9:
printf("9번을 선택하셨습니다.\n");
printf("10진수 사칙연산은 계산하지 않았습니다.\n");
break;
case 10:
printf("10번을 선택하셨습니다.\n");
printf("2진수로 바꿀 16진수를 입력하세요:");
gets(hexa);
if(ErrorCheck(hexa, 16) == 0)
{
printf("잘못입력하셨습니다..\n아무키나 누르면 다시 메뉴로 갑니다");
e = getche();
break;
}
fflush(stdin);
printf("2진수의 값은 %s 입니다. \n",htob(hexa));
break;
case 11:
printf("11번을 선택하셨습니다.\n");
printf("10진수로 바꿀 16진수를 입력하세요 : ");
gets(hexa);
if(ErrorCheck(hexa, 16) == 0)
{
printf("잘못입력하셨습니다..\n아무키나 누르면 다시 메뉴로 갑니다");
e = getche();
break;
}
fflush(stdin);
printf("10진수의 값은 %d 입니다.\n",htoi(hexa));
break;
case 12:
printf("12번을 선택하셨습니다.\n");
printf("16진수를 입력하세요 : ");
gets(hexa);
if(ErrorCheck(hexa, 16) == 0)
{
printf("잘못입력하셨습니다..\n아무키나 누르면 다시 메뉴로 갑니다");
e = getche();
break;
}
fflush(stdin);
printf("16진수를 입력하세요 : ");
gets(hexa2);
if(ErrorCheck(hexa2, 16) == 0)
{
printf("잘못입력하셨습니다..\n아무키나 누르면 다시 메뉴로 갑니다");
e = getche();
break;
}
fflush(stdin);
printf(" %s + %s = %s 입니다.\n",hexa,hexa2,sumhexa1(hexa, hexa2));
printf(" %s - %s = %s 입니다.\n",hexa,hexa2,sumhexa2(hexa, hexa2));
printf(" %s × %s = %s 입니다.\n",hexa,hexa2,sumhexa3(hexa, hexa2));
printf(" %s ÷ %s = %s 입니다.\n",hexa,hexa2,sumhexa4(hexa, hexa2));
break;
case 13:
printf("13번을 선택하셨습니다.\n");
printf("10진수로 바꿀 2진수를 입력하세요:");
gets(strB);
if(ErrorCheck(strB, 2) == 0)
{
printf("잘못입력하셨습니다..\n아무키나 누르면 다시 메뉴로 갑니다");
e = getche();
break;
}
fflush(stdin);
printf("10진수의 값은 %d 입니다. \n",btod(strB));
break;
case 14:
printf("14번을 선택하셨습니다.\n");
printf("16진수로 바꿀 2진수를 입력하세요:");
gets(strB);
if(ErrorCheck(strB, 2) == 0)
{
printf("잘못입력하셨습니다..\n아무키나 누르면 다시 메뉴로 갑니다");
e = getche();
break;
}
fflush(stdin);
printf("16진수의 값은 %s 입니다. \n",btoh(strB));
break;
case 15:
printf("12번을 선택하셨습니다.\n");
printf("2진수를 입력하세요 : ");
gets(hexa);
if(ErrorCheck(hexa, 2) == 0)
{
printf("잘못입력하셨습니다..\n아무키나 누르면 다시 메뉴로 갑니다");
e = getche();
break;
}
fflush(stdin);
printf("2진수를 입력하세요 : ");
gets(hexa2);
if(ErrorCheck(hexa2, 2) == 0)
{
printf("잘못입력하셨습니다..\n아무키나 누르면 다시 메뉴로 갑니다");
e = getche();
break;
}
fflush(stdin);
printf(" %s + %s = %s 입니다.\n",hexa,hexa2,sumbin1(hexa, hexa2));
printf(" %s - %s = %s 입니다.\n",hexa,hexa2,sumbin2(hexa, hexa2));
printf(" %s × %s = %s 입니다.\n",hexa,hexa2,sumbin3(hexa, hexa2));
printf(" %s ÷ %s = %s 입니다.\n",hexa,hexa2,sumbin4(hexa, hexa2));
break;
case 16:
printf("16번을 선택하셨습니다.\n");
printf("오른쪽으로 쉬프트시킬려면 1, 왼쪽으로 쉬프트시킬려면 2를 누르세요:");
scanf("%d",&p);
fflush(stdin);
switch(p)
{
case 1:
printf( "1번을 선택하셨습니다.\n");
printf( "정수를 입력하세요: " );
scanf( "%d", &x );
fflush(stdin);
printf( "쉬프트시킬 칸수를 입력하세요 : " );
scanf( "%d", &n );
fflush(stdin);
result = bit_move1( x , n );
printf( "입력한 %d 값이 %d 만큼 오른쪽으로 쉬프트되어 %d의 결과값이 나왔습니다.\n", x, n, result );
break;
case 2:
printf( "2번을 선택하셨습니다.\n ");
printf( "정수를 입력하세요: " );
scanf( "%d", &x );
fflush(stdin);
printf( "쉬프트시킬 칸수를 입력하세요 : " );
scanf( "%d", &n );
fflush(stdin);
result = bit_move2( x , n );
printf( "입력한 %d 값이 %d 만큼 왼쪽으로 쉬프트되어 %d의 결과값이 나왔습니다.\n", x, n, result );
break;
}
break;
case 17:
printf("17번을 선택하셨습니다.\n");
printf("점수 10개를 입력하세요.\n");
for(num = 0; num < 10; num++)
{
printf("%d번째 점수입력=>",num+1);
scanf("%f", &jumsu[num]);
fflush(stdin);
}
sum = ssum(jumsu);
printf("합계는 %f 입니다.\n",sum);
avg = aavg(sum);
printf("평균은 %f 입니다.\n",avg);
dis = ddis(jumsu);
printf("분산은 %f 입니다.\n",dis);
dev = ddev(dis);
printf("표준편차는 %f 입니다.\n",dev);
break;
case 18:
printf("18번을 선택하셨습니다.\n");
printf("종료합니다.\n ");
exit(0);
default:
printf("번호선택이 잘못되었습니다.\n");
break;
}
return main();
}
-----------예전에 만들어논거 올립니다..;;-----
글수정 | 글삭제
http://codesarang.com. mail to cpueblo cpueblo.com
|
|