C Primer Plus 第9章 函数 复习题与编程练习
问题:编写一个函数将一个整数转换成二进制形式?(
扩展请移步编程练习9)
1、实际参数和形式参量有何不同?
答:
形式参量(也被称为形式参数)是一个变量,它在被调函数中进行定义。实际参数是在函数调用中出现的值,它被赋值给形式参量。可以把实际参数认为是在函数被调用时用来初始化形式参量的值。
2、写出下面所描述的各个函数的ANSI函数头。注意:只写出函数头即可,不需要实现。
a.donut()接受一个int类型的参数,然后输出若干个0,输出0的数目等于参数的值。
b.gear()接受两个int类型的参数并返回int类型的值。
c.stuff_it()的参数包括一个double类型的值以及一个double类型变量的地址,功能是把第一个数值存放到指定的地址中。
答:
a.n_to_char()接受一个int类型的参数并返回一个char类型的值。
b.digits()接受的参数是一个double类型的数值和一个int类型的数值,返回值类型是int。
c.random()不接受参数,返回int类型的数值。
答:
答:
答:
答:( 注意:下面这种写法是错误的!!!)
有错误。num应该在salami()的参数列表中而不是在花括号之后声明,而且应该是count++而不是num++。
8、编写一个函数,使其返回3个整数参数中的最大值。
答:
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部分中的函数编写一个最小的程序。最小的意思是该程序不需要实现菜单中所描述的功能;它只需要显示这些选项并能获取正确的响应即可。
答:(参考课后答案)
1、
#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;
}
复习题
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函数头,不需要实现函数。
b. int gear( int n, int m)
c. void stuff_it( double n, double * d)
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、设计一个实现两整数相加并将结果返回的函数。
b. int digits( double n, int m)
c. int random( void)
答:
int plus(
int n,
int m)
{
return n + m;
}
5、假如问题4中的函数实现两个double类型的数值相加,那么应该如何修改原函数?
{
return n + m;
}
答:
double plus(
double n,
double m)
{
return n + m;
}
6、设计函数alter(),其输入参数是两个int类型的变量x和y,功能是分别将这两个变量的数值改为它们的和以及它们的差。
{
return n + m;
}
答:( 注意:下面这种写法是错误的!!!)
void alter(
int x,
int y)
{
x = x + y;
y = x - y;
}
正确的写法如下:
{
x = x + y;
y = x - y;
}
void alter(
int * u,
int * v)
{
int temp;
temp = *u;
*u = *u + *v;
*v = temp - *v;
}
7、判断下面的函数定义是否正确。
{
int temp;
temp = *u;
*u = *u + *v;
*v = temp - *v;
}
void salami(num)
{
int num, count;
for(count = 1; count <= num; num++)
printf("O salami mio!\n");
}
答:
{
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;
if(x > y)
if(x > z)
max = x;
else
max = z;
else
if(y > z)
max = y;
else
max = z;
return max;
}
int max(
int x,
int y,
int z)
{
int max = x;
if(y > max)
max = y;
if(z > max)
max = z;
return max;
}
9、给定下面的输出:
{
int max = x;
if(y > max)
max = y;
if(z > max)
max = z;
return max;
}
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( int, int);
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;
}
编程练习
void menu( void);
int get_input( int, int);
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( double, double);
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、
double min( double, double);
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;
}
#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、
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);
}
#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、
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');
}
}
#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、
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;
}
#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)
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;
}
#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 <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 <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;
}
#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、
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;
}
#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、
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;
}
#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原作者的做法,脑子太笨,实在想不出来)
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 ;
}
#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题没明白什么意思,所以只能借鉴别人的了,真是天下文章一大抄!
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;
}
}