C Primer Plus(第五版)学习(七)

第9章《函数》在这一章中,模块化处理是主要思想,以后面对的程序代码会越来越大,为了能分式高效的完成代码的编写,避免重复编写代码的繁琐,不得不模块化也就是函数,这样也有利于程序的阅读和修改完善。

利用了函数,我们就可以值关注主体部分也就是main()函数,把函数看成“黑盒子”值要直到输入和输出,不需要太纠结"黑盒子”里到底是什么。

好了,编程练习:欢迎讨论交流

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

#include <stdio.h>

double min(double x,double y);//比较这个数的大小返回较小的数

//驱动程序
int main(void)
{
	double x=3.0,y=4.0;
	printf("两者之间较小的数是:%.1f .\n",min(x,y));
	return 0;
}
//比较这个数的大小返回较小的数
double min(double x,double y)
{
	double dmin;
	if(x<y)
		dmin=x;
	else
		dmin=y;
	return dmin;
}

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

#include <stdio.h>
#define  SPACE ' '

//指定字符在i列到j列的输出
void chine(char ch,int i,int j);

int main(void)
{
	chine('*',3,8);//在第3列到第8列之间打印*号
	return 0;
}

//指定字符在i列到j列的输出
void chine(char ch,int i,int j)
{
	int temp;
	temp=i;
	while(temp-->0)//前i列打印空格符
		putchar(SPACE);
	for (;i<=j;i++)//在i列到j列之间打印指定字符
		putchar(ch);
	printf("\n");

}

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

#include<stdio.h>

void chline(char ch,int i,int j);//在指定j行上输出i个ch字符

int main (void)
{
	chline('$',8,8);//在第8行上打印8个$符号
	return 0;
}

void chline(char ch,int i,int j)
{
	while(--j>0)
		printf("%d\n",j);//到达指定j行,前j行全部打印换行符
	while(i-->0)
		printf("%c",ch);//连续打印i个ch字符
	printf("\n");
}

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

#include <stdio.h>
#include <math.h>
double xave(double x,double y);//计算谐均值

int main(void)
{
	printf("4和8的谐均值是 %.1f\n",xave(4.0,8.0));
	return 0;
}

//计算谐均值
double xave(double x,double y)
{
	return (1/((1.0/x+1.0/y)/2.0));
}

5.编写并测试韩式larger_of(),其功能是将两个double类型变量的数值替换称它们中的较大值。例如,larger_of(x,y)会把x和y中的较大数值重新赋给变量x和y。

#include <stdio.h>

void larger_of(double * u,double * v);//把较大的数重新赋给两个变量

int main(void)
{
	double x=4.0,y=9.0;
	printf("原始x=%.1f	y=%.1f\n",x,y);
	larger_of(&x,&y);//指针传递
	printf("经过变换后现在x=%.1f	y=%.1f\n",x,y);
	return 0;
}

//把较大的数重新赋给两个变量
void larger_of(double * u,double * v)
{
	if(*u<*v)
		*u=*v;
	else
		*v=*u;
}

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

#include<stdio.h>
#include <ctype.h>

int address(char ch);//字母ch在字母表的位置,忽略大小写

int main(void)
{
	char ch;
	printf("请输入一个字母(#号退出):");
	while((ch=getchar())!='#')
	{
		if('\n'==ch)
			continue;//跳过换行符
		if(isalpha(ch))
			printf("字母%c在字母表的位置是%d\n",ch,address(ch));
		else
			return -1;
		printf("请输入一个字母(#号退出):");
	}
}

//字母ch在字母表的位置,忽略大小写
int address(char ch)
{
	switch(tolower(ch))
	{	case 'a':
			return 1;
			break;
		case 'b':
			return 2;
			break;
		case 'c':
			return 3;
			break;
		case 'd':
			return 4;
			break;
		case 'e':
			return 5;
			break;
		case 'f':
			return 6;
			break;
		case 'g':
			return 7;
			break;
		case 'h':
			return 8;
			break;
		case 'i':
			return 9;
			break;
		case 'j':
			return 10;
			break;
		case 'k':
			return 11;
		case 'l':
			return 12;
		case 'm':
			return 13;
		case 'n':
			return 14;
		case 'o':
			return 15;
		case 'p':
			return 16;
		case 'q':
			return 17;
		case 'r':
			return 18;
		case 's':
			return 19;
			break;
		case 't':
			return 20;
			break;
		case 'u':
			return 21;
			break;
		case 'v':
			return 22;
			break;
		case 'w':
			return 23;
			break;
		case 'x':
			return 24;
			break;
		case 'y':
			return 25;
			break;
		case 'z':
			return 26;
			break;
		default:
			break;
	}
}

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

#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)//利用scanf函数的返回值确定有无正确读入
	{
		xpow=power(x,exp);
		printf("%.3f的%d次幂是 %.5f\n",x,exp,xpow);
		printf("输入一个数和一个次幂(输入q退出):");
	}
	return 0;
}

//计算任何数的幂
double power(double n,int p)
{
	double pow=1;
	int i;
	if(0==n)//0的0任何次幂等于0
		pow=0;
	else if(0==p)//任何数的0次幂等于1
		pow=1;
	else
		for(i=1;i<=p;i++)
			pow*=n;
	return pow;

}

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

//计算任何数的幂
double power(double n,int p)
{
	double pow=1;
	int i;
	if(0==n)//0的0任何次幂等于0
		pow=0;
	else if(0==p)//任何数的0次幂等于1
		pow=1;
	else
		pow=n*power(n,p-1);//递归做次幂pow=n*n的p-1次方
	return pow;

}

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

