是的,只有开始动手,才会发现自己有多菜。
请叫我小白菜~~~~
题目:
被要求每周六道题,好吧,今天的第一道是求数列和,1+1/2!+1/3!+...+1/n!
要求输入n, 输出表达式及和。
string、int、float间转换:
看上去简单,嗯,两个方法,两个循环,搞定。
结果一写,string和int , double之间的转换给忘了。
╮(╯_╰)╭,找到了两种。
第一种:
#include<sstream>
ostringstream os;
os<<i;
return i.str();
这种是利用sstream的string流转换。
第二种:
#include<stdio.h>
float f=1.23244;
char* ch=new char[1024];
sprintf(ch,"%f",f);
这种是利用c函数将float存入char数组中。
数组指针传递:
好了,转换搞定,开始写循环之类的,这些都是小菜~~问题又来了,函数规定为输入n和char * ,返回值为空,直接在函数里面修改char数组的值~~
void getResult(int input, char * result){
...
result = const_cast<char *>(str.c_str());
}
这样写,根本就不会改变主函数里面result数组的值,并且通过cout<<&result 的值,发现函数中和函数外的两个地址不一致!
好吧,换成 char ** result ,然后赋值的时候, *result = str.c_str(); 就可以改变其值了。
double精度:
最后一虐,double的精度问题。
从1-8的值都是正常的,到了9开始就发现所有的答案都一致,这肯定是有问题的。
然后跟踪,定位,发现是double的精度改变了。
起初的想法是,肯定是cout的问题~~~(太天真了,有木有)
所以我找到了如下方法,在控制台上打印出了正确的值。
#include<iomanip>
cout<<std::fixed;
cout<<setprecision(16)<<d<<endl;
但是,但是,函数里面的值还是没有变,double在传值的时候就已经损失了精度了。
所以,这里必须用sprintf函数来转换double。
由于double是8位的,所以正负16位,sprintf(chs,"%.16f",d);
空指针异常:
到了最后,发现老是异常退出,控制台返回的错误码是0xc00005,百度之后发现这个是空指针异常。
结果发现char * ch=new char[1024]; 是需要new 空间的,不然会报空指针。
总的cpp:
#include<iostream>
#include<string>
#include<sstream>
#include<iomanip>
#include<stdio.h>
using namespace std;
string itos(int i){
ostringstream os;
os<<i;
return os.str();
}
string dtos(double d){
ostringstream os;
os<<d;
cout<<"double : "<<d<<" string: "<<os.str()<<endl;
return os.str();
}
long fact(int n){
long sum;
sum=1;
for(int i=1;i<=n;i++){
sum*=i;
}
return sum;
}
void getResult(int input,char** result){
string str="";
double sum=0.0;
char* chs=new char[1024];
for(int i=1;i<=input;i++){
if(i==1){
str+="1";
}else{
str+="1/";
sprintf(chs,"%d",i);
str+=chs;
}
if(i==input){
str+="=";
}else{
str+="+";
}
double f=(double)fact(i);
cout<<"fact "<<f<<endl;
sum+=1.0/f;
cout<<" sum: "<<sum<<endl;
}
char *s=new char[1024];
sprintf(s,"%.16f",sum);
str+=s;
*result=const_cast<char *>(str.c_str());
}
int main(){
int input=10;
char * res=new char[1024];
res="";
getResult(input,&res);
cout<<"finally: "<<res<<endl;
delete []res;
cout<<"----------"<<endl;
}