C++学习笔记2020.3.15(下)

函数和结构体

与数组名就是数组第一个元素的地址不同的是,结构名只是结构的名称,要获得结构的地址,必须使用地址运算符&

#include<iostream>
using namespace std;
struct time{
	int hour;
	int minute;
};
time t_sum(time t1,time t2);
void t_show(time t);
const int min_to_hour=60;
int main(void){
	time t1={5,45};
	time t2={4,55};
	time t=t_sum(t1,t2);
	t_show(t);
	return 0;
} 
time t_sum(time t1,time t2){
	time t;
	t.minute=(t1.minute+t2.minute)%60;
	t.hour=(t1.hour+t2.hour)+(t1.minute+t2.minute)/60;
	return t;
}
void t_show(time t){
	cout<<t.hour<<"hours "<<t.minute<<" minute";
}

传递结构体的地址:

#include<cmath>
#include<iostream>
using namespace std;
struct polar{
	double distance;
	double angle;
};
struct rect{
	double x;
	double y;
};
void rect_to_polar(const rect * pxy,polar * pda);
void show_polar(const polar * pda);
int main(void){
	cout<<"Enter the X and Y values:";
	rect rplace;
	polar pplace;
	while (cin>>rplace.x>>rplace.y){
		rect_to_polar(&rplace,&pplace);
		show_polar(&pplace);
		cout<<"Next to numbers(q to quit):";
	}
	cout<<"Done.\n";
	return 0;
}
void rect_to_polar(const rect * pxy,polar * pda){
	pda->distance=sqrt(pxy->x*pxy->x+pxy->y*pxy->y);
	pda->angle=atan2(pxy->x,pxy->y);
}
void show_polar(const polar * pda){
	const double Rad_to_deg=57.29577951;
	cout<<"distance= "<<pda->distance;
	cout<<", angle "<<pda->angle;
	cout<<" degrees.\n";
}
pda->angle获取pda结构下的angle属性

函数和string对象

#include<iostream>
#include<string>
using namespace std;
const int Size=5;
void show(const string str[],int num);
int main(void){
	string str[Size];
	cout<<"Please give me "<<Size<<" kinds of food you like:"<<endl;;
	for (int i=0;i<Size;i++){
		cout<<i+1<<" is ";
		getline(cin,str[i]);
	}
	cout<<"I will show your list,it is:"<<endl;
	show(str,Size);
	return 0;
} 
void show(const string str[],int num){
	for (int i=0;i<num;i++){
		cout<<i+1<<"is "<<str[i]<<endl;
	}
}

递归

函数自己调用自己的过程叫做递归(注:C++不允许main()函数自己调用自己)

简单的递归:

1、n!

#include<iostream>
using namespace std;
double Fn(int n);
int main(void){
	cout<<"Which number do you want to calculate:";
	int number;
	cin>>number;
	cout<<endl<<"The answer is "<<Fn(number);
	return 0;
}
double Fn(int n){
	if (n<0) cout<<"Nagetive number don't have function of Fn!";
	else if ((n==1)||(n==0)) return 1;
	else return n*Fn(n-1);
}

2、斐波那契数列

#include<iostream>
using namespace std;
int Fn(int number);
int main(void){
	cout<<"Which site of number in array of fb you want to know:";
	int number;
	cin>>number;
	cout<<"The result is "<<Fn(number);
}
int Fn(int number){
	if ((number==1)||(number==2)) return 1;
	else return Fn(number-1)+Fn(number-2);
}

包含多个递归调用的递归:

例子:
一条长空个字符串,首尾是‘|’外其余都是空格,想在标出两端,找到中点并将其标出,然后将同样的操作用于标尺的左半部分和右半部分。

;
void picture(char str[],int head,int tail,int level);
int main(void){
	char str[length];
	for (int i=1;i<length-2;i++){
		str[i]=' ';
	}
	str[length-1]='\0';
	int max=length-2,min=0;
	str[min]='|';
	str[max]='|';
	cout<<str<<endl;
	for (int i=1;i<=Division;i++){
		picture(str,min,max,i);
		cout<<str<<endl;
		for (int j=1;j<length-2;j++){
			str[j]=' ';
		}
	}
 	return 0;
}
void picture(char str[],int head,int tail,int level)
{
	if (level==0) return;
	int mid=(head+tail)/2;
	str[mid]='|';
	picture(str,head,mid,level-1);
	picture(str,mid,tail,level-1);
}

函数指针:

1、获取函数的地址

要获取函数的地址很简单:只要使用函数名即可。
注意要区分传递的是函数还是函数的返回值
例: 存在函数fn(),gn()
fn(gn) 向fn函数中传递了函数gn作为参数
fn(gn()) 向fn函数传递了函数gn的返回值作为参数

2、声明函数指针

注意括号的比较级比*要高
注意区分:
double *pf(int) → pf是一个返回指针的函数
double (*pf)(int) → pf是一个指向函数的指针

3、使用指针来调用函数

double sum(int);
double (*pf)(int);
pf=sum;
double x=sum(4);
dounle y=(*pf)(4);或者dounle y=pf(4)

上述两者等价。

深入浅出:

#include<iostream>
using namespace std;
const double * f1(const double ar[],int n);
const double * f2(const double [],int);
const double * f3(const double *,int);
int main(void){
	double data[3]={10,11,12};
	const double *(*p1)(const double *,int)=f1;
	cout<<(*p1)(data,3)<<" "<<*(*p1)(data,3)<<endl;
	const double *(*pa[3])(const double *,int)={f1,f2,f3};
	cout<<(*pa[0])(data,3)<<" "<<*(*pa[0])(data,3)<<endl;
	auto pc=&pa;
	cout<<(*pc)[0])(data,3)<<" "<<*(*pc)[0])(data,3)<<endl;
}
const double * f1(const double ar[],int n){
	return ar;
}
const double * f2(const double ar[],int){
	return ar+1;
}
const double * f3(const double *ar,int){
	return ar+2;
}

const double *(*p1)(const double *,int)=f1;

告诉我们 p1是指向fi函数的指针,const double *存储着返回值的地址

const double *(*pa[3])(const double *,int)={f1,f2,f3};

告诉我们pa是存储着指向三个函数的三个指针

auto pc=&pa;(C++11标准)

告诉我们pc是一个指向指针pa指针数组的指针
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值