《明解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);    
}

你可能感兴趣的:(C)