C Primer Plus 第9章 函数 复习题与编程练习

C Primer Plus 第9章 函数 复习题与编程练习
问题:编写一个函数将一个整数转换成二进制形式?( 扩展请移步编程练习9)
#include <stdio.h>
void to_binary(unsigned  long n);
int main( void)
{
    unsigned  long number;
    printf("Enter an integer (q to quit): \n");
     while(scanf("%lu", &number) == 1)
    {
        printf("Binary equivalent: ");
        to_binary(number);
        putchar('\n');
        printf("Enter an integer (q to quit): \n");
    }
    printf("Done!\n");
     return 0;
}
void to_binary(unsigned  long n)
{
     int r;
    r = n % 2;
     if(n >= 2)
        to_binary(n / 2);
    putchar('0' + r);
     return;
}
复习题
1、实际参数和形式参量有何不同?
答:
形式参量(也被称为形式参数)是一个变量,它在被调函数中进行定义。实际参数是在函数调用中出现的值,它被赋值给形式参量。可以把实际参数认为是在函数被调用时用来初始化形式参量的值。
2、写出下面所描述的各个函数的ANSI函数头。注意:只写出函数头即可,不需要实现。
a.donut()接受一个int类型的参数,然后输出若干个0,输出0的数目等于参数的值。
b.gear()接受两个int类型的参数并返回int类型的值。
c.stuff_it()的参数包括一个double类型的值以及一个double类型变量的地址,功能是把第一个数值存放到指定的地址中。
答:
a. void donut( int n)
b. int gear( int n,  int m)
c. void stuff_it( double n,  double * d)
3、只写出下列函数的ANSI C函数头,不需要实现函数。
a.n_to_char()接受一个int类型的参数并返回一个char类型的值。
b.digits()接受的参数是一个double类型的数值和一个int类型的数值,返回值类型是int。
c.random()不接受参数,返回int类型的数值。
答:
a. char n_to_char( int n)
b. int digits( double n,  int m)
c. int random( void)
4、设计一个实现两整数相加并将结果返回的函数。
答:
int plus( int n,  int m)
{
     return n + m;
}
5、假如问题4中的函数实现两个double类型的数值相加,那么应该如何修改原函数?
答:
double plus( double n,  double m)
{
     return n + m;
}
6、设计函数alter(),其输入参数是两个int类型的变量x和y,功能是分别将这两个变量的数值改为它们的和以及它们的差。
答:( 注意:下面这种写法是错误的!!!)
void alter( int x,  int y)
{
    x = x + y;
    y = x - y;
}
正确的写法如下:
void alter( int * u,  int * v)
{
     int temp;

    temp = *u;
    *u = *u + *v;
    *v = temp - *v;
}
7、判断下面的函数定义是否正确。
void salami(num)
{
     int num, count;

     for(count = 1; count <= num; num++)
        printf("O salami mio!\n");
}
答:
有错误。num应该在salami()的参数列表中而不是在花括号之后声明,而且应该是count++而不是num++。
8、编写一个函数,使其返回3个整数参数中的最大值。
答:
int max( int x,  int y,  int z)
{
     int max;
     if(x > y)
         if(x > z)
            max = x;
         else
            max = z;
     else
         if(y > z)
            max = y;
         else
            max = z;
     return max;
}
or ( 更简洁一点)
int max( int x,  int y,  int z)
{
     int max = x;
     if(y > max)
        max = y;
     if(z > max)
        max = z;
     return max;
}
9、给定下面的输出:
Please choose one of the following:
1)copy files 2)move files
3)remove files 4)quit
Enter the number of your choice:
a.用一个函数实现菜单的显示,且该菜单有4个用数字编号的选项并要求你选择其中之一(输出应该如题中所示)。
b.编写一个函数,该函数接受两个int类型的参数:一个上界和一个下界。在函数中,首先从输入终端读取一个整数,如果该整数不在上下界规定的范围内,则函数重新显示菜单(使用本题目a部分中的函数)以再次提醒用户输入新值。如果输入数值在规定的范围内,那么函数应该将数值返回给调用函数。
c.使用本题目a和b部分中的函数编写一个最小的程序。最小的意思是该程序不需要实现菜单中所描述的功能;它只需要显示这些选项并能获取正确的响应即可。
答:(参考课后答案)
#include <stdio.h>
void menu( void);
int get_input( intint);
int main( void)
{
     int res;

    menu();
     while((res = get_input(1, 4)) != 4)
        printf("I like choice %d.\n", res);
    printf("Bye!\n");
     return 0;
}
void menu( void)
{
    printf("Please choose one of the following: \n");
    printf("1)copy files          2)move files\n");
    printf("3)remove files        4)quit\n");
    printf("Enter the number of your choice: \n");
}
int get_input( int min,  int max)
{
     int number;

    scanf("%d", &number);
     while(number < min || number > max)
    {
        printf("%d is not a valid choice; try again.\n", number);
        menu();
        scanf("%d", &number);
    }
     return number;
}
编程练习
1、
#include <stdio.h>
double min( doubledouble);
int main( void)
{
    printf("One of the smaller of the two numbers is %.2f", min(23.34, 12.11));
     return 0;
}
double min( double x,  double y)
{
     return x < y ? x : y;
}
2、
#include <stdio.h>
void chline( char ch,  int i,  int j);
int main( void)
{
    chline('$', 3, 5);
     return 0;
}
void chline( char ch,  int i,  int j)
{
     int index;

     for(index = 1; index < i; index++)
        putchar(' ');
     for(index = 1; index <= j - i + 1; index++)
        putchar(ch);
}
3、
#include <stdio.h>
void chline( char ch,  int col,  int row);
int main( void)
{
    chline('$', 3, 5);
     return 0;
}
void chline( char ch,  int col,  int row)
{
     int i, j;

     for(i = 0; i < row; i++)
    {
         for(j = 0; j < col; j++)
           putchar(ch);
        putchar('\n');
    }
}
4、
#include <stdio.h>
double computer( double a,  double b);
int main( void)
{
    printf("%.2f和%.2f的谐均值是:%.3f\n", 0.3, 0.5, computer(0.3, 0.5));
     return 0;
}
double computer( double a,  double b)
{
     double result;

    result = 1 / ((1/a + 1/b) / 2);
     return result;
}
5、
#include <stdio.h>
void larger_of( double *,  double *);
int main( void)
{
     double x = 23.3;
     double y = 34.4;
    printf("Originally x = %.1f; y = %.1f\n", x, y);
    larger_of(&x, &y);
    printf("Now x = %.1f; y = %.1f\n", x, y);
     return 0;
}
void larger_of( double * u,  double * v)
{
     double temp;
    temp = *u > *v ? *u : *v;
    *u = temp;
    *v = temp;
}
6、(第一次码的程序读取到换行符的时候也会打印出来,会给人看不明白的感觉,索性按[Enter]键的时候就退出循环,不要读到EOF)
#include <stdio.h>
#include <ctype.h>
void printchar( char ch);
int main( void)
{
     char ch;

    printf("请输入要分析的东西:\n");
     while((ch = getchar()) != EOF)
    {
        printchar(ch);
    }
     return 0;
}
void printchar( char ch)
{
     if(isalpha(ch))
    {
        printf("%c %d\n", ch, toupper(ch) % 'A' + 1);
    }
}
修改之后,程序如下:
#include <stdio.h>
#include <ctype.h>
int show_c_location( char ch);

