第七章 函数——C++的编程模块

写在前面:之前的内容,都是自己按照书上的内容和笔记敲上去的,发现费力不讨好。我还是太懒了,不愿意动脑子,学完一章后,脑子里是空白的,现在要加入自己的逻辑。作为入门级别的菜鸟,肯定有不少错误,希望大佬看到了能指出来。

函数基础知识

本帖内容包含了书本上第五、六、七三个章节的总结。

三种循环结构

  1. for循环
for (init; test; update )
	statement;
或者
{
	statements;
}

入口条件循环:进入循环语句前要先判断是否满足test的语句。

  1. while循环
    while循环是没有初始化和更新部分的for循环,只有测试条件和循环体,so也是入口条件循环
while(test}
	body

建议:在知道了循环次数时,使用for循环;而不知道循环次数,根据具体情况来确定是否停止,则使用while循环。
3. do…while…循环

出口条件循环:先执行循环体,再判定测试表达式。

两种分支语句

  1. if…else…
    知识点:?运算符——5 > 3 ? 10 : 12; 结果为10。若5改为2,结果为12.
  2. switch语句
switch( 整型表达式 )
{
	case labell : statement(s)
	case label2 : statement(s)
	...
	default : statement(s)
}

每个labelx必须是整数常量表达式。
程序跳到switch中特定代码行之后,将依次执行所有语句,除非有明确的其它指示。所以,要让程序执行完一组特定语句后,需要使用break语句。

break:跳出循环语句;continue:跳出此次循环剩下的语句,开始下一次循环。

正文

基本概念

创建函数的三个工作:定义、提高原型和调用函数。
定义函数

typename func_name(para_List)
{
	statements;
	return 0;		//typename  = viod时,此句可省。
}

也可以定义为:typename * 型函数,返回一个指针。
函数原型:在调用函数之前,需要提供函数原型。一般放在头文件之后,main()函数之前。

typename func_name(para_List);
注:C++对于返回值的类型限制:不能直接返回数组。(但可以通过其它方式,比如结构的组成部分)

函数参数和按值传递

函数的实参和形参。形参(parameter):用于接收传递值得变量(如x);实参(argument):传递给函数的值(如side)。

double cube(double x);
double volume = cube(side);

cube()被调用时,该函数将创建一个side的副本来使用,名为x。

函数和数组

在C++中,数组名为数组的地址,即数组第一个元素的地址。

将数组作为函数参数时的函数原型(举例):

int sum_arr(int arr[], int n);
————————————————————————————————————————————————————————————————
调用时:
value = sum_arr(cookies, 4);

数组名作为数组的首地址,因此正确的函数头是:

int sum_arr(int * arr, int n);
_________________________________________________________________
调用时:
value = sum_arr(cookies, 4);

于是(当且仅当用于函数头或者函数原型中)

int sum_arr(int arr[], int n);	=	int sum_arr(int * arr, int n);

const和指针

const和引用符号(“ * ”)的相互位置指明了固定的内容。

const只在引用符号的左侧——则固定的是 * pointer_name,即不能通过指针修改其指向的内容,但可以改变指针所指向的地方。如

int age = 30;
const int * pt = &age;

const只在引用符号的右侧——则固定的是 pointer_name,即不能修改指针指向的位置,但可以改变指针所指向的内容。如

int age = 30;
int *const pt = &age;

const同时在引用符号的左侧和右侧——则同时固定了 pointer_name和 * pointer_name。如:

int age = 30;
const int *const pt = &age;

指针和二维数组

*(arr + r) 等价于 arr[r]
*(arr + r) + c 等价于 arr[r] + c
*(*(arr + r) + c) 等价于 arr[r][c]

函数和结构

使用结构编程时,最直接的方式是像处理基本类型那样处理结构。但是按值传递结构时,如果结构本身非常大,会浪费较多内存,因此实际编程过程倾向于传递结构的地址
传递结构的地址时,需要修改三个地方:

  • 调用函数时,要将结构的地址(&structName)传递给函数;
  • 将形参声明为指向结构的指针(即structName *类型);
  • 应用间接运算符:-> 。
    其余应用还有:函数和C-风格字符串函数和string对象函数和array对象

递归函数

格式:

void recurs(argumentlist)
{
	statements1
	if(test)
		recurs(arguments)
	statements2
}

test最终将为false,调用链将断开。

函数指针

函数的地址是存储其机器语言代码的内存的开始地址。

声明指针:将(* pointer_name)代替function_name。

double pam(int);
double (*pf)(int);		
pf = pam;		// () 的优先级高于 * 优先级,因此必须在前面也加括号

double x = pam(4);
double y = (*pf)(5);	or  double y = pf(5);	//使用指针调用函数,C++中允许这两种调用方式
——————————————————————————————————————————————————————————
double *pf(int);		// pf() 是一个返回指针的函数

注意返回值类型为指针的函数。
声明包含多个函数指针的数组:const double *(*pa[3])(const double *, int ) = {f1, f2, f3};
说明:

  • const double * 说明该函数是一个返回值为指针的函数
  • [] 的优先级高于 *,因此(*pa[3])是一个包含三个指针的数组
  • 参数列表的完整表达式为(const double * ar, int n)
  • 因此,f_x的表达式为const double *f1(const double *ar, int n)
  • pa是一个指向包含三个指针的数组的指针
    调用:
按照上面程序,有:
const double *px = (*pa[0])(ar, n);  or const double *px = pa[0](ar, n);
获取返回指针指向的内容:
const double px = *(*pa[0])(ar, n);  or const double px = *pa[0](ar, n);

pa、&pa[0]、&pa三者的辨析

  • pa是数组名,C++中将其定义为数组的地址,因此实际上是一个指向数组首地址的指针,与&pa[0]等价;
  • &pa是整个数组的地址
    得到数组第一个元素的值:
**&pa = *pa = pa[0]

使用typedef简化

关键字typedef提供程序员创建类型别名的工具。
typedef double real;
_____________________________________
typedef const double *(*p_func)(const double *, int);	//p_func现在为一个类型名
p_func pa[3] = {f1, f2, f3};
p_func (*pd)[3] = &pa;
第七章编程题  第10题
————————————————————————————————————————————————————————————————————————————————————
#include<iostream>

using namespace std;

double add(double x, double y);
double calculate(double m, double n, double fun(double x, double y));

int main()
{
	double v1, v2;
	double sum = 0.0;
	double (*pf)(double x, double y);
	pf = add;
	cout << "请输入两个参数: ";
	while (cin >> v1 >> v2 )
	{
		sum = calculate(v1, v2, pf);
		cout << "两数之和为: " << sum << endl;
		cout << "请输入两个参数: ";
	}
	cout << "结束";
	return 0;
}

double add(double x, double y)
{
	return x + y;
}
double calculate(double m, double n, double fun(double x, double y))
{
	double result;
	result = add(m, n);
	return result;
}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值