函数和结构体
与数组名就是数组第一个元素的地址不同的是,结构名只是结构的名称,要获得结构的地址,必须使用地址运算符&
#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;
}