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


    //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;
    }
    

      

  • 相关阅读:
    css控制英文内容自动换行問題
    jquery添加select option两种代码思路比较
    C++实现单例模式
    C++实现单例模式
    windows下socket编程:区分shutdown()及closesocket()
    windows下socket编程:区分shutdown()及closesocket()
    socket关闭
    socket关闭
    C++模板的一些巧妙功能
    C++模板的一些巧妙功能
  • 原文地址:https://www.cnblogs.com/xiangxiaodong/p/2687999.html
Copyright © 2020-2023  润新知