函数练习(1)

简介: 函数练习(1)

函数的调用:(1)传值调用  (2)传址调用

那我们怎么使用呢?

总结:

(1)传值调用——我们只是把值传过去就可以了,不会涉及形参修改实参的这种方式。

(2)传址调用——当我们在把实参传过去后,形参要能远程找到实参,形参要能修改我的实参,我们这时候就要考虑传址调用了。

实参和形参占用的是不同的内存单元,要使形参能改变我们的实参,就要创造联系。

怎么创造联系呢?如下:

int  a=10;

//想把a改为20

(1)

a=20;

(2)

int  *  pa=&a;//pa就是指针变量,存放a的地址

*pa=20;//*pa解引用操作,*pa就是a

如上:我们想创造联系,就把地址传给实参就行了——这就是传址调用

1.写一个函数可以判断一个数是不是素数。

//写一个函数求100-200之间的素数
#include<stdio.h>
#include<math.h>//sqrt的头文件
int is_prime(int x)
{
  //不是返回0
  int n = 0;
  for (n = 2; n <= sqrt(x); n++)
  {
    if (x % n == 0)
    {
      return 0;
    }
  }
  //是素数返回1
  return 1;
}
int main()
{
  int i = 0;
  for (i = 100; i <= 200; i++)
  {
    //函数判断i是否为素数,是素数返回1,不是返回0
    if (is_prime(i) == 1)
    {
      printf("%d ", i);
    }
  }
  return 0;
}

tip:break与return

break:在循环中的作用是终止循环——一个break跳出一层循环,继续执行后面的代码

return:遇到return函数直接返回了(结束),不管后面还有没有代码都不执行

相比break,return更加直接

2. 写一个函数判断一年是不是闰年。

#include<stdio.h>
//判断闰年
//(1)4年一闰,百年不闰 
//(2)400年又闰
int is_leap_year(int y)
{
  if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
  {
    return 1;//是返回1
  }
  else
  {
    return 0;//不是返回0
  }
}
int main()
{
  int y = 0;
  for (y = 1000; y <= 2000; y++)
  {
    //调用函数判断y是否为闰年
    //是返回1,不是返回0
    if (is_leap_year(y))
    {
      printf("%d ",y);
    }
  }
  return 0;
}

注:实参和形参名字可以一样,但是占用的内存单元不一样。

学习好的代码风格,如:

(1)函数名——一定要有意义

(2)写法——要有质量

is_leap_year

IsLeapYear

Is_Leap_Year

前两种都可以,后面不建议

有兴趣的可以去看《高质量的C/C++编程》这本书

3.写一个函数,实现一个整形有序数组的二分查找。


#include<stdio.h>
int binary_search(int arr[], int k, int sz)
{
  int left = 0;
  int right = sz - 1;
  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;
    }
  }
  return -1;
}
int main()
{
  int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
  int k = 7;//要查找的数
  //调用函数判断是否找到
  //找到返回下标
  //找不到返回-1
  int pos = binary_search(arr, k, 10);
  if (-1 == pos)
  {
    printf("找不到\n");
  }
  else
  {
    printf("找到了,下标为%d\n", pos);
  }
  return 0;
}

那如果数组元素太多,我们怎么算数组的元素个数呢?

#include<stdio.h>
int main()
{
  int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
  printf("%d\n", sizeof(arr));
  printf("%d\n", sizeof(arr[0]));
  return 0;
}


sizeof(arr);//这是计算整个数组的大小,单位是字节。

sizeof(arr[0]);//这是在计算数组(第一个)元素的大小,单位是字节。

所以计算数组的元素个数,我们可以:

int sz=sizeof(arr)/sizeof(arr[0]);


4. 写一个函数,每调用一次这个函数,就会将 num 的值增加1。

#include<stdio.h>
void Add(int* p)
{
  *p = *p + 1;
}
int main()
{
  int num = 0;
  Add(&num);
  printf("%d\n", num);
  Add(&num);
  printf("%d\n", num);
  Add(&num);
  printf("%d\n", num);
  return 0;
}


void Add(int* p)
{
  //*p = *p + 1;
  *p++;
}
int main()
{
  int num = 0;
  Add(&num);
  printf("%d\n", num);
  Add(&num);
  printf("%d\n", num);
  Add(&num);
  printf("%d\n", num);
  return 0;
}


为什么呢?

操作符的优先级。

改:(*p)++


除了传址调用,我们也可以传值调用如下:

#include<stdio.h>
int Add(int n)
{
  return n+1;
}
int main()
{
  int num = 0;
  num = Add(num);
  printf("%d\n", num);
  num = Add(num);
  printf("%d\n", num);
  num = Add(num);
  printf("%d\n", num);
  return 0;
}


相关文章
|
3月前
|
存储 自然语言处理 数据处理
有效的函数
有效的函数
21 0
|
6月前
|
安全 程序员 数据处理
CreateFileMapping函数详解
CreateFileMapping函数详解
|
6月前
|
算法 程序员 编译器
函数(2)
函数(2)
25 0
|
7月前
|
存储 C语言 Python
函数的前世今生1系列
函数的前世今生1系列
|
7月前
|
Java 测试技术 Python
为什么要用函数
在编程中,函数是一种重要的抽象工具,它使我们能够组织和复用代码,提高代码的可读性、可维护性和效率。函数允许我们将一段代码块封装起来,给它一个名字,并通过参数和返回值来与外部世界交互。下面,我们将深入探讨为什么要使用函数,并附上相应的代码示例。
96 1
|
7月前
|
数据库
什么是纯函数
纯函数是指在相同的输入下,总是返回相同的输出,且没有副作用的函数。具体来说,纯函数不会改变任何传入的参数,也不会在函数外部改变全局变量、文件系统、数据库等状态,它只是接收输入并返回输出,不会产生任何可观察的副作用。
78 0
|
机器学习/深度学习
函数的使用
任务1 统计小组一门课程的总分及平均分。
65 1
|
前端开发
纯函数
纯函数
82 0
|
算法 编译器
函数(二)
函数(二)
89 0
函数(二)