鱼C论坛

 找回密码
 立即注册
查看: 1214|回复: 10

[已解决]关于文件读取和定义函数的改进问题

[复制链接]
发表于 2019-9-19 08:15:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我们老师让我们读取文件中的整形数据,然后分别输出这些数据的数目(Elements),最大值(Max),最小值(Min),平均值(Mean)以及方差(Var)。
1.我的程序有个问题就是老师要求输出的是double,但是我强制输出double了还是输出的是整形,请问各位大神如何改呢?

2.老师给的例子是5个数据,但是我想知道如果我未知文件中的整形数据是多少,我改如何在读取文件的时候就知道文件中整形数据的个数呢?我就怕交作业的时候老师的数据是大于5个,所以大神门可以帮我改一下程序吗?谢谢呢!

3.我不会利用定义函数的方式来实现最大值,最小值以及平均值,方差的求取,请问大神们可以给我举例一下利用定义函数的方式来求取这些数据吗?
#include <iostream>
#include <fstream>
#include <cmath>

using namespace std;
template<class v>
double length(v& array){
    return(sizeof(array)/ sizeof(array[0]));
}
int main() {

    double x[5];
    double Max=0,Min=0,Mean=0,Var=0,sum1=0;
    ifstream infile;
    infile.open("../3D.txt");
    if(!infile){
        cout<<"fail to open the file!"<<"\n";
        return 0;
    }
    else{
        for(int i=0; i<100; i++){
            infile >>x[i];
        }
    }
    cout<<"Elements = "<<double(length(x))<<endl;
    for(int i = 1; i<5; i++){
        Max=x[0];
        if(Max < x[i]){
            Max= x[i];
        }
    }
    cout<<"Max = "<<double(Max)<<"\n";
    for(int i=1; i<5; i++){
        Min = x[0];
        if(Min > x[i]){
            Min = x[i];
        }
    }
    cout<<"Min = "<<double(Min)<<"\n";
    for(int i =0; i<5; i++){
        sum1+=x[i];
    }
    Mean = sum1/5.0;
    cout<<"Mean = "<<double(Mean)<<"\n";
    for(int i = 0; i<5; i++){
        Var+=pow((x[i] - Mean),2)/5.0;

    }
    cout<<"Var = "<<double(Var)<<"\n";
    infile.close();
    cout<<endl;
    return 0;
}
最佳答案
2019-9-19 21:03:42
本帖最后由 superbe 于 2019-9-20 12:45 编辑
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
#include <iomanip>
using namespace std;

double getMax(vector<double>&);    //下面四行是函数声明
double getMin(vector<double>&);
double getMean(vector<double>&);
double getVar(vector<double>&);

int main() {

        vector<double> vect;    //定义一个向量vect,用来存储从文件读入的数据
        double Max,Min,Mean,Var;
        size_t Elements;
        ifstream infile;
        infile.open("3B.dat");
        if(!infile){
                cout<<"fail to open the file!"<<"\n";
                return -1;
        }
        double num;
        while(!infile.eof()){    //从文件读入数据到vect
                infile>>num;
                if(infile.fail()) break;
                vect.push_back(num);
        }
        Elements=vect.size();    //调用向量的size()函数得到数据数量
        Max=getMax(vect);    //调用getMax()函数得到最大值
        Min=getMin(vect);    //调用getMin()函数得到最小值
        Mean=getMean(vect);    //调用getMean()函数得到平均值
        Var=getVar(vect);    //调用getVar()函数得到方差

        cout<<"Elements = "<<Elements<<endl;
        cout<<"Max = "<<fixed<<setprecision(1)<<Max<<endl;
        cout<<"Min = "<<Min<<endl;
        cout<<"Mean = "<<Mean<<endl;
        cout<<"Var = "<<Var<<endl;

        infile.close();

        return 0;
}

/* 计算最大值的函数 */
double getMax(vector<double>& v){
        double max=v[0];
        for(size_t i=1;i<v.size();i++){
                if(v[i]>max) max=v[i];
        }
        return max;
}

/* 计算最小值的函数 */
double getMin(vector<double>& v){
        double min=v[0];
        for(size_t i=1;i<v.size();i++){
                if(v[i]<min) min=v[i];
        }
        return min;
}

/* 计算平均值的函数 */
double getMean(vector<double>& v){
        double sum=0,mean;
        for(size_t i=0;i<v.size();i++){
                sum+=v[i];
        }
        mean=sum/v.size();
        return mean;
}

/* 计算方差的函数 */
double getVar(vector<double>& v){
        double mean,sum=0,var;
        mean=getMean(v);  //平均值
        for(size_t i=0;i<v.size();i++){
                sum+=pow((v[i]-mean),2);    //计算sum(x[i]-mean)^2
        }
        var=sum/v.size();    //计算方差
        return var;
}
vector2.png

这是老师的要求,input是老师的示范输入,但是比我不知道万一老师测试作业的输入数据大于5怎么办

