代码清单
①返回两个整数中较大值的函数
#includeint maxof(int x, int y) { if (x > y) return (x); else return (y); } int main() { int na, nb; puts("请输入两个整数。"); printf("整数1:"); scanf("%d", &na); printf("整数2:"); scanf("%d", &nb); printf("较大的整数的值是%dn", maxof(na, nb)); return 0; }
main函数:一个程序只能存在一个main函数,程序运行的时候会执行main函数的主体
库函数:printf、scanf、puts、putchar…由C语言提供的函数称为库函数
本程序由maxof函数和main函数组成,其中maxof函数是我们自己所定义的。
定义函数分为函数头和函数体两个部分,其中函数头就是:int maxof(int x, int y) 这一部分,int 是其返回类型,maxof是定义的函数名称,(int x, int y)是形参说明。{}内的就是函数体,函数体一定是被大括号包括起来的复合语句。
②返回三个整数中最大值的函数
#includeint max3(int x, int y, int z) { int max = x; if (y > max) max = y; if (z > max) max = z; return (max); } int main() { int na, nb, nc; puts("请输入三个整数。"); printf("整数1:"); scanf("%d", &na); printf("整数2:"); scanf("%d", &nb); printf("整数3:"); scanf("%d", &nc); printf("最大值是%dn", max3(na, nb, nc)); return 0; }
③计算两个整数的平方差
#includeint sqr(int x) { return x * x; } int diff(int x, int y) { return (x > y ? x - y : y - x); } int main() { int kx, ky, kx2, ky2; puts("请输入两个整数。"); printf("整数kx:"); scanf("%d", &kx); printf("整数ky:"); scanf("%d", &ky); kx2 = sqr(kx); ky2 = sqr(ky); printf("kx和ky的平方差是%dn", diff(kx2, ky2)); return 0; }
将kx的平方和ky的平方临时储存在变量kx2和ky2中,但由于这些变量之后不会再使用了,因此可以直接像下面这样调用diff函数:diff(sqr(kx),sqr(ky))
④计算幂
#includedouble power(double dx, int no) { int i; double tmp = 1.0; for (i = 1; i <= no; i++) tmp *= dx; return (tmp); } int main() { int n; double x; printf("请输入一个实数:"); scanf("%lf", &x); printf("请输入一个整数:"); scanf("%d", &n); printf("%.2f的%d次幂是%.2fn", x, n, power(x, n)); return 0; }
#includedouble power(double dx, int no) { double tmp = 1.0; while (no-- > 0) tmp *= dx; return (tmp); } int main() { int n; double x; printf("请输入一个实数:"); scanf("%lf", &x); printf("请输入一个整数:"); scanf("%d", &n); printf("%.2f的%d次幂是%.2fn", x, n, power(x, n)); return 0; }
2.函数设计第二版本相比于第一版本没有使用循环变量 i 这样可以使函数更加简洁和紧凑
灵活使用运用值传递的优点,可以使函数更加简洁和紧凑
代码清单
①在左下方显示出一个直角三角形(函数版本)
#includevoid put_stars(int no) { while (no-- > 0) printf("★"); } int main(void) { int i, ln; printf("三角形有几层:"); scanf("%d", &ln); for (i = 1; i <= ln; i++) { put_stars(i); putchar('n'); } return 0; }
本函数只用来进行显示的,没有返回结果。没有返回结果的函数类型要声明为void
②逆向显示输入的非负整数
#includeint scan_uint(void) { int tmp; do { printf("请输入一个非负整数:"); scanf("%d", &tmp); if (tmp < 0) puts("a请不要输入非负整数"); } while (tmp < 0); return 0; } int rev_int(int num) { int tmp = 0; if (num > 0) { do { tmp = tmp * 10 + num % 10; num /= 10; } while (num > 0); } return (tmp); } int main(void) { int nx = scan_uint(); printf("该整数倒转后的值是%dn", rev_int(nx)); return 0; }
函数scan_uint读取键盘输入的非负整数并返回。
③计算出最高分
#include#define NUMBER 5 int tensu[NUMBER]; int top (void); int main(void) { extern int tensu[]; int i; printf("请输入%d名学生的分数n",NUMBER); for (i = 0; i < NUMBER; i++) { printf("%d:", i + 1); scanf("%d", &tensu[i]); } printf("最高分=%dn", top()); return 0; } int top(void) { extern int tensu[]; int i; int max = tensu[0]; for (i = 0; i < NUMBER; i++) if (tensu[i] > max) max = tensu[i]; return (max); }
④ 计算英语分数和数学分数的最高分
#include#define NUMBER 5 int max_of(int vc[], int no) { int i; int max = vc[0]; for (i = 1; i < no; i++) if (vc[i] > max) max = vc[i]; return max; } int main(void) { int i; int eng[NUMBER]; int mat[NUMBER]; int max_e, max_m; printf("请输入%d名学生的分数n",NUMBER); for (i = 0; i < NUMBER; i++) { printf("[%d]英语:", i + 1); scanf("%d", &eng[i]); printf(" 数学:"); scanf("%d", &mat[i]); } max_e = max_of(eng, NUMBER); max_m = max_of(mat, NUMBER); printf("英语的最高分=%dn", max_e); printf("数学的最高分=%dn", max_m); return 0; }
⑤将数组元素设置为0
#includevoid int_set(int vc[], int no) { int i; for (i = 0; i < no; i++) vc[i] = 0; } int main(void) { int i; int ary1[] = { 1,2,3,4,5 }; int ary2[] = { 3,2,1 }; int_set(ary1, 5); int_set(ary2, 5); for (i = 0; i < 5; i++) printf("ary1[%d]=%dn", i, ary1[i]); for (i = 0; i < 3; i++) printf("ary2[%d]=%dn", i, ary2[i]); return 0; }
⑥顺序查找
#include#define NUMBER 5 #define FALLED -1 int search(const int vc[], int key, int no) { int i = 0; while (1) { if (i == no) return (FALLED); if (vc[i] == key) return (i); i++; } } int main() { int i, ky, idx; int vx[NUMBER]; for (i = 0; i < NUMBER; i++) { printf("vx[%d]:", i); scanf("%d", &vx[i]); } printf("要查找的值:"); scanf("%d",&ky); idx = search(vx, ky, NUMBER); if (idx == FALLED) puts("a查找失败"); else printf("%d是数组的第%d号元素。n", ky, idx + 1); return 0; }
函数search中while语句的控制表达式为1,因此只有在执行return语句时才能跳出循环,否则就会一直进行下去。像这样从数组开头进行搜索的方法叫做顺序查找
⑦哨兵查找法
#include3.作用域及储存域#define NUMBER 5 #define FALLED -1 int search(int vc[], int key, int no) { int i = 0; vc[no] = key; while (1) { if (vc[i] == key) break; i++; } return (i == no ? FALLED : i); } int main(void) { int i, ky, idx; int vx[NUMBER + 1]; for (i = 0; i < NUMBER; i++) { printf("vx[%d]:", i); scanf("%d", &vx[i]); } printf("要查找的值:"); scanf("%d", &ky); idx = search(vx, ky, NUMBER); if (idx == FALLED) puts("a查找失败"); else printf("%d是数组的第%d号元素n",ky,idx + 1); return 0; }
代码清单
①确定标识符的作用域
#includeint x = 100; void print_x(void) { printf("x=%dn", x); } int main() { int i; int x = 800; print_x(); printf("x=%dn", x); for (i = 0; i < 5; i++) { int x = i * 100; printf("x=%dn", x); } printf("x=%dn", x); return 0; }
②自动存储和静态存储
#includeint fx = 0; void func(void) { static int sx = 0; int ax = 0; printf("%3d%3d%3dn", ax++, sx++, fx++); } int main() { int i; puts("ax sx fx "); puts("-----------"); for (i = 0; i < 10; i++) func(); puts("-----------"); return 0; }
自动存储期:在函数中不使用存储类说明符static而定义出的对象,被赋予了自动存储的空间。它具有以下特性:程序执行到对象声明的时候就创建相应的对象。而执行到包含该声明的程序块的结尾时,对象就会消失。
静态存储期:在函数中使用存储类说明符static而定义出的对象,或者在main函数外声明的对象。该对象有永久的寿命。
③确认默认的初始化
#includeint fx; int main() { static int sx; int ax; printf("ax=%dn", ax); printf("sx=%dn", sx); printf("fx=%dn", fx); return 0; }
sx和fx的变量值为0,而ax会因为编译器的不同而不同。