#include <stdio.h>

void to_base_n(int p,int n);//把p改成n进制显示

int main(void)
{
	int pp,nn;
	printf("请输入一个数和一种进制方式(进制数在2~10)按q退出:");
	while(scanf("%d%d",&pp,&nn)==2)
	{
		if(nn<2||nn>10)//进制超出的话,重复循环
		{
			printf("请输入一个数和一种进制方式(进制数在2~10)按q退出:");
			continue;
		}
		to_base_n(pp,nn);
		putchar('\n');
	printf("请输入一个数和一种进制方式(进制数在2~10)按q退出:");
	}
	printf("good job!\n");
	return 0;
}
//把p改成n进制显示
void to_base_n(int p,int n)
{
	int r;
	r=p%n;//求余
	if(p>=n)
		to_base_n(p/n,n);//递归继续求余数
	putchar('0'+r);//putchar输出字符而不是整型
}

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

#include <stdio.h>
int main(void)
{
	unsigned int n=16;
	Fibonacci(16);
	printf("\n");
	return 0;
}
int Fibonacci( unsigned int n )//从下往上计算。即通过f(0) + f(1) 得到f(2), 再由f(2) + f(1)得到f(3)....直到计算出f(n)
{

	int FibN, FibNOne, FibNTwo;
	int i;
	int result[2] = { 0, 1 };
	if( n < 2 )
		return result[n];
	FibNOne = 0;
	FibNTwo = 1;
	FibN = 0;
	for( i = 2; i <= n; i++ )
	{                                                 /*以第一次循环执行过程为例*/
		FibN = FibNOne + FibNTwo; /*f(2) = f(0) + f(1)*/
		printf("%5d",FibN);
		FibNOne = FibNTwo;                  /*f(1)*/
		FibNTwo = FibN;                       /*f(2)*/
	}
	return FibN;
}

<转载请注明出处>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 第章主要介绍了C语言中的函数,包括函数的定义、调用、参数传递、返回值等方面的内容。具体内容包括: 1. 函数的定义和调用:介绍了如何定义函数以及如何调用函数,包括函数的返回类型、函数名、参数列表和函数体等。 2. 函数参数传递:介绍了C语言中的参数传递方式,包括值传递和地址传递,以及如何在函数中使用参数。 3. 函数的返回值:介绍了函数的返回值类型和返回值的作用,以及如何在函数中使用返回值。 4. 函数的声明和定义:介绍了函数的声明和定义的区别,以及如何在不同的文件中使用函数。 5. 函数的递归:介绍了递归函数的概念和使用方法,以及递归函数的优缺点。 6. 函数指针:介绍了函数指针的概念和使用方法,以及如何在程序中使用函数指针。 总的来说,第章是C语言中非常重要的一章,对于理解和使用函数有很大的帮助。 ### 回答2: 《C Primer Plus》第六版第章主要介绍了C语言中的输入和输出函数。这章的内容包括标准I/O库、`printf()`、`scanf()`等函数以及文件输入输出等。 在这一章中,首先讲解了如何使用标准I/O库进行输入输出。标准I/O库提供了一组函数,可以用于从键盘读取输入,或将结果输出到屏幕上。`printf()`函数可以用于格式化输出,可以控制输出的格式,比如输出特定长度的整数、浮点数等。`scanf()`函数可以用于从键盘读取输入,并将其存储到变量中,也可以使用特定的格式来读取特定类型的数据。 接下来,讲解了如何使用`getchar()`和`putchar()`函数。`getchar()`函数用于从键盘读取单个字符,`putchar()`函数用于向屏幕输出单个字符。 此外,还介绍了文件的输入输出。通过使用`fopen()`函数打开文件,可以读取或写入文件的内容。使用`fprintf()`函数可以将数据写入文件中,使用`fscanf()`函数可以从文件中读取数据并存储到变量中。同时还介绍了如何使用`fclose()`函数关闭文件。 最后,本章还讲解了格式化输出的一些高级特性,比如控制字段宽度、对齐方式以及使用转换说明符等。 通过学习《C Primer Plus》第六版第章,我们能够了解C语言中输入输出的基本概念和原理,掌握使用输入输出库函数进行读写操作的方法,以及如何进行文件的读写操作。这对于日后编写C语言程序以及处理文件输入输出都有着重要的作用。 ### 回答3: C Primer Plus第六版第章主要介绍了C语言中的函数函数是一段完成特定任务的可重复使用的代码块,它可以接收输入参数并返回一个值。 在这一章中,我们学习了如何定义函数并明确函数的返回类型、函数名和参数列表。通过使用函数,我们可以将程序中的代码划分为更小、更可管理的部分。函数的主要好处之一是提高了代码的可读性和可维护性。 我们还学习了传递参数的不同方式,包括按值传递、按地址传递以及传递指针。这些方法允许我们在函数之间传递数据,并在函数内部对数据进行修改。 此外,我们还研究了递归函数的概念。递归函数是指可以调用自身的函数。使用递归可以通过将问题划分为更小的子问题来解决复杂的问题。 在这一章中,我们还学习函数的作用域和生命周期。函数的作用域定义了函数内部和外部变量的可见性。函数的生命周期指的是函数在程序运行期间的保持状态的时间。 最后,我们还讨论了函数的多文件组织和调用。通过将函数定义和函数声明分离到不同的文件中,我们可以更好地组织和管理大型项目的代码。 通过学习C Primer Plus第六版第章,我们可以更好地理解和应用函数C语言中的重要性。掌握函数的知识将有助于我们编写更模块化、可读性更强、可维护性更高的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值