这是老师的要求,input是老师的示范输入,但是比我不知道万一老师测试作业的输入数据大于5怎么办
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-19 14:51:57 | 显示全部楼层
本帖最后由 superbe 于 2019-9-20 12:45 编辑
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
using namespace std;

void calculate(vector<double>&,double&,double&,double&,double&);  //函数声明

int main() {

    vector<double> vect;        //定义一个向量vect,用于存储从文件读入的数据
    double Max,Min,Mean,Var;
    size_t Elements;
    ifstream infile;
    infile.open("3B.dat");
    if(!infile){
        cout<<"fail to open the file!"<<endl;
        return -1;
    }
    double num;
    while(!infile.eof()){    //从文件中读数据到vect
        infile>>num;
        if(infile.fail())        break;
        vect.push_back(num);
    }
    Elements=vect.size();    //得到数据的数量
    calculate(vect,Max,Min,Mean,Var);    //调用函数计算最大值、最小值、均值、方差
    cout<<"Elements = "<<Elements<<endl;
    cout<<"Max = "<<fixed<<Max<<endl;
    cout<<"Min = "<<Min<<endl;
    cout<<"Mean = "<<Mean<<endl;
    cout<<"Var = "<<Var<<endl;

    infile.close();
    cout<<endl;

    return 0;
}

/* 计算最大值、最小值、均值、方差的函数 */
void calculate(vector<double>& v,double& max,double& min,
               double& mean,double& var){
    double sum=0,s=0;    //sum是数据总和,s是sum(v[i]-mean)^2,计算方差时用到了s
    max=v[0];    //最大值
    min=v[0];    //最小值
    for(size_t i=0;i<v.size();i++){
        if(v[i]>max)    //比较修改最大值
            max=v[i];
        else if(v[i]<min)    //比较修改最小值
            min=v[i];
        sum+=v[i];
    }
    mean=sum/v.size();    //计算平均值
    for(size_t i=0;i<v.size();i++){
        s+=pow((v[i]-mean),2);    //计算sum(v[i]-mean)^2
    }
    var=s/v.size();    //计算方差
}
vector.png
看截图老师是要求读取文件中的double数据啊,不是整型数据?
我是在一个函数里计算四个值的,分开成四个函数每个返回一个值也可以。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-19 20:47:51 | 显示全部楼层
superbe 发表于 2019-9-19 14:51
看截图老师是要求读取文件中的double数据啊,不是整型数据?
我是在一个函数里计算四个值的,分开成四 ...

读取的是未知数目的double形,输出保留到小数点后一位。
请问你可以分别定义一下那4个函数的吗,我不知道为啥我就是不会通过定义函数来做这题。。老师也没说过定义函数。。。。谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-19 21:03:42 | 显示全部楼层    本楼为最佳答案   
本帖最后由 superbe 于 2019-9-20 12:45 编辑
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
#include <iomanip>
using namespace std;

double getMax(vector<double>&);    //下面四行是函数声明
double getMin(vector<double>&);
double getMean(vector<double>&);
double getVar(vector<double>&);

int main() {

        vector<double> vect;    //定义一个向量vect,用来存储从文件读入的数据
        double Max,Min,Mean,Var;
        size_t Elements;
        ifstream infile;
        infile.open("3B.dat");
        if(!infile){
                cout<<"fail to open the file!"<<"\n";
                return -1;
        }
        double num;
        while(!infile.eof()){    //从文件读入数据到vect
                infile>>num;
                if(infile.fail()) break;
                vect.push_back(num);
        }
        Elements=vect.size();    //调用向量的size()函数得到数据数量
        Max=getMax(vect);    //调用getMax()函数得到最大值
        Min=getMin(vect);    //调用getMin()函数得到最小值
        Mean=getMean(vect);    //调用getMean()函数得到平均值
        Var=getVar(vect);    //调用getVar()函数得到方差

        cout<<"Elements = "<<Elements<<endl;
        cout<<"Max = "<<fixed<<setprecision(1)<<Max<<endl;
        cout<<"Min = "<<Min<<endl;
        cout<<"Mean = "<<Mean<<endl;
        cout<<"Var = "<<Var<<endl;

        infile.close();

        return 0;
}

/* 计算最大值的函数 */
double getMax(vector<double>& v){
        double max=v[0];
        for(size_t i=1;i<v.size();i++){
                if(v[i]>max) max=v[i];
        }
        return max;
}

/* 计算最小值的函数 */
double getMin(vector<double>& v){
        double min=v[0];
        for(size_t i=1;i<v.size();i++){
                if(v[i]<min) min=v[i];
        }
        return min;
}

/* 计算平均值的函数 */
double getMean(vector<double>& v){
        double sum=0,mean;
        for(size_t i=0;i<v.size();i++){
                sum+=v[i];
        }
        mean=sum/v.size();
        return mean;
}

/* 计算方差的函数 */
double getVar(vector<double>& v){
        double mean,sum=0,var;
        mean=getMean(v);  //平均值
        for(size_t i=0;i<v.size();i++){
                sum+=pow((v[i]-mean),2);    //计算sum(x[i]-mean)^2
        }
        var=sum/v.size();    //计算方差
        return var;
}
vector2.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-19 22:52:01 | 显示全部楼层

