1. 程式人生 > >《明解C語言》示例程式碼和練習程式碼[第8章]

《明解C語言》示例程式碼和練習程式碼[第8章]

第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(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-1 /*---編寫一段程式,計算出15減去37的結果,並以“15減去37 的結果時-22。”的格式進行顯示。*/ #include <stdio.h> int main (void) { printf("15減去37的結果是%d\n",15-

C語言示例程式碼練習程式碼[8]

第8章 動手編寫各種程式吧 示例程式碼: 示例程式碼8-1 /* 整數的平方和浮點數的平方(函式) */ #include <stdio.h> // int型整數的平方值

C語言示例程式碼練習程式碼[9]

第9章 字串的基本認識 示例程式碼: 示例程式碼9-1 /* 顯示字串字面長度 */ #include <stdio.h> int main(void) { prin

C語言示例程式碼練習程式碼[11]

第11章 字串和指標 示例程式碼: 示例程式碼11-1 /* 用陣列實現的字串和用指標實現的字串 */ #include <stdio.h> int main(void) {

C語言示例程式碼練習程式碼[12]

第12章 結構體 示例程式碼: 示例程式碼12-1 /* 將5名學生的“身高”按升序排列 */ #include <stdio.h> #define NUMBER 5 //

C語言示例程式碼練習程式碼[3]

第3章 分支結構程式 示例程式碼: 示例程式碼 3-1 /* 輸入的整數能被5整除嗎 */ #include <stdio.h> int main(void) { int vx; printf("請輸入一個整數:");

哨兵查詢法(c語言

//哨兵法,就是將待查詢的元素加入待查詢的陣列的後面,這樣可以提高效能(在資料量很龐大的時候體現出來) #include <stdio.h> #define FAILURE -1 //使用for迴圈的 int searching1(int v[],int key,int n) {

C語言入門篇練習題

練習7-1#include <stdio.h> int main(void) { int n = 1; printf("sizeof 1 : %u\n",sizeof(1)); printf("sizeof +1 : %u\n", sizeof(+1));

C語言入門篇練習題

練習5-1#include <stdio.h> int main(void) { int i; int v[5]; /* int[5]陣列 */ for (i = 0; i < 5; i++) /* 為陣列元素賦值 */ v[i] = i; f

C語言入門篇練習題

練習9-1#include<stdio.h> int main(void) { char str[] = "ABC\0DEF"; printf("string str = %s\n",str); return 0; }練習9-2#include<st

C語言》筆記及課後習題答案 【十二

練習12-1/*---編寫顯示物件takao各成員地址的程式。---*/ #include <stdio.h> #define NAME_LEN 64 struct student { char name[NAME_LEN]; int height;

C語言》筆記及課後習題答案 【

練習3-1/*---輸入兩個整數,判斷後者是否為前者的約數---*/ #include <stdio.h> int main(void) { int a,b; puts("請輸入兩個整數。"); printf("整數a:"); scanf("%d"

C語言中級篇練習題第一

練習1-1#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int qian; srand(time(NULL));//seed qi

C語言》筆記及課後習題答案 【

練習6-1/*---返回兩個int型整數中較小一數的值---*/ #include <stdio.h> int min2(int a, int b){ if (a > b) return b; else return a; } int ma

C語言中級篇練習題第二

練習2-1#include <time.h> #include <stdio.h> /*--- 等待x毫秒 ---*/ int sleep(unsigned long x) { clock_t c1 = clock(), c2; do { i

C語言》筆記及課後習題答案 【

練習9-1/*---輸出字元陣列char str[] = "ABC\0DEF"---*/ #include <stdio.h> int main(void) { char str[] = "ABC\0DEF"; printf("字串str為\"%s\

C語言》筆記及課後習題答案 【

練習5-1/*---從頭順次為陣列中的元素賦值0,1,2,3,4---*/ #include <stdio.h> int main(void) { int i, v[5]; for(i = 0;i < 5; i++){ v[i] = i;

C語言 入門篇 答案

  練習4-1 #include <stdio.h> int main(void) { int no; int x; do{ printf("請輸入一個整數:"); scanf("%d", &no);

C語言程式設計(第二版)6程式設計題

1:找出與平均值相差最小的元素 #include"stdio.h" #include"math.h" #define N 10 void main() { int i; double a[N],v=0,min; printf("Please input

挑戰程式設計競賽 演算法資料結構 8

//ALDS1_7_B Binary Trees #include <stdio.h> #include <string.h> struct node{     int parent,left,right; }T[30]; int H[30],D[30];//H[]高度 D[]深度