C Primer Plus (第五版) 第九章 函数 编程练习

第九章 函数

编程练习

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

double min(double x, double y);

int main(void)
{
	double a, b;

	printf("请输入两个数:\n");
	scanf("%lf%lf", &a, &b);
	printf("两个数中较小的数是:%lf\n", min(a, b));
	return 0;
}

double min(double x, double y)
{
	return x < y ? x : y;
}

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

#include <stdio.h>

void chline(char, int, int);

int main(void)
{
	char ch;
	int x, y;

	printf("请输入要显示的字符:\n");
	scanf("%c", &ch);
	printf("请输入字符开始输出和结束输出的列数\n");
	scanf("%d%d", &x, &y);
	chline(ch, x, y);

	return 0;
}

void chline(char ch, int i, int j)
{
	int k = 0;
	while (k++ < i)
		putchar(‘\n‘);
	while (i++ <= j)
		printf("%c\n", ch);
}

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

#include <stdio.h>

void chline(char, int, int);

int main(void)
{
	char ch;
	int x, y;

	printf("请输入要显示的字符:");
	scanf("%c", &ch);
	printf("请输入每行字符输出的个数:");
	scanf("%d", &x);
	printf("请输入字符输出的行数:");
	scanf("%d", &y);
	chline(ch, x, y);

	return 0;
}

void chline(char ch, int x, int y)
{
	int i, j;
	for (i = 0; i < y; i++)
	{
		for (j = 0; j < x; j++)
			putchar(ch);
		putchar(‘\n‘);
	}
}

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

#include <stdio.h>

double har(double, double);

int main(void)
{
	double x, y;

	printf("请输入要求谐均值的两个数:");
	scanf("%lf%lf", &x, &y);

	printf("%.4lf 和 %.4lf 的谐均值为:%.4lf\n", x, y, har(x, y));

	return 0;
}

double har(double x, double y)
{
	return 1.0 / ((1.0 / x + 1.0 / y) / 2);
}

5.编写并测试函数larger_of(),其功能是将两个double类型变量的数值替换成它们中的较大值。

例如,larger_of(x,y)会把x和y中的较大数值重新赋给变量x和y

#include <stdio.h>

void larger_of(double *, double *);

int main(void)
{
	double x, y;

	printf("请输入要求比较的两个数:");
	scanf("%lf%lf", &x, &y);

	larger_of(&x, &y);

	printf("x = %.4lf\n", x);
	printf("y = %.4lf\n", y);

	return 0;
}

void larger_of(double *x, double *y)
{
	//*x > *y ? *x = *y : *y = *x;
	//error:表达式必须是可修改的左值。
	//因为运算符的优先级问题,编译器看做是(*x > *y ? *x = *y : *y) = *x;
	*x > *y ? *y = *x : (*x = *y);
}

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

#include <stdio.h>
#include <ctype.h>
int fun(char);

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

	while ((ch = getchar()) != EOF)
	{
		a = fun(ch);
		if (-1 == a)
			printf("%c不是一个字母:\n", ch);
		else
			printf("%c字母排在字母表中第%d位。\n", ch, a);
	}

	return 0;
}
int fun(ch)
{
	int a;
	if (isalpha(ch))
	{
		ch = toupper(ch);
		a = ch - 64;
	}
	else
		return -1;
}

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

#include <stdio.h>
double power(double n, int p);
int main(void)
{
	double x, xpow;
	int exp;

	printf("输入一个数字和它的整数次幂(输入q退出):");
	while (scanf("%lf%d", &x, &exp) == 2)
	{
		xpow = power(x, exp);
		printf("%.3g的%d次幂为:%.5g\n", x, exp, xpow);
		printf("再次输入一个数字和它的整数次幂(输入q退出):");
	}
	printf("Bye!");

	return 0;
}

double power(double n, int p)
{
	int i;
	double pow = 1;
	if (0 == n)
		return 0;
	if (0 == p)
		return 1;
	else
		if (0 < p)
		{
			for (i = 0; i < p; i++)
				pow *= n;
			return pow;
		}
		else
		{
			for (i = 0; i < -p; i++)
				pow *= n;
			pow = 1.0 / pow;
			return pow;
		}
}

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

#include <stdio.h>
double power(double n, int p);
int main(void)
{
	double x, xpow;
	int exp;

	printf("输入一个数字和它的整数次幂(输入q退出):");
	while (scanf("%lf%d", &x, &exp) == 2)
	{
		xpow = power(x, exp);
		printf("%.3g的%d次幂为:%.5g\n", x, exp, xpow);
		printf("再次输入一个数字和它的整数次幂(输入q退出):");
	}
	printf("Bye!");

	return 0;
}

double power(double n, int p)
{
	int i;
	double pow = 1;
	if (0 == n)
		pow = 0;
	if (0 == p)
		pow = 1;
	else
		if (0 < p)
			for (i = 0; i < p; i++)
				pow *= n;
		else
			pow = 1.0 / power(n, -p);

	return pow;
}

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

#include <stdio.h>
void to_binary(unsigned long n, int a);
int main(void)
{
	unsigned long number;
	int a;
	printf("请输入一个整数和一个2-10的进制(输入q退出): \n");

	while (scanf("%lu%d", &number, &a) == 2)
	{
		printf("%lu的%d进制数为: ", number, a);
		to_binary(number, a);
		putchar(‘\n‘);
		printf("请再次输入一个整数和一个2-10的进制(输入q退出): \n");
	}
	printf("结束。\n");

	return 0;
}
void to_binary(unsigned long n, int a)
{
	int x = n % a;
	if (n >= a)
		to_binary(n/a, a);
	printf("%d", x);
}

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

