📄 shuxu.txt
字号:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <errno.h>
#include <stddef.h>
#define INITSIZE 20 /* 顺序表初始空间分配量 */
#define INCREMENT 10 /* 顺序表空间分配增量 */
/* 清空输入缓冲 */
#define flush_stdin() { int c; while ( ( c = getchar() ) != '\n' && c != EOF ); }
typedef char ElemType; /* 定义ElemType代表的数据类型 */
typedef struct {
ElemType *elem; /* 存储空间基址 */
size_t length; /* 当前长度 */
size_t listsize; /* 当前空间分配量 */
int power; /* 存储乘方次数 */
char negflag; /* 正负标记 */
} Sqlist;
void InitList( Sqlist * ); /* 创建顺序表 */
short InputList(Sqlist *); /* 输入二进制数字 */
double cal(Sqlist *); /* 计算 */
int main( void )
{
Sqlist bin;
InitList( &bin );
for (;;) {
fputs( "Please input a binary number: ", stdout );
if ( InputList(&bin) ) {
if ( !bin.length ) { /* 用户没有输入,退出 */
break;
}
printf( "%g\n", cal(&bin) ); /* 输出计算结果 */
} else {
int c;
puts( "Invailid Input!" );
flush_stdin();
}
}
free( bin.elem ); /* 释放内存 */
puts( "Thanks for using our product!" );
return 0; /* 无误退出 */
}
void InitList( Sqlist *L ) /* 创建顺序表 */
{
L->elem = malloc( INITSIZE * sizeof *L->elem ); /* 分配空间 */
if ( !L->elem ) {
perror( "Error: malloc" );
exit( -1 );
}
L->listsize = INITSIZE;
}
short InputList(Sqlist *L) /* 输入二进制数字 */
{
char integer = 1, positive = 1; /* 整数标记,正数标记 */
char addend[2] = { 0, 1 };
ElemType *newbase;
L->power = -1;
L->length = 0;
L->negflag = 1;
while ( ( L->elem[L->length] = getchar() ) != '\n' ) {
if ( L->elem[L->length] < '0' || L->elem[L->length] > '1' ) { /* 输入合法性检查 */
if ( positive && L->elem[L->length] == '-') {
L->negflag = -1; /* 负数 */
positive = 0;
continue;
} else if ( integer && L->elem[L->length] == '.') { /* 小数 */
integer = 0;
continue;
} else { /* 如果输入的不是二进制数字 */
return 0;
}
}
positive = 0;
++(L->length);
if ( L->length == L->listsize ) { /* 如果输入数字等于listsize个,则重新分配空间 */
newbase = realloc( L->elem, (L->listsize + INCREMENT) * sizeof *L->elem );
if ( !newbase ) {
perror( "Error: malloc" );
free( L->elem );
exit( -1 );
}
L->elem = newbase;
L->listsize += INCREMENT;
}
L->power += addend[integer];
}
return 1;
}
double cal(Sqlist *L)
{
size_t index=0;
double dec=0;
while ( L->elem[index] != '\n' ) {
L->elem[index] -= '0';
dec += L->elem[index] * pow(2, L->power);
index++;
--(L->power);
}
return dec * L->negflag; /* 返回转换结果 */
}
本文版权归 蚂蚁的 C/C++ 标准编程 以及 作者 antigloss 共同所有
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -