好久没发啦,这是第六章的答案。之前人生发生了颇大的变故,不提也罢。
之前发现CSDN上写《C Primer Puls》这本书课后答案的不少,没想到我居然受到到了几位朋友点赞,看来萌新风格对萌新更友好啊。关于@天姬or田鸡提到第五章第1题minute应该从>=改为>更符合题目语义我深表赞同,已加以修改。
回归正题,第六章引入while、for、do while、三种循环后,课后题目写法就不像之前那样单一了,不同的人出于数学上考虑的差异,程序的逻辑也各有不同。为写好第六章,在自己编完后看对比别人的版本得出一个结论:简洁。
都说程序可读性是最重要的,而写循环最能让人看懂的方式就是简洁。少写变量,少用嵌套循环(事实上书里就是这样倡导,比如第14题就要求不要用嵌套循环)。课后题目比起动辄上千行的实际工程简单多了,若课后题目写的都艰涩复杂,那实际工作岂不得要命?而且研究如何写的轻便高效也是锻炼的过程。
第六章中第5题和第14题是我个人认为最难的,均花了2个多小时才逐渐写出来。建议和我一样的萌新不要急着看答案,先自己写完再比照别人的。
第5题,最后我设计了一种输入任意字母均可形成金字塔的写法,而网上很多答案都是只能输入E形成金字塔。第14题要求不用嵌套循环,但我发现找到的答案几乎全部用了嵌套循环。当然,实际工程中不需要太多的奇技淫巧(比如最近大火的《太吾绘卷》据说被很多程序员吐槽写的乱),但能写出来还是很有意思的嘛。
#include
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
int main(void)
{
int n, m;
for(n = 1; n <= 5; n++)
{
for(m = 1; m <= n; m++)
printf("$");
printf("\n");
}
return 0;
}
#include
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
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
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
#include
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
#include
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
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
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
#include
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
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
#include
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
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
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
#include
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
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
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
# 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;
}