進数変換強化練習のc言語実現
11505 ワード
前に自分でいくつかc言語の知識を学んだことがあって、ちょうど進数の転換のそこで引っかかって、だから毕先生の言う進数の転換の知識を見て、とても感じがあって、ほほほ
理解してから、C言語で書いてみたいと思って、多くの問題を発見して、コードの中に説明があります.コードのダウンロード
ファイルの説明:
思考と実現過程と存在する問題注釈には、対応するexeファイルのテスト効果を直接実行できることを詳細に説明しています.
進数変換c先生Javaチュートリアルの進数変換方法に倣って書いた
テスト結果:C言語には符号なし右シフトがないので、この方法で負の数を直接変換することはできません.負の数を入力と問題が発生します.実現方法を考え続けます.cファイルに負の変換が実現されました
進数変換update.c既に10進数から2、8、16進数への変換を実現することができる.cファイルでは他の進数から10進数への変換を実現
進数変換toInt.c熱いうちに鉄を打って2、8、16進数を10進数に変換するプログラムをもう一つ書きます
理解してから、C言語で書いてみたいと思って、多くの問題を発見して、コードの中に説明があります.コードのダウンロード
ファイルの説明:
思考と実現過程と存在する問題注釈には、対応するexeファイルのテスト効果を直接実行できることを詳細に説明しています.
進数変換c先生Javaチュートリアルの進数変換方法に倣って書いた
テスト結果:C言語には符号なし右シフトがないので、この方法で負の数を直接変換することはできません.負の数を入力と問題が発生します.実現方法を考え続けます.cファイルに負の変換が実現されました
/*
2012 11 21 9:19:25
Java
:
C ,
, ,
Update.c
*/
#include
void trans(int, int, int);
int main(void)
{
int num, base;
char ch;
while (1)
{
printf(" :");
scanf("%d", &num);
printf(" (2,8,16):");
scanf("%d", &base);
switch (base)
{
case 2: trans(num, 1, 1);
break;
case 8: trans(num, 7, 3);
break;
case 16:trans(num, 15, 4);
break;
default: printf("
");
}
printf(" “Y” “y”, :");
getchar();
ch = getchar();
if (ch=='Y' || ch=='y')
{
continue;
}
else
{
break;
}
}
return 0;
}
// , ,
void trans(int num, int base, int offset)
{
char chs[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
char arr[32] = { ' '};
int pos = 32-1, temp;
while (num!=0)
{
temp = num & base;
arr[pos--] = chs[temp];
num = num >> offset; //C
}
for (temp=pos; temp<32; temp++)
{
printf("%c ", arr[temp]);
}
}
進数変換update.c既に10進数から2、8、16進数への変換を実現することができる.cファイルでは他の進数から10進数への変換を実現
/*
2012 11 21 9:19:25
Java
C ,
2、8、16
toInt.c
*************************
2012 11 23 10:38:03
:
,
base , offset
, 1
( 1), 0 1
1 0 ( 16 ):C int
sizeof(int) = 4
1111-1111 1111-1111 1111-1111 1111-1111
toBin 0111-1111 1111-1111 1111-1111 1111-1111 0X 7-F F-F F-F F-F
toOct 0001-1111 1111-1111 1111-1111 1111-1111 0X 1-F F-F F-F F-F
toHex 0000-1111 1111-1111 1111-1111 1111-1111 0X 0-F F-F F-F F-F
sizeof(int) = 2
1111-1111 1111-1111
toBin 0111-1111 1111-1111 0X 7-F F-F
toOct 0001-1111 1111-1111 0X 1-F F-F
toHex 0000-1111 1111-1111 0X 0-F F-F
*/
// OK 2012 11 23 13:26:34
#include
void trans(int, int, int);
int main(void)
{
int num, nbase;
char ch;
while (1)
{
printf(" :");
scanf("%d", &num);
printf(" 2/8/16:");
scanf("%d", &nbase);
switch (nbase)
{
case 2: trans(num, 1, 1);
break;
case 8: trans(num, 7, 3);
break;
case 16:printf("0X"); trans(num, 15, 4);
break;
default: printf("
");
break;
}
printf(" “Y” “y”, :");
getchar();
ch = getchar();
if (ch=='Y' || ch=='y')
{
continue;
}
else
{
break;
}
}
return 0;
}
//
void trans(int num2, int base, int offset)
{
char chs[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
char arr[32] = { ' '};
int pos = 32-1, temp;
int val; // 0
int num = num2;
if (num2==0)
{
printf("0
");
return ;
}
while (num!=0)
{
if (num<0 && base!=1) // , , num
{ // num ,
// chs[pos--] = '-'; //
num = -1*num; // OK
}
temp = num & base;
arr[pos--] = chs[temp];
num = num >> offset;
//
if (num<0) // 1, , 0
{
int sizeInt = sizeof(int); // int
if (sizeInt==4)
{
val = 0x7fffffff;
}
else if (sizeInt==2)
{
val = 0x7fffffff>>16; //
}
num = num & val;
}
//
if (num2<0 && base!=1)
{
arr[pos] = '-';
}
}
//
for (temp=pos; temp<32; temp++)
{
printf("%c ", arr[temp]);
}
printf("
");
}
//
/*
// 0 ,
// int 4 , sizeof(int) ,2 16
int getVal(int base)
{
switch (base)
{
case 1: return 0X7FFFFFFF;
break;
case 7: return 0X1FFFFFFF;
break;
case 15: return 0X0FFFFFFF;
break;
default: printf(" ");
}
return 0;
}
//****
// long , 0, int
// ,VC int long 4
void trans2(int num, int base, int offset)
{
char chs[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
char arr[32] = { ' '};
int pos = 32-1, temp;
long l;
if (num==0)
{
printf("0
");
return ;
}
while (num!=0)
{
if (num<0 && base!=1) // ,
{
chs[pos--] = '-';
l = (long)num & 0xFFFFFFFF; // num long , 0
printf("%l
", l);
}
temp = l & base;
arr[pos--] = chs[temp];
l = l >> offset;
num = (int)l;
}
for (temp=pos; temp<32; temp++)
{
printf("%c ", arr[temp]);
}
printf("
");
}
*/
// ,
//********** ,8、16 , ,
/*
************ , :
:10
:8
1: temp= 10 & 7 = 2
2: num= 1 >> 3 = 1
temp=2 num=1
1: temp= 1 & 7 = 1
2: num= 0 >> 3 = 0
temp=1 num=0
:-10
:8
num《0
1: temp= -10 & 754974727 = 754974726
& 7 ???
10——12
-10——-12
-10 :
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0
& 1 1 1
--------------------------------------------------------------------
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
#############################################################
※
※ ,
※ 8、16 ,
※ 1 , ,
※ 8、16 , ,
※
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
#############################################################
*/
/*
void trans_ (int num, int base, int offset)
{
char chs[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
char arr[32] = { ' '};
int pos = 32-1, temp;
int val; // 0
if (num==0)
{
printf("0
");
return ;
}
while (num!=0)
{
if (num<0 && base!=1) // ,
{
chs[pos--] = '-';
printf(" num《0
");
}
temp = num & base;
printf("1: temp= %d & %d = %d
", num, base, temp);
arr[pos--] = chs[temp];
num = num >> offset;
printf("2: num= %d >> %d = %d
", num, offset, num);
printf(" temp=%d num=%d
", temp, num);
if (num<0) // 1, , 0
{
int sizeInt = sizeof(int); // int
printf(" 1,
");
if (sizeInt==4)
{
val = getVal(base);
}
else if (sizeInt==2)
{
val = getVal(base)>>16; //
}
num = num & val;
printf(" , 0 & 0X %X num=%d
", val, num);
}
}
for (temp=pos; temp<32; temp++)
{
printf("%c ", arr[temp]);
}
printf("
");
}
// , ,
void trans_old(int num, int base, int offset)
{
char chs[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
char arr[32] = { ' '};
int pos = 32-1, temp;
while (num!=0)
{
temp = num & base;
arr[pos--] = chs[temp];
num = num >> offset; //C
}
for (temp=pos; temp<32; temp++)
{
printf("%c ", arr[temp]);
}
}
*/
進数変換toInt.c熱いうちに鉄を打って2、8、16進数を10進数に変換するプログラムをもう一つ書きます
/*
2012 11 23 13:27:44
2、8、16 10
10 2、8、16 : update.c
,
:
C , ,
,
%s ,
, 1、11 ,
111 7 6, ,
, , Java,
:
,
,
ASCII
0 48
a 97
A 65
char[] arr
len=arr.length
for(i=len-1, x=1; i>=0; i--, x=x*base)
sum = sum + arr[i]*x;
↑---------------------↑
arr[i] ,sum arr[i]
if 0=
void trans(char[], int);
int main(void)
{
char arr[32] = {'\0'}; // 32'1','a','\0',
int base = 0;
char ch;
while (1)
{
printf(" :");
scanf("%s", arr);
getchar(); //
// //gets(arr);
/* //
for (base=0; base<32; base++)
{
ch=getchar();
if (ch!=' '&& ch!='
')
arr[base] = ch;
else
break;
getchar();
}
*/
printf(" :");
scanf("%d", &base); // base
getchar(); // &base base
// base=8;
// ??
printf(" %s %d
", arr, base);
/* 110
arr[0]='1';
arr[1]='1';
arr[2]='0';
base = 2;
*/
switch (base)
{
case 2: trans(arr, 2);
break;
case 8: trans(arr, 8);
break;
case 16: trans(arr, 16);
break;
default : printf("
");
return 0;
}
printf(" “Y” “y”, :");
ch = getchar();
if (ch=='Y' || ch=='y')
{
continue;
}
else
{
break;
}
}
return 0;
}
void trans(char * arr, int base)
{
int i, x, len = 0; //len
int sum = 0; //
for (i=0; arr[i]!='\0'; i++)
{
len++;
}
// printf("%s %d
", arr, len);
for (i=len-1, x=1; i>=0; i--, x=x+base-1)
{
if (arr[i]>='0' && arr[i]<='9')
{
arr[i] = arr[i] - '0';
}
else if (arr[i]>='a' && arr[i]<='z')
{
arr[i] = arr[i] - 87;
}
else if (arr[i]>='A' && arr[i]<='Z')
{
arr[i] = arr[i] - 55;
}
else
{
printf(" :%c
", arr[i]);
return ;
}
sum = sum + (arr[i]*x);
}
printf("%d :%s :%d
", base, arr, sum);
// %s ,
//Java C , ,
}