《明解C语言》示例代码和练习代码[第8章]
2016-12-20 10:16
260 查看
第8章 动手编写各种程序吧
示例代码:
示例代码8-1
/* 整数的平方和浮点数的平方(函数) */ #include <stdio.h> // int型整数的平方值 int sqr_int(int x) { return (x * x); } // double型浮点数的平方值 double sqr_double(double x) { return (x * x); } int main(void) { int nx; double dx; printf("请输入一个整数:"); scanf("%d", &nx); printf("该数的平方是%d。\n", sqr_int(nx)); printf("请输入一个实数:"); scanf("%lf", &dx); printf("该数的平方是%f。\n", sqr_double(dx)); return (0); }
示例代码8-2
/* 整数的平方和浮点数的平方(函数式宏) */ #include <stdio.h> #define sqr(x)((x) * (x)) // 计算x的平方 int main(void) { int nx; double dx; printf("请输入一个整数:"); scanf("%d", &nx); printf("该数的平方是%d。\n", sqr(nx)); printf("请输入一个实数:"); scanf("%lf", &dx); printf("该数的平方是%f。\n", sqr(dx)); return (0); }
示例代码8-3
/* 响铃并显示的宏定义(误例) */ #include <stdio.h> #define putsa(str) { putchar('\a'); puts(str); } int main(void) { int na; printf("请输入一个整数:"); scanf("%d", &na); if (na) putsa("这个数不是0。"); else putsa("这个数是0。"); return (0); }
示例代码8-4
/* 响铃并显示的宏定义(误例) */ #include <stdio.h> #define putsa(str) ( putchar('\a'), puts(str) ) int main(void) { int na; printf("请输入一个整数:"); scanf("%d", &na); if (na) putsa("这个数不是0。"); else putsa("这个数是0。"); return (0); }
示例代码8-5
/* 显示所选动物的叫声 */ #include <stdio.h> enum animal { Dog, Cat, Monkey, Invalid }; // 狗叫 void dog(void) { puts("汪汪!"); } // 猫叫 void cat(void) { puts("喵~!"); } // 猴叫 void monkey(void) { puts("唧唧!!"); } // 选择动物 enum animal select(void) { int tmp; do { printf("0...狗 1...猫 2...猴 3...结束:"); scanf("%d", &tmp); } while (tmp < Dog || tmp > Invalid); return (tmp); } int main(void) { enum animal selected; do { switch (selected = select()) { case Dog : dog(); break; case Cat : cat(); break; case Monkey : monkey(); break; } } while (selected != Invalid); return (0); }
示例代码8-6
/* 计算阶乘 */ #include <stdio.h> // 返回阶乘的值 int factorial( 4000 int n) { if (n > 0) return (n * factorial(n - 1)); else return (1); } int main(void) { int num; printf("请输入一个整数:"); scanf("%d", &num); printf("\该数阶乘为:%d。\n", factorial(num)); return (0); }
示例代码8-7
/* 求出最大公约数 */ #include <stdio.h> // 返回vx和vy的最大公约数(vx >= vy) int gcdf(int vx, int vy) { return (vy == 0 ? vx : gcdf(vy, vx % vy)); } // 求出va和vb的最大公约数 int gcd(int va, int vb) { return (va > vb ? gcdf(va, vb) : gcdf(vb, va)) ; } int main(void) { int n1, n2; puts("请输入两个整数。"); printf("整数1:"); scanf("%d", &n1); printf("整数2:"); scanf("%d", &n2); printf("最大公约数是%d。\n", gcd(n1, n2)); return (0); }
示例代码8-8
/* 计算标准输入流中出现的数字字符数 */ #include <stdio.h> int main(void) { int i, ch; int cnt[10] = {0}; // 数字字符的出现次数 while (1) { // 死循环 ch = getchar(); if (ch == EOF) break; switch (ch) { case '0' : cnt[0]++; break; case '1' : cnt[1]++; break; case '2' : cnt[2]++; break; case '3' : cnt[3]++; break; case '4' : cnt[4]++; break; case '5' : cnt[5]++; break; case '6' : cnt[6]++; break; case '7' : cnt[7]++; break; case '8' : cnt[8]++; break; case '9' : cnt[9]++; break; } } puts("数字字符的出现次数"); for (i = 0; i < 10; i++) printf("'%d' : %d\n", i, cnt[i]); return(0); }
示例代码8-9
/* 计算标准输入流中出现的数字字符数(第2版) */ #include <stdio.h> int main(void) { int i, ch; int cnt[10] = {0}; // 数字字符的出现次数 while (1) { // 死循环 ch = getchar(); if (ch == EOF) break; if (ch >= '0' && ch <= '9') cnt[ch - '0']++; } puts("数字字符的出现次数"); for (i = 0; i < 10; i++) printf("'%d' : %d\n", i, cnt[i]); return(0); }
示例代码8-10
/* 显示EOF和数字字符的值 */ #include <stdio.h> int main(void) { int i; printf("EOF = %d\n", EOF); for (i = 0; i < 10; i++) printf("'%d' = %d\n", i, '0' + i); return (0); }
示例代码8-11
/* 从标准输入流复制到标准输出流 */ #include <stdio.h> int main(void) { int ch; while ((ch = getchar()) != EOF) putchar(ch); return (0); }
练习代码:
练习代码e8-1
/* 定义一个函数式宏diff(x, y),返回x、y二值之差 */ #include <stdio.h> #define diff(x, y) x - y int main(void) { int n1, n2; printf("请输入两个整数:"); scanf("%d%d", &n1, &n2); printf("两数之差是%d。\n", diff(n1, n2)); system("pause"); return (0); }
练习代码e8-2
/* 定义返回x、y中较大值的函数式宏 */ #include <stdio.h> #define max(x, y) (((x) > (y) ? (x) : (y))) int main(void) { int a, b, c, d; printf("请输入四个整数:"); scanf("%d%d%d%d", &a, &b, &c, &d); printf("max(max(a, b), max(c, d))返回值是%d。\n", max(max(a, b), max(c, d))); printf("max(max(max(a, b), c), d)返回值是%d。\n", max(max(max(a, b), c), d)); system("pause"); return (0); }
练习代码e8-3
/* 定义一个函数式宏swap(type, a, b)以使type型的两值互换 */ #include <stdio.h> #define swap(type, a, b) type t; t = a; a = b; b = t; int main(void) { int a, b; double c, d; printf("请输入两个整数:"); scanf("%d%d", &a, &b); printf("\n前:a = %d, b = %d\n", a, b); swap(int, a, b) printf("\n后:a = %d, b = %d\n", a, b); /* printf("请输入两个实数:"); scanf("%lf%lf", &c, &d); printf("\n前:c = %f, d = %f\n"); swap(double, c, d) printf("\n后:c = %f, d = %f\n"); */ return (0); }
练习代码e8-4
/* 在程序中定义表示性别、季节等的枚举类型,并有效使用它们 */ #include <stdio.h> enum sex {male, female}; enum season {spring, summer, fall, winter}; // 选择性别 enum sex select_s(void) { int tmp; do { printf("0...男 1...女"); scanf("%d", &tmp); } while (tmp < male || tmp > female); return (tmp); } // 选择季节 enum season select_ss(void) { int tmp; do { printf("0...春季 1...夏季 2...秋季 3...冬季"); scanf("%d", &tmp); } while (tmp < spring || tmp > winter); return (tmp); } int main(void) { enum sex s; enum season ss; s = select_s(); ss = select_ss(); if (s) printf("选择的性别是:女性\n"); else printf("选择的性别是:男性\n"); switch (ss) { case 0 : printf("选择的季节是:春季\n"); break; case 1 : printf("选择的季节是:夏季\n"); break; case 2 : printf("选择的季节是:秋季\n"); break; case 3 : printf("选择的季节是:冬季\n"); break; } return (0); }
练习代码e8-5
/* 不使用递归,定义如下函数,使其返回整数n的阶乘 */ #include <stdio.h> int fact(int n) { int f = 1; while (n) f *= n--; return f; } int main(void) { int num; printf("请输入一个整数:"); scanf("%d", &num); printf("\该数阶乘为:%d。\n", fact(num)); return (0); }
练习代码e8-6
/* 求出从n个不同整数中取出r个整数的组合数 */ #include <stdio.h> int combination(int n, int r) { int c; if (r == 0 || n == r) c = 1; else if (r == 1) c = n; else c = combination(n - 1, r - 1) + combination(n - 1, r); return (c); } int main(void) { int n, r; printf("请输入个数:"); scanf("%d", &n); printf("请输组合数:"); scanf("%d", &r); printf("%d的%d组合结果是:%d。\n", n, r, combination(n, r)); return (0); }
练习代码e8-7
/* 计算标准输入流中出现的数字字符数(出现次数用*表示) */ #include <stdio.h> int main(void) { int i, ch; int cnt[10] = {0}; // 数字字符的出现次数 while (1) { // 死循环 ch = getchar(); if (ch == EOF) break; if (ch >= '0' && ch <= '9') cnt[ch - '0']++; } puts("数字字符的出现次数"); for (i = 0; i < 10; i++) { printf("'%d' : ", i); while (cnt[i]--) printf("*"); putchar('\n'); } return(0); }
练习代码e8-8
/* 计算标准输入流中出现的行数 */ #include <stdio.h> int main(void) { int ch; int n = 0; while ((ch = getchar()) != EOF) { putchar(ch); if (ch == '\n') n++; } printf("一共输入了%d行。\n", n); return (0); }
相关文章推荐
- 《明解C语言》示例代码和练习代码[第1章]
- 《明解C语言》示例代码和练习代码[第10章]
- 《明解C语言》示例代码和练习代码[第3章]
- 《明解C语言》示例代码和练习代码[第2章]
- 《明解C语言》示例代码和练习代码[第9章]
- 《明解C语言》示例代码和练习代码[第4章]
- 《明解C语言》示例代码和练习代码[第6章]
- 《明解C语言》示例代码和练习代码[第5章]
- 《明解C语言》示例代码和练习代码[第12章]
- 《OpenGL ES 2.0 Programming Guide》第8章 “最简单的Vertex Buffer Object”示例代码【C语言版】
- JAVA__窗口示例代码之布局的练习
- 数据科学Python基础(附示例代码和练习题目)
- 数据科学Python基础(附示例代码和练习题目)
- 《明解C语言第3版.入门篇》练习代码 第12章
- 【Todo】Java并发学习 & 示例练习及代码
- 数据科学Python基础(附示例代码和练习题目)
- 《明解C语言第3版.入门篇》练习代码 第11章
- Accelerated C++:通过示例进行编程实践——练习解答(第8章)
- opencv图像处理——形态学腐蚀膨胀练习示例代码
- 编程更改公式字段示例代码