通过一个代码简要解析函数的定义与调用

来源:互联网 发布:厦门软件企业 编辑:程序博客网 时间:2024/04/30 05:16

首先来看用作例子的代码:

#include<vector>
#include<iostream>
#include<fstream>
#include<sstream>
#include<stdlib.h>


using namespace std;


typedef vector < int > VI;
typedef vector < VI > VVI;
void print (const VI&);
void input ( VVI& );
bool findVec (const VVI&,VI&);


int main()
{
VVI matrix;
    input (matrix);
VI vec;
if (findVec(matrix,vec))
print (vec);
system("pause");
}


void print (const VI& v)
{
for (int i=0;i<v.size();++i)
cout<<v[i]<<" ";
cout<<"\n";
}


void input (VVI& m)
{
ifstream in ("abc.in");
int n =8, t;
m.resize(n);
for (string s;n-- && getline (in,s);)
for (istringstream sin (s); sin>>t ;m[m.size()-n-1].push_back(t));
}


bool findVec (const VVI& matrix , VI& v)
{
for (int i=0; i<matrix.size(); ++i)
for (int j=0; j<matrix[i].size(); ++j)
if (matrix[i][j]==-1)
{
v= matrix[i];
return true;
}
return false;
}

这个代码的主要功能是在一个矩阵中找其中一个元素为-1的向量,若找到,则找到的结果存放在参数v中,返回true。否则,没有结果,且返回false。程序所用的数据放在文件abc.in中。文件中第一行放向量的个数n,以便读入操作。接下来n行即n个长短不一的向量。


下面我们来逐块分析此代码。

#include<vector>
#include<iostream>
#include<fstream>
#include<sstream>
#include<stdlib.h>


using namespace std;

头定义。


typedef vector < int > VI;
typedef vector < VI > VVI;
void print (const VI&);
void input ( VVI& );
bool findVec (const VVI&,VI&);

将int类型的向量赋名为VI,将向量类型的向量赋名为VVI,定义print函数,定义input函数,定义findVec函数。


int main()
{
VVI matrix;
    input (matrix);
VI vec;
if (findVec(matrix,vec))
print (vec);
system("pause");
}

这一块为主函数部分,首先我们定义一个向量类型的向量matrix。

然后调用input函数,我们跳入input函数定义模块来看这个函数的运行结果。

void input (VVI& m)
{
ifstream in ("abc.in");
int n =8, t;
m.resize(n);
for (string s;n-- && getline (in,s);)
for (istringstream sin (s); sin>>t ;m[m.size()-n-1].push_back(t));
}

可以看到,函数的形参为m,在主函数中就是matrix。

首先逐行读入abc.in中的内容并存入in中。

定义整形n,t,其中n=8.因为在abc.in中指明文件第一行放向量的个数n,笔者的abc.in中有8行数据。

因此定义n=8.将m即主函数中的matrix中的行数定义为8.

定义一个string类型的s,并使用getline函数将in逐行读入s中并将n每次减一。关于string流和getline函数的应用,在笔者的另一篇博客中有叙述,链接如下:

string流

第二个循环是指在每一行中定义一个string流sin,并将sin逐个赋值给t,将t的值用push_back函数在尾部逐个赋值给m中的每一行,两个循环完成后,abc.in中的矩阵就赋给m了。

回到主函数,可以看到这一句就是将abc.in中的矩阵赋值给matrix。

下一句,定义了一个整形向量Vec。

在if的判断条件里调用了findVec函数,我们跳入findVec函数的定义来看这一函数的运行过程。

bool findVec (const VVI& matrix , VI& v)
{
for (int i=0; i<matrix.size(); ++i)
for (int j=0; j<matrix[i].size(); ++j)
if (matrix[i][j]==-1)
{
v= matrix[i];
return true;
}
return false;
}

可以看到这一函数是布尔型的,布尔型的返回值只有两个,true和false。

可以看到前两个for循环是遍历matrix整个矩阵,后面的判断是逐个判断矩阵中像素是否有-1值,若有返回true,并将matrix中有-1的一行赋值给v。

若没有,返回false。

回到主函数,可以看到这个判断就是若检测到-1值,返回true就调用print函数,若没有检测到-1就结束程序。

下面我们跳入print函数的定义来看函数的运行过程。

void print (const VI& v)
{
for (int i=0;i<v.size();++i)
cout<<v[i]<<" ";
cout<<"\n";
}
这个函数非常简单,就是当检测到-1值,已经将有-1的那一行赋值给v以后,我们逐个输出v中元素,最后换行。


这样函数就整个讲解完了,运行结果就是,若abc.in中含有-1元素,我们最后会输出含有-1元素的那一行,若没有-1元素,就不做输出操作。

希望对大家对函数的学习有所帮助。

大家都来自己写几个整数编辑一个abc.in试试看吧。

我们下期见

0 0