用c编写的进制转换

来源:互联网 发布:气gou配件淘宝交易 编辑:程序博客网 时间:2024/05/18 13:23

/*这个程序包含的功能有:1.任意字符转化二进制ASCII码,2.二进制,八进制,十进制,十六进制的相互转换,3转换结果会输出到D://result.txt中*/
/*这个程序是我上了数电课后有感而发所做的,由于水平问题做了很久而且还有很多的不足,但是基本能用:)*/
#define SIZE 1000  //定义所用数组大小
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<conio.h>

void ChangeChar(char *s);
void Save(int s,int a);
void ChangeNum(long int m);
long int Change_Num(char *n);
void ChangeDec(int k);

void main()
{
    int a=0;
   
    long int m;
    char s[SIZE];
 char useless[2];

    printf("请选择:/n");
    printf("1:char->ASCII 2:10->2 3:2->10 4:2-8 5:2->16 6:8->2 7:16->2 8:Esc/n");  //用户选择
 
 scanf("%d",&a);                    //输入选择
    printf("请输入要转换的数据:/n");  //提示输入
  switch(a)
  {
  case 1: gets(useless); //由于gets函数的定义问题,这个用来接收用户选择后的回车按键
       gets(s);       //这个用来接收输入的字符
                      //输出字符转ASCII码
                ChangeChar(s);
                break;
     case 2: scanf("%d",&m);         //输出十进制转二进制
                ChangeNum(m);
                break;
        case 3: scanf("%s",s);                   //以字符数组形式接收二进制数,然后输出二进制转十进制
                m=Change_Num(s);
                printf("%d",m);
    Save(m,1);         
    break;
        case 4: scanf("%s",s);          //以字符数组形式接收二进制数,输出二进制转八进制
                m=Change_Num(s);
                printf("%o",m);
    Save(m,a);
    break;
        case 5: scanf("%s",s);          //以字符数组形式接收二进制数,输出二进制转十六进制
                m=Change_Num(s);
                printf("%x",m);
    Save(m,a);
                break;
        case 6: scanf("%o",&m);     //输出八进制转二进制
                ChangeNum(m);
                break;
        case 7: scanf("%x",&m);         //输出十六进制转二进制
                ChangeNum(m);
                break;
        case 8:                //退出
                break;
        default: printf("You have enter the wrong key!/n");     //错误输入处理
                 break;
  }
 
}

void ChangeChar(char *s)
{
 int result[8]={0,0,0,0,0,0,0};  //定义一个接收转化单字后的二进制数
   int i,j,k;
 for(i=0;s[i]!='/0';i++)
 {
  for(j=7;j>=0;j--)  //逐位转化,把单字转化为相应的ASCII码
  {
   result[j]=s[i]%2;
   s[i]/=2;
  }
     for(k=0;k<8;k++)  //输出转化后的单字ASCII码
  {
   printf("%d",result[k]);
      Save(result[k],1);     //将ASCII码写到txt中
  }
  printf(" ");
 }
}

   

void ChangeNum(long int m)  //别的进制转二进制
{
 int i,a[SIZE];
 if(m!=0)
 {
  for(i=SIZE-1;m!=0&&i>=0;i--) //从低位到高位
  {
   a[i]=m%2;
      m/=2;
  }
     for(i+=1;i<SIZE;i++)
  {
      printf("%d",a[i]);
   Save(a[i],1);
  }
 }
 else
 {
  printf("%d",m);
  Save(m,1);
 }
}
 
long int Change_Num(char *n)  //二进制转十进制
{
 int i,k;
 long int j=0;
   
 k=strlen(n);  //计算输入二进制的长度
 
 for(i=0;k>0;k--,i++) 
 {
 
  j+=(n[k-1]-48)*pow(2,i);  //对字符进行演算化为1和0然后转化为十进制数
 }
 return(j);
}

void Save(int s,int a) //保存
{
 FILE *fpt;

 if((fpt=fopen("D://result.txt","at"))==NULL)  //检查能否以写追加的方式打开或建立文件
 {
  printf("不能打开文件,按任意键退出!/n");
  getch();
  exit(1);
 }
    if(a==4)
 {
  fprintf(fpt,"%o",s);  //八进制写入
 }
 else if(a==5)
 {
  fprintf(fpt,"%x",s);  //十六进制写入
 }
 else
 {
  fprintf(fpt,"%d",s);  //十进制写入
 }
    fclose(fpt);
}