c++实战操练----函数篇(2012-12-24)

本文探讨了指针形参与引用形参在不同场景下的优缺点,并通过实例展示了如何编写程序处理数组元素之和,同时介绍了如何利用命令行参数进行函数调用,以及在函数中使用静态局部变量实现特定功能。此外,文章还提供了内联函数的使用方法,以及编写函数使其在多次调用中按顺序产生正整数的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、指针形参 vs 引用形参 优缺点

当函数需要处理数组且函数体不依赖于数组的长度时,应使用指针形参;其他情况下应使用引用形参

指针形参的优点:可以明确地表示所操作的是指向数组元素的指针,而不是数组本身,而且可以使用任意长度的实参数组来调用函数;

                   缺点是函数体不能依赖于数组的长度,否则容易造成数组内存的越界访问,从而产生作物的结果或者导致程序崩溃。

引用形参的优点:在函数体中依赖数组的长度是安全的,其缺点是限制了可以传递的实参数组,只能使用长度匹配的实参数组来调用函数。

2、编写程序设计数组元素之和,要求编写函数三次,每次以不同的方式处理数组边界;

#include <iostream>

using namespace std;
int sum1(int* begin,int* end)//way1:传递指向数组第一个和最后一个的下一个位置的指针;
{
    int sum=0;
    while(begin!=end)
    {
        sum+=*begin++;
    }
    return sum;
}
int sum2(const int a[],size_t size)//way2:传递数组的大小
{
    int sum=0;
    for(size_t ix=0;ix!=size;ix++)
    {
        sum+=a[ix];
    }
    return sum;
}
int sum3(int* begin,size_t size) //way3:传递指向数组第一个元素的指针和数组的大小
{
    int sum=0;
    int *p=begin;
    while(p!=begin+size)
    {
        sum+=*p++;
    }
    return sum;
}
int main()
{
    int a[]={1,2,3,4};
    cout<<"sum1计算结果为:"<<sum1(a,a+4)<<endl;
    cout<<"sum2计算结果为:"<<sum2(a,4)<<endl;
    cout<<"sum3计算结果为:"<<sum3(a,4)<<endl;
    cout << "Hello world!" << endl;
    return 0;
}

3、编写程序求vector<double>中所有元素之和

#include <iostream>
#include <vector>
using namespace std;
//传递元素迭代器来处理元素
double vectorSum(vector<double>::iterator begin,vector<double>::iterator end)
{
    double sum=0.0;
    while(begin!=end){
        sum+=*begin++;
    }
    return sum;
}
int main()
{
    vector<double> dvec;
    //输入vector元素
    cout<<"请输入vector中double类型的元素,以ctrl+z结束"<<endl;
    double dval;
    while(cin>>dval)
        dvec.push_back(dval);
    //求元素之和并输出结果
    cout<<"vector<double>中元素的求和结果为:"<<vectorSum(dvec.begin(),dvec.end())<<endl;
    return 0;
}

4、编写一个主函数main,使用两个值作为他们的实参,并输出它们的和;

#include <iostream>
#include <stdlib.h>
using namespace std;
//第一个形参argc用于传递数组中字符串的个数;第二个形参argv是一个C风格字符串数组;
int main(int argc,char **argv)
{
    //检查命令行参数
    if(argc!=3){
        cout<<"you should use three arguments"<<endl;
        return -1;
        }
    //使用标准库函数atof将c风格字符串转换为double型数据
    cout<<"Summation of"<<argv[1]<<"and"<<argv[2]<<"is"<<(atof(argv[1])+atof(argv[2]))<<endl;
    return 0;
}

5、编写程序使之可以接受本节介绍的命令行选项,并输出传递给main的实参的值;

#include <iostream>
using namespace std;

int main(int argc,char **argv)
{
    cout<<"arguments passed to main():"<<endl;
    for(int i=0;i!=argc;++i)
        cout<<argv[i]<<endl;
    return 0;
}

6、函数什么时候返回引用,什么时候返回const引用;

