/*
* FileName: bin2dec.c
* Author: Antigloss at http://stdcpp.cn
* LastModifiedDate: 2005-7-23 10:50
* Purpose: Translate binary number to decimal number
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <errno.h>
/* 清空输入缓冲 */
#define flush_stdin() { int c; while ( ( c = getchar() ) != '\n' && c != EOF ); }
typedef struct Link {
char bit;
struct Link *next; /* 链表指针 */
} Link; /* 定义链表结构 */
Link* bit_list( int *, char * ); /* 输入二进制 */
double bin_to_dec( Link *, int ); /* 二进制转换十进制 */
void destroy_list( Link * ); /* 释放空间 */
int main( void )
{
Link *bin; /* 定义链表指针 */
double dec=0;
int i; /* 用于转化成十进制的次数 */
char negflag; /* 正负标记 */
/* 不推荐使用 while(1),因为 while(1) 是有条件循环, */
/* 而 for(;;) 是无条件循环,因此,for(;;) 效率比 while(1) 高。*/
for (;;) {
fputs( "Please input a binary number: ", stdout );
bin = bit_list( &i, &negflag );
if ( !bin ) {
int c;
puts("Invalid input!");
flush_stdin();
continue;
} else if ( bin->bit == '\n' ) {
break; /* 用户没有输入,退出 */
}
/* 进行转换 */
dec = bin_to_dec( bin, i );
printf( "%g\n", dec * negflag ); /* 输出结果 */
/* 释放内存 */
destroy_list( bin );
}
destroy_list( bin );
puts( "Thanks for using our product!" );
return 0; /* 无误退出 */
}
/* begin of bit_list */
Link *bit_list( int *i, char *flag )
{
char integer = 1, positive = 1;
char addend[2] = { 0, 1 };
Link *head, *mid, *end;
/* 形成链表 */
head = mid = malloc( sizeof *head );
if ( !head ) { /* 若内存分配不成功,则退出 */
perror("Error: malloc");
exit(-1);
}
head->next = NULL; /* 初始化指针 */
/* 用户输入二进制数字 */
*i = -1;
*flag = 1;
while ( ( mid->bit = getchar() ) != '\n') { /* 按回车结束输入 */
if ( mid->bit < '0' || mid->bit > '1' ) { /* 输入合法性检查 */
if ( positive && mid->bit == '-' ) {
*flag = -1; /* 负数 */
positive = 0;
continue;
} else if ( integer && mid->bit == '.' ) { /* 小数 */
integer = 0;
continue;
} else { /* 如果输入的不是二进制数字 */
destroy_list( head );
return NULL; /* 用户输入的不是 q,返回 NULL */
}
}
positive = 0;
end = malloc( sizeof *head );
if ( !end ) { /* 若内存分配不成功,则退出 */
perror("Error: malloc");
destroy_list( head );
exit( -1 );
}
mid->next = end; /* 连接两块内存空间 */
mid = end;
mid->next = NULL;
(*i) += addend[integer];
}
return head;
} /* end of bit_list */
/* begin of bin_to_dec */
double bin_to_dec( Link *h, int i )
{
double dec = 0;
while ( h->bit != '\n' ) {
h->bit -= '0';
dec += h->bit * pow(2, i);
h = h->next;
i--;
}
return dec;
} /* end of bin_to_dec */
/* begin of destroy_list */
void destroy_list( Link *h )
{
Link *tmp;
while ( h ) {
tmp = h->next;
free( h );
h = tmp;
}
} /* end of destroy_list */
本文版权归 蚂蚁的 C/C++ 标准编程 以及 作者 antigloss 共同所有,转载请注明原作者和出处。谢谢。