📄 bin2dec1.c
字号:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define INITSIZE 20 //顺序表初始空间分配量
#define INCREMENT 5 //顺序表空间分配增量
short flag=1, flag2=0; //定义全局变量
typedef char ElemType; //定义ElemType代表的数据类型
typedef struct{
ElemType *elem; //存储空间基址
unsigned int length; //当前长度
unsigned int listsize; //当前空间分配量
int power; //存储乘方次数
}Sqlist;
short InitList(Sqlist *); //创建顺序表
short InputList(Sqlist *); //输入二进制数字
double cal(Sqlist *); //计算
int main()
{
Sqlist L;
if( InitList(&L) ){//如果创建顺序表失败,则退出
printf("Not Enough Memory!\n");
return 1;
}
if( InputList(&L)==1 ){//输入错误或者内存不足,退出
printf("Invailid Input Or Not Enough Memory!\n");
return 1;
}
printf("%g\n", cal(&L));//输出计算结果
free(L.elem);//释放内存
return 0;//无误退出
}
short InitList(Sqlist *L) //创建顺序表
{
L->elem=(ElemType *)malloc(INITSIZE*sizeof(ElemType));//分配空间
if(!L->elem)
return 1;//创建失败返回1
L->length=0;
L->listsize=INITSIZE;
return 0;//创建失败返回0
}
short InputList(Sqlist *L) //输入二进制数字
{
int i=0;
ElemType *newbase;
L->power=-1;
while( ( L->elem[i]=getchar() )!='\n' ){
if(L->elem[i] < '0' || L->elem[i] > '1'){//输入合法性检查
if( !i && L->elem[i]=='-' && flag==1){
flag=-1;//负数
continue;
}
else if(!flag2 && L->elem[i]=='.')//小数
flag2=1;
else
return 1;
}
L->length++;
if(L->length==L->listsize){//如果输入数字等于listsize个,则重新分配空间
newbase=(ElemType *)realloc(L->elem, (L->listsize+INCREMENT)*sizeof(ElemType) );
if(!newbase)
return 1;
L->elem=newbase;
L->listsize += INCREMENT;
}
i++;
if(!flag2)
L->power++;
}
return 0;
}
double cal(Sqlist *L)
{
unsigned int i=0;
double dec=0;
if(flag2){//整数转换
while(L->elem[i] != '.'){
L->elem[i] -= 48;
dec += L->elem[i] * pow(2, L->power);
i++;
L->power--;
}
L->power=-1;
i++;
}
while(L->elem[i] != '\n'){//小数转换
L->elem[i] -= 48;
dec += L->elem[i] * pow(2, L->power);
i++;
L->power--;
}
return flag*dec;//返回转换结果
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -