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.
- C语言 自定义 浮点数的输入函数 inputDouble()
- C语言 字符串的浮点数转换成浮点数
- C语言浮点数
- c语言浮点数
- C语言 浮点数
- C语言中用scanf输入双精度浮点数
- c语言 输入两个浮点数,输出它们中的大数
- C语言中浮点数的比较
- C语言浮点数的二进制表示
- c语言中浮点数的陷阱
- C语言中浮点数的运算
- 【C语言】得到浮点数的二进制
- C语言 有关浮点数的总结
- C语言:浮点数的存储
- 自己动手写C语言浮点数转换字符串函数
- C语言中fscanf函数读取double型浮点数的问题
- C语言中fscanf函数读取double型浮点数的问题
- C语言中的浮点数
- 活动——如何手动创建活动,布局,注册,并运行
- 判断是否安装指定jdk版本(python类似)
- C++中内联函数的写法
- MAC 下安装jpype
- Java 上传图片(非文本)
- C语言 自定义 浮点数的输入函数 inputDouble()
- 面向对象程序设计上机练习六(类和对象)
- python中通过xlwt、xlrd和xlutils操作xls
- [学习][poj3254]状压DP Corn Field
- ORA-01791: 不是 SELECTed 表达式(distinct使用注意点)
- 修改eclipse的默认编码方式
- linux安装jdk,tomcat,mysql
- 定义方法实现在控制台上打印n*n乘法表
- nodejs 用call和apply当中的继承