C语言中多位数的输入问题研究

来源 :中国新通信 | 被引量 : 0次 | 上传用户:bach88888
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  【摘要】 C语言中的scanf( )函数输入数据位数,最多可达到15—19位十进制数,本文将讨论扩大scanf( )函数输入数据位数的方法。
  【关键词】 C语言 scanf( )函数 扩大输入数据位数
  在使用C语言中的scanf( )函数时,常遇到输入数据位数受限制的情况。这里调试工具选用cfree4.0/vc6.0,在输入十进制数时,如果输入变量是int16类型,可输入的数据范围在[-32768,+32767]之间,最多5位整数,变量是long / int32类型,输入数据范围在[-2G,+2G]之间,约±2×109之间,最多10位整数,变量是float类型,尽管输入数据范围在±3.4×1038之间,但由于精确度是7位有效数字限制,最多输入7位数是准确的,变量是double/long double类型,最多输入15--19位数是准确的,再想多输入几位,直接的scanf( )函数就做不到了。本文将探索研究扩大scanf( )输入位数的方法。
  一、扩大scanf( )输入位数的思路
  既然用scanf( )输入数值型数据达不到要求 ,我们就考虑把输入的数据作为字符串,先把输入的长串数据处理成字符串形式,每一位数以字符形式保存到一个字符型数组中,这样输入数据的宽度理论上就不受限制,只要用户设定的字符数组足够大即可。以二进制转十进制数为例,首先要输入一个N位二进制数,由于目前我们使用的计算机字长一般都在32位以上,所以每个机器数二进制数位数都不少于32位,本程序数组大小设置为128,意味着可以完成约128位二进制数的输入和转换问题。从形式上,输入位数增加了不少。
  二、字符型数据转换成数值型数据原理
  用上述方法输入的长数据串,我们可以把它当做任何进制数,这里我们把问题简单化,假设输入字符数据是二进制数,那么字符型数据转换成数值型数据原理是:每个字符在计算机中以ASCII码形式保存,例如字符串1010,是以‘49 48 49 48’形式保存,我们给每个ASCII码值减去48(0的ASCII码值),就得到‘1010’,接下来要完成的任务是编程序把这个二进制有符号数表示成十进制数。
  二进制整型正数转换为十进制数,直接采用“系数乘以权值再相加”法。我们把二进制的每一位作为系数,乘以该位所在的权值,再和其它每一位的系数与权值的积相累加,即Dn…D4D3D2D1D0= Dn×2n+ Dn-1×2n-1+…+ D2×22 + D1×21 + D0×20 就可得到相应的十进制结果。
  整型负数二进制数表示成十进制数,情况较复杂。由于计算机中参与加减运算的数据,通常都是补码,所以我们先假设该二进制码为补码,需要把该补码按位取反,之后最低位再自动加1,即得到该码相应的原码形式。二进制的原码形式几乎和十进制是一一对应的,这时也可以采用“系数乘以权值再相加”方法得到十进制结果。实际上这个结果仅仅是十进制数的绝对值形式,还需要用户修正符号,只我们要在其绝对值前加一个负号即可得到十进制数的正确答案。
  三、多位二进制有符号数表示成十进制数程序实现
  根据上述原理我们编写程序代码如下:
  #include "stdio.h"
  #include "stdlib.h"
  #include "math.h"
  int main( )
  { int j,n,flags=0; /* flags是正负数标志*/
  char str[128]; double sum=0;
  printf( “请输入一个二进制整数: “ );
  scanf( "%s",&str ); /*D0D1..Dn-1*/
  n=strlen(str); /*二进制数位数*/
  for( j=0;j<=n-1;j++ )
  {str[j]=str[j]-’0’; }
  if (str[0]==0) { flags=0;goto a1; }
  flags=1;/* flags=1负数flags=0正数*/
  for( j=0;j<=n-1;j++ )
  {str[j]=!(str[j]); } /* 补码按位取反*/
  str[n-1]=str[n-1]+1; /* 补码按位取反之后,末尾加1,得到原码*/
  for( j=n-1;j>=0;j-- )
  if (str[j]==2) { str[j]=0;
  str[j-1]=str[j-1]+1;; } /*末尾加1之后,所有位可能有进位,需要逐位修正*/
  a1:for( j=0;j<=n-1;j++ )
  sum=str[j]*pow( 2,n-1-j )+sum;
  if ( flags==1 )sum=-sum;
  printf(“\n转换成十进制数为:%.0f\n “,sum);}
  其中变量sum,还可以改成long double类型,这样程序可以处理的二进制位数会更多。
  四、综述
  利用上述方法,我们把C语言scanf( )函数输入数据的宽度增加了,问题得到解决,该方法省时省力,简捷高效,这一点对于C语言在大中小型机中的应用推广的意义非常重大。
  参 考 文 献
  [1] 谭浩强等编著 .C程序设计[M]. 北京:清华大学出版社,2005(2007重印)
  [2] 周维武等编著. 计算机基础教程(第3版)[M]. 北京:电子工业出版社,2008.
  [3] 李飞,廖琪梅,何鑫主编. 计算机应用新教程[M]. 西安:西安电子科技大学出版社,2004.
其他文献
该文从挂篮荷载计算、施工流程、支座及临时固结施工、挂篮安装及试验、合拢段施工、模板制作安装、钢筋安装、混凝土的浇筑及养生、测量监控等方面人手,介绍了S226海滨大桥
期刊
钛酸锂(Li4Ti5O12)具有“零应变”特性,嵌锂电位高,安全性好,充放电平台稳定,库仑效率高的特点.然而,钛酸锂导电性低,对其进行改性以改善电化学性能成为了近期的研究重点.本
本文详细介绍了γ射线测厚仪控制系统的基本工作原理及在精轧机自动控制系统中的接口应用与控制,同时对人机对话界面作了详细介绍.
该文从挂篮荷载计算、施工流程、支座及临时固结施工、挂篮安装及试验、合拢段施工、模板制作安装、钢筋安装、混凝土的浇筑及养生、测量监控等方面人手,介绍了S226海滨大桥
该文从挂篮荷载计算、施工流程、支座及临时固结施工、挂篮安装及试验、合拢段施工、模板制作安装、钢筋安装、混凝土的浇筑及养生、测量监控等方面人手,介绍了S226海滨大桥
期刊
【摘要】 世界科学技术的迅猛发展促进了交通方式的革命,上世纪日本、德国、台湾地区的高铁有了迅猛发展,为高铁的使用做出了典范。本世纪,高铁网络在我国大规模的建设起来,因此对高铁防灾监控提出了更高的要求。本文从高铁灾害防护系统总体功能设计的角度分析了防灾监控需要从哪些方面进行,在第二部分对高铁防灾监控的完善进行了分析,并就积极学习国外的先进经验进行了论述。  【关键词】 高铁 防灾监控 设计 完善  
该文从挂篮荷载计算、施工流程、支座及临时固结施工、挂篮安装及试验、合拢段施工、模板制作安装、钢筋安装、混凝土的浇筑及养生、测量监控等方面人手,介绍了S226海滨大桥
期刊
期刊
该文从挂篮荷载计算、施工流程、支座及临时固结施工、挂篮安装及试验、合拢段施工、模板制作安装、钢筋安装、混凝土的浇筑及养生、测量监控等方面人手,介绍了S226海滨大桥
期刊
目前,煤炭在我国是主要化石能源,当前新型的煤化工业以大型煤气化为龙头,生产洁净的能源以及可代替石油化工的产品等.很多企业采用催化合成和分离与生物化工等最前沿的技术,