邪恶八进制信息安全团队技术讨论组's Archiver

EvilOctal 2005-9-16 16:20

[转载]C语言描述进制转换器v1.0源代码

文章作者:PrOve

[code]/********************************************/
/*          进制转换器v1.0          */
/*        Designed by PrOve         */
/*           2005-6-25            */
/********************************************/

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<dos.h>

char str[40];/*str数组存要转换的数*/
int a,b;    /*a为该数的进制,b为要转换的进制*/
int n;     /*n为字符串长度*/
int num[40]; /*全局变量存储由字符串转化的数字*/
int temp[40];

/*----------------------界面----------------------*/
void win()
{
   int i;
   printf("\n");
   printf("\t\t********************************************\n");
   printf("\t\t*                            *\n");
   printf("\t\t*     DigitTransformTool v1.0        *\n");
   printf("\t\t*                            *\n");
   printf("\t\t*       Designed by PrOve          *\n");
   printf("\t\t*      Copyright 2005-6-25          *\n");
   printf("\t\t*                            *\n");
   printf("\t\t********************************************\n");
   for(i=1;i<=20;i++)
   {
      randomize();
      i=30+rand()%(100-20);
      sound(10*i);
      delay(3000);
      nosound();
   }
   printf("\n");
   input();
}
/*----------------------End-----------------------*/

/*-------------------输入函数---------------------*/
input()
{
   printf("Please input digit:");
   scanf("%s",str);
   printf("Please input the unit of this digit:");
   scanf("%d",&a);
   printf("Please input the unit you want to transform:");
   scanf("%d",&b);
}
/*---------------------End-------------------------*/

/*------------其他进制转化为10进制-----------------*/
long int ot_dec(int a[],int b)/*a数组为要转化的数,b为a的进制数*/
{
   int i,j=0;
   long int decimal=0;
   for(i=n-1;i>=0;i--)
   {
      decimal+=a[j]*pow(b,i);
      j++;
   }
   return decimal;
}
/*-------------------End--------------------------*/

/*-------------10进制转其他进制-------------------*/
void dec_ot(long a,long b) /*a为10进制数,b为要转化的进制*/
{
   long c;
   int i=0;
   do
   {
      c=a%b;
      temp[ i]=c;
      i++;
   }while((a/=b)!=0);
   for(i--;i>=0;i--)
   {
      if(b==16&&(temp[ i]>=10&&temp[ i]<=15))
        printf("%c",temp[ i]+55);
      else
        printf("%d",temp[ i]);
   }
   printf("\n");
}
/*---------------------End-------------------------*/

/*------------------错误输入的处理-----------------*/
int error_pro(char s[])
{
   int i;
   for(i=0;i<strlen(s);i++)
      if((s[ i]>=&#39;A&#39;&&s[ i]<=&#39;F&#39;)||(s[ i]>=&#39;0&#39;&&s[ i]<=&#39;9&#39;)||(s[ i]>=&#39;a&#39;||s[ i]<=&#39;f&#39;))
      {
        if(a==10&&(s[ i]<&#39;0&#39;||s[ i]>&#39;9&#39;))/*10进制数输入错*/
        {
           printf("Error!Input again!\n");
           input();
           return 1;
        }
        else if(a==8&&(s[ i]<&#39;0&#39;||s[ i]>&#39;7&#39;))/*8进制数输入错*/
        {
           printf("Error!Input again!\n");
           input();
           return 1;
        }
        else if(a==2&&(s[ i]!=&#39;0&#39;&&s[ i]!=&#39;1&#39;))/*2进制数输入错*/
        {
           printf("Error!Input again!\n");
           input();
           return 1;
        }
        else if((b!=2&&b!=8&&b!=10&&b!=16)||(a==b))
        {

           printf("Error!Input again!\n");
           input();
           return 1;
        }
      }
      else
      {

        printf("Error!Input again!\n");
        input();
        return 1;
      }
}
/*----------------------End------------------------*/

/*-----------------进制转换函数--------------------*/
void transform(char s[],int a,int b)
{
   int i,j,k;
   /*char c;*/
   long int two,eight,ten,sixteen;

   /*-------------错误处理--------------------*/
   while(!error_pro(str))
        input();
   /*---------------End-----------------------*/

   /*-------------字符转化为数字--------------*/
   for(i=0,n=strlen(s);i<strlen(s);i++)
   {
      if(s[ i]>=&#39;A&#39;&&s[ i]<=&#39;F&#39;)/*A~F的字母转化*/
        num[ i]=s[ i]-55;
      else if(s[ i]>=&#39;a&#39;&&s[ i]<=&#39;f&#39;)
        num[ i]=s[ i]-87;
      else            /*  数字的转化 */
        num[ i]=s[ i]-48;
   }
   /*------------------End--------------------*/

   /*----------------进制转换-----------------*/
      switch(a)
      {
        /*-------2进制数的转化-----------*/
        case 2:two=ot_dec(num,2);
        switch(b)
        {
           case 8 :dec_ot(two,8);break;
           case 10:dec_ot(two,10);break;
           case 16:dec_ot(two,16);break;
        }break;
        /*------------End----------------*/

        /*-------8进制数的转化-----------*/
        case 8:eight=ot_dec(num,8);
        switch(b)
        {
           case 2 :dec_ot(eight,2 );break;
           case 10:dec_ot(eight,10);break;
           case 16:dec_ot(eight,16);break;
        }break;
        /*------------End----------------*/

        /*-------10进制数的转化----------*/
        case 10:ten=ot_dec(num,10);
        switch(b)
        {
           case 2 :dec_ot(ten,2);break;
           case 8 :dec_ot(ten,8);break;
           case 16:dec_ot(ten,16);break;
        }break;
        /*------------End----------------*/

        /*-------16进制数的转化----------*/
        case 16:sixteen=ot_dec(num,16);
        switch(b)
        {
           case 2 :dec_ot(sixteen,2 );break;
           case 8 :dec_ot(sixteen,8 );break;
           case 10:dec_ot(sixteen,10);break;
        }break;
        /*------------End----------------*/
        default:printf("Input error!\n"); break;
      }
/*--------------------------End------------------------------*/
/*   printf("\nQuit or Not &#39;Y&#39;/&#39;N&#39; ?");
   c=getchar();
   getchar();
   if(c==&#39;n&#39;)
      transform(s,a,b);
   else if(c==&#39;y&#39;)
      exit(0);*/
}
/*--------------------------End------------------------------*/

/*----------------Main-------------*/
main()
{
   int c;
   win();
   transform(str,a,b);
   /*printf("\nQuit or Not &#39;Y&#39;/&#39;N&#39; ?");
   c=getchar();
   c=getchar();
   while(c==&#39;n&#39;)
      transform(str,a,b);*/
   getch();
}
/*----------------End-------------*/[/code]

页: [1]
© 1999-2008 EvilOctal Security Team