谢谢!!我去上课了回来我好好看看!谢谢你的帮助!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-20 00:48:48 | 显示全部楼层
本帖最后由 丶不离不弃 于 2019-9-20 00:53 编辑
丶不离不弃 发表于 2019-9-19 22:52
谢谢!!我去上课了回来我好好看看!谢谢你的帮助!


1.我想问一下,你开始声明了函数,在main函数中你把数值从num中存到vect向量中,然后调用的也是vect进行求值运算,但是在最后定义函数的时候你定义的函数是v,请问这个有冲突吗,会不会调用不了,因为变量不一样?还是定义的时候任意的定义符号都可以?

2.你开始读取文件的时候,定义的是double形的num,请问这样从文件中传入是不是只能传1个数据呢?我一般都是定义一个数组什么的来从文件中存入数据,我这里有点不明白。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-20 00:59:50 | 显示全部楼层
本帖最后由 丶不离不弃 于 2019-9-20 01:25 编辑


1.我想问一下,你开始声明了函数,在main函数中你把数值从num中存到vect向量中(28行),然后调用的也是vect进行求值运算(31行),但是在最后定义函数的时候你定义的函数是v(48行),请问这个有冲突吗,会不会调用不了,因为变量不一样?还是定义的时候任意的定义符号都可以?

2.你开始读取文件的时候,定义的是double形的num(26行),请问这样从文件中传入是不是只能传1个数据呢?也可以用double形的变量来存文件中的所有数据吗?我一般都是定义一个数组什么的来从文件中存入数据,我这里有点不明白。

3.你在36行输入数据的时候,输出的是大写的Max,Min。。。(37-40行)什么的,可是你在下面定义函数的时候,return的是小写的max,min。。。。(53行)请问在mian函数里输出的时候也可以正常输出吗?

4.就是Elements我给强制用double(Elenemts)输出了为啥结果还是5.0呢?

5.底下的定义函数,for循环的时候我size_t是什么,必须要加吗,可以直接用for(i=0;i<Elements; i ++)吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-20 13:39:46 | 显示全部楼层
本帖最后由 superbe 于 2019-9-20 13:43 编辑

1. vect是调用时使用的实际参数,v是函数定义时使用的形式参数,它们是否同名没关系。如果按值传递(函数形参前没有&),就是将实参的值复制到形参里,实际上它们是不同的两个变量,如果在函数里修改了形参,实参是不会变的。如果按引用传递(有&),那么它们实际上是同一个变量但有两个不同的名字,如果在函数里修改了形参,实际上修改了实参。

2. num确实是保存一个数据,但是在循环里,每次读一个新的数据给num,再把num保存到向量里,就相当于把所有数据都保存到数组里。向量就类似于一个数组,但向量长度是不固定的,可以随添加而增长,而数组定义时需要固定的大小。

3. 以这句为例吧,Max=getMax(vect); Max是接收函数返回值的,而return max表示将max的值返回,它们是否同名没关系。Max接收了值后,输出的是Max的值,不是max的值。

4. 我测试发现double输出时如果小数点后全0就被省略了,非全0就不会省。如果使用了fixed也不会省,cout<<fixed<<double(Elements)输出5.000000,使用setprecison指定小数位数,cout<<fixed<<setprecision(2)<<double(Elements)输出是5.00。

5. for(size_t i=1;i<v.size();i++)这里使用size_t是因为v.size()实际上返回的是size_t类型,如果使用int有的编译器就通不过。size_t是一种可移植性的无符号整型,能够表示比int更大的数。可移植性意思大概是根据不同的cpu位数、编译器、系统,size_t所占的字节数可能不同。Elements是由vect.size()得到的所以也应该用size_t类型,我已经修改了。

我回答得不准确,因为我也是理解得不深。你做个参考,帮助理解吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-25 10:11:29 | 显示全部楼层
superbe 发表于 2019-9-20 13:39
1. vect是调用时使用的实际参数,v是函数定义时使用的形式参数,它们是否同名没关系。如果按值传递(函数形 ...

我还想问一下,你的28行,vect.push_back(num)是什么意思呢,是将num中的数据全都放到vect中嘛?我查了一下百度,上面说”void push_back(const T& x):向量尾部增加一个元素X”这个是什么意思呢?为啥在是在尾部?那这样数据不就倒了吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-9-26 08:12:39 | 显示全部楼层
vect.push_back(num)是将一个数据放到vect中,通过过循环把所有数据放到vect中,每次循环给num一个新值再用push_back放到vect。
读的顺序和放的顺序都是从前往后,怎么会倒呢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-26 10:59:36 | 显示全部楼层
superbe 发表于 2019-9-26 08:12
vect.push_back(num)是将一个数据放到vect中,通过过循环把所有数据放到vect中,每次循环给num一个新值再用 ...

奥,对哦,我明白啦谢谢呢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-4 11:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表