例题
写一个函数可以判断一个数是不是闰年
#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; }
写一个函数判断一年是不是素数
#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; }
写一个函数,实现一个整形有序数组的二分查找。
#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
这是一个错误的示范
数组传参实际上传递的是数组首元素的地址
而不是整个数组
所以在函数内部计算一个函数参数部分的数组的元素个数是不靠谱的
int binary_search(int a[])//形参a看上去是数组,本质是指针变量
布尔类型
bool:用来表示真假的变量
如 bool flag
flag只有俩种情况return true或return false
头文件#include<stdbool.h>
嵌套调用
#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; }
函数可以嵌套调用,但不能嵌套定义
若嵌套定义,则函数会报错
链式访问
一个函数的返回值,作为其它函数的参数
函数返回值
函数不写返回值,默认返回类型是int,当用int类型的函数没有返回值时,在一些编译器上程序会默认返回最后一条语句的返回值
该函数没有返回值,但已返回84
不推荐这种写法
100传过去了,但是没有使用 ,若想拒绝这个100,加void即可,此时编译器会产生警报,但程序仍会运行成功
main函数的参数