C Primer Plus 第6版 编程练习 chapter 9

1. 第1题

1.1 题目描述

设计一个函数min(x,y),返回两个double类型值的较小值。在一个简单的驱动程序中测试该函数。

1.2 编程源码

# include<stdio.h>

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

int main(){
		
	printf("%lf 和 %lf 两个数之间较小的为:%lf \n", 10.0,11.0,min(10,11));
	printf("%lf 和 %lf 两个数之间较小的为:%lf \n", 7.0,6.0,min(7,6));	
	
	return 0;
}

1.3 结果显示

结果显示


2. 第2题

2.1 题目描述

设计一个函数chline(ch,i,j),打印指定的字符j行j列。在一个简单的驱动程序测试函数。

2.2 编程源码

# include<stdio.h>

void chline(char ch, int i, int j){
	for(int l = 0;l<j;++l){
		for(int m = 0;m<i;++m)
			putchar(ch);
		putchar('\n');
	}
}

int main(){
	
	chline('*', 10,10);
		
	return 0;
}

2.3 结果显示

结果显示


3. 第3题

3.1 题目描述

编写一个函数,接受3个参数:一个字符和两个整数。字符参数时待打印的字符,第一个整数指定一行中打印字符的次数,第2个整数指定打印指定字符的行数。编写一个调用该函数的程序。

3.2 编程源码

# include<stdio.h>

void chline(char ch, int i, int j){
	for(int l = 0;l<j;++l){
		for(int m = 0;m<i;++m)
			putchar(ch);
		putchar('\n');
	}
}

int main(){
	
	chline('*', 10,10);
		
	return 0;
}

3.3 结果显示

结果显示


4. 第4题

4.1 题目描述

两数的调和平均数这样计算:先得到两数的倒数,然后计算两个倒数的平均值,最后取计算结果的倒数。编写一个函数,接受两个double类型的参数,返回这两个参数的调和平均数。

4.2 编程源码

# include<stdio.h>

double chline(double m, double n){
	return 2.0/(1/m+1/n);
}

int main(){
	
	printf("%.2f 和 %.2f的调和平均数为 %.2f\n", 2.0,3.0, chline(2,3));
		
	return 0;
}

4.3 结果显示

结果显示


5. 第5题

5.1 题目描述

编写并测试一个函数large_of(),该函数把两个double类型变量的值替换为较大的值。例如large_of(x,y)会把x和y中较大的值重新赋值给两个变量。

5.2 编程源码

# include<stdio.h>

void large_of(double* m, double* n){
	double t = *m>*n?*m:*n;
	*m = t;
	*n = t;
}

int main(){
	double m = 2;
	double n = 3;
	printf("运行前:%.2f 和 %.2f\n", m,n);
	large_of(&m,&n);
	printf("运行后:%.2f 和 %.2f\n", m,n);
		
	return 0;
}

5.3 结果显示

结果显示


6. 第6题

6.1 题目描述

编写并测试一个函数,该函数以3个double变量的地址作为参数,把最小值放入第一个函数,中间值放入第2个变量,最大值放入第3个变量。

6.2 编程源码

# include<stdio.h>

void large_of(double* l, double* m, double* n){
	double t;
	if(*l>*m){
		t = *l;
		*l = *m;
		*m = t;
	}
	if(*l>*n){
		t = *l;
		*l = *n;
		*n = t;
	}
	if(*m>*n){
		t = *n;
		*n = *m;
		*m = t;
	}
}

int main(){
	double l = 4;
	double m = 2;
	double n = 3;
	printf("运行前:%.2f\t%.2f\t%.2f\n",l,m,n);
	large_of(&l,&m,&n);
	printf("运行后:%.2f\t%.2f\t%.2f\n",l,m,n);
		
	return 0;
}

6.3 结果显示

结果显示


7. 第7题

7.1 题目描述

编写一个函数,从标准输入中读取字符,直到遇到文件结尾。程序要报告每个字符是否是字母。如果是,还要报告该字母在字母表中的数值位置。例如,c和C在字母表中的位置都是3。合并一个函数,以一个字符作为参数,如果该字符是一个字母则返回一个数字的,否则返回-1

7.2 编程源码

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

void large_of(void){
	char c;
	while((c=getchar())!=EOF){
		if(isupper(c))printf("%c:%d", c, c-'A');
		else if(islower(c))printf("%c:%d", c, c-'a');
		else putchar(c);
	}
}

int main(){
	large_of();
		
	return 0;
}

7.3 结果显示

文件内容:

ABC
a b c
d e f
A 

结果显示


8. 第8题

8.1 题目描述

第6章的程序清单6.20中,power()函数返回一个double类型数的正整数次幂。改进该函数,使其能正确计算负幂。另外,函数要处理0的任何次幂都为0,任何数的0次幂都为1(函数应报告0的0次幂未定义,因此把该值处理为1)。要是用一个循环,并在程序中测试该函数。

8.2 编程源码

# include<stdio.h>

double cal(double a, int n){
	double s = 1;
	for(int i=0;i<n;++i) s*=a;
	return s;
}

double power(double a, int n){
	if(-0.000000000001<a && a < 0.0000000001){
		if(n==0){
			printf("0的0次幂未定义,因此把该值处理为1\n");
			return 1;
		}else return 0;
	}
	int f = n>0?0:1;
	n = n>0?n:-n;
	if(f)return(1/cal(a,n));
	else return(cal(a,n));
}

int main(){
	printf("%.2lf的%d次幂为%.2lf\n", 0.0,0, power(0.0,0));
	printf("%.2lf的%d次幂为%.2lf\n", 1.0,0, power(1.0,0));
	printf("%.2lf的%d次幂为%.2lf\n", 2.0,2, power(2.0,2));
	printf("%.2lf的%d次幂为%.2lf\n", 2.0,-2, power(2.0,-2));
	
	return 0;
}

8.3 结果显示

结果显示


9. 第9题

9.1 题目描述

使用递归函数重写编程练习8。

9.2 编程源码

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

double cal(double a, int n){
	if(n<=0)return 1;
	else return a*cal(a, n-1);
}

double power(double a, int n){
	if(-0.000000000001<a && a < 0.0000000001){
		if(n==0){
			printf("0的0次幂未定义,因此把该值处理为1\n");
			return 1;
		}else return 0;
	}
	int f = n>0?0:1;
	n = n>0?n:-n;
	if(f)return(1/cal(a,n));
	else return(cal(a,n));
}

int main(){
	printf("%.2lf的%d次幂为%.2lf\n", 0.0,0, power(0.0,0));
	printf("%.2lf的%d次幂为%.2lf\n", 1.0,0, power(1.0,0));
	printf("%.2lf的%d次幂为%.2lf\n", 2.0,2, power(2.0,2));
	printf("%.2lf的%d次幂为%.2lf\n", 2.0,-2, power(2.0,-2));
	
	return 0;
}

9.3 结果显示

结果显示


10. 第10题

10.1 题目描述

为了让程序清单9.8中的to_binary函数更通用,编写一个to_base_n函数接受两个在2~10范围内的参数,然后以第2个参数中指定的禁止打印第一个参数的数值。例如,to_base_n(129,8)显示的结果为201,也就是129的八进制数。在一个完整的程序中测试该函数。

10.2 编程源码

# include<stdio.h>

int to_base_n(int num,int n){
	int a;
	int b;
	if(num>=n){
		b = num%n;
		a = num/n;
		return b+to_base_n(a,n)*10;
	}else
		return num;
}

int main(){
	printf("%d的%d进制表示为%d\n", 129,8,to_base_n(129,8));
	printf("%d的%d进制表示为%d\n", 65,2,to_base_n(65,2));
	
	return 0;
}

10.3 结果显示

结果显示


11. 第11题

11.1 题目描述

编写并测试Fibonacci函数,该函数用循环代替递归计算斐波那契数。

11.2 编程源码

# include<stdio.h>

int Fibonacci(int n){
	int s = 0;
	int p = 1;
	int pp = 1;
	if(n<=2)return 1;
	for(int i=2;i<n;++i){
		s = pp+p;
		pp = p;
		p = s;
	}
	return s;
}

int main(){
	printf("第%d个Fibonacci数为%d\n", 1,Fibonacci(1));
	printf("第%d个Fibonacci数为%d\n", 2,Fibonacci(2));
	printf("第%d个Fibonacci数为%d\n", 3,Fibonacci(3));
	printf("第%d个Fibonacci数为%d\n", 4,Fibonacci(4));
	printf("第%d个Fibonacci数为%d\n", 10,Fibonacci(10));
	
	return 0;
}

11.3 结果显示

结果显示


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值