C prime plus 第九章 编程练习答案

一系列C语言编程实例,包括求最小值、字符矩阵打印、调和平均数计算、数值交换、指数运算及进制转换。涉及递归、循环等基本编程技巧,适合初学者巩固基础知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有问题可评论或者私信作者。

/* 9-1.c -- 设计函数min(x,y),返回两个double值的最小值 */
#include<stdio.h>

double min(double, double);

int main(void)
{
	double num1, num2;

	printf("请输入两个double类型的值:");
	scanf("%lf %lf",&num1,&num2);
	printf("看好咯,他两中最小的一个为:%.3lf\n",min(num1,num2));

	return 0;
}

double min(double x, double y)
{
	if (x > y)
		return y;
	else
		return x;
}
/* 9.2-c -- 设计一个函数chline(ch,i,j),打印指定字符j行i列 */
#include<stdio.h>

void chline(char, int, int);

int main(void)
{
	char ch;
	int row, col;

	printf("请输入你想要打印的字符:");
	scanf("%c",&ch);
	printf("请输入你想打印的行数和列数:");
	scanf("%d %d",&row,&col);
	chline(ch, col, row);

	return 0;
}

void chline(char ch, int i, int j)
{
	int row, col;

	for (row = 1; row <= j; row++)
	{
		for (col = 1; col <= i; col++)
			putchar(ch);
		printf("\n");
	}
}
/* 9-3.c -- 与上个例程异曲同工之妙 */
#include<stdio.h>

void Matrix(char, int, int);

int main(void)
{
	char ch;
	int row,col;
	scanf("%c %d %d",&ch,&row,&col);
	Matrix(ch, col, row);

	return 0;
}

void Matrix(char ch, int i, int j)
{
	for (int row = 1; row <= j; row++)
	{
		for (int col = 1; col <= i; col++)
			putchar(ch);
		printf("\n");
	}
}
/* 9-4.c -- 编写一个求调和平均数的函数 */
#include<stdio.h>

double Harmean(double, double);

int main(void)
{
	double num1, num2;

	printf("请输入两个待计算的double值:");
	scanf("%lf %lf",&num1,&num2);
	printf("%.4lf 和 %.4lf的调和平均数为%.4lf\n", num1, num2, Harmean(num1, num2));

	return 0;
}

double Harmean(double num1, double num2)
{
	return (1 / ((1 / num1 + 1 / num2) / 2));
}
/* 9-5.c -- larger_of将较大值重新赋给两个变量 */
#include<stdio.h>

void larger_of(double *, double *);

int main(void)
{
	double num1, num2;
	
	scanf("%lf %lf",&num1,&num2);
	printf("原本的num1和num2为:%lf %lf\n", num1, num2);
	larger_of(&num1, &num2);
	printf("如今的num1和num2为:%lf %lf\n", num1, num2);

	return 0;
}

void larger_of(double *x, double *y)
{
	if (*x > *y)
		*y = *x;
	else
		*x = *y;
}
/* 9-6.c -- 换汤不换药的9.5 */
#include<stdio.h>

void Change_postion(double *, double *, double *);

int main(void)
{
	double num1, num2, num3;

	scanf("%lf %lf %lf",&num1,&num2,&num3);
	printf("原本的num1和num2和num3为:%lf %lf %lf\n", num1, num2, num3);
	Change_postion(&num1, &num2, &num3);
	printf("如今的num1和num2和num3为:%lf %lf %lf\n", num1, num2, num3);

	return 0;
}

void Change_postion(double *x, double *y, double *z)
{
	double n;
	if (*x > *y && *x > *z)			//	x是最大值的情况
	{	
		n = *x;						// 把x的值先复制给中间变量
		if (*y > *z)					// y是中间值的情况
		{
			*x = *z;				// 移形换位,将最小值放第一个位置
			*z = n;					// 最大值放在第三个位置
		}
		else                        // 中间值是z的情况
		{
			*x = *y;				// 把最小值y放在第一个位置
			*y = *z;				// 把中间值放在第二个位置
			*z = n;					// 把最大值放在第三个位置
		}
	}
	if (*y > *x && *y > *z)
	{
		n = *y;
		if (*x > *z)
		{
			*y = *x;
			*x = *z;
			*z = n;
		}
		else
		{
			*y = *z;
			*z = n;
		}
	}
	if (*z > *x && *z > *y)			// 特殊情况,z本身就在它自己的位置上
	{
		n = *y;
		if (*x > *y)
		{
			*y = *x;
			*x = n;
		}							// 若*y > *x,也是特殊情况,都在自己的位置上,所以无else
	}
}
/* 9-7.c -- 从标准输入中读取字符,直至文件结尾。程序还要报告是否是字母,
,如果是,报告字母在字母表的数值位置。*/
#include<stdio.h>

