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

时间:2022-10-27 19:03:44
第一题:设计函数min(x,y),返回两个double数值中较小的数值,同时用一个简单的驱动程序测试该函数。
解:
代码如下:
#include <stdio.h>
double min(double x,double y);
int main(void)
{
    double x,y,m;


    printf("Input two double,I will tell you witch is smaller.\n");
    scanf("%lf %lf",&x,&y);
    m = min(x,y);
    printf("%lf is smaller.\n",m);
    return 0;
}
double min(double x,double y)
{
    return (x < y)?x:y;
}
———————————————分割线—————————————————
第二题:设计函数chline(ch,i,j),实现指定字符在i列到j列的输出,并用一个简单的驱动程序测试该函数。
解:
代码如下:
#include <stdio.h>
void chline(char ch,int i,int j);
int main(void)
{
    char ch;
    int i,j;


    printf("Input a char:");
    scanf("%c",&ch);
    printf("Input two int(first is small than second):");
    scanf("%d %d",&i,&j);
    chline(ch,i,j);
    return 0;
}
void chline(char ch,int i,int j)
{
    int count;
    
    for(count = 1;count <= j;count++)
    {
        if(count >= i)
            putchar(ch);
        else
            putchar(' ');
    }
    printf("\n");
}
———————————————分割线—————————————————
第三题:编写一个函数,包含三个参数,第一个是字符,表示需要打印的字符,第二个整数,是每行需要打印的个数,第三个是整数,是需要打印的行数,用一个程序来测试该函数。
解:
代码如下:
#include <stdio.h>
void print(char ch,int i,int j);
int main(void)
{
    char ch;
    int i,j;


    printf("Input a char:");
    scanf("%c",&ch);
    printf("Input two int:");
    scanf("%d %d",&i,&j);
    print(ch,i,j);
    return 0;
}
void print(char ch,int i,int j)
{
    int count1,count2;
    
    for(count1 = 1;count1 <= j;count1++)
    {
        for(count2 = 1;count2 <= i;count2++)
            putchar(ch);
        printf("\n");
    }
}
———————————————分割线—————————————————
第四题:两数值的谐均值可以这样计算:首先对两数值的倒数取平均值,最后再取倒数。编写一个带有两个double参数的函数,计算这两个参数的谐均值。(为了测试,个人编写了驱动程序)
解:
代码如下:
#include <stdio.h>
double xie(double i,double j);
int main(void)
{
    double i,j;


    printf("Input two double:");
    scanf("%lf %lf",&i,&j);
    printf("The Harmonic mean of your Input is %lf\n",xie(i,j));
    return 0;
}
double xie(double i,double j)
{
   return  1.0 / ((1.0 / i +1.0 / j) / 2.0);
}
———————————————分割线—————————————————
第五题:编写并测试函数larger_of(),其功能是将两个double类型变量的数值替换成他们中的较大值。例如,larger_of(x,y)会把x和y中的较大值重新赋值给变量x和y。
解:用指针实现
代码如下:
#include <stdio.h>
void larger_of(double * x,double * y);
int main(void)
{
    double x,y;


    
    printf("Input two double:");
    scanf("%lf %lf",&x,&y);
    larger_of(&x,&y);
    printf("The two double your Input is changed to x = %lf and y = %lf\n",x,y);
    return 0;
}
void larger_of(double * x,double * y)
{
    if(*x < *y)
        *x = *y;
    else
        *y = *x;
}
———————————————分割线—————————————————
第六题:编写一个程序,使其从标准输入读取字符,直到遇到文件结尾。对于每个字符,程序需要检查并报告该字符是否是一个字母。如果是的话,程序还应该报告该字母在字母表中的数值位置。例如c和C的字母位置都是3。可以先实现这样一个函数:接收一个字符参数,如果该字符为字母则返回该字母的数值位置,否则返回-1。
解:
代码如下:
#include <stdio.h>
#include <ctype.h>
int isa(char ch);
int main(void)
{
    char ch;
    int re;


    printf("Input a text:\n");
    while((ch = getchar()) != EOF)
    {
        re = isa(ch);
        if(re > 0)
            printf("%c is a alphabet and its localtion is %d.\n",ch,re);
        else
            printf("%c is not a alphabet.\n",ch);
    }
    return 0;
}
int isa(char ch)
{
    int re;


    if(isalpha(ch))
    {
        if(isupper(ch))
            re = ch - '@';
        else
            re = ch - 'a' + 1;
    }
    else
        re = -1;
    return re;
}
———————————————分割线—————————————————
第七题:在程序清单6.20中,函数power()的功能是返回一个double类型数的某个正整数次冥。现在改进该函数,使其能正确地计算负冥。同时,用该函数实现0的任何次冥为0,并且任何数值的0次冥为1.使用循环的方法编写该函数并在程序中测试它。
解:负冥计算为正冥的倒数,例如5的负1次方为5的1次方的倒数,值为1/5。
代码如下:
#include <stdio.h>
double power_f(double x,int y);
int main(void)
{
    double x;
    int y;


    printf("Input a double and a int:\n");
    scanf("%lf %d",&x,&y);
    printf("the result is %lf\n",power_f(x,y));
    return 0;
}
double power_f(double x,int y)
{
    double result = 1.0;
    int count;
 
    if(x == 0.0)
        return 0.0;
    if(y == 0)
        return 1.0;
    if(y > 0)
    {
        for(count = 1;count <= y;count++)
            result *= x;
    }
    if(y < 0)
    {
        for(count = 1;count <= -y;count++)
            result *= x;
        result = 1.0/result;
    }
    return result;
}
———————————————分割线—————————————————
第八题:用递归函数重做第七题
解:
代码如下:
#include <stdio.h>
double power_f(double x,int y);
int main(void)
{
    double x;
    int y;


    printf("Input a double and a int:\n");
    scanf("%lf %d",&x,&y);
    printf("the result is %lf\n",power_f(x,y));
    return 0;
}
double power_f(double x,int y)
{
    double result = 1.0;
    int count;
 
    if(x == 0.0)
        return 0.0;
    if(y == 0)
        return 1.0;
    if(y > 0)
    {
        result = x * power_f(x,y - 1);
    }
    if(y < 0)
    {
        result = x * power_f(x,-y - 1); //这里对y去反后,就调用递归函数的y > 0的情况,所以不会出现多次的取倒数。
        result = 1.0/result;
    }
    return result;
}
———————————————分割线—————————————————
第九题:为了使程序清单9.8中的函数to_binary()更一般化,可以在心的函数to_base_n()中使用第二个参数,且该参数的范围从2到10。然后,这个新函数输出第一个参数在第二个参数规定的进制数下的数值结果。例如,to_base_n(129,8)的输出时201,也就是129的八进制数值。最后在一个完整的程序中对该函数进行测试。
解:
代码如下:
#include <stdio.h>
void to_base_n(int x,int y);
int main(void)
{
    int x,y;


    printf("Input a int for number and a int for like binary:\n");
    scanf("%d %d",&x,&y);
    to_base_n(x,y);
    printf("\n");
    return 0;
}
void to_base_n(int x,int y)
{
    int n1,n2;


    n1 = x /y ;
    n2 = x %y;
    if(n1 < y)
        putchar('0' + n1);
    else 
        to_base_n(n1,y);
    putchar('0' + n2);
}
———————————————分割线—————————————————
第十题:编写并测试一个函数Fibonacci(),在该函数中使用循环替代递归完成斐波纳契数列的计算。
#include <stdio.h>
double Fibonacci(int n);
int main(void)
{
    int n;
  
    printf("Input a int about how many times to compute the Fibonacci.\n");
    scanf("%d",&n);
    printf("%d times Fibonacci number is %.20e\n",n,Fibonacci(n));
    return 0;
}
double Fibonacci(int n)
{
    double pre,re,temp;
    pre = 1.0;
    re = 1.0;
    int i;


    if(n < 3)
        return 1;
    else
    {
        for(i = 3;i <= n;i++)
        { 
            temp = re;
            re += pre;
            pre = temp;
        }
    }
    return re;
}