带你轻松玩转C语言函数(下)

简介: 笔记

例题


写一个函数可以判断一个数是不是闰年

12.png


#include <stdio.h>
int is_leap_year(int y)
{
  if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
  return 1;
  else
  return 0;
}
int main()
{
  int year = 0;
  for (year = 1000; year <= 2000; year++)
  {
  //判断year是不是闰年
  if (is_leap_year(year))
  {
    printf("%d ", year);
  }
  }
  return 0;
}


写一个函数判断一年是不是素数

13.png


#include <stdio.h>
#include<math.h>
int is_prime(int n)
{
  int j = 0;
  for (j = 2; j <= sqrt(n); j++)
  {
  if (n % j == 0)
  {
    return 0;
  }
  }
  return 1;
}
int main()
{
  int i = 0;
  int count = 0;
  for (i = 101; i <= 200; i+=2)
  {
  if (is_prime(i)==1)
  {
    printf("%d ", i);
    count++;
  }
  }
  printf("\ncount = %d\n", count);
  return 0;
}


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

14.png


#include <stdio.h>
int binary_search(int a[],int x,int y,int z)
{
  while (x <= y)
  {
  int  mid = x + (y - x) / 2;
  if (z ==a[ mid])
  {
    return mid;
  }
  else if (z>a[ mid])
  {
    x = mid + 1;
  }
  else if (z < a[mid])
  {
    y = mid - 1;
  }
  }
  if (x > y)
  return -1;
}
int main()
{
  int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
  int left = 0;
  int right = sizeof(a) / sizeof(a[0]);
  int k = 0;
  scanf("%d", &k);
  int h=binary_search(a, left, right,k);
  if (h == -1)
  printf("没找到");
  else
  printf("找到了,下表是:%d", h);
  return 0;
}


当我们在函数内部计算数组大小时,此时数组大小会变为1,这是因为数组在传参时传的是首元素的地址,函数形参的int a[]看似是个数组,其实是指针,接受的是首元素的地址


因此int y = sizeof(a) / sizeof(a[0])


sizeof(a)实际是算指针变量的大小,sizeof a[0]是首元素大小,指针大小为4或8,a[0]为4,所以最终结果为1

15.png

这是一个错误的示范


数组传参实际上传递的是数组首元素的地址


而不是整个数组


所以在函数内部计算一个函数参数部分的数组的元素个数是不靠谱的


int binary_search(int a[])//形参a看上去是数组,本质是指针变量



布尔类型


bool:用来表示真假的变量


如 bool flag


flag只有俩种情况return true或return false


头文件#include<stdbool.h>

16.png

17.png

嵌套调用


18.png


#include <stdio.h>
void new_line()
{
    printf("hehe\n");
}
void three_line()
{
    int i = 0;
    for (i = 0; i < 3; i++)
    {
        new_line();
    }
}
int main()
{
    three_line();
    return 0;
}


函数可以嵌套调用,但不能嵌套定义

19.png

若嵌套定义,则函数会报错


链式访问


一个函数的返回值,作为其它函数的参数


21.png

22.png

函数返回值


函数不写返回值,默认返回类型是int,当用int类型的函数没有返回值时,在一些编译器上程序会默认返回最后一条语句的返回值


该函数没有返回值,但已返回84

23.png24.png

不推荐这种写法

25.png26.png

100传过去了,但是没有使用 ,若想拒绝这个100,加void即可,此时编译器会产生警报,但程序仍会运行成功


main函数的参数


27.png

相关文章
|
5天前
|
C语言
C语言—内存函数的实现和模拟实现(内存函数的丝绸之路)
C语言—内存函数的实现和模拟实现(内存函数的丝绸之路)
18 0
|
5天前
|
C语言
C语言—字符函数与字符串函数(字符问题变简单的关键之技)
C语言—字符函数与字符串函数(字符问题变简单的关键之技)
6 0
|
1天前
|
存储 编译器 C语言
C语言进阶⑱(文件上篇)(动态通讯录写入文件)(文件指针+IO流+八个输入输出函数)fopen+fclose(下)
C语言进阶⑱(文件上篇)(动态通讯录写入文件)(文件指针+IO流+八个输入输出函数)fopen+fclose
7 0
|
1天前
|
C语言
C语言进阶⑱(文件上篇)(动态通讯录写入文件)(文件指针+IO流+八个输入输出函数)fopen+fclose(中)
C语言进阶⑱(文件上篇)(动态通讯录写入文件)(文件指针+IO流+八个输入输出函数)fopen+fclose
8 0
|
1天前
|
存储 数据库 C语言
C语言进阶⑱(文件上篇)(动态通讯录写入文件)(文件指针+IO流+八个输入输出函数)fopen+fclose(上)
C语言进阶⑱(文件上篇)(动态通讯录写入文件)(文件指针+IO流+八个输入输出函数)fopen+fclose
8 0
|
1天前
|
程序员 编译器 C语言
C语言进阶⑰(动态内存管理)四个动态内存函数+动态通讯录+柔性数组_malloc+free(下)
C语言进阶⑰(动态内存管理)四个动态内存函数+动态通讯录+柔性数组_malloc+free
5 0
C语言进阶⑰(动态内存管理)四个动态内存函数+动态通讯录+柔性数组_malloc+free(下)
|
1天前
|
C语言 C++
C语言进阶⑰(动态内存管理)四个动态内存函数+动态通讯录+柔性数组_malloc+free(中)
C语言进阶⑰(动态内存管理)四个动态内存函数+动态通讯录+柔性数组_malloc+free
8 0
|
1天前
|
编译器 数据库 C语言
C语言进阶⑰(动态内存管理)四个动态内存函数+动态通讯录+柔性数组_malloc+free(上)
C语言进阶⑰(动态内存管理)四个动态内存函数+动态通讯录+柔性数组_malloc+free
9 0
C语言进阶⑰(动态内存管理)四个动态内存函数+动态通讯录+柔性数组_malloc+free(上)
|
1天前
|
C语言 C++
C语言进阶⑭(内存函数_以字节操作)momcpy+mommove+memcmp+memset
C语言进阶⑭(内存函数_以字节操作)momcpy+mommove+memcmp+memset
5 0
|
1天前
|
算法 程序员 编译器
C语言初阶③(函数)知识点+编程作业(递归模拟strlen,pow)
C语言初阶③(函数)知识点+编程作业(递归模拟strlen,pow)
7 0