C语言程序设计谭浩强(第四版)部分课后习题作答——第四章

代码: 

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
void q4_3() {
	int m, n, a, b, temp;
	scanf_s("%d,%d", &m, &n);//也可以使用scanf
	a = m, b = n;
	//使用辗转相除法求最大公约数
	if (a < b) {//使a为大值b为小值
		temp = a;
		a = b;
		b = temp;
	}
	while (b != 0) {//辗转相除
		temp = a % b;
		a = b;
		b = temp;
	}
	printf("最大公约数:%d", a);
	//最小公倍数,两数相乘除以最大公约数就是最小公倍数
	printf("最小公倍数:%d", m*n/a);
}


void q4_4() {
	char str[256];
	int i = 0;
	int word = 0, space = 0, number = 0, other = 0;
	printf("input string:\n");
	fgets(str,256,stdin);//获取输入
	while (str[i] != '\n') {
		if (str[i] == 32) {
			space++;
		}
		else if ((str[i] >= 65 && str[i] <= 90) || (str[i] >= 97 && str[i]<=122)) {
			word++;
		}
		else if (str[i] >= 48 && str[i] <= 57) {
			number++;
		}
		else {
			other++;
		}
		i++;
	}
	printf("英文字母:%d,空格:%d,数字:%d,其他字符:%d",word,space,number,other);
}

//迭代法求平方根
void q4_13() {
	double a,m,n;
	scanf_s("%lf", &a);//double类型要用lf获取输入,否则会变为负值
	m = a/2; // 选取xn为a/2
	n = (m + a / m) / 2;
	while (fabs(m - n) >= 10e-5) {
		m = n;
		n = (m + a / m) / 2;
	}
	printf("平方根为:%7.2f", n);//保留两位小数
}

//牛顿迭代法求根
//公式为 x2 = x1 - f(x1)/f(x1)'
void q4_14() {
	double x1 = 0, x2;
	double fx1, fx2;
	x2 = 1.5;
	while (fabs(x1 - x2) >= 1e-6)
	{
		x1 = x2;
		fx1 = 2 * x1*x1*x1 - 4 * x1*x1 + 3 * x1 - 6;//f(xn)题目已给出
		fx2 = 6 * x1*x1 - 8 * x1 + 3;  //f(xn)'
		x2 = x1 - fx1 / fx2;
	}
	printf("value:%lf", x2);
}

double q4_15_f(double x) {//计算函数值
	return 2 * x*x*x - 4 * x*x + 3 * x - 6;
}
void q4_15() {
	double m = -10, n = 10, mid;//区间
	while(1){
		mid = (m + n) / 2;
		if (fabs(q4_15_f(mid)) < 10e-5) {//精度(这里加绝对值很重要,因为函数值可能为负)
			printf("根为%f", mid);//本题要求根,所以直接输出了,如果是一般情况,需要输出根的范围
			break;
		}
		if ( q4_15_f(m)*q4_15_f(n) < 0) {//零点定理判断区间内有无根
			if (q4_15_f(mid)*q4_15_f(m) < 0) {
				n = mid;
			}
			else if (q4_15_f(mid)*q4_15_f(n) < 0) {
				m = mid;
			}
		}
		else {
			printf("无根");
		}
	}
}
//乒乓球队比赛
void q4_17() {
	char i, j, k;//假设C对手为i,B对手为k,A对手为j
	for (i = 'X'; i <= 'Z'; i++) {
		if (i != 'X' && i != 'Z') {//先满足c的条件再往下执行 
			for (j = 'X'; j <= 'Z'; j++) {
				if (j != 'X' && j != i) {  //a的对手不是x,而且不能和c的对手重复
					for (k = 'X'; k <= 'Z'; k++) {
						if (k != i && k != j) { //b的对手不能喝a,c的对手重复
							printf("A vs %c; B vs %c ;C vs %c\n", j, k, i);

						}
					}
				}
			}
		}
	}
}
int main() {
	//q4_3();
	//q4_4();
	//q4_13();
	//q4_14();
	//q4_15();
	q4_17();
	system("pause");
	return 0;
}

 

运行:

4.3

 

4.4

 

4.13

 

4.14

 

4.15

 

4.17

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值