C Primer Plus 第9章 函數 9.11 編程練習答案

一、設計函數min(x,y)返回兩個double數值中較小的數值,同時用一個驅動程序測試該函數。c++

#include<stdio.h>
double min(double ,double );

int main(void)
{
 double x,y;
 printf("input two doubles:");
 scanf("%lf%lf",&x,&y);
 printf("the smaller is:%.2lf\n",min(x,y));
 return(0);
}

double min(double a,double b)
{
 r=(a<b?a:b);
}

二、 設計函數chline(ch,i,j),實現指定字符在i列到j列的輸出,同時用一個驅動程序測試該函數。函數

#include<stdio.h>
void chline(char ch,int i,int j);
int main (void)
{
    char ch;
    int x,y;
    printf("Input a char: ");
    scanf("%c",&ch);
    printf("Input two inter: ");
    scanf("%d%d",&x,&y);
    chline(ch,x,y);
    return 0;
}

void chline(char ch,int i,int j)
{
    int k;
    for(k=1;k<i;k++)
        printf(" ");
    for(;k<=j;k++)
        printf("%c",ch);
    return 0;
}

三、編寫一個函數。函數的3個參數是一個字符和兩個整數。字符參數是須要輸出的字符。第一個字符說明了在每行中該字符輸出的個數,而第二個整數指的是須要輸出的行數。編寫一個調用該函數的程序。測試

#include<stdio.h>
void chline(char ch,int i,int j);
int main (void)
{
    char ch;
    int x,y;
    printf("Input a char : ");
    scanf("%c",&ch);
    printf("Input the row and column : ");
    scanf("%d%d",&x,&y);
    chline(ch,x,y);
    return 0;
}

void chline(char ch,int i,int j)
{
    int r,c;
    for(r=1;r<=i;r++)
    {
        for(c=1;c<=j;c++)
            printf("%c",ch);
        printf("\n");
    }
    return 0;
}

四、兩個數的諧均值能夠這樣計算:首先對兩個數值的倒數取平均值,最後再取拿到。編寫一個帶有兩個double參數的函數,計算這兩個參數的諧均值。ui

#include<stdio.h>
double calculate(double,double);;
int main(void)
{
    double a,b;
    printf("Input two doubles: ");
    scanf("%lf%lf",&a,&b);
    printf("1/((1/x+1/y)/2)=%0.3lf\n",calculate(a,b));
    return 0;
}
double calculate(double x,double y)
{
    return 1/((1/x+1/y)/2);
}

五、編寫並測試函數larger_of(),其功能是將兩個double類型變量的數值替換成它們中的較大值。例如,larger_of(x,y)會把x和y中的較大者從新賦值給變量x和y。設計

#include<stdio.h>
void larger_of(double *,double *);
int main(void)
{
    double a,b;
    printf("Input two doubles: ");
    scanf("%lf%lf",&a,&b);
    larger_of(&a,&b);
    printf("the result is: a=%0.3lf,b=%0.3lf\n",a,b);
    return 0;
}
void larger_of(double *x,double *y)
{
    *x=*y=(*x>*y?*x:*y);
}

六、編寫一個程序,使其從標準輸入讀取字符,下到遇到文件結尾。對於每一個字符,程序須要檢查並報告該字符是不是一個字母。若是是的話,程序還應報告字母在字母表中的位置。例如,c和C的字母位置都是3.能夠先實現這樣一個函數:接受一個字符參數,若是該字符是字母則返回該字母的數值位置,不然返回-1。code

#include<stdio.h>
#include<ctype.h>
int adress(char);
int main(void)
{
    char ch;
    printf("Input a ch: ");
    while((ch=getchar())!='\n')
    {
        printf("the position of the char in ABC is: %d\n",adress(ch));
    }
    return 0;
}

int adress(char ch)
{
    if(isalpha(ch))
        return tolower(ch)-'a'+1;
    else
        return -1;
}

七、在第6章「c控制語句:循環」的程序清單6.20中,函數power()的功能是返回一個double類型數的某個正整數次冪。如今改進該函數使用能正確的計算負冪。同時,用該函數實現0的任何次冪爲0,而且任何數值的0次冪爲1。使用循環的方法編寫該函數並在程序中測試它。遞歸

#include<stdio.h>
double power(double ,int);

int main(void)
{
    double x;
    int exp;
    printf("input the base number and the exponent: ");
    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次冪無心義,因此用1/0這個無心義氣數代替
    return pow;
}

八、使用遞歸函數重作練習7.ci

#include<stdio.h>
double power(double ,int);

int main(void)
{
    double x;
    int exp;
    printf("input the base number and the exponent: ");
    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);
    else if(n!=0)
        pow=1;
    else pow=1/n;  //0的0次冪無心義,因此用1/0這個無心義氣數代替
    return pow;
}

九、爲了使程序清單9.8中的函數to_binary()更通常化,能夠在新的函數to_base_n中使用第二個參數,且該參數的範圍從2-10.而後,新函數輸出第一個參數在第二個參數規定的進制數下的數值結果。例如,to_base_n(129,8)的輸出結果是201,也就是129的八進制數值。最後在一個完整的程序中對該函數進行測試。get

#include <stdio.h>
void to_base_n(unsigned long,unsigned int);

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

    printf("Enter an integer (q to quit):\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)
{
    int r ;
    r=n%base;
    if(n>=base)
        to_base_n(n/base,base);
    putchar('0'+r);

    return 0 ;
}

十、編寫並測試一個函數FIbonacci(),在該函數中使用循環代替遞歸完成斐波納契數列的計算。input

#include <stdio.h>
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 n)
{
    int n1,n2,temp,i;
    if(n>2)
        for(n1=1,n2=1,i=3;i<=n;i++)
    {
        temp=n1+n2;  //計算前兩個數的和
        n1=n2;       //把第二個數的值賦給第一個數
        n2=temp;     //把二者以後再賦給第二個變量
    }
    else n2=1;
    return n2;
}
相關文章
相關標籤/搜索