#include <stdio.h>

void fibonacci(int n);

int main(void)
{
	int a = 30;

	fibonacci(a);

	return 0;
}
void fibonacci(int n)
{
	int i, a, b, c;

	a = 0;
	b = 0;
	c = 1;
	for (i = 0; i < n; i++)
	{
		if (i < 2)
			printf("%d\n", i);
		else
		{
			a = b + c;
			b = c;
			c = a;
			printf("%d\n", a);
		}
	}
}
时间: 2024-11-03 20:51:20

C Primer Plus (第五版) 第九章 函数 编程练习的相关文章

C++primer(第五版)第九章 顺序容器(容器的运用及其部分习题解答,C++11特性总结,重点章节内容较多)

顺序容器:为程序员提供了控制元素存储和访问顺序的能力.(无序容器)           1.顺序容器的概述           A.顺序容器的类型           vector:可变大小数组.支持快速随机访问.在尾部之外的位置插入或删除元素可能很慢.          deque:双端队列.支持快速随机访问.在头尾位置插入/删除速度很快.           list:双向链表.只支持双向顺序访问.在list中任何位置进行插入/删除操作速度都很快.          forword_list

c++ primer 第五版第九章

9.01 对于下面的程序任务,vector, deque和list哪种容器最为合适?解释你选择的理由.如果没有哪一种容器优于其它容器,也请解释理由. 读取固定数量的单词,将它们按字典序插入到容器中.我们将在下一章看到,关联容器更适合这个问题. 读取未知数量的单词,总是将新单词插入到末尾.删除操作在头部进行. 从一个文件中读取未知数量的整数.将这些整数排序,然后打印到标准输出. 使用list,需要在中间插入,用list效率更高. 使用deque.只在头尾进行操作,deque效率更高. 使用vect

C++ Primer(第五版) 第九章:顺序容器

练习9.1:考察使用哪种顺序容器 (a)list,当需要在容器中任意位置执行插入/删除操作时,用list最好 (b)deque,当需要在头部插入/删除元素,不需要在容器中间任意位置插入/删除元素时,用deque最好 (c)vector,当不需要在头部/任意位置插入/删除元素的情况下,用vector最好 练习9.2:考察对容器可以保存的元素类型的限制 list<deque<int>>lst1; list<deque<int> >lst2;     //在编译器

C++ Primer【第五版】习题参考答案——第六章(函数)

本系列文章会不断更新,但是时间不能保证.另外基本上都是自己做的答案,仅供参考,如果有疑问欢迎交流. #include <iostream> #include <initializer_list> using namespace std; int test_Ex_6_27(std::initializer_list<int> li); int main() { cout << test_Ex_6_27({23,78,89,76,90}) << en

C++ Primer【第五版】习题参考答案——第五章(语句)

#include <iostream> #include <vector> #include <string> using namespace std; /******************************************************************* Ex_5_1: 空语句就是只含有一个分号的语句. 如果在程序的某个地方,语法上要求有一条语句,但是逻辑上不需要, 这时就需要一条空语句. Ex_5_2: 块就是由花括号包围的复合语句

c++ primer(第五版)学习笔记及习题答案代码版(第十四章)重载运算与类型转换

笔记较为零散,都是自己不熟悉的知识点. 习题答案至于一个.h 和.cc 中,需要演示某一题直接修改 #define NUM****, 如运行14.30题为#define NUM1430: Alice Emma has long flowing red hair. Her Daddy says when the wind blows through her hair, it looks almost alive, like a fiery bird in flight. A beautiful f

c++ primer(第五版)学习笔记及习题答案代码版(第十一章)关联容器

笔记较为零散,都是自己不熟悉的知识点. 习题答案至于一个.cc 中,包含Chapter7.h头文件,读入文件包括./test ./rules .需要演示某一题直接修改 #define NUM****, 如运行11.23题为#define NUM1123: chapter 11 1.  关联容器不支持顺序容器的位置相关的操作,例如push_front或push_back.原因是关联容器中元素是根据关键字存储的,这些操作对 关联容器没有意义.而且关联容器也不支持构造函数或插入操作这些接收一个元素值和

c++ primer(第五版)学习笔记及习题答案代码版(第六章)函数

笔记较为零散,都是自己不熟悉的知识点. 习题答案至于一个.cc 中,编译需要包含Chapter6.h头文件. 需要演示某一题直接修改 #define NUM***, 如运行6.23题为#define NUM623: chapter 6 1. 形参初始化的机理与变量初始化一样. 当形参是引用类型时,它对应的实参被引用传递或者函数被传引用调用. 2. const和实参 void fcn(const int i){ /*fcn能够读取i,但是不能向i写值*/} void fcn(int i){ /*.

《C++Primer》第五版习题详细答案--目录

作者:cosefy ps: 答案是个人学习过程的记录,仅作参考. <C++Primer>第五版习题答案目录 第一章:引用 第二章:变量和基本类型 第三章:字符串,向量和数组 第四章:表达式 原文地址:https://www.cnblogs.com/cosefy/p/12180771.html