1. 程式人生 > 其它 >C語言程式設計第五版譚浩強課後答案 第五章習題答案

C語言程式設計第五版譚浩強課後答案 第五章習題答案

技術標籤:C語言學習筆記c語言C程式設計譚浩強答案

C語言程式設計第五版譚浩強答案 第五章習題答案

scanf出問題請看:超簡單的scanf錯誤修改

2.請補充例5. 7程式,分別統計當“fabs(t)>= le- 6”和“fabs(t)> = le- 8”時執行迴圈體的次數。

fabs(t)>= le- 6 :

# include <stdio.h>
# include <math.h>

int main()
{
	int sign = 1;
	double pi = 0.0, term = 1.0;
	int n = 0;

	while (fabs
(term) >= 1e-6) { n++; term = 1.0 / (2 * n - 1)*sign; pi += term; sign = -sign; } pi *= 4; printf("pi的近似值是%lf\n", pi); printf("迴圈體迴圈了%d次\n", n); return 0; }

fabs(t)> = le- 8:

# include <stdio.h>
# include <math.h>

int main()
{
	int sign = 1;
	double
pi = 0.0, term = 1.0; int n = 0; while (fabs(term) >= 1e-8) { n++; term = 1.0 / (2 * n - 1)*sign; pi += term; sign = -sign; } pi *= 4; printf("pi的近似值是%lf\n", pi); printf("迴圈體迴圈了%d次\n", n); return 0; }

3.輸人兩個正整數m和n,求其最大公約數和最小公倍數