返回指向在函数调用之前已存在的对象的引用是正确的

放不希望返回的对象被修改时,返回const引用是正确的

7、形参,局部变量,静态局部变量的差别;并给出一个有效使用了这三种变量的程序例子

本质上:三种都属于局部作用域中的变量,其中,局部变量又可区分为普通(非静态)局部变量和静态局部变量

差别在于:

(1)形参的作用域为整个函数体,而普通(非静态)局部变量和静态局部变量的作用域为:从定义处到包含该变量定义的块的结束处;

(2)形参由调用函数时所传递的实参初始化;而普通(非静态)局部变量和静态局部变量通常用初始化式进行初始化,且均在程序执行流程第一次经过该对象的定义语句时进行初始化。静态局部变量的初始化在整个程序执行过程中只进行一次;

(3)形参和普通(非静态)局部变量均属于自动变量,在每次调用函数时创建,并在函数结束时撤销;而静态局部变量的生命期却跨越了函数的多次调用,它在创建后直到程序结束时才撤销;

例子:

#include <iostream>

using namespace std;
//用于辅助求阶乘的函数
int fac(int x)     //x为形参
{
    /*result为静态局部变量(确保不迟于在程序执行流程第一次经过该对象的定义语句中进行初始化,这种对象一旦被创建,在程序结束前都不会被撤销。当定义静态局部对象的函数结束时,静态局部对象不会撤销。在函数被多次调用的过程中,静态局部对象会持续存在并保持它的值 )*/
    static int result=1;
    result*=x;
    return result;
}
int main()
{
    int upLmt ;    //upLmt为普通(非静态)局部变量
    cout<<"Enter value of upper limit:"<<endl;
    //依次输出[1.。。uplmt]只见所有整数的阶乘
    cin>>upLmt;
    for(int i=1;i<=upLmt;++i)
        cout<<i<<"!="<<fac(i)<<endl;
    return 0;
}


8、编写函数,使其第一次调用时返回0,然后再次调用时按顺序产生正整数(即返回其当前的调用次数)

#include <iostream>

using namespace std;
//用于辅助求阶乘的函数
size_t count_calls()
{
    static size_t ctr=-1;//ctr的生命期将跨越函数的多次调用、
    return ++ctr;
}
int main()
{
    for(size_t i=0;i!=10;++i)
    cout<<count_calls()<<endl;
    return 0;
}

9、内联函数避免函数调用时候的开销,将函数设置为内联函数,通常就是将它在程序中每个调用点上“内联地”展开;内联函数应该在头文件中定义;

内容概要:本文介绍了基于Python实现的SSA-GRU(麻雀搜索算法优化门控循环单元)时间序列预测项目。项目旨在通过结合SSA的全局搜索能力和GRU的时序信息处理能力,提升时间序列预测的精度和效率。文中详细描述了项目的背景、目标、挑战及解决方案,涵盖了从数据预处理到模型训练、优化及评估的全流程。SSA用于优化GRU的超参数,如隐藏层单元数、学习率等,以解决传统方法难以捕捉复杂非线性关系的问题。项目还提供了具体的代码示例,包括GRU模型的定义、训练和验证过程,以及SSA的种群初始化、迭代更新策略和适应度评估函数。; 适合人群:具备一定编程基础,特别是对时间序列预测和深度学习有一定了解的研究人员和技术开发者。; 使用场景及目标:①提高时间序列预测的精度和效率,适用于金融市场分析、气象预报、工业设备故障诊断等领域;②解决传统方法难以捕捉复杂非线性关系的问题;③通过自动化参数优化,减少人工干预,提升模型开发效率;④增强模型在不同数据集和未知环境中的泛化能力。; 阅读建议:由于项目涉及深度学习和智能优化算法的结合,建议读者在阅读过程中结合代码示例进行实践,理解SSA和GRU的工作原理及其在时间序列预测中的具体应用。同时,关注数据预处理、模型训练和优化的每个步骤,以确保对整个流程有全面的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值