C++:返回函数的指针

问题

此程序已使用C++11新标准,使用GCC编译器请添加参数[ -std=c++0x ],其他编译器请查阅相关手册.

  1. 编写函数的声明,令其接受两个int形参并且返回类型也是int;然后声明一个vector对象,令其元素是指向该函数的指针.
  2. 编写4个函数,分别对两个int值执行加,减,乘,除运算;在上一题创建的vector对象中保存指向这些函数的指针.
  3. 调用上述vector对象中的每个元素并输出其结果.

C++.
image-2033

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/*************************************************************************
    > File Name: test.6.56.cpp
    > Author: puruidong
    > Mail: 1@w1520.com
    > Created Time: 2014年03月17日 星期一 20时03分26秒
 ************************************************************************/

#include<vector>
#include<iostream>
#include<iterator>
using namespace std;
//将放入vector中函数指针进行运算,并输出值.
//test.6.54-test.6.56有关联.

int add(int a,int b){return a+b;}
int mins(int a,int b){return a-b;}
int mul(int a,int b){return a*b;}
int divs(int a,int b){return a/b;}

int (*re(int sa))(int,int)//返回函数指针:两个形参,函数名是re,包含两个形参,而函数名也包含了一个形参.它的返回类型是:int (*)(int,int).
{
    switch(sa)
    {
        case 0:
            return add;
            break;
        case 1:
            return mins;
            break;
        case 2:
            return mul;
            break;
        case 3:
            return divs;
            break;
    }
    return 0;
}

int main()
{
    int a=10,b=5;
    int (*pas)(int,int);//声明一个类型:包含两个形参的一个函数[函数名是pas],pas前面的*号表示其是一个指针,即函数指针
    vector<decltype(pas)> kess;//使用decltype关键字获取pas的准确类型
    for(int i=0;i<4;++i)//使用pas获取实际的函数指针.
    {
        pas=re(i);
        kess.push_back(pas);//添加到vector
    }
    vector<decltype(pas)>::iterator it=kess.begin();//依旧使用decltype获取准确类型.
    for(;it!=kess.end();++it)
    {
        cout << ((*it)(a,b)) << endl;//内联函数:解引用,计算值并输出值.
    }
    return 0;
}

参考了相关资料,具体请前往:[嗯,让我们彻底搞懂C/C++函数指针吧]

C++:使用递归输出vector中的值

问题

此程序使用了C++11新标准,在Linux GCC编译环境中请添加参数[ -std=c++0x ] 进行编译.其他编译器请查阅相关手册

递归输出vector中的值.

一般输出vector中的值都是使用循环比较简单,而使用递归输出[估计也只有书上才会让这么做],太少见了.留个笔记吧.

C++.
image-2029

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/*************************************************************************
    > File Name: test.6.33.cpp
    > Author: puruidong
    > Mail: 1@w1520.com
    > Created Time: 2014年03月16日 星期日 23时42分42秒
 ************************************************************************/

#include<iostream>
#include<vector>
using namespace std;
//编写一个递归函数,输出vector对象的内容.

//递归数字累加
int resstest(int n)
{
    if(n>=1)
    {
        return resstest(n-1)+n;
    }
    return 0;
}

//递归输出vector
void pass(vector<int> &is,unsigned i)
{
    if(i==is.size())
    {
        return ;
    }
    cout << is[i++] << " " << endl;
    pass(is,i);
}

int main()
{
    vector<int> ksa = {1,2,3,4,5,6,7,8,9};//c++11的初始化.
    cout << "输出vector的结果:" << endl;
    pass(ksa,0);
    cout << "1+2+3+4....10的结果:" << (resstest(10)) << endl;
    return 0;
}

C++:查找字符串中的字符

重要信息

这个问题困扰了我两个晚上,第一次遇到这样的问题.

使用G++作为C++编译器的同学,打开警告信息[编译时在文件后面加上: -Wall ]吧,就因为原来没开启编译警告信息才困扰了这么久啊.

C++.
image-2025

问题描述

读入一个字符串,判断其中是否包含ff,fl,fi,输出次数.

解决方案

注意:”>>>”注释后面是修改句.

错误版本1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/*************************************************************************
    > File Name: test.5.12.cpp
    > Author: puruidong
    > Mail: 1@w1520.com
    > Created Time: 2014年03月12日 星期三 23时07分44秒
 ************************************************************************/

//逻辑错误
//会重复统计出现次数.

#include<iostream>
using namespace std;
//统计ff,fl,fi的数量

int main()
{
    cout << "请输入字符(可包括:ff,fi,fl):" << endl;
    int result=0;
    string pa;
    cin >> pa;
    int index= 0 ;//记录位置.
    for (int t=0;t!=pa.size();++t)//>>>++t出现异常.
    {
       //判断第一个字符是否是f.
        if(pa[t]=='f')
        {
            index = t;
        }
        //首先,位置不能为最后一个,然后判断下一位是否为f,l,i.
        char parts = pa[index+1];//这个index依然顺序出现,出现值顺序为:1,2,3..字符长度,因此出现逻辑错误.
        switch(parts)
        {
            case 'f':
            case 'l':
            case 'i':
            result+=1;
            break;
        }
    }
    cout << "包含ff,fl,fi的个数是:" << result << endl;
    return 0;
}

错误版本2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/*************************************************************************
    > File Name: test.5.12.cpp
    > Author: puruidong
    > Mail: 1@w1520.com
    > Created Time: 2014年03月12日 星期三 23时07分44秒
 ************************************************************************/

//ERROR,运行错误!!!
//死循环.无法正常运行.

#include<iostream>
using namespace std;
//统计ff,fl,fi的数量

int main()
{
    cout << "请输入字符(可包括:ff,fi,fl):" << endl;
    int result=0;
    string pa="ff";
    cin >> pa;
    cout << pa.size() << endl;
    for(int index=0;index<=pa.size();index+2)//>>>修改了此句.index+2虽然刻意改变了index的值,但是并未返回.
    {
   
    cout << pa.size() << endl;
 
            if(pa[index]=='f')
         {  
            switch(pa[index+1])
            {
                case 'f':
                case 'l':
                case 'i':
                    result+=1;
                break;
            }
        }
    }
   
    cout << "包含ff,fl,fi的个数是:" << result << endl;
    return 0;
}

可运行版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/*************************************************************************
    > File Name: test.5.12.3.cpp
    > Author: puruidong
    > Mail: 1@w1520.com
    > Created Time: 2014年03月13日 星期四 02时32分45秒
 ************************************************************************/

//ok.

#include<iostream>
using namespace std;
//统计ff,fl,fi的数量

int main()
{
    cout << "请输入字符(可包括:ff,fi,fl):" << endl;
    int result=0;
    string pa="ff";
    cin >> pa;
    //>>>第一个位置是0,下一个位置应该是2,所以index+=2将值增加之后返回至index.
    for(unsigned index=0;index!=pa.size();(index+=2))
    {
        if(pa[index]=='f')//判断第一个字符是f,就进入到switch.
         {
        switch(pa[index+1])//下一个位置如果是下面三个字符就对返回值+1.
            {
                case 'f':
                case 'l':
                case 'i':
                    result+=1;
                break;
            }
        }
    }

    cout << "字符串的长度是:" << pa.size() << "\n包含ff,fl,fi的个数是:" << result << endl;
    return 0;
}

继续学习ING,加油!!