C语言 自定义 浮点数的输入函数 inputDouble()

来源:互联网 发布:中国2016 m2最新数据 编辑:程序博客网 时间:2024/05/21 00:55

C语言中我们读入变量的值都是用scanf()函数来实现的.我今天自定义一个函数来实现读入一个浮点数的功能。

思路是先用递归来读入每个字符,并记录递归的次数,也就是读入的字符数目,到读入回车符的时候,递归条件不满足。这时候生成一个在内存中开辟一个动态的一维数组。

然后再逆序的想动态数组中放入读入的字符,以抵消递归返回的逆序。逆序的逆序就是顺序了。这样跟按顺序读入的字符是一样的.

之所以用递归来实现,是因为我实现不知道输入的字符长度是多少。使用递归,我只要统计递归调用了多少次我就知道了输入的字符的长度了。这样就知道要开辟多少的内存空间。

使用递归函数inputString()来按顺序读入字符。

然后再使用函数inputDouble()来处理遍历处理inputString()函数返回的一维数组。

每次取出一个字符,使用isNumber()函数来判断这个字符是不是数字,或者是小数点。

如果还没有读到小数点,那么认为现在读的是浮点数的整数部分。只要把读入的每个数组累加乘以10然后累加到浮点数变量doubleNum中就可以了。

如果读到小数点,就跳过这个小数点,并且这时候就认为下一个是输入浮点数的小数部分了。

接着读下一个字符,也就是小数点的第一位:这一位的值是 数字部分乘以0.1,计算这一位的数值(数字位*0.1),然后累加到浮点数变量doubleNum中就可以了。

接着读小数点后的第二位:数字位*0.01 然后累加

知道读到动态一维数组的结束符‘\0’就结束返回doubleNum

变量doubleNum中的值就是你输入的浮点数。

/*自己实现读入浮点数的函数*/#include<stdio.h>#include<stdlib.h>#include<math.h>char* inputString();double inputDouble();int isNumber(char *p);int main(){    printf("输入一个浮点数:");    double doubleNum=inputDouble();    printf("%lf\n",doubleNum);    return 0;}double inputDouble(){    char *p=inputString();    double doubleNum=0;//    printf("doubleNum=%lf\n",doubleNum);    int i=0;    int flag=0;    int j=0;    while(*p!='\0')    {//        printf("%c",*p);        if(isNumber(p))        {            if(flag==0)            {                if(*p!='.')                {                    doubleNum=doubleNum*10+(((int)*p)-48);                    i++;                }                else if(*p=='.')                {                    i++;                    flag=1;                }            }            else            {                j--;                double num=pow(10,j);        //        printf("%lf\n",num);                doubleNum+=((int)*p-48)*num;            }        }        else            break;        p++;    }    free(p);    return doubleNum;}//判断输入的是不是数字或者是小数点int isNumber(char *p){    return ((*p>='0')&&(*p<='9'))||(*p=='.');}char* inputString(){    char c;//缓冲字符    scanf("%c",&c);    static int flag=0;    static int count=0;    static char* array;    if(c!='\n')    {        flag=1;        count++;        inputString();//        printf("%c",c);        count--;        *(array+count-1)=c;//写入数字    }    else if(c=='\n')    {        count++;        array=(char*)malloc(sizeof(char)*count);        *(array+count-1)='\0';//逆序写入字符,因为递归返回是逆序的,逆序写入之后,逆序的逆序就是顺序的了    }//    printf("count=%d\n",count);    if(count==1&&flag>0)    {//        printf("返回------\n");        return array;    }}
测试:

输入一个浮点数:123.456123.456000Process returned 0 (0x0)   execution time : 3.876 sPress any key to continue.

测试2:

输入一个浮点数:1.234561.234560Process returned 0 (0x0)   execution time : 5.538 sPress any key to continue.
测试3:输入错误的字符:全部输入字母

输入一个浮点数:aaaaa.aaaa0.000000Process returned 0 (0x0)   execution time : 6.003 sPress any key to continue.
测试4:输入错误的字符:数字和字母混合输入

输入一个浮点数:12.aaaa12.000000Process returned 0 (0x0)   execution time : 7.950 sPress any key to continue.

总结:

这个小函数加深了我对递归了理解,加深了对动态内存空间的理解。

现在来打包成头文件:MyInput.h。头文件里面只要把main函数去掉就行了。

/**自己实现浮点数的输入函数MyInput.h*/#include<stdio.h>#include<stdlib.h>#include<math.h>char* inputString();double inputDouble();int isNumber(char *p);//int main()//{//    printf("输入一个浮点数:");//    double doubleNum=inputDouble();//    printf("%lf\n",doubleNum);//    return 0;//}double inputDouble(){    char *p=inputString();    double doubleNum=0;//    printf("doubleNum=%lf\n",doubleNum);    int i=0;    int flag=0;    int j=0;    while(*p!='\0')    {//        printf("%c",*p);        if(isNumber(p))        {            if(flag==0)            {                if(*p!='.')                {                    doubleNum=doubleNum*10+(((int)*p)-48);                    i++;                }                else if(*p=='.')                {                    i++;                    flag=1;                }            }            else            {                j--;                double num=pow(10,j);        //        printf("%lf\n",num);                doubleNum+=((int)*p-48)*num;            }        }        else            break;        p++;    }    free(p);    return doubleNum;}//判断输入的是不是数字或者是小数点int isNumber(char *p){    return ((*p>='0')&&(*p<='9'))||(*p=='.');}char* inputString(){    char c;//缓冲字符    scanf("%c",&c);    static int flag=0;    static int count=0;    static char* array;    if(c!='\n')    {        flag=1;        count++;        inputString();//        printf("%c",c);        count--;        *(array+count-1)=c;//写入数字    }    else if(c=='\n')    {        count++;        array=(char*)malloc(sizeof(char)*count);        *(array+count-1)='\0';//逆序写入字符,因为递归返回是逆序的,逆序写入之后,逆序的逆序就是顺序的了    }//    printf("count=%d\n",count);    if(count==1&&flag>0)    {//        printf("返回------\n");        return array;    }}
测试:

新建测试文件:testMyInput_h.c

/**testMyInput_h.c*/#include<stdio.h>#include "MyInput.h"int main(){    printf("自定义的浮点数输入函数------\n");    printf("输入一个浮点数:");    double myInput=inputDouble();    printf("%lf",myInput);    return 0;}
运行结果:

自定义的浮点数输入函数------输入一个浮点数:123.456788123.456788Process returned 0 (0x0)   execution time : 4.776 sPress any key to continue.