前面学了那么多语句,现在,我们“返璞归真”,来看一看我们从第一节课认识的程序框架吧:
#include<iostream>
using namespace std;
int main()
{
return 0;
}
这几节课,我们就来重新解读一下这个框架。今天,我们将从第3行的main函数入手。
大家应该注意到了,我们之前提到main时后面都会跟着“函数”一词。
那么,什么是函数呢?
数学中的函数大家并不陌生,但C++中,函数更像是一个固定的方法。
比如说,如果之前第五课“查找指定数”有多个输入,应该怎么办?
用之前的方法,可以这样写(假设有q组询问):
#include<iostream>
using namespace std;
const int MaxN = 100005;
int a[MaxN], n, q;
int main()
{
cin >> n >> q;
for(int i = 1; i <= n; i++) cin >> a[i];
while(q--){
int x, ans = -1;
cin >> x;
for(int i = 1; i <= n; i++){
if(a[i] == x){
ans = i;
break;
}
}
cout << ans << endl;
}
return 0;
}
我们用一个while循环(循环q次)包着查询代码,实现多组查询。
但是,如果我们要在代码中随时调用查询功能,是不是每一次都要写for循环呢?
当然没这个必要。我们可以利用函数解决:
#include<iostream>
using namespace std;
const int MaxN = 100005;
int a[MaxN], n, q;
int query(int x){
int ans = -1;
for(int i = 1; i <= n; i++){
if(a[i] == x){
ans = i;
break;
}
}
return ans;
}
int main()
{
cin >> n >> q;
for(int i = 1; i <= n; i++) cin >> a[i];
while(q--){
int x;
cin >> x;
cout << quuery(x) << endl;
}
return 0;
}
这里,我们在第5行定义了一个函数query(当然可以叫其他名字),具体方式如下:
返回类型 函数名 修饰符(参数1, 参数2...); //声明函数:表明这里有函数,避免先调用导致的编译出错
返回类型 函数名 修饰符(参数1, 参数2...){...}//函数实现(此前不声明也没关系)
先不管声明和实现的区别,来看前面相同的部分:
返回类型可以是 void(无返回值), int(整数), double(双精度浮点数)等。函数实现中,用return语句返回数,就像main函数最后有return 0;语句(return后函数直接跳出,即不继续运行)
函数名的定义规则和变量名一样,开头不能是数字且只包含字母、数字或下划线(_)。
后面的修饰符可有可无,时间比较紧时一般会加上inline,这里不作详细说明。
括号里面是参数列表,可以理解为是传进几个变量的值。
如,void f(int a, int b);表示有一个名为f的无返回值函数,需要传入a和b两个参数,
即调用时 f(1, 2)则实现时函数内a为1,b为2。
注意,这里说的是函数内。函数执行完毕后,函数内定义的所有变量(包括参数)都会无效:
#include<iostream>
using namespace std;
void f(int a, int b){
int t = a; a = b; b = t;
}
int main()
{
int a = 1, b = 2;
f(a, b);
cout << a << ' ' << b;
return 0;
}
这里的f()函数看似是将a和b交换,实则输出的仍然是1和2。
那f函数做了什么呢?让我们改一改f()函数:
void f(int a, int b){
int t = a; a = b; b = t;
cout << "f(): a = " << a << ", b = " << b << endl;
}
令人震惊的是,修改后,f函数内输出的是2和1。也就是说,f函数实现了函数内a,b两数的交换,
但这种“交换”影响不到main函数中的值。这种方式传入的只是一个值,如传入a和b等于传入1和2,
并没有把“变量”a和“变量”b传入。具体的原因我们讲指针和内存分配时会提到。
好了,以上就是这篇文章的全部内容了。最后,如果你觉得这篇文章还不错或者对你有帮助,麻烦点个收藏点个赞,这是免费的,你随时可以取消。你的支持是作者最大的动力,谢谢!