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

2016-04-12 09:06马红旭
中国新通信 2016年5期
关键词:C语言函数

马红旭

【摘要】 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.

猜你喜欢
C语言函数
“C语言程序设计”课程混合教学探索
基于C语言的计算机软件编程技术探究
中职计算机C语言教学的探讨与研究
中职C语言单片机课堂教学中的趣味性探讨
计算机原理中C语言的应用价值
关于函数的一些补充知识
高中数学中二次函数应用举隅オ
无独有偶 曲径通幽
函数与导数
函数部分(一)