| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 705 人关注过本帖
标题:如何实现把这些很相同的代码写成一个函数或者一个类?
只看楼主 加入收藏
校草
Rank: 1
等 级:新手上路
帖 子:50
专家分:7
注 册:2017-3-15
结帖率:75%
收藏
 问题点数:0 回复次数:2 
如何实现把这些很相同的代码写成一个函数或者一个类?
程序代码:
const int NYEAR_HIST = 3; //总共模拟几年,必须接CONST哟
        const int START_YEAR_HIST = 1990;//模拟起始年
        //
        //读温度的方法(原始数据是摄氏度)
        //************************************************************************************
        //确保数据格式如下:
        //   经度  纬度   起始年份  1990年1月数据   1990年2月数据 .........XX年11月数据    XX年12月数据
        //  -36.5   93   1990      12.4           -12.5 .................-12.6          23
        //   100   -92   1990      -12.1             0                    34            13
        double lon = gridlist.getobj().lon;
        double lat = gridlist.getobj().lat;
       


        FILE* in; double dlon, dlat, dyear;//从文件里读出来的数据****
                double dmtemp[12 * NYEAR_HIST];//从文件里读取月(温度)
        double mtemp[NYEAR_HIST][12];//给予赋值,在模型里计算的月(温度)
       

        //********************************
        //打开文件
        in = fopen(file_temp, "r");
        if (!in) fail("readenv: could not open %s for input", (char*)file_temp);

        //********************************
        //循环或许当前STAND的数据(温度!!!!)
        bool foundgrid;//找到了这个格子的数据
        foundgrid = false;//一开始是处于没有找到格子的状态

        while (!feof(in) && !foundgrid) {  //while(真)则继续循环,while(到文件尾 && 未找到)停止遍历

            // Read next record in file,下面的((36))要改!!!!!!!重要
           

            readfor(in, "f,f,i,36f", &dlon, &dlat, &dyear, dmtemp);//读取数据,其中36要改 36=12*模拟的年份,即NYEAR_HIST!!!
                                                             // f表示浮点数 i表示整数 36f表示有36个月就读36个数据
            if (equal(lon, dlon) && equal(lat, dlat) && equal((START_YEAR_HIST), dyear)) foundgrid = true;//等于ture时就停止遍历了
        }
        if (!foundgrid) fail("readenv: could not find record for (%g,%g) in %s",
            gridlist.getobj().lon, gridlist.getobj().lat, (char*)file_temp);//如果没找到格子的话if(!假)=if(真)就会执行这个语句,输出错误结果
        //*********************************
        //将提取的月数据赋值给要进行计算的数据
        int y, m;
        for (y = 0; y < NYEAR_HIST; y++) {
            for (m = 0; m < 12; m++) {
                mtemp[y][m] = dmtemp[y * 12 + m]; // now deg   mtemp[0][11]即起始年12月份的数据   mtemp[1][0]即第二年1月份数据
            }
        }

        fclose(in);//关闭打开的文件
        //*************************************************************************************
        //循环读取当前stand温度完毕




        //
        //读降雨的方法
        //************************************************************************************
        //确保数据格式如下:
        //   经度  纬度   起始年份  1990年1月数据   1990年2月数据 .........XX年11月数据    XX年12月数据
        //  -36.5   93   1990      124            125 ..................126           23
        //   100   -92   1990      121             0                    34            13
        double lon = gridlist.getobj().lon;
        double lat = gridlist.getobj().lat;


        FILE* in; double dlon, dlat, dyear;//从文件里读出来的数据****
        double dmprec[12 * NYEAR_HIST];//从文件里读取月(降水)
        double mprec[NYEAR_HIST][12];//给予赋值,在模型里计算的月(降水)

        //********************************
        //打开文件
        in = fopen(file_prec, "r");
        if (!in) fail("readenv: could not open %s for input", (char*)file_prec);

        //********************************
        //循环或许当前STAND的数据(温度!!!!)
        bool foundgrid;//找到了这个格子的数据
        foundgrid = false;//一开始是处于没有找到格子的状态

        while (!feof(in) && !foundgrid) {  //while(真)则继续循环,while(到文件尾 && 未找到)停止遍历

            // Read next record in file,下面的((36))要改!!!!!!!重要

            readfor(in, "f,f,i,36f", &dlon, &dlat, &dyear, dprec);//读取数据,其中36要改 36=12*模拟的年份,即NYEAR_HIST!!!
            // f表示浮点数 i表示整数 36f表示有36个月就读36个数据
            if (equal(lon, dlon) && equal(lat, dlat) && equal((START_YEAR_HIST), dyear)) foundgrid = true;//等于ture时就停止遍历了
        }
        if (!foundgrid) fail("readenv: could not find record for (%g,%g) in %s",
            gridlist.getobj().lon, gridlist.getobj().lat, (char*)file_prec);//如果没找到格子的话if(!假)=if(真)就会执行这个语句,输出错误结果
        //*********************************
        //将提取的月数据赋值给要进行计算的数据
        int y, m;
        for (y = 0; y < NYEAR_HIST; y++) {
            for (m = 0; m < 12; m++) {
                mprec[y][m] = dmprec[y * 12 + m]; // now mm   mtemp[0][11]即起始年12月份的数据   mtemp[1][0]即第二年1月份数据
               

                // Limit very low precip amounts because negligible precipitation causes problems

                // in the prdaily function (infinite loops).

                if (mprec[y][m] <= 1) mprec[y][m] = 0;
            }
        }

        fclose(in);//关闭打开的文件
        //*************************************************************************************
        //循环读取当前stand降雨完毕




        //
        //读光照百分比的方法
        //************************************************************************************
        //自己的方法!!!!!!!自己的方法!!!!!!!,其中readfor()中读月数据量需要根据实际数据修改
        //确保数据格式如下:
        //   经度  纬度   起始年份  1990年1月数据   1990年2月数据 .........XX年11月数据    XX年12月数据
        //  -36.5   93   1990      56            60 ..................80            23
        //   100   -92   1990      12            0                    34            13
        double lon = gridlist.getobj().lon;
        double lat = gridlist.getobj().lat;


        FILE* in; double dlon, dlat, dyear;//从文件里读出来的数据****
        double dmsun[12 * NYEAR_HIST];//从文件里读取月(光照)
        double msun[NYEAR_HIST][12];//给予赋值,在模型里计算的月(光照)

        //********************************
        //打开文件
        in = fopen(file_sun, "r");
        if (!in) fail("readenv: could not open %s for input", (char*)file_sun);

        //********************************
        //循环或许当前STAND的数据(光照!!!!)
        bool foundgrid;//找到了这个格子的数据
        foundgrid = false;//一开始是处于没有找到格子的状态

        while (!feof(in) && !foundgrid) {  //while(真)则继续循环,while(到文件尾 && 未找到)停止遍历

            // Read next record in file,下面的((36))要改!!!!!!!重要

            readfor(in, "f,f,i,36f", &dlon, &dlat, &dyear, dmsun);//读取数据,其中36要改 36=12*模拟的年份,即NYEAR_HIST!!!
            // f表示浮点数 i表示整数 36f表示有36个月就读36个数据
            if (equal(lon, dlon) && equal(lat, dlat) && equal((START_YEAR_HIST), dyear)) foundgrid = true;//等于ture时就停止遍历了
        }
        if (!foundgrid) fail("readenv: could not find record for (%g,%g) in %s",
            gridlist.getobj().lon, gridlist.getobj().lat, (char*)file_sun);//如果没找到格子的话if(!假)=if(真)就会执行这个语句,输出错误结果
        //*********************************
        //将提取的月数据赋值给要进行计算的数据
        int y, m;
        for (y = 0; y < NYEAR_HIST; y++) {
            for (m = 0; m < 12; m++) {
                msun[y][m] = dmsun[y * 12 + m] ; // % sun   mtemp[0][11]即起始年12月份的数据   mtemp[1][0]即第二年1月份数据
            }
        }

        fclose(in);//关闭打开的文件
        //*************************************************************************************
        //循环读取当前stand光照百分比完毕


如何实现把这些很相同的代码写成一个函数或者一个类?
另外问一下,定义的dlon,dlat等好多变量,都重新定义了好多遍,每次重新定义对跟在定义后的代码有什么影响吗?
搜索更多相关主题的帖子: 如何 
2017-03-22 22:09
校草
Rank: 1
等 级:新手上路
帖 子:50
专家分:7
注 册:2017-3-15
收藏
得分:0 
读取每一种参数(降雨,温度,光照百分比)都是差不多相同的思路,如何把他们都写成一个函数或者一个类呢?
2017-03-22 22:12
校草
Rank: 1
等 级:新手上路
帖 子:50
专家分:7
注 册:2017-3-15
收藏
得分:0 
另外还想问一下,对于一个100MB的txt文件使用fscan()遍历的速度快不快啊?
文件格式如下:
经度 纬度 起始年份 数据1 数据2 数据3 ............................数据 364 数据365
2017-03-22 22:20
快速回复:如何实现把这些很相同的代码写成一个函数或者一个类?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029299 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved