第十七章 特殊成员_函数指针

//5 函数指针
//我们知道数组名是指向数组第一个元素的常量指针
//同理,函数名也是指向函数第一条指令的常量指针,一般来说,在不出现异常的情况下
//程序在编译后,每个函数都有一个首地址,也就是函数第一条指令的地址
//那么这个指针就是函数指针,该指针可以看做是函数名,因为我们可以通过该指针调用函数
#include <iostream>
#include <string>
using namespace std;


bool check(string);
void get(float &, float &);

//int (*func)(int);
//该语句声明了一个int型指针func
//它指向一个函数
//这个函数带有一个int型参数并返回int值

//我们要注意一点:
//一个指向函数的指针必须确保该函数被定义且分配了内存
//否则它将指向一个指地址,这是指针的大忌

//long (*func1)(int); //该语句声明了一个指针,该指针指向一个函数
//long* func1(int); //该语句声明了一个函数,返回一个long型的指针
//我们来比较一下这两种声明:
//long(*func1)(int); //声明了一个指针,该指针指向一个函数
//long*func1(int);   //声明了一个函数,该函数返回一个指针


//重新,定义函数指针
float(*fp)(float&, float&);
void(*p)(float&, float&);



//取得三角型的面积
float triangle(float &x, float &y)
{
     return x*y*0.5;
}
float rectangle(float &x, float &y)
{
     return x*y;
}



void swap(float &x, float &y)
{
     float n;
	 n=x;
	 x=y;
	 y=n;
}
void print(float &x, float &y)
{
	cout<<"长为:"<<x<<" "<<"宽:"<<y<<endl;
}



//只能是顺随的问题了,如果指check放在get的后面,执行失败,这可能需要的不是这种直接定义,页是先声明,然后定义
void get(float &x, float &y)
{
	cout<<"请输入x的新值:"<<endl;
	string str1;
	cin>>str1;
	while(!check(str1))
	{
	    cout<<"你输入的不是数字,请重新输入!!!!!"<<endl;
		cin>>str1;
	}
	x=atof(str1.c_str());

	cout<<"请输入y的新值:"<<endl;
	string str2;
	cin>>str2;
	while(!check(str2))
	{
	    cout<<"你输入的不是数字,请重新输入!!!!!"<<endl;
		cin>>str2;
	}
	y = atof(str2.c_str());
}


bool check(string str)
{
	for(int s=0; s<str.length(); s++)
	{
		if((str[s]>'9' || str[s]<'0') && (str[s] != '.') )
		{
		    return false;
		}
	}
	return true;
}

int main()
{
	bool quit = false;
	float a=2, b=3;
	int choice; //用来记录用户的选择值
	while(quit == false)
	{
	     cout<<"(0)退出 (1)设定长宽 (2)设定三角形 (3)长方形 (4)交换长宽值:"<<endl;
		 cin>>choice;
		 switch(choice)
		 {
			 case 1:
				 //cout<<"设定前长和宽的值:"<<endl;
				 //print(a,b);
				 //get(a,b);
				 //cout<<"设定后长和宽的值:"<<endl;
				 //print(a,b);
				 p = get;
				 break;
			 case 2:
				 //cout<<"当前长和宽的值:"<<endl;
				 //print(a,b);
				 //cout<<"三角形的面积为:"<<triangle(a,b)<<endl;
				 fp = triangle;
				 break;
			 case 3:
				 //cout<<"当前长和宽的值:"<<endl;
				 //print(a,b);
				 //cout<<"长方形的面积为:"<<rectangle(a,b)<<endl;
				 fp = rectangle;
				 break;
			 case 4:
				 //cout<<"交换前长和宽的值:"<<endl;
				 //print(a,b);
				 //swap(a,b);
				 //cout<<"交换后长和宽的值:"<<endl;
				 //print(a,b);
                 p = swap;
				 break;
			 case 0:
				 quit = true;
				 break;
			 default:
				 quit = true;
				 break;
		 }
		 if(choice == 1 || choice==4)
		 {
		      print(a, b);
			  p(a,b);
			  print(a, b);
		 }else if(choice == 2 || choice==3)
		 {
		      print(a,b);
			  cout<<"面积为:"<<fp(a,b)<<endl;
		 }
	}
	return 0;
}

  

posted @ 2012-09-16 22:47  简单--生活  阅读(205)  评论(0编辑  收藏  举报
简单--生活(CSDN)