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


相关文章
|
6月前
|
程序员 编译器 C++
函数介绍
函数介绍
67 1
|
6月前
|
存储 编译器 C++
13函数
13函数
24 0
|
2月前
|
存储 Python
有效的函数(一)
有效的函数(一)
|
6月前
|
存储 编译器 C++
|
5月前
|
C++
<iomanip>库中setw(),setfill()等函数的使用
<iomanip>库中setw(),setfill()等函数的使用
96 0
|
6月前
|
XML 存储 JavaScript
loadXMLString() 函数
`loadXMLString()` 是一个JavaScript函数,用于在不同浏览器环境下解析XML字符串。它使用DOMParser在支持的浏览器中解析,而在IE中则使用ActiveXObject。函数接受XML文本作为参数,返回解析后的XML文档。此函数适用于HTML页面的&lt;script&gt;标签内,方便在页面中重用,尤其在处理XML实例时。
|
程序员 编译器 C语言
从零带你认识函数(一)
从零带你认识函数
84 1
|
6月前
|
存储 编译器 Serverless
C++系列十:函数
C++系列十:函数
|
6月前
函数(三)
函数(三)
42 0