進数変換強化練習のc言語実現

11505 ワード

前に自分でいくつかc言語の知識を学んだことがあって、ちょうど進数の転換のそこで引っかかって、だから毕先生の言う進数の転換の知識を見て、とても感じがあって、ほほほ
理解してから、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 , , }