int main( void)
{
     char ch;

    printf("Please enter some characters: \n");
     while((ch = getchar()) != '\n')
        printf("%c-%d ", ch, show_c_location(ch));
     return 0;
}
int show_c_location( char ch)
{
     int result;

     if(isalpha(ch))
        result = toupper(ch) - 'A' + 1;
     else
        result = -1;
     return result;
}
7、
#include <stdio.h>
double power( double n,  int p);
int main( void)
{
     double x, xpow;
     int exp;

    printf("Enter a number and the positive integer power");
    printf(" to which\nthe number will be raised. Enter q");
    printf(" to quit.\n");
     while(scanf("%lf%d", &x, &exp) == 2)
    {
        xpow = power(x, exp);
        printf("%.3g to power %d is %.5g\n", x, exp, xpow);
        printf("Enter next pair of numbers or q to quit.\n");
    }
    printf("Hope you enjoyed this power trip -- bye!\n");
     return 0;
}
double power( double n,  int p)
{
     int i;
     double result = 1;

     if(n != 0)
    {
         if(p > 0)
        {
             for(i = 1; i <= p; i++)
                result *= n;
        }
         else  if(p < 0)
        {
             for(i = 1; i <= -p; i++)
                result *= (1 / n);
        }
         else
            result = 1;
    }
     else
    {
         if(p == 0)
            result = 1; //  0的0次方是一个有争议的数,本题认为会得到1
         else
            result = 0;
    }
     return result;
}
8、
#include <stdio.h>
double power( double n,  int p);
int main( void)
{
     double x, xpow;
     int exp;

    printf("Enter a number and the positive integer power");
    printf(" to which\nthe number will be raised. Enter q");
    printf(" to quit.\n");
     while(scanf("%lf%d", &x, &exp) == 2)
    {
        xpow = power(x, exp);
        printf("%.3g to power %d is %.5g\n", x, exp, xpow);
        printf("Enter next pair of numbers or q to quit.\n");
    }
    printf("Hope you enjoyed this power trip -- bye!\n");
     return 0;
}
double power( double n,  int p)
{
     double result = 1;

     if(n != 0)
    {
         if(p > 0)
            result = n * power(n, p-1);
         else  if(p < 0)
            result = (1/n) * power(n, p+1);
         else
            result = 1;
    }
     else
    {
         if(p == 0)
            result = 1; //  0的0次方是一个有争议的数,本题认为会得到1
         else
            result = 0;
    }
     return result;
}
9、
#include <stdio.h>
void to_base_n(unsigned  long n,  int range);
int main( void)
{
    unsigned  long number;
     int range;
    printf("请输入要转换的无符号整数和所规定的进制数: \n");
     while(scanf("%lu %d", &number, &range) == 2)
    {
         if(range >= 2 && range <= 10)
        {
            printf("无符号整数%lu转换成%d进制数为: ", number, range);
            to_base_n(number, range);
            putchar('\n');
            printf("请输入要转换的无符号整数和所规定的进制数: \n");
        }
         else
            printf("所规定的进制数的范围是2~10,请输入正确的数字\n");
    }
    printf("Done!\n");
     return 0;
}
void  to_base_n(unsigned  long  n,  int  range)
{
     int  r;

    r  =  n  %  range;
     if (n  >=  range)
        to_base_n(n  /  range, range);
    putchar( ' 0 '  +  r);
     return ;
}
10、(题意理解不清楚,借鉴 CSDN——vs9841原作者的做法,脑子太笨,实在想不出来)
#include <stdio.h>
int Fibonacci( int n);
int main( void)
{
     int n = 9;
    printf("当n为%d时,斐波纳契数值为%d", n, Fibonacci(9));
     return 0;
}
int Fibonacci( int n)
{
     int a, b, i;
    a = 0;
    b = 1;
     int sum;
     if(n == 0)
         return 0;
     if(n == 1)
         return 1;
     else
    {
         for(i = 2; i <= n; i++)
        {
            sum = a + b;
            a = b;
            b = sum;
        }
         return sum;
    }
}
总结:总体来说编程练习相对以往来说要简单了,但第10题没明白什么意思,所以只能借鉴别人的了,真是天下文章一大抄!

你可能感兴趣的:(C Primer Plus 第9章 函数 复习题与编程练习)