C Primer Plus(第6版)第六章编程练习答案

       好久没发啦,这是第六章的答案。之前人生发生了颇大的变故,不提也罢。

       之前发现CSDN上写《C Primer Puls》这本书课后答案的不少,没想到我居然受到到了几位朋友点赞,看来萌新风格对萌新更友好啊。关于@天姬or田鸡提到第五章第1题minute应该从>=改为>更符合题目语义我深表赞同,已加以修改。

        回归正题,第六章引入while、for、do  while、三种循环后,课后题目写法就不像之前那样单一了,不同的人出于数学上考虑的差异,程序的逻辑也各有不同。为写好第六章,在自己编完后看对比别人的版本得出一个结论:简洁。

        都说程序可读性是最重要的,而写循环最能让人看懂的方式就是简洁。少写变量,少用嵌套循环(事实上书里就是这样倡导,比如第14题就要求不要用嵌套循环)。课后题目比起动辄上千行的实际工程简单多了,若课后题目写的都艰涩复杂,那实际工作岂不得要命?而且研究如何写的轻便高效也是锻炼的过程。

        第六章中第5题和第14题是我个人认为最难的,均花了2个多小时才逐渐写出来。建议和我一样的萌新不要急着看答案,先自己写完再比照别人的。

        第5题,最后我设计了一种输入任意字母均可形成金字塔的写法,而网上很多答案都是只能输入E形成金字塔。第14题要求不用嵌套循环,但我发现找到的答案几乎全部用了嵌套循环。当然,实际工程中不需要太多的奇技淫巧(比如最近大火的《太吾绘卷》据说被很多程序员吐槽写的乱),但能写出来还是很有意思的嘛。

#include <stdio.h>
int main(void)
{
	char Letters[26], x = 'a';
	int n;
	
	for(n = 0; x <= ('a' + 25); x++, n++) 
	{
		Letters[n] = x;
		printf("%c", Letters[n]);
	}
		return 0;
 } 
#include <stdio.h>
int main(void)
{
	int n, m;
	
	for(n = 1; n <= 5; n++)
	{
		for(m = 1; m <= n; m++)
		printf("$");
		printf("\n");
	}
	
	return 0;
}
#include <stdio.h>
int main(void)
{
	int n, m;
	char letter;
	
	for(n = 1; n <= 6; n++)
	{
		for(letter = 'F', m = 1; m <= n; m++, letter--)
		printf("%c", letter);
		printf("\n");
	}
	
	return 0;
}
#include <stdio.h>
int main(void)
{
    int n, m, p;
	char letter;
	
	for(n = 0, m = 0; n <= 5; n++, m += n)
	{
		for(letter = 'A' + m, p = 0; p <= n; p++, letter++)
	 	printf("%c", letter); 
	 	printf("\n");
	 } 
	 return 0;
 } 
#include <stdio.h>
int main(void)
{
	int m, n, i, z, q;
	char x;
	scanf("%c", &x);
	
	n = x - 'A';
	
	for(m = 0; m < n + 1; m++)
	{
		for(i = 0; m < n - i; i++)
		printf(" ");
		for(z = 0; z <= m; z++)
		printf("%c", 'A' + z);
		for(q = 2; 'A' + z - q >= 'A'; q++)
		printf("%c", 'A' + z - q);
		printf("\n");
	}
return 0;
}
#include <stdio.h>
#include <math.h>
int main(void)
{
	long a, b ,c;
	long max, min;
	
	scanf("%ld", &a);
	b = pow(a, 2);//关于pow函数可以参考P105内容。 
	c = pow(a, 3);
	
	for(scanf("%ld %ld", &min, &max) ; a >= max, c <= max; ) 
	{
	printf("%15ld %15ld %15ld\n", a, b, c);
	scanf("%ld", &a);/*往下三行放入for循环更新部分,可以使循环部分简洁明了。我的放法只是一种尝试,没有特别用意。*/
	b = pow(a, 2);
	c = pow(a, 3);
	}
	printf("over");
	return 0;
 } 
#include <stdio.h>
#include <string.h>
int main(void)
{
	int i;
	char voc[25];
	
	for(i = 0, scanf("%s", voc); i <= strlen(voc); i++)
	printf("%c", voc[strlen(voc)-1-i]);//-1是因为数组从0算顺序,而strlen从1开始 
	
return 0;
}
#include <stdio.h>
int main(void)
{
    double x, y, z;
	
	printf("请输入两个浮点数:\n");
	
	
	while( scanf("%lf %lf", &x, &y) == 2)
	{
	z = (x - y) / (x * y);
	printf("%lf\n", z);
	}
	printf("您输入的不是浮点数。"); 
	return 0; 
 } 
#include <stdio.h>
double txt(double x, double y);
int main(void)
{
    double x, y, z;
	
	printf("请输入两个浮点数:\n");
	
	
	while( scanf("%lf %lf", &x, &y) == 2)
	{
	printf("%lf\n", txt(x, y));
	}
	printf("您输入的不是浮点数。"); 
	return 0; 
 } 
 double txt(double x, double y)
 {
 	double z;	
 	z = (x - y) / (x * y);
 	
 	return z;
 }
