您的位置:首页 > 编程语言 > C语言/C++

《明解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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息