第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);
}