#include <stdio.h>
int main()
{
int p, r, n, m, temp; printf("請輸入兩個正整數n,m:"); scanf("%d%d,", &n, &m); //調整n儲存較大的值 if (n < m) { temp = n; n = m; m = temp; } p = n * m; while (m != 0) { r = n % m; n = m; m = r; } printf("它們的最大公約數為:%d\n", n); printf("它們的最小公倍數為:%d\n", p / n); return 0; }

4.輸人一行字元,分別統計出其中英文字母、空格、數字和其他字元的個數。

#include <stdio.h>

int main()
{
	char c;
	//定義eng_char為英文字母的個數,初始值為0
	//定義space_char為空格字元的個數,初始值為0
	//定義digit_char為數字字元的個數,初始值為0
	//定義other_char為其他字元的個數,初始值為0
	int eng_char = 0, space_char = 0, digit_char = 0, other_char = 0;
	printf("請輸入一行字元:");
	while ((c = getchar()) != '\n')
	{
		if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')
		{
			eng_char++;
		}
		else if (c == ' ')
		{
			space_char++;
		}
		else if (c >= '0' && c <= '9')
		{
			digit_char++;
		}
		else
		{
			other_char++;
		}
	}

	printf("英文字母數量:%d\n空格數量:%d\n數字數量:%d\n其他字元數量:%d\n", eng_char, space_char, digit_char, other_char);
	return 0;
}

5.求在這裡插入圖片描述

之值,其中a是一個數字,n表示a的位數,n由鍵盤輸入。例如:

#include <stdio.h>
#include <math.h>

int main()
{
	//n為a的個數
	int n;
	double a, prev_sum = 0.0, total_sum = 0.0;
	printf("請輸入a的值以及n的值: ");
	scanf("%lf %d", &a, &n);
	//迴圈n次求總和
	for (int i = 0; i < n; i++)
	{
		prev_sum += a * pow(10, i); 
		total_sum += prev_sum;
	}
	printf("總和為:%lf\n", total_sum);
	return 0;
}

6.求在這裡插入圖片描述(即求1!+2!+3!+4!+…+20!)。

#include<stdio.h>

int main()
{
	double total_sum = 0;
	for(int i = 1; i <= 20; i++) 
	{
		double single_sum = 1;
		for (int j = i; j > 0; j--)
		{
			single_sum *= j;
		}
		total_sum += single_sum;
	}
	printf("1~20每個數字階乘總和為:%lf\n",total_sum);
	return 0;
}

在這裡插入圖片描述

7.在這裡插入圖片描述

#include <stdio.h>

int main()
{
	double total_sum = 0, sum1 = 0, sum2 = 0, sum3 = 0.0;
	for (int k = 1; k <= 100; k++)
	{
		sum1 += k;
		//遍歷50次就不在執行情況2
		if (k <= 50)
		{
			sum2 += k * k;
		}
		//遍歷10次就不在執行情況3
		if (k <= 10)
		{
			sum3 += 1.0 / k;
		}
	}
	total_sum = sum1 + sum2 + sum3;
	printf("三種情況求和結果為:%lf\n", total_sum);
	return 0;
}

在這裡插入圖片描述

8.輸出所有的“水仙花數”,所謂“水仙花數”是指一個3位數,其各位數字立方和等於該數本身。例如,153是水仙花數,因為153=1*+5*+3。

#include <stdio.h>

int main()
{
	 //a表示百位數字,b表示十位數字,c表示各位數字
	int a, b, c;
	for (int i = 100; i <= 999; i++)
	{
		a = i / 100;
		b = (i / 10) % 10;
		c = i % 10;
		if (a * a * a + b * b * b + c * c * c == i)
		{
			printf("%d\n", i);
		}
	}
	return 0;
}

在這裡插入圖片描述

9.一個數如果恰好等於它的因子之和,這個數就稱為“完數”。例如,6的因子為1,2,3,而6=1+2+3,因此6是“完數”。程式設計序找出1000之內的所有完數,並按下面格式輸出其因子:

#include<stdio.h>

int main()
{
	int data, fator, sum;      /* data表示要判斷的數,fator表示因子,sum表示因子之和*/

	for (data = 2; data <= 1000; data++)
	{
		//1是所有整數的因子,所以因子之和從1開始
		sum = 1;
		for (fator = 2; fator <= data / 2; fator++)
		{
			/* 判斷data能否被fator整除,能的話fator即為因子  因子不包括自身 */
			if (data % fator == 0)
			{
				sum += fator;
			}
		}
		// 判斷此數是否等於因子之和 */
		if (sum == data)    
		{
			printf("%d its factors are 1, ", data);
			for (fator = 2; fator <= data / 2; fator++)
			{
				if (data % fator == 0)
				{
					printf("%d, ", fator);
				}
			}
			printf("\n");
		}
	}
	return 0;
}

10.有一個分數序列,求出這個數列的前20項之和。

在這裡插入圖片描述

#include <stdio.h> 
//定義迴圈次數
#define COUNT 20

int main()
{
	//定義第一個分式的分子為a, 值為2; 定義分母為b,值為1
	//定義相加的和為sum,初始值為0
	double a = 2, b = 1, sum = 0;
	double temp;

	for (int i = 0; i < COUNT; i++)
	{
		sum += a / b;
		//記錄前一項分子
		temp = a;
		//前一項分子與分母之和為後一項分子
		a = a + b;
		//前一項分子為後一項分母
		b = temp;
	}
	printf("前%d項之和為:sum=%9.7f\n", COUNT, sum);
	return 0;
}

11.一個球從100m高度自由落下,每次落地後反彈回原高度的一半,再落下,再反彈。求它在第10次落地時共經過多少米,第10次反彈多高。

#include <stdio.h>

int main()
{
	//總高度
	double total_m = 100.0;
	//小球經歷的米數
	double total_sum = 0.0;
	for (int i = 0; i < 10; i++)
	{
		total_sum += total_m;
		total_m /= 2;
		total_sum += total_m;
	}
	//不需要計算第10次的反彈高度,所以減去
	total_sum -= total_m;
	printf("小球總共經歷%lf米, 第10次反彈%lf米\n", total_sum, total_m);
	return 0;
}

在這裡插入圖片描述

12.猴子吃桃問題。猴子第1天摘下若干個桃子,當即吃了一半,還不過癮,又多吃了一個。第2天早上又將剩下的桃子吃掉一半,又多吃了一個。以後每天早上都吃了前一天剩下的一半零一個。到第10天早上想再吃時,就只剩一個桃子了。求第1天共摘多少個桃子。

#include <stdio.h>

int main()
{
	int day = 9;
	int prev_day_count;
	int cur_day_count = 1;
	while (day > 0)
	{
		prev_day_count = (cur_day_count + 1) * 2;
		cur_day_count = prev_day_count;
		day--;
	}
	printf("total count : %d\n", cur_day_count);
	return 0;
}

在這裡插入圖片描述

13.用迭代法求x=求平方根的迭代公式為在這裡插入圖片描述要求前後兩次求出的x的差的絕對值小於10^(-5)

#include <stdio.h>
#include <math.h>

int main()
{
	float a, x0, x1;
	printf("請輸入一個正數: ");
	scanf("%f", &a);
	x0 = a / 2;
	x1 = (x0 + a / x0) / 2;
	do
	{
		x0 = x1;
		x1 = (x0 + a / x0) / 2;
	} while (fabs(x0 - x1) >= 1e-5);
	printf("[%f] 的平方根為 [%f]\n", a, x1);
	return 0;
}

在這裡插入圖片描述

14.用牛頓迭代法求下面方程在1.5附近的根:

在這裡插入圖片描述

#include <stdio.h>
#include <math.h>

int  main()
{
	double x1, x0, f, f1;
	x1 = 1.5;
	do
	{
		x0 = x1;
		f = ((2 * x0 - 4) * x0 + 3) * x0 - 6;
		f1 = (6 * x0 - 8) * x0 + 3;
		x1 = x0 - f / f1;
	} while (fabs(x1 - x0) >= 1e-5);
	printf("方程在1.5附近的根為:%lf\n", x1);
	return 0;
}

在這裡插入圖片描述

15.用二分法求下面方程在(-10,10)的根:

在這裡插入圖片描述

#include<stdio.h>
#include<math.h>

int main()
{
	double left = -10, right = 10, mid;
	double temp = 10;
	while (fabs(temp) > 1e-5)
	{
		mid = (left + right) / 2;
		//((2x - 4)*x + 3) * x - 6 ==> 2x^3 - 4x^2 + 3x -6
		temp = ((2 * mid - 4) * mid + 3) * mid - 6;

		if (temp > 0)
		{
			right = mid;
		}
		else if (temp < 0)
		{
			left = mid;
		}
	}
	printf("在(-10,10)的根為:%lf", mid);
	return 0;
}

16.輸出以下圖案:

在這裡插入圖片描述

#include <stdio.h>

int main()
{
	int cur_row, space_count, start_count;
	//輸出前4行內容
	for (cur_row = 0; cur_row < 4; cur_row++)
	{
		//計算當前行空格數量,並且進行列印
		for (space_count = 3 - cur_row; space_count > 0; space_count--)
		{
			printf(" ");
		}
		//計算當前行*數量,並且進行列印
		for (start_count = 2 * cur_row + 1; start_count > 0; start_count--)
		{
			printf("*");
		}
		printf("\n") ;
	}
	//輸出後三行
	for (cur_row = 0; cur_row < 3; cur_row++)
	{
		for (space_count = cur_row + 1; space_count > 0; space_count--)
		{
			printf(" ");
		}

		for (start_count = 7 - 2 * (cur_row + 1); start_count > 0; start_count--)
		{
			printf("*");
		}
		printf("\n");
	}
	return 0;
}

17.兩個乒乓球隊進行比賽,各出3人。甲隊為A,B,C 3人,乙隊為X,Y,Z 3人。已抽籤決定比賽名單。有人向隊員打聽比賽的名單,A說他不和X比,C說他不和X,Z比,請程式設計序找出3對賽手的名單。

#include <stdio.h>

int main()
{
	int A_battle, B_battle, C_battle;
	//如果A對戰的物件從“X”到“Z”
	for (A_battle = 'X'; A_battle <= 'Z'; A_battle++)
	{
		//如果B對戰的物件從“X”到“Z”
		for (B_battle = 'X'; B_battle <= 'Z'; B_battle++)
		{
			//如果C對戰的物件從“X”到“Z”
			for (C_battle = 'X'; C_battle <= 'Z'; C_battle++)
			{
				//去除限制條件
				if (A_battle == 'X' || C_battle == 'X' || C_battle == 'Z' || B_battle == A_battle || B_battle == C_battle || A_battle == C_battle)
				{
					continue;
				}
				printf("A對%c,B對%c,C對%c", A_battle, B_battle, C_battle);
			}
		}
	}
	return 0;
}

在這裡插入圖片描述