int Letter_postion(char ch);

int main(void)
{
	char ch;

	while ((ch = getchar()) != EOF)
	{
		if (Letter_postion(ch) == -1)
			printf("该字符不是字母\n");
		else
			printf("该字符是字母 且在字母表中的位置是:%d\n",Letter_postion(ch));
	}
	return 0;
}

int Letter_postion(char ch)
{
	int postion;
	if (ch >= 'a' && ch <= 'z')
		postion = ch - 'a' + 1;
	else if (ch >= 'A' && ch <= 'Z')
		postion = ch - 'A' + 1;
	else
		postion = -1;
	return postion;
}
/* 9-8.c -- power()函数返回一个double类型数的正整数次幂。改进该函数,
使其能正确计算负幂。另外,函数要处理0的任何次幂都为0,任何数的0次幂都
为1(函数应报告0的0次幂未定义,因此把该值处理为1)。要使用一个循环,并
在程序中测试该函数 */
#include<stdio.h>

double New_power(double, int);

int main(void)
{
	double num;
	int power;

	printf("请输入double值类型数和幂次:");
	while (scanf("%lf %d", &num, &power) == 2)
	{
		printf("%.2lf ^ %d = %.4lf\n", num, power, New_power(num, power));
		printf("请输入double值类型数和幂次:");
	}
	
	return 0;
}

double New_power(double num, int power)
{
	double result = 1;
	int flag = 0;				// 负数幂次的标志
	if (power == 0)				// 如果幂次为0,除0以外的任何数的都为1
	{
		if (num == 0)
			printf("0^0 is not be defined\n");
		return 1;
	}	
	if (num == 0)				// 如果底数为0,则任何次幂都为0
		return 0;
	if (power < 0)				// 如果是负幂的情况
	{
		power = -power;			// 转换成正幂
		flag = 1;				// 标记为负数幂
	}
	for (int i = 1; i <= power; i++)
		result *= num;
	if (flag)
		return 1 / result;
	else
		return result;
}
/* 9-9.c -- 使用递归函数重写9-8 */
#include<stdio.h>

double New_power(double num, int power);

int main(void)
{
	double num;
	int power;

	printf("请输入double值类型数和幂次:");
	while (scanf("%lf %d", &num, &power) == 2)
	{
		printf("%.2lf ^ %d = %.4lf\n", num, power, New_power(num, power));
		printf("请输入double值类型数和幂次:");
	}
	return 0;
}

double New_power(double num, int power)
{
	if (power == 0)
	{
		if (num == 0)
			printf("0 ^ 0 is not be defined!\n");
		return 1;
	}
	if (num == 0)
		return 0;
	if (power > 0)
		return num * New_power(num, power - 1);
	else
		return (1 / num * New_power(num, power + 1));
}
/* 9-10.c -- 为了让程序清单9.8中的to_binary()函数更通用,
编写一个to_base_n()函数接受两个在2~10范围内的参数,然后
以第2个参数中指定的进制打印第1个参数的数值。
例如,to_base_n(129, 8)显示的结果为201,也就是129的八进
制数。在一个完整的程序中测试该函数 */
#include<stdio.h>

void to_base_n(unsigned long, unsigned char);

int main(void)
{
	unsigned long number;
	unsigned char system;
	printf("请输入一个十进制整数以及想要转换的进制:");
	while (scanf("%lu %u", &number, &system) == 2)
	{
		printf("%lu的%u进制数为:",number,system);
		to_base_n(number,system);
		printf("\n请输入一个十进制整数以及想要转换的进制:");
	}
	return 0;
}

void to_base_n(unsigned long number, unsigned char system)
{
	int r;

	r = number % system;
	if (number >= system)
		to_base_n(number / system, system);
	printf("%d",r);

	return;
}
/* 9-11.c -- 编写并测试Fibonacco()函数,用循环来替代递归计算斐波那契 */
#include<stdio.h>

void Fibonacco(unsigned long);

int main(void)
{
	unsigned long term;

	printf("请输入数列的项数:");
	scanf("%lu",&term);
	Fibonacco(term);

	return 0;
}

void Fibonacco(unsigned long term)
{
	unsigned long long sum, num1 = 1, num2 = 1;
	if (term == 0)
		printf("0\n");
	if (term == 1)
		printf("1\n");
	if (term == 2)
		printf("1\n");
	for (int i = 3; i <= term; i++)
	{
		sum = num1 + num2;
		num1 = num2;
		num2 = sum;
	}
	printf("斐波那契数列的第%lu项为:%llu\n",term,sum);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值