函数(二)

简介: 函数(二)

一.函数代码练习

1.写一个函数判断一个数是不是素数,是素数返回1.不是返回0.打印100-200之间的素数

题目中既然把素数作为判断部分,那么我们可以采用函数作为判断条件,基本架构如下:

int main()
{
  int i = 0;
  for (i = 101; i <= 200; i=i+2)
  {
    if (is_prime(i))
    {
      printf("%d\n", i);
    }
  }
  return 0;
}

偶数不可能是素数,所以直接pass掉。

下面是函数部分:

int prime(int x)
{
  int j = 0;
  for (j = 2; j <= sqrt(x); j++)
  {
    if (x % j == 0)
    {
      return 0;
    }
    return 1;
  }
}

关于sqrt平方的方法,后续会作出说明。

基本上素数方面只需要掌握2个循环就行了,而要想引入函数,把函数当作判断也是一种不错的组合。

检查了一遍我居然犯了一个致命错误,return 1不应该在for循环里,这样会导致每一个数都会变成素数,根本判定不了。

2.写一个函数判断一年是不是闰年 1000-2000

int decide(int n)
{
  if (n % 400 == 0 || (n % 4 == 0 && n % 100 != 0))
  {
    return 1;
  }
  else
  {
    return 0;
  }
}
int main()
{
  int i = 0;
  int count = 0;
  for (i = 1000; i <= 2000; i++)
  {
    if (decide(i))
    {
      count++;
      printf("%d\n", i);
    }
  }
  printf("%d", count);
  return 0;
}

会发现这是老套路了,就是通过把函数返回的数组作判断条件。

3.写一个函数,实现整形有序数组的二分查找,找到了就返回下标,找不到就返回-1。

int half(int arr[], int k, int sz)
{
  int left = 0;
  int right = sz - 1;
  int count = 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
    {
      count = 1;
      return mid;
    }
  }
  if (count != 1)
  {
    return -1;
  }
}
int main()
{
  int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
  int k = 0;
  scanf("%d", &k);
  int sz = sizeof(arr) / sizeof(arr[0]);
  int ret = half(arr, k, sz);
  if (ret != -1)
  {
    printf("找到了,下标是%d", ret);
  }
  else
  {
    printf("找不到");
  }
  return 0;
}

这里的返回操作基本和无函数没有区别,唯一要注意的是上传过去的数值要有所甄别,不用一股脑全传,挑一些重要的数值即可。

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

int main()
{
  int num = 0;
  prime()
  return 0;
}

首先传输的是地址,因为如条件所言的话不仅仅是形参需要变化,实参也要跟着改变。

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

剩下就简单了,在函数内部实现Num++就行了,不过因为接受的是地址,所以是*num++.

二.链式访问

int main()
{
  printf("%d", printf("%d", printf("43")));
  return 0;
}

如图所示,按照这样的结构最终会打印出什么呢?

首先,printf的返回值是整型int,其次打印了几个字符就返回数字几。例如打印43则返回2,而2作为打印为1个字符就返回1.

int main()
{
  printf("%d", printf("%d", 2));
  return 0;
}

所以最后结果为4321。

需要注意的是如果是打印了%d\n的话,那么在屏幕上会识别到换行,这样\n也会作为字符计算的。

相关文章
|
24天前
|
程序员 C语言
函数(1)
函数(1)
17 0
|
1月前
|
C++
<iomanip>库中setw(),setfill()等函数的使用
<iomanip>库中setw(),setfill()等函数的使用
16 0
|
11月前
|
程序员 编译器 C语言
从零带你认识函数(一)
从零带你认识函数
66 1
|
2月前
|
存储 编译器 Serverless
C++系列十:函数
C++系列十:函数
|
7月前
|
机器学习/深度学习
函数的使用
任务1 统计小组一门课程的总分及平均分。
42 1
|
2月前
|
开发工具 Windows
GetMessage()函数使用时的注意
GetMessage()函数使用时的注意
43 0
|
程序员 C语言 C++
函函函函函函函函函函函数——one
函函函函函函函函函函函数——one
67 0
|
Python
什么是函数
什么是函数
79 0
基本初等函数 对数函数
基本初等函数 对数函数
66 0
|
自然语言处理 C++
C/C++ 中的 atol()、atoll() 和 atof() 函数
1.atol(): 此函数将作为参数传递给函数调用的 C 类型字符串转换为长整数。它解析 C 字符串 str 并将其内容解释为整数,该整数作为 long int 类型的值返回。该函数会丢弃字符串开头的空白字符,直到找到非空白字符。如果 C 字符串 str 中的非空白字符序列不是有效的整数,或者如果因为 str 为空或仅包含空白字符而不存在这样的序列,则不执行任何转换并返回零。
167 0