第四章 过程抽象和返回值的函数笔记

1自顶向下设计

写程序之前要构思出程序的用途
将任务分为多个子任务,再讲每个子任务分解成更小的子任务,层层递进,这种设计方案就是自顶向下设计

2 预定义函数

C++提供了预定义函数库,可在自己的程序中使用这些现成的函数。

2.1 使用预定义函数

theRoot = sqrt(9.0);

以sqrt函数为例,sqrt函数获得了一个值9.0,并计算它的平方根
函数获取的值成为函数的实参,它计算后得到的值称为返回值
实参可以有多个,但是函数返回值最多一个
将函数视为程序的话,实参就是输入,返回值就是输出
表达式sqrt(9.0)称为函数调用,函数调用的实参可以是常量,如9.0,也可以是变量,甚至可以是一个复杂的表达式,函数调用本身就是表达式,可以像表达式一样被调用,只要返回值正确即可,例如以下

bonus = sqrt(9.0)/10;

2.2 强制类型转换

计算机语言是非常苛刻的,只会按照输入给出输出
9/2在C++里默认的是两个int类型的除法,结果是整型即为4
想要正常的话,相除两方至少一个是double类型,如9/2.0
C++中也提供预定义函数来转换数值的类型,如

static_cast<double>(9)

这就将9从int类型转换到了double类型

3自定义函数

自定义函数要么和main()部分一起放到同一个文件中,要么放到一个单独的文件中,使得函数能被几个不同的程序使用

//函数声明
double exm(int t1,int t2);
//主程序
int main()
{
    ......
}
//函数定义
double exm(int t1,int t2)
{
    ......
}

函数描述分为两个部分,即函数声明和定义
函数声明也称函数原型,描述了如何调用函数,包括了函数名称,函数需要的实参及类型
函数定义在最底部,函数定义描述了,这个函数如何计算返回值
函数可以返回布尔值
函数声明中可以不带形参名称,例如

void exm1(int t1,int t2);
void exm2(int , int );

以上两种是等价的,但是第二种只适合函数声明,函数定义处必须列出形参名称

4 过程抽象

我们不需要了解函数是怎么样运行的,我们只需要调用就行
下面是一段计算披萨性价比,或者说每平方英寸最低价格的程序

#include "stdafx.h"
#include <iostream>
using namespace std;

double avg(double dia,double price);
const double pai = 3.14;
int main()
{
    double dia1,dia2;
    double price1,price2;
    cout<<"请输入两个披萨的直径:"<<endl;
    cin>>dia1;
    cin>>dia2;
    cout<<"请输入两个披萨的价格:"<<endl;
    cin>>price1;
    cin>>price2;
    cout<<"第一个"<<avg(dia1/2,price1)<<endl;
    cout<<"第二个"<<avg(dia2/2,price2)<<endl;
    if (avg(dia1/2,price1)>avg(dia2/2,price2))
    {
        cout<<"直径为"<<dia2<<"的性价比高";
    }
    else{
        if (avg(dia1/2.0,price1)==avg(dia2/2.0,price2))
        {
            if (dia1>dia2)
            {
                cout<<"直径为"<<dia2<<"的性价比高";
            }else{
                cout<<"直径为"<<dia1<<"的性价比高";
            }
        }
        cout<<"直径为"<<dia1<<"的性价比高";
    }
    /*cout<<pai;*/
}

double avg(double dia,double price){
    double size = dia*dia*pai;
    double avg = price/size;
    return avg;
}

5 作用域和局部变量

在函数中定义的变量局部于该函数,或者说变量将函数作为作用域
如果某个函数是局部变量,既没有提到某个函数,也没有提到主程序main,那么默认就是函数的局部变量
全局命名常量,通常在程序比较靠前,所有函数主题之外,包括main函数

6 重载函数名称

函数的重载是指两个构造函数名字一样,仅有参数的类型和个数不同。只有返回类型不同是不足以构成重载的,仅有函数自带的默认参数不同也无法构成重载。
还是以披萨性价比为例

#include "stdafx.h"
#include <iostream>
using namespace std;

double avg(double dia,double price);
double avg(int l,int w,double price);
const double pai = 3.14;
int main()
{
    double dia1/*,dia2*/;
    double price1,price2;
    int len,wid;
    cout<<"请输入原形披萨的直径:"<<endl;
    cin>>dia1;
    //cin>>dia2;
    cout<<"请输入原形披萨的价格:"<<endl;
    cin>>price1;
    //cin>>price2;
    cout<<"请输入方形披萨的长和宽:"<<endl;
    cin>>len>>wid;
    cout<<"请输入方形披萨的价格:"<<endl;
    cin>>price2;
    cout<<"第一个"<<avg(dia1/2,price1)<<endl;
    cout<<"第二个"<<avg(len,wid,price2)<<endl;
    if (avg(dia1/2,price1)>avg(len,wid,price2))
    {
        cout<<"长宽为"<<len<<"   "<<wid<<"的性价比高";
    }
    else{
        cout<<"直径为"<<dia1<<"的性价比高";
    }
    /*cout<<pai;*/
}

double avg(double dia,double price){

    double size = dia*dia*pai;
    double avg = price/size;
    return avg;
}
double avg(int l,int w,double price){

    double size = l*w;
    double avg = price/size;
    return avg;
}

如上图,我们调用了个参数不同但名称相同的avg函数,这就是重载

double mpg(double miles,double gallons){
    return (miles/gallons);
}

cout<<mpg(45,2);

此时,函数要求的实参是double类型的,但是提供的是int类型的,所以函数会自动进行类型转换,最后输出为22.5

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值