C primer plus 第九章(函数)编程练习--第五版

C primer plus 第九章(函数)编程练习–第五版


C语言编程练习都为本人学习时的编写代码记录或学习笔记,若有不当之处欢迎指正,感激不尽。(其中编程设计也可有其他设计方案,本人目前仅在学习中,所以仅为个人学习纪录,仅供参考。)



1.设计函数 min(x,y),返回两个 double 数值中较小的数值,同时用一个简单的驱动程序测试该函数。

#include

double min(double, double);
/* test */
int main(void)
{
    double x, y;

    printf("Please input two doubles:\n");
    scanf("%lf %lf", &x, &y);
    printf("The smaller is: %lf\n",min(x, y));

    return 0;
}

/* function */
double min(double x, double y)
{
    return(x > y ? y:x);
}


2.设计函数 chline(ch, i, j),实现指定字符在 i 列到 j 列的输出,并用一个简单的驱动程序测试该函数。

#include

void chline(char ,int , int );
/* test */
int main(void)
{
    int i, j;
    char ch;

    printf("Please input a character:\n");
    scanf("%c", &ch);

    printf("Please input two integers:\n");
    scanf("%d%d", &i, &j);

    chline(ch, i, j);

    return 0;
}

/* function */
void chline(char ch, int i, int j)
{
    int k;

    for(k = 0; k < i; k++)
        printf(" ");

    for(; k < j; k++)
        printf("%c", ch);
    printf("\n");
}


3.编写一个函数。函数的 3 个参数是一个字符和两个整数。字符参数是需要输出的字符。第一个整数说明了在每行中该字符输出的个数,而第二个整数指的是需要输出的行数。编写一个调用该函数的程序。

#include

void chline(char , int , int );

int main(void)
{
    int i, j;
    char ch;

    printf("Please input a character: \n");
    scanf("%c", &ch);

    printf("Please input column and row:\n");
    scanf("%d%d", &i, &j);

    chline(ch, i, j);

    return 0;
}

/* print characters */
void chline(char ch, int i, int j)
{
    int x, y;

    for(x = 0; x < j; x++) {
        for(y = 0; y < i; y++)
            printf("%c", ch);
    printf("\n");

    }
}


4.两数值的谐均值可以这样计算:首先对两数值的倒数取平均值,最后再取倒数。编写一个带有两个 double 参数的函数,计算这两个参数的谐均值。

#include

double getvalue(double , double );

int main(void)
{
    double x, y;

    printf("Please input two doubles:\n");
    scanf("%lf%lf", &x, &y);

    printf("1/((1/x + 1/y) / 2) = %.4lf\n",getvalue(x, y));

    return 0;
}

double getvalue(double x, double y)
{
    return 1/((1/x + 1/y) / 2);
}


5.编写并测试函数 larger_of(),其功能是将两个 double 类型变量的数值替换成它们中的较大值。例如larger_of(x,y)会把 x 和 y 中的较大数值重新赋给变量 x 和 y .

#include

void getmax(double *, double *);

int main(void)
{
    double x, y;

    printf("Please input two doubles:\n");
    scanf("%lf%lf", &x, &y);

    getmax(&x, &y);
    printf("x = %.3lf; y = %.3lf\n", x, y);

    return 0;
}

void getmax(double *x, double *y)
{
    *x = *y = *x > *y ? *x: *y;
}


6.编写一个程序,使其从标准输入读取字符,直到遇到文件结尾。对于每个字符,程序需要检查并报告该字符是否是一个字母。如果是的话,程序还应报告该字母在字母表中的数值位置。例如,c 和 C 的字母位置都是 3。可以先实现这样一个函数:接受一个字符参数,如果该字符为字母则返回该字母的数值位置,否则返回-1。

#include
#include

int retnloc(char );

int main(void)
{
    int m;
    char ch;

    printf("Please input some letters: \n");
    while( scanf("%c\n", &ch) != EOF) {
        m = retnloc(ch);
        if(m == -1)
            printf("\n%d.(it isn't a letter.)\n", m);
        else
            printf("\nThe position of letter in alphabet is %d.\n", m);         
    }

    return 0;
}
/* returns location or -1 */
int retnloc(char ch)
{
        if(isalpha(ch))
            return tolower(ch) - 'a' + 1;
        else
            return -1;
}


