C语言学习日记(3)
#include
int main() {
void print_star(); //声明:写函数声明时,可以简单复制已定义的函数的首行,再加一个分号,就构成函数的声明
void print_message();
print_star();//调用
print_message();
print_star();
return 0;
}
void print_star() { //无参函数
printf(“*******************************n”);
}
void print_message() {
printf(“Hi! World!n”); //void空类型无返回值,不写return
}
C程序的执行是从main 函数开始的,在main函数中调用其它函数,调用结束后返回main函数,结束运行。
函数间可以相互调用,但是不能调用main函数,main函数是被操作系统调用的。
从用户使用角度看,函数有两种:
1.库函数(系统提供,直接使用);
2.用户自己定义的函数。
从函数的形式看,有两种:
1.无参函数 (主调函数不向被调用函数传递数据)
2.有参函数(主调函数通过参数向被调用函数传递数据)
#include
int max(int x, int y) { //形参
int z;
z = x > y ? x : y;
return(z);
}
int main() {
int max(int x, int y);
int a, b, c;
printf(“请输入两个整数:”);
scanf_s(“%d%d”, &a, &b);
c = max(a, b); //实参
printf(“最大值为%dn”, c);
return 0;
}
实参与形参的类型应相同或赋值兼容
函数调用时的数据传递
1.形式参数:定义函数时函数后面括号中的变量名称。
2.实际参数:主函数调用函数时,函数名后面括号中的参数。
在调用函数时,系统会把实参的值传递给被调用的形参,在调用期间有效。
函数调用的过程
形参,在未出现函数调用时并不分配内存单元,被调用时,才临时分配内存单元。形参的值发生改变,不影响主调函数的实参的值。
实参和形参在内存中占用不同的存储单元,实参无法得到形参的值。
函数的返回值
通过函数中的return语句获得,如果需要从被调用函数带回一个函数值供主调函数使用,被调用函数中必须包含return语句。
函数类型决定返回值类型。不带回值的函数应定义为空(void)类型。
函数的嵌套调用
输入4个整数,找出其中最大的数
#includeint max4(int a, int b, int c, int d) { int max2(int a, int b); int m; m = max2(a, b); //调用max2函数,将a,b中最大值赋给m m = max2(m, c);//将a,b,c m = max2(m, d);//将a,b,c,d return m; } int max2(int a,int b) { if (a > b) return a; else return b; } int main() { int max4(int a, int b, int c, int d); int a, b, c, d, max; printf("请输入四个整数"); scanf_s("%d%d%d%d", &a, &b, &c, &d); max = max4(a, b, c, d); printf("最大值为%d", max); return 0; } //11, 12行可改为: return(a >= b ? a : b); //5 - 7行可改为:m = max(max2(max2(a, b), c), d);
函数的递归调用
学生的年龄依次减小,递归求第一个学生的年龄。
#includeint age(int n) { int c; if (n == 1) c = 10; else c=age(n - 1) + 2; return c; } int main() { int age(int n); printf("第五个人的年龄为:%d", age(5)); return 0; }
递归方法求n的阶乘
#include数组作为函数参数int fac(int n) { int f=0; if (n < 0) printf("请输入正整数!"); else if (n == 0 || n == 1) f = 1; else f = fac(n - 1) * n; return(f); } int main() { int fac(int n); int n; int x; printf("请输入一个正整数:");//int类型的取值范围:-2147483648~2147483647 scanf_s("%d", &n); x = fac(n); printf("%d的阶乘为%dn",n,x); return 0; }
数组元素作为函数实参
例题:输入10个数,输出最大值并输出是数组第几位数
//输入10个数,判断大小,输出最大数所在位置 #includeint max(int a, int b) { return(a > b ? a : b); } int main() { int max(int a, int b); int a[10], m, n, i; printf("请输入10个数"); for (i = 0; i < 10; i++) { scanf_s("%d", &a[i]); } for (i = 1, m = a[0], n = 0; i < 10; i++) { if (max(m, a[i]) > m) { m = max(m, a[i]); n = i; } } printf("最大数为%d, 在第%d位n", m, n + 1); return 0; } m存放最大值,n存放这个数的位置
一维数组名作函数参数
用数组元素作为实参时,向形参变量传递的是数组元素的值,用数组名作函数实参时,向形参(数组名或指针变量)传递的是数组首元素的地址。
例题:一维数组score内放10个学生成绩,求平均成绩
#includefloat average(float array[10]) { //array是形参数组名 int i; float aver, sum = array[0]; for (i = 1; i < 10; i++) { sum = sum + array[i]; } aver = sum / 10; return(aver); } int main() { float average(float array[10]); float score[10], aver; //score是实参数组名 int i; printf("请输入10个人的成绩"); for (i = 0; i < 10; i++) { scanf_s("%f", &score[i]); } aver = average(score); //数组名作函数实参参数 printf("平均成绩为:%5.2fn", aver); return 0; }
例题:求两个班级学生的平均成绩
#includefloat average(float array[], int n) { int i; float aver, sum = array[0]; for (i = 0; i < n; i++)//注意这个位置,需要用未知数n来决定循环次数,不然用实数结果会出现错误 sum = sum + array[i]; aver = sum / n; return(aver); } int main() { float average(float array[], int n); float score1[4] = { 76,34 ,45,43 }; float score2[10] = {24,65,70,24,76,43,76,23,12,67}; printf("A班的平均成绩为%5.2fn", average(score1, 4)); printf("B班的平均成绩为%5.2fn", average(score2, 10)); return 0; }
用数组名作函数实参时,不是把数组元素的值传递给形参,而是把实参数组的首元素地址传递给形参数组,这样**两个数组就共占一段内存单元==形参数组中各元素的值发生变化会使实参数组的值发生变化。
例题:选择排序(重点掌握)
#includevoid sort(int array[], int n) { int i, j, k, t; for (i = 0; i < n - 1; i++){ k = i; for (j = i + 1; j < n; j++) if (array[j] < array[k]) k = j;//交换位置 //交换数值,借助中间变量t t = array[k]; array[k] = array[i]; array[i] = t; } } int main() { void sort(int array[], int n); int a[10], i; printf("输入数组"); for (i = 0; i < 10; i++) scanf_s("%d", &a[i]); sort(a, 10); printf("排序结果: n"); for (i = 0; i < 10; i++) printf("%d ", a[i]); printf("n"); return 0; }
多维数组名作函数参数
//3X4矩阵求最大值 #includeint max_value(int array[][4]) { int i, j, max; max =array [0][0]; for (i = 0; i < 3; i++) for (j = 0; j < 4; j++) if (array[i][j] > max) max = array[i][j];//和当前max进行比较,大于就把最大值赋给max return max; } int main() { int max_value(int array[][4]); int a[3][4] = { {1,3,7,11},{2,5,8,13},{4,7,7,10} }; printf("最大的值为%dn", max_value(a)); return 0; }



