一.函数代码练习
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也会作为字符计算的。