知识点
1.函数可以传值调用,传值调用的时候形参是实参的一份临时拷贝。
2.函数可以传址调用,传址调用的时候,可以通过形参操作实参。
3.函数可以嵌套调用,但是不可以嵌套定义。
4.形参和实参可以同名。
5.函数定义是说明函数是怎么实现的。
6.形参在函数调用的时候才实例化,才开辟内存空间。
7.函数调用如果采用传值调用,改变形参不影响实参。
8.函数设计应追求高内聚低耦合(即模块化)。是衡量程序的模块之间独立性的标准。要保证模块(函数,方法)内部高内聚,之间低耦合。比如一个程序有50个函数,这个程序执行得非常好;然而一旦你修改其中一个函数,其他49个函数都需要仍然可以不需要修改,这就说明程序的函数之间保持了较好的独立性,即:低耦合。同时各个模块的变量也是和自己模块保持着紧密的联系。说明也是高内聚的。可以这样理解,一个企业的管理, 最理想的情况就是各个部门各司其职,井然有序,互不干涉, 但是需要沟通交流的时候呢, 各个部门都可以找到接口人专门负责部门沟通以及对外沟通。
9.要尽量少的使用全局变量。(因为全局变量在整个工程中哪里、到处都可以使用,这个地方可以改,那个地方也可以改,此时就乱套了。少的去使用全局变量不至于让代码失控。)
10.函数的参数不易过多。
11.设计函数时,尽量做到谁申请的资源就由谁来释放。
12.库函数的使用必须包含对应的头文件。
13.在不同的函数中可以使用相同名字的变量。
14.函数中的形式参数是在栈中保存的。
15.在一个函数内定义的变量只能在本函数范围内有效。
16.在一个函数内复合语句中定义的变量在本函数范围内无效。
习题
1.函数调用fun((v1,v2),(v3,v4),v5,v6)中,实参的个数是4。(逗号表达式算一个)。
2.实现一个整型数组的冒泡排序(编程体)。
//冒泡排序 void bubble_sort(int arr[], int sz) { int i = 0; for (i = 0; i < sz - 1; i++) { int j = 0; for (j = 0; j < sz - 1 - i; j++) { if (arr[j] > arr[j + 1]) { int tmp = 0; tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; } } } } #include<stdio.h> int main() { int arr[] = { 4,5,6,3,7,2,8,1,9,10 }; int sz = sizeof(arr) / sizeof(arr[0]); //进行排序 bubble_sort(arr, sz); //打印数据 int i = 0; for (i = 0; i < sz; i++) { printf("%d ", arr[i]); } return 0; }
3.编程题:创建一个整型数组,完成对数组的操作
1.实现函数Init()初始化为全0。
2.实现Print()打印数组的每一个元素
3.实现reverse()函数完成数组元素的逆置。
#include<stdio.h> void Init(int arr[], int sz) { int i = 0; for (i = 0; i < sz; i++) { arr[i] = 0; } } void Reverse(int arr[], int sz) { int left = 0; int right = sz - 1; while (left < right) { int tmp = arr[left]; arr[left] = arr[right]; arr[right] = tmp; left++; right--; } } void Print(int arr[], int sz) { int i = 0; for (i = 0; i < sz; i++) { printf("%d ", arr[i]); } printf("\n"); } int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int sz = sizeof(arr) / sizeof(arr[0]); //Init(arr, sz);//把数组初始化为0 Print(arr, sz);//打印 Reverse(arr,sz);//实现数组逆置 Print(arr, sz);//打印 return 0; }
4.编程题:将数组A的内容和数组B中的内容进行交换(数组一样大)。
//交换数组 //通过创建临时变量的方式 #include<stdio.h> int main() { int arr1[5] = { 1,2,3,4,5 }; int arr2[5] = { 6,7,8,9,10 }; int tmp = 0; int sz = sizeof(arr1) / sizeof(arr1[0]); int i = 0; for (i = 0; i < sz; i++) { tmp = arr1[i]; arr1[i] = arr2[i]; arr2[i] = tmp; } return 0; }
5.下列程序的运行结果是什么?
#include<stdio.h> int i;//全局变量-不初始化-默认是0 int main() { i--; if (i > sizeof(i))//sizeof()-计算变量/类型所占内存的大小 { printf(">\n"); } else { printf("<\n"); } return 0; }
6.编写一个函数实现n的k次方(使用递归实现)
#include<stdio.h> double Pow(int n, int k) { if (k == 0) return 1; else if (k > 0) { return n * Pow(n, k - 1); } else { return 1.0 / Pow(n, -k); } } int main() { int n = 0; int k = 0; double ret = 0.0; scanf("%d %d", &n, &k); ret = Pow(n, k); printf("%lf", ret); return 0; }
8.写一个递归函数Digitsum(n),输入一个非负整数,返回组成它的数字之和。
#include<stdio.h> int Digitsum(n) { if (n > 9) { return Digitsum(n / 10) + n % 10; } else { return n; } } int main() { int n = 0; scanf("%d", &n); int sum = Digitsum(n); printf("%d", sum); return 0; }
9.编写一个函数reverse_string(char * string),用递归实现。
#include<stdio.h> #include<string.h> void reverse_string(char arr[]) { int l = 0; int r = strlen(arr) - 1; while (l < r) { char tmp = arr[l]; arr[l] = arr[r]; arr[r] = tmp; l++; r--; } } int main() { char arr[] = "abcdef"; reverse_string(arr); printf("%s", arr); return 0; }
#include<stdio.h> #include<string.h> int Strlen(char *str) { int count = 0; while ((*str) != '\0') { count++; str++; } return count; } void reverse_string(char *str) { int l = 0; int r = Strlen(str) - 1; while (l < r) { char tmp = *(str + l);//char tmp = str[l]; *(str + l) = *(str + r);//str[l]=str[r]; *(str + r) = tmp;//str[r]=tmp; l++; r--; } } int main() { char arr[] = "abcdef"; reverse_string(arr); printf("%s", arr); return 0; }
10.写一个函数返回参数二进制中1的个数
//注意此算法不能解决n是负数的问题 #include<stdio.h> int count_bit_one(int n) { int count = 0; while (n) { if (n % 2 == 1) { count++; } n /= 2; } return count; } int main() { int n = 0; scanf("%d", &n); int count = count_bit_one(n); printf("%d", count); return 0; }
当输入为负数时:
法一:
#include<stdio.h> int count_bit_one(unsigned int n) { int count = 0; while (n) { if (n % 2 == 1) { count++; } n /= 2; } return count; } int main() { int n = 0; scanf("%d", &n); int count = count_bit_one(n); printf("%d", count); return 0; }
法二:
#include<stdio.h> int count_bit_one(int n) { int count = 0; int i = 0; for (i = 0; i < 32; i++) { if (((n >> i) & 1) == 1) { count++; } } return count; } int main() { int n = 0; scanf("%d", &n); int count = count_bit_one(n); printf("%d", count); return 0; }
法三(推荐):
#include<stdio.h> int count_bit_one(int n) { int count = 0; while (n) { n = n & (n - 1); count++; } return count; } int main() { int n = 0; scanf("%d", &n); int count = count_bit_one(n); printf("%d", count); return 0; }
11.求二进制位中不同位的个数
编程实现:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
输入样例:
1999 2299
输出样例:
7
//求二进制位中不同位的个数 #include<stdio.h> int get_diff_bit(m, n) { int tmp = m ^ n; return count_bit_one(tmp); } int count_bit_one(int n) { int count = 0; while (n) { n = n & (n - 1); count++; } return count; } int main() { int m = 0; int n = 0; scanf("%d %d", &m, &n); int count = get_diff_bit(m, n); printf("%d", count); return 0; }
12.打印二进制中的奇数和偶数位。
获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列。
//12.打印二进制中的奇数和偶数位。 #include<stdio.h> void print(int n) { int i = 0; printf("奇数位:\n"); for (i = 30; i >= 0; i -= 2) { printf("%d ", (n >> i) & 1); } printf("\n偶数位:\n"); for (i = 31; i >= 1; i -= 2) { printf("%d ", (n >> i) & 1); } } int main() { int n = 0; scanf("%d", &n); print(n); return 0; }
13.交换两个变量(不创建临时变量)
#include<stdio.h> int main() { int m = 0; int n = 0; scanf("%d %d", &m, &n); m = m ^ n; n = m ^ n; m = m ^ n; printf("%d %d", m, n); return 0; }
14.函数判断素数
实现一个函数,判断一个数不是素数
利用上面的函数打印100到200之间的素数。
//函数判断素数 #include<stdio.h> #include<math.h> int is_prime(int n) { int i = 2; for (i = 2; i <= sqrt(n); i++) { if (n % i == 0) return 0; } return 1; } int main() { int i = 0; for (i = 100; i <= 200; i++) { if (is_prime(i) == 1) { printf("%d ", i); } } return 0; }
15.乘法口诀表
实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定。
如:输入9,输出9^9口诀表,输入12,输出,…
//实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定。 #include<stdio.h> void print_table(int n) { int i = 0; for (i = 1; i <= n; i++) { int j = 0; for (j = 1; j <= i; j++) { printf("%-2d*%-2d=%-3d ", i, j, i * j); } printf("\n"); } } int main() { int n = 0; scanf("%d", &n); print_table(n); return 0; }