#include <stdio.h>
#include <math.h>
int main(void)
{
	long x, y, i, z;

	printf("Enter lower and upper integer limits:");
	scanf("%ld %ld", &x, &y); 
	
	for(; x < y; scanf("%ld %ld", &x, &y)) 
	{
		for(z = 0, i = x; i <= y; i++)
		{
			z += pow(i, 2);
		}
	printf("The sums of the squares from %ld to %ld is %ld\n", x*x, y*y, z);//别把这里的x*x和y*y换成pow(x,2)和pow(y,2),可以试着换看看结果然后思考原因 
	printf("Enter lower and upper integer limits:");
	} 
	printf("Done");
	return 0; 
 } 
#include <stdio.h>
int main(void)
{
	int num[8], i;
	
	for(i = 1; i <= 8; i++)
	{
		printf("请输入第%d个数:\n", i);
		scanf("%d", &num[i-1]);
		printf("第%d个数是%d\n", i, num[i-1]);
	}
	for(i = 7; i >= 0; i--)
	{
		printf("%d\t", num[i]);
	}
	return 0;
 } 
#include <stdio.h>
#include <math.h>
int main(void)
{
	int n, x, y; 
	float i1, i2;
	
	
	printf("请输入制定次数:");
	scanf("%d", &n); 
	
	for(i1 = 0, i2 = 0, x =1, y = 1; x <= n, y <= n;  x++, y++)
		{
		i1 += 1.0 / x;//这里和下面的1不用浮点形式,会导致除以2以上的数只能得到0,而浮点型加减乘除整型都得到整型 
		i2 += (pow(-1, (y+1))*(1.0 / y));
		}
	printf("%lf\n%lf", i1, i2);
	
	return 0;
 } 
#include <stdio.h>
int main(void)
{
	int num[8], i;
	
	for(i = 1; i <= 8; i++)
	{
		num[i-1] = pow(2, i);
	}
	do
	{
		printf("%d\t", num[i-2]);//经过上面的迭代i已经变成9,对此要有清醒认识 
		i--;
	}
	while(i > 1);
	
	return 0; 
 } 
#include <stdio.h>
int main(void)
{
	double fir[8], sec[8];
	int i, k;
	
	printf("请输入第1个数:\n");
	scanf("%lf", &fir[0]);
	sec[0] = fir[0];
	printf("fir[8]的第1个元素是:%lf,sec[8]的第1个元素是:%lf\n", fir[0], sec[0]);
		
	for(i = 2, k = 1; i <=8, k <= 7; i++, k++)
	{
		printf("请输入第%d个数:\n", i);
		scanf("%lf", &fir[k]);
		sec[i-1] = sec[i-2]+ fir[k];  
		printf("fir[8]的第%d个元素是:%lf,", i, fir[k]);
		printf("sec[8]的第%d个元素是:%lf\n", i, sec[i-1]);
	}
	
	i = 0;
	while(i <= 7)
	{
		printf("%lf\t", fir[i]);
		i++;
	}
	printf("\n");
	
	i = 0;
	while(i <= 7)
	{
		printf("%lf\t", sec[i]);
		i++;
	}
	return 0;
 } 
#include <stdio.h>
#include <string.h>
int main(void)
{
	int i;
	char voc[255];
	
	for(i = 0, scanf("%s", voc); i <= strlen(voc); i++)//scanf函数读取一行时用%s遇到空白字符就断开,也就是说只能读取无间断的一行 
	{
		for(n=0; str)
	}
	printf("%c", voc[strlen(voc)-1-i]);
	
return 0;
}
#include <stdio.h>
int main(void)
{
	float Dei, Dap, x;
	int n;
	
	for(Dap = 100.0, Dei = 100.0, n = 1, x = 0.0; x <= Dap; n++)
	{
		Dap = 0.1 * 100 * n;
		Dei *= 1.05 ;
		x = Dei - 100.0;
	}
	printf("%f\t%f\n", Dap, x);
	printf("%d", n-1);//注意for循环顺序:当经过某次循环实现反超后仍会迭代n再继续比较,得到反超结论退出循环后,此时n已经+1了 
	
	return 0;
 } 
#include <stdio.h>
int main(void)
{
	double x;
	int n;
	
	x = 100.0;
	n = 1; 
	
	while(x >= 0.0)
	{
		x *= 1.08;
		x -= 10.0;
		n++;
	}
	printf("最后还剩下%lf万元。\n", x + 10);
	printf("共计%d年。", n - 1);
	return 0;
}
#include <stdio.h>
# define Dun 150
int main(void)
{
	int n, i;
	
	for(i = 1, n = 5; n <= Dun; i++)
	{
		n = n - i;
		n = n * 2;
		printf("第%d周Rabnud博士的朋友数量:%d\n", i, n);
	}
	printf("花了%d周超过了邓巴数", i - 1);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/LittleHaardt/article/details/83050445