明解c语言 练习,《明解C语言》示例代码和练习代码[第8章]

第8章 动手编写各种程序吧

示例代码:

示例代码8-1

/*

整数的平方和浮点数的平方(函数)

*/

#include // 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 #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 #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 #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 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 // 返回阶乘的值

int factorial(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 // 返回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 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 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 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 int main(void)

{

int ch;

while ((ch = getchar()) != EOF)

putchar(ch);

return (0);

}

练习代码:

练习代码e8-1

/*

定义一个函数式宏diff(x, y),返回x、y二值之差

*/

#include #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 #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 #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 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 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 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 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 int main(void)

{

int ch;

int n = 0;

while ((ch = getchar()) != EOF) {

putchar(ch);

if (ch == '\n') n++;

}

printf("一共输入了%d行。\n", n);

return (0);

}