7.在第 6 章“C 控制语句:循环”的程序清单 6.20 中,函数 power()的功能是返回一个 double 类型数的某个正整数次幂。现在改进该函数,使其能正确地计算负幂。同时,用该函数实现 0 的任何次幂为 0,并且任何数值的 0次幂为 1。使用循环的方法编写该函数并在一个程序中测试它。

#include

double power(double , int );

int main(void)
{
    int exp;
    double x;

    printf("Please input the base number and the exponent:\n");
    scanf("%lf%d", &x, &exp);

    printf("%.3g to the power %d is %.5g\n", x, exp, power(x, exp));

    return 0;
}

double power(double n, int p)
{
    int i;
    double pow = 1;

    if(p > 0) {
        for(i = 1; i <=p; i++)
            pow *= n;
    }

    else if(p < 0) {
        for(i = -1; i >=p; i--)
            pow /= n;
    }

    else if(n != 0)
        pow = 1;

    else
        pow = 1 / n;   /* 0/0 meaningless, so replace it with 1/0(1.#INF) */

    return pow;

}


8.使用递归函数重做练习 7。

#include

double power(double , int );

int main(void)
{
    int exp;
    double x;

    printf("Please input the base number and the exponent:\n");
    scanf("%lf%d", &x, &exp);

    printf("%.3g to the power %d is %.5g\n", x, exp, power(x, exp));

    return 0;
}

double power(double n, int p)
{
    int i;
    double pow = 1;

    if(p > 0) {
        for(i = 1; i <=p; i++)
            pow *= n;
    }

    else if(p < 0) {
        for(i = -1; i >=p; i--)
            pow = 1 / power(n, -p);  /* used recursion */
    }

    else if(n != 0)
        pow = 1;

    else
        pow = 1 / n;   /* 0/0 meaningless, so replace it with 1/0(1.#INF) */

    return pow;

}


9.为了使程序清单 9.8 中的函数 to_binary()更一般化,可以在新的函数 to_base_n()中使用第二个参数,且该参数的范围从 2 到 10。然后,这个新函数输出第一个参数在第二个参数规定的进制数下的数值结果。例如to_base_n (129,8)的输出是 201,也就是 129 的八进制数值。最后在一个完整的程序中对该函数进行测试。

/* binary.c -- ... */
#include

void to_base_n(unsigned long , unsigned int);

int main(void)
{
    unsigned long number;
    unsigned int base;

    printf("Enter an integer and the base(q to quit): \n ");
    printf("*****base 意指转换进制*****\n");
    while(scanf("%lu%u", &number, &base) == 2) {
        printf("%lu's base %u equivalent:", number, base);
        to_base_n(number, base);
        putchar('\n');
        printf("Enter an integer (q to quit): \n");
    }
    printf("Done.\n");
    return 0;
}

void to_base_n(unsigned long n, unsigned int base)  /* recursive fuction */
{
    int r;

    r = n % base;
    if(n >= base)
        to_base_n(n / base, base);
    putchar('0' + r);

    return ;
}


10.编写并测试一个函数 Fibonacci(),在该函数中使用循环代替递归完成斐波纳契数列的计算。

#include

long Fibonacci(int );

int main(void)
{
    int n;

    printf("Enter an integer (q to quit):\n");
    while(scanf("%d", &n) == 1) {
        printf("The term %d of Fibonacci sequence is %d\n", n, Fibonacci(n));
        printf("Enter an integer(q to quit!):\n");

    }

    printf("Done.\n");

    return 0;
}

long Fibonacci(int x)
{
    int x1, x2, t, y;

    if( x > 2)
        for(x1 = 1, x2 = 1, y = 3; y <= x; y++) {
            t = x1 + x2;
            x1 = x2;
            x2 = t;
        }
    else
    x2 = 1;

    return x2;
}

你可能感兴趣的:(linux,C)