函数练习(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;
}


相关文章
|
分布式计算 资源调度 Java
|
安全 Java
安装burp2022 --illegal-access=permit
安装burp2022 --illegal-access=permit
240 0
|
11月前
|
机器学习/深度学习 传感器 人工智能
深度学习之自主学习和任务规划
基于深度学习的自主学习和任务规划,是指通过深度学习算法使人工智能(AI)系统能够自主地从环境中学习,并根据特定的目标和任务,规划出有效的解决方案。
442 3
|
8月前
|
JavaScript 前端开发 测试技术
盘点原生JavaScript中直接触发事件的方式
本文全面探讨了原生JavaScript中触发事件的多种方式,包括`dispatchEvent`、`Event`构造函数、`CustomEvent`构造器、直接调用事件处理器以及过时的`createEvent`和`initEvent`方法。通过技术案例分析,如模拟点击事件、派发自定义数据加载事件和实现提示框系统,帮助开发者掌握这些方法在实际开发中的应用,提升灵活性与兼容性。
259 3
|
前端开发 开发者
CSS盒子模型(如果想知道CSS有关盒子模型的知识点,那么只看这一篇就足够了!)
CSS盒子模型(如果想知道CSS有关盒子模型的知识点,那么只看这一篇就足够了!)
|
运维 数据中心
计算巢资源组功能的最佳实践
计算巢简介计算巢是阿里云开放给ISV与其客户的服务管理PaaS平台,旨在解决ISV云上交付、部署、运维问题,建立ISV与客户之间的通道。针对ISV的实际场景,计算巢提供了私有化部署、托管版部署、代运维服务三种模式。托管版和私有化部署的区别是针对于部署在ISV的账号下还是部署在用户账号下。本文主要介绍计算巢不同场景下使用资源组功能的最佳实践。功能介绍资源组能够对用户拥有的云资源从用途、权限、归属等维
746 0
计算巢资源组功能的最佳实践
|
存储 JavaScript 前端开发
ShareDB:构建实时应用从未如此简单
ShareDB:构建实时应用从未如此简单
453 0
|
机器学习/深度学习 供应链 算法
SPSS Modeler分析物流发货明细数据:K-MEANS(K均值)聚类和Apriori关联规则挖掘
SPSS Modeler分析物流发货明细数据:K-MEANS(K均值)聚类和Apriori关联规则挖掘
|
编解码 弹性计算 Ubuntu
倚天自强!
倚天710推出接近2年,您是否真正用过阿里云搭载倚天710的ECS云服务器?您是否对ARM架构的服务器感到陌生?让我通过本篇文章向您展示搭载倚天710云服务器的强大性能、超高的可靠性以及其优秀的性价比!倚天云服务器采用倚天710处理器,基于新一代CIPU架构,通过芯片快速路径加速手段完成计算、存储、网络性能的数量级提升。
34243 15
倚天自强!
|
Docker 容器
kali vulhub的使用方法
kali vulhub的使用方法
282 0