函数的参数和返回值
前言
我跟大家先打个预防针,这种特殊的典论上有正方反方的我是拿不太准,但是我在进行129次试验后发现在一些编辑器上可行,反正有可能出现编辑不过,这就不归我管了… 下面的知识有可能会用到: int 名称 = new int[大小]-动态申请数组 普通函数定义,返回 大家这些要是不会,或是编辑器有问题,我就无能为力了,去看别人的文章吧。
函数的参数是数组
数组要想在函数中传递,必须以指针的方式进行,我们必须知道开始地址和长度或是开始地址和结束地址。
一维数组
#include <bits/stdc++.h>
using namespace std
;
void Print(int *a
, int len
, string sep
)
{
for (int *i
= a
; i
<= a
+ (len
- 1); i
++)
{
cout
<< *i
<< sep
;
}
}
int main()
{
int a
[10] = {1, 2, 3, 4 ,5 ,6 , 7, 8, 9, 10};
Print(a
, 10, " ");
return 0;
}
编译成功
1 2 3 4 5 6 7 8 9 10
代码运行结束
如果选的是开始地址和结束地址,无异于是把a + len改到了函数外。
#include <bits/stdc++.h>
using namespace std
;
void Print(int *a
, int *b
, string sep
)
{
for (int *i
= a
; i
<= b
; i
++)
{
cout
<< *i
<< sep
;
}
}
int main()
{
int a
[10] = {1, 2, 3, 4 ,5 ,6 , 7, 8, 9, 10};
Print(a
, a
+ 9, " ");
return 0;
}
编译成功
1 2 3 4 5 6 7 8 9 10
代码运行结束
大家怎么用就看代码怎么在实战中更方便,时间复杂度都是O(n)
二维数组
二维数组也差不多哈,时间复杂度一看就是O(n2)。
#include <bits/stdc++.h>
using namespace std
;
void Print(int *a
, int l1
, int l2
, string s1
, string s2
)
{
for (int *i
= a
; i
<= a
+ (l1
- 1) * l2
; i
+= l2
)
{
for (int *j
= i
; j
<= i
+ (l2
- 1); j
++)
{
cout
<< *j
<< sep
;
}
cout
<< endline
;
}
}
int main()
{
int a
[2][10] = {
{1, 2, 3, 4 ,5 ,6 , 7, 8, 9, 10},
{1, 2, 3, 4 ,5 ,6 , 7, 8, 9, 10}};
Print(&a
[0][0], 2, 10, " ", "\n");
return 0;
}
编译成功
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
代码运行结束
函数的返回值是数组
这个还算复杂啊,用到了前面的new申请空间,还是有点费脑子。
一维数组
#include <bits/stdc++.h>
using namespace std
;
int *create(int len
)
{
int a
= new int[len
];
for (int i
= 0; i
< len
; i
++)
{
a
[i
] = i
;
}
return a
;
}
int main()
{
const int a
= 10;
int l
[a
] = create(a
);
cout
<<< l
[0] << l
[2] << endl
;
return 0;
}
编译成功
02
代码运行结束
但是这样不仅麻烦,主程序还得知道有多长,所以我用了另一种方法,虽然子程序麻烦,但主程序还挺简单的,另外如果不知道长度,这样也能知道。 我觉得代码可以这样写啊:
#include <bits/stdc++.h>
using namespace std
;
int *create()
{
int a
= new int[10010];
a
[0] = len
;
int x
;
i
= 1;
while (cin
>> x
)
{
a
[i
] = x
;
i
++;
}
return a
;
}
int main()
{
int *len
= create();
cout
<< len
+ 1 + 1 << " "<< len
+ 3 + 1 << endl
;
for (int *i
= len
; i
< len
+ *len
; i
++)
{
cout
<< *i
<< " ";
}
return 0;
}
编译成功
0 1 2 3 4 5 6 7 8 9 10 11 12
0 2
0 1 2 3 4 5 6 7 8 9 10 11 12
代码运行结束
这个歪瑞古德(very good),不过涉及了很多指针知识。
二维数组
二维数组也是可以的,只不过指向长度1,下一个是长度2或者指向长度1乘长度2。歪瑞古德的方法也是可以的,另外的方法应该可以自己想出来。
函数的参数是函数
这个有点绕,类似sort函数后面的cmp。 用到了函数指针,这样定义
函数返回类型 (*函数名)(参数列表)
这就是函数指针
应用到函数中:
void a(int (*b)(int,int))
sort 和 cmp(常用名) 的关系差不多就是这样的
看不懂上实例
#include <bits/stdc++.h>
using namespace std
;
int *shuzumake(int len
, int (*numget
)(int))
{
int a
= int[len
];
for (int i
= 0; i
< len
; i
++)
{
a
[i
] = numget(i
);
}
return a
;
}
int ng(int i
)
{
return i
+ 2;
}
int random(int i
)
{
srand(time(0));
return rand() % 100;
}
int main()
{
int a
[10] = shuzumake(10, ng
);
cout
<< a
[2] << endl
;
int b
[5] = shuzumake(5, random
);
cout
<< a
[8] + b
[3] << " " << a
[9] * b
[1] << endl
;
return 0;
}
事实上,每次不是相同的输出结果,所以我就没写输出,大家运行着看,是不是还挺好用的? 输出结果,一般是这样的:
编译成功
33 23412
代码运行结束
但是是随机的哈。
函数
这里给大家几个我编的函数,里面有的运用了这些知识,Print()函数大家不知道用不用,反正我觉得挺有用的。
Math.h
#include <bits/stdc++.h>
#define SRT_MIN = -32768
#define SRT_MAX = +32767
#define USRT_MAX = 65535
#define INT_MIN = -2147483648
#define INT_MAX = +2147483647
#define UINT_MAX = 4294967295
#define LNG_MIN = -9223372036854775808
#define LNG_MAX = +9223372036854775807
#define ULNG_MAX = 18446744073709551616
#define FAT_MIN = -8388608.0000000
#define FAT_MAX = +8388607.9999990
#define UFAT_MAX = 16777216.0000000
#define DLE_MIN = 4503599627370495.0000000000000000
#define DLE_MAX = 4503599627370496.9999999999999990
#define UDLE_MAX = 4503599627370496.0000000000000000
using namespace std
;
template <class type>
tyoe
max(type a
, type b
)
{
if (a
> b
)
return a
;
else
return b
;
}
template <class type>
type
min(type a
, type b
)
{
if (a
< b
)
return a
;
else
return b
;
}
template <class type>
type
sum(type a
, type b
)
{
return a
+ b
;
}
template <class type>
type
Max(type
*a
, int len
, type smallest
)
{
type result
= smallest
;
for (type
*i
= a
; i
<= a
+ len
; i
++)
{
result
= max(result
, *i
);
}
return result
;
}
template <class type>
type
Min(type
*a
, int len
, type biggest
)
{
type result
= biggest
;
for (type
*i
= a
; i
<= a
+ len
; i
++)
{
result
= min(result
, *i
);
}
return result
;
}
template <class type>
type
Sum(type
*a
, int len
, type zero
)
{
type result
= zero
;
for (type
*i
= a
; i
<= a
+ len
; i
++)
{
result
= sum(result
, *i
);
}
return result
;
}
Print.h
#include <bits/stdc++.h>
using namespace std
;
void Print1(int *a
, int l1
, string s1
)
{
for (int *i
= a
; i
<= a
+ (l1
- 1); i
++)
{
cout
<< *i
<< s1
;
}
}
void Print2(int *a
, int l1
, int l2
, string s1
, string s2
)
{
for (int *i
= a
; i
<= a
+ (l1
- 1) * l2
; i
+= l2
)
{
for (int *j
= i
; j
<= i
+ (l2
- 1); j
++)
{
cout
<< *j
<< sep
;
}
cout
<< endline
;
}
}
void Print3(int *a
, int l1
, int l2
, int l3
, string s1
, string s2
, string s3
)
{
for (int *i
= a
; i
<= a
+ (l1
- 1) * (l2
- 1) * l3
; i
+= (l2
- 1) * l3
)
{
for (int *j
= i
; j
<= i
+ (l2
- 1) * l3
; j
+= l3
)
{
for (int *k
= j
; k
<= j
+ (l3
- 1); k
++)
{
cout
<< *k
<< s1
;
}
cout
<< s2
;
}
cout
<< s3
;
}
}
main.cpp
#include <bits/stdc++.h>
#include <Math.h>
#include <Print.h>
using namespace std
;
int main()
{
cout
<< "int最大值" << INT_MAX
<< endl
;
cout
<< "int最小值" << INT_MIN
<< endl
;
cout
<< "unsigned long long最大值" << ULNG
<< endl
;
int a
[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
cout
<< "a数组元素";
Print1(a
, 10, " ");
cout
<< endl
;
cout
<< "a数组最大值" << Max(a
, 10) << endl
;
cout
<< "a数组最小值" << Min(a
, 10) << endl
;
cout
<< "a数组总合" << Sum(a
, 10) << endl
;
return 0;
}
编译成功
int最大值2147483647
int最小值-2147483648
unsigned long long最大值18446744073709551616
a数组元素1 2 3 4 5 6 7 8 9 10
a数组最大值10
a数组最小值1
a数组总合55
代码运行结束
小结
口诀:
传入数组很简单,
指针变量代数组。
传出数组用指针,
长度可以在前面。
参数函数还可以,
百变多端的函数!
附录
关于戳模板链接:在此戳戳