⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shuxu.txt

📁 [数据结构 C]二进制转换十进制(顺序表)。
💻 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 + -