目录
一.函数的调用
1. 写一个函数可以判断一个数是不是素数。
2. 写一个函数判断一年是不是闰年。
3. 写一个函数,实现一个整形有序数组的二分查找。
4. 写一个函数,每调用一次这个函数,就会将 num 的值增加1
二.函数与变量的声明与定义
1.函数
2.变量
三.函数的嵌套调用和链式访问
1.嵌套调用
2.链式访问
(1)strcat函数
(2)printf函数
#include
//求100-200之间的素数
//是返回1,不是返回0
is_prime(int n) {
int j = 0;
for (j = 2; j <= sqrt(n); j++)
{
if (n % j == 0)
return 0;
}
return 1;//要放在外面,只有当n整除了2到n-1的数,无法整除才能证明n是素数
}
int main()
{
int i = 0,cnt=0;
for (i = 100; i <= 200; i++)
{
if (is_prime(i) == 1)
{
cnt++;
printf("%d ", i);
}
}
printf(" 100-200间共有素数:%d", cnt);
}
说明一下,j<=sqrt(n)。当m=a*b,a和b至少有一个数字是<=√n,可以优化代码,提高效率。(只需要遍历前面的元素,比n小的遍历完,后面就不用遍历了。)
打印1000-2000的闰年,cnt是计数器;
#include
is_leap_year(int year)
{
return ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0));
}
int main()
{
int y = 0;
int cnt = 0;
for (y = 1000; y <= 2000; y++)
{
if (is_leap_year(y)) {
cnt++;
printf("%d ", y);
}
}
printf(" %d", cnt);
}
//二分查找binary_search
int binary_search(int arr[],int k,int sz)
{
//sz = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = sz - 1;
//printf("%d %d \n", sizeof(arr),sizeof(arr[0]));
while (left <= right) {
int mid = (left + right) / 2;
if (arr[mid] > k)
{
right = mid - 1;
}
else if (arr[mid] < k)
{
left = mid + 1;
}
else {
return mid;
}
}
if (left > right)
{
return -1;
}
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 7;
int sz = sizeof(arr) / sizeof(arr[0]);
//找到了就返回下标
//找不到返回-1
//计算数组的元素个数
//printf("%d\n", sizeof(arr));//40,这里计算整个数组的大小,单位是字节
//printf("%d\n", sizeof(arr[0]));//4,计算数组第一个元素的大小,单位是字节
int pos = binary_search(arr,k,sz);
if (-1 == pos)
printf("找不到\n");
else
printf("找到了,下标是:%d\n", pos);
return 0;
}
注意:
sz的值要在main函数里算完再传过去,否则在自定义函数内算的sizeof(arr)的大小是指针大小,在32位机器上所占字节数是4,sizeof(arr[0])一个int元素所占字节是4,4/4=1,结果错误。
void Add(int* p)
{
//*p = *p+1;
(*p)++;//要加括号,++的优先级高于*
}
int main()
{
int num = 0;
Add(&num);//取地址远程操作
printf("%d\n", num);//1
Add(&num);
printf("%d\n", num);//2
Add(&num);
printf("%d\n", num);//3
return 0;
}
(1)声明
//函数的声明
int add(int x, int y);
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
//求和
int ret = add(a, b);
printf("%d\n", ret);
return 0;
}
(2)定义
//函数的定义
//函数的定义也是一种特殊的声明
int add(int x, int y)
{
return x + y;
}
(1)声明:有定义的时候使用它,叫变量的声明,放在开头,已经初始化了变量
//变量的声明,下面有赋值
int g_val;
//全局变量不初始化的时候,默认是0
int main()
{
printf("g_val = %d\n", g_val);
return 0;
}
//变量的定义
int g_val = 2022;
(2)定义:没有定义的时候使用它就叫变量的定义,没有初始化变量。
//定义,//没有赋值
int val;
//全局变量不初始化的时候,默认是0
int main()
{
printf("%d\n", val);
return 0;
}
可理解为像乐高一样拼起来,你调用我,我调用你。一个程序就是由函数嵌套调用组成的(包括main函数)。
#include
void m()
{
printf("hehe\n");
}
void test()
{
int i = 0;
for (i = 0; i < 3; i++)
{
m();
}
}
int main()
{
test();
return 0;
}
函数可以嵌套调用,但是不能嵌套定义。
把一个函数的返回值作为另外一个函数的参数。
链式访问
#include
#include
int main()
{
char arr[20] = "hello";
int len = strlen(strcat(arr,"world"));//返回字符的个数
printf("%s\n", arr);
printf("%d\n",len);
return 0;
}
char *strcat(char *destination, const char *source) 把 source 所指向的字符串追加到 destination 所指向的字符串的结尾
printf函数的返回值是打印在屏幕上字符的个数
#include
C int main() { char arr[20] = "hello"; int len = strlen(strcat(arr,"world"));//返回字符的个数 printf("%s\n", arr); printf("%d\n",len); return 0; }