目录
6.16.1
编写一个程序,创建一个包含26个元素的数组,并在其中储存26个小写字母。
然后打印数组的所有内容。
/*6.16.1. 编写一个程序,创建一个包含26个元素的数组,并在其中储存26个小写字母。
然后打印数组的所有内容。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
char ch[26];
int n = 0;
for (n = 0; n < 26; n++)
{
ch[n] = 'a' + n;
printf("%c ", ch[n]);
}
return 0;
}
运行结果:
6.16.2
使用嵌套格式,按下面的格式打印字符:
$
$$
$$$
$$$$
$$$$$
/*6.16.2. 使用嵌套格式,按下面的格式打印字符:
$
$$
$$$
$$$$
$$$$$
*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
int x, y;
for (x = 1; x <= 5; x++)
{
for (y = 0; y < x; y++)
{
printf("$");
}
printf("\n");
}
return 0;
}
运行结果:
6.16.3
使用嵌套循环,按下面的格式打印字母:
F
FE
FED
FEDC
FEDCB
FEDCBA
注意:如果你的系统不使用ASCII或其他以数字顺序编码的代码,可以把字符数组初始化为字母表中的字母:
char lets[27] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
/*6.16.3. 使用嵌套循环,按下面的格式打印字母:
F
FE
FED
FEDC
FEDCB
FEDCBA
注意:如果你的系统不使用ASCII或其他以数字顺序编码的代码,可以把字符数组初始化为字母表中的字母:
char lets[27] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; */
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
char ch[6];
int n = 0;
int m = 0;
for (n = 0; n < 6; n++)
{
for (m = 0; m <= n; m++)
{
ch[n] = 'F' - m;
printf("%c", ch[n]);
}
printf("\n");
}
return 0;
}
运行结果:
6.16.4
使用嵌套循环,按下面的格式打印字母:
A
BC
DEF
GHIJ
KLMNO
PQRSTU
如果你的系统不适用以数字顺序编码的代码,请参照练习3的方案解决。
/*6.16.4. 使用嵌套循环,按下面的格式打印字母:
A
BC
DEF
GHIJ
KLMNO
PQRSTU
如果你的系统不适用以数字顺序编码的代码,请参照练习3的方案解决。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
int x; //行
int y; //下标
int k;
int sum = 0; //打印次数
for (x = 0; x < 6; x++)
{
k = sum;
for (y = k; y <= k + x; y++)
{
printf("%c", 'A' + y);
sum++;
}
printf("\n");
}
return 0;
}
运行结果:
6.16.5
编写一个程序,提示用户输入信息。使用嵌套循环以下面金字塔型的格式打印字母:
A
ABA
ABCBA
ABCDCBA
ABCDEDCBA
打印这样的图形,要根据用户输入的字母来决定。例如,上面的图形是在用户输入E后的打印结果。提示:用外层循环处理行,每行使用3个内层循环,分别处理空格、以升序打印字母、以降序打印字母。
如果系统不使用ASCII或其他以数字顺序编码的代码,请参照练习3的解决方案。
/*6.16.5. 编写一个程序,提示用户输入信息。使用嵌套循环以下面金字塔型的格式打印字母:
A
ABA
ABCBA
ABCDCBA
ABCDEDCBA
打印这样的图形,要根据用户输入的字母来决定。例如,上面的图形是在用户输入E后的打印结果。
提示:用外层循环处理行,每行使用3个内层循环,分别处理空格、以升序打印字母、以降序打印字母。
如果系统不使用ASCII或其他以数字顺序编码的代码,请参照练习3的解决方案。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
char ch;
int x, y, z, w, length;
printf("输入一个字母:");
scanf("%c", &ch);
length = ch - 'A';
//以'A'为基点,假设A对应1,则B对应2,C对应3,D对应4,E对应5,length = 5-1 =4
//实际电脑里字母都有对应的ASKII码值,但是个人觉得没必要特意去背,所以这里假设从1开始了
for (x = 0; x <= length; x++) //限定行数
{
//length是输入字符的长度
//根据输入的字母来限定打印多少行
//比如输入'A',打印1行;输入'B',打印2行;输入'E',打印5行
for (y = 0; y <= length - x; y++) //限定空格数
{
//限定每一行的空格数
//如果输入的是'E':
//length = 4,根据上个循环可以知道要打印5行
//根据本循环知道:第1行打印4个空格,第2行打印3个空格,第3行打印2个空格
//第4行打印1个空格,第5行打印0个空格
printf(" ");
}
for (z = 0; z <= x; z++) //升序
{
//第1行打印1个字符,第2行打印2个字符,以此类推
printf("%c", 'A' + z);
}
for (w = x - 1; w >= 0; w--) //降序
{
//第1行不打印,第2行打印1个字符,第3行打印2个字符,以此类推
//第1行,x = 0, w = -1, 条件不成立,所以跳过
//第2行,x = 1, w = 1, 所以打印1个
printf("%c", 'A' + w);
}
printf("\n");
}
return 0;
}
运行结果:
输入大写Z得到:
输入小写字母z得到:
6.16.6
编写一个程序打印一个表格,每一行打印一个整数、该数的平方、该数的立方。
要求用户输入表格的上下限。使用一个for循环。
/*6.16.6. 编写一个程序打印一个表格,每一行打印一个整数、该数的平方、该数的立方。
要求用户输入表格的上下限。使用一个for循环。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
int n = 0;
int x = 0;
int y = 0;
int temp = 0;
printf("请输入表格的下限和上限:\n");
scanf("%d %d", &x, &y);
if (x > y) //此条件语句是为了确保x是下限,y是上限
{
temp = x;
x = y;
y = temp;
}
printf(" 整数 平方 立方\n");
for (n = x; ((n >= x) && (n <= y)); n++)
printf("%10d %10d %10d\n", n, n * n, n * n * n);
return 0;
}
运行结果:
6.16.7
/*6.16.7. 编写一个程序把一个单词读入一个字符数组中,然后倒序打印这个单词。
提示:strlen()函数(第4章介绍过)可用于计算数组最后一个字符的下标。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main(void)
{
char ch[50];
int x = 0;
int y = 0;
printf("请输入一个单词:");
scanf("%s", ch);
y = strlen(ch); //strlen(ch) 是读取的字符串的长度
printf("倒序是:");
for (x = y - 1; x >= 0; x--) //字符串长度-1,结束字符串最后一个字母的下标
{
printf("%c", ch[x]);
}
printf("\n");
return 0;
}
运行结果:
6.16.8
编写一个程序,要求用户输入两个浮点数,并打印两数之差除以两数乘积的结果。
在用户输入非数字之前,程序应循环处理用户输入的每对值。
/*6.16.8. 编写一个程序,要求用户输入两个浮点数,并打印两数之差除以两数乘积的结果。
在用户输入非数字之前,程序应循环处理用户输入的每对值。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
float x, y;
printf("请输入两个浮点数:\n");
while (scanf("%f %f", &x, &y) == 2)
{
printf("%f\n", (x - y) / (x * y));
}
printf("输入非数字,结束循环\n");
return 0;
}
运行结果:
6.18.9
修改练习8,使用一个函数返回计算的结果。
练习8题目:编写一个程序,要求用户输入两个浮点数,并打印两数之差除以两数乘积的结果。
在用户输入非数字之前,程序应循环处理用户输入的每对值。
/*6.16.9. 修改练习8,使用一个函数返回计算的结果。
练习8题目:编写一个程序,要求用户输入两个浮点数,并打印两数之差除以两数乘积的结果。
在用户输入非数字之前,程序应循环处理用户输入的每对值。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
float temp(float x, float y);
int main(void)
{
float a, b, c;
printf("请输入两个浮点数:\n");
while (scanf("%f %f", &a, &b) == 2) //scanf返回的是读取成功的个数
{
c = temp(a, b);
printf("%f\n", c);
}
printf("输入非数字,结束循环\n");
return 0;
}
float temp(float x, float y)
{
float z;
z = (x - y) / (x * y);
return z;
}
运行结果:
6.16.10
编写一个程序,要求用户输入一个上限整数和一个下限整数,计算从上限到下限范围内所有整数的平方和,并显示计算结果。然后程序继续提示用户输入上限和下限整数,并显示结果,直到用户输入的上限整数等于或小于下限整数为止。程序的运行示例如下:
Enter lower and upper integer limits: 5 9
The sums of the squares from 25 to 81 is 255
The next set of limits: 3 25
The sums of the squares from 9 to 625 is 5520
The next set of limits: 5 5
Done
/*6.16.10. 编写一个程序,要求用户输入一个上限整数和一个下限整数,计算从上限到下限范围内所有整数的平方和,并显示计算结果。然后程序继续提示用户输入上限和下限整数,并显示结果,直到用户输入的上限整数等于或小于下限整数为止。程序的运行示例如下:
Enter lower and upper integer limits: 5 9
The sums of the squares from 25 to 81 is 255
The next set of limits: 3 25
The sums of the squares from 9 to 625 is 5520
The next set of limits: 5 5
Done
*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
int x = 0; //下限
int y = 0; //上线
int n = 0;
int sum = 0;
printf("Enter lower and upper integer limits: ");
scanf("%d %d", &x, &y);
while (x < y)
{
for (n = x; ((n >= x) && (n <= y)); n++)
sum += (n * n);
printf("The sums of the squares from %d to %d is %d\n", x * x, y * y, sum);
sum = 0;
printf("The next set of limits: ");
scanf("%d %d", &x, &y);
}
printf("Done\n");
return 0;
}
运行结果:
6.16.11
编写一个程序,在数组中读入8个整数,然后按倒序打印这8个整数。
/*6.16.11. 编写一个程序,在数组中读入8个整数,然后按倒序打印这8个整数。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
int ch[8];
int n;
int x;
printf("请输入8个整数:\n");
for (n = 0; n < 8; n++)
{
scanf("%d", &ch[n]); //可以输入8个以上,但是最后只读取8个
}
printf("确认读取8个整数:\n");
for (n = 0; n < 8; n++)
{
printf("%d ", ch[n]);
}
printf("\n");
printf("倒序为:\n");
for (x = 7; x >= 0; x--)
{
printf("%d ", ch[x]);
}
printf("\n");
return 0;
}
运行程序:
6.16.12
考虑下面两个无限序列:
1.0 + 1.0/2.0 + 1.0/3.0 + 1.0/4.0 + …
1.0 - 1.0/2.0 + 1.0/3.0 - 1.0/4.0 + …
编写一个程序计算这两个无限序列的总和,直到达到某次数。提示:奇数个-1相乘得-1,
偶数个-1相乘得1。让用户交互地输入指定的次数,当用户输入0或负值时结束输入。
查看运行100项、1000项、10000项后的总和,是否发现每个序列都收敛于某值?
解析:由观察发现,1.0 - 1.0/2.0 + 1.0/3.0 - 1.0/4.0 + …序列收敛;
1.0 + 1.0/2.0 + 1.0/3.0 + 1.0/4.0 + …序列不收敛。
/*6.16.12. 考虑下面两个无限序列:
1.0 + 1.0/2.0 + 1.0/3.0 + 1.0/4.0 + …
1.0 - 1.0/2.0 + 1.0/3.0 - 1.0/4.0 + …
编写一个程序计算这两个无限序列的总和,直到达到某次数。提示:奇数个-1相乘得-1,
偶数个-1相乘得1。让用户交互地输入指定的次数,当用户输入0或负值时结束输入。
查看运行100项、1000项、10000项后的总和,是否发现每个序列都收敛于某值?*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
int num = 0;
int k = 0;
double m = 0;
double n = 0;
double sum_m = 0;
double sum_n = 0;
printf("请输入次数:\n");
scanf("%d", &k);
while (k > 0)
{
for (num = 0, m = 1.0, n = 1; num < k; num++, m++, n *= -1)
{
sum_m += 1.0 / m;
sum_n += n / m;
}
printf("sum_m = %lf\n", sum_m);
printf("sum_n = %lf\n", sum_n);
printf("请输入次数:\n");
scanf("%d", &k);
sum_m = 0; // 重新初始化
sum_n = 0; // 重新初始化
}
printf("结束\n");
return 0;
}
运行结果:
6.16.13
编写一个程序,创建一个包含8个元素的int类型数组,分别把数组元素设置为2的前8次幂。
使用for循环设置数组元素的值,使用do while循环显示数组元素的值。
/*6.16.13. 编写一个程序,创建一个包含8个元素的int类型数组,分别把数组元素设置为2的前8次幂。
使用for循环设置数组元素的值,使用do while循环显示数组元素的值。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define SIZE 8 //把8设置为常量,这样以后可以调整元素个数很方便
int main(void)
{
int i = 0;
int digit[SIZE];
int sum = 1;
for (i = 0; i < SIZE; i++)
{
digit[i] = sum;
sum *= 2; //2的n次方,就是n个2相乘
}
i = 0;
do
{
printf("第 %d 个元素的值是:%d\n", i, digit[i]);
i++;
} while (i < 8);
return 0;
}
运行结果:
6.16.14
编写一个程序,创建两个包含8个元素的double类型数组,使用循环提示用户为第一个数组输入8个值。第二个数组元素的值设置为第一个数组对应的元素的累计之和。例如,第二个数组的第4个元素的值是第一个数组前4个元素之和,第二个数组的第5个元素的值是第一个数组前5个元素之和(用嵌套循环可以完成,但是利用第二个数组的第5个元素是第二个数组的第4个元素与第一个数组的第5个元素之和,只用一个循环就能完成任务,不需要使用嵌套循环)。最后,使用循环显示两个数组的内容,第一个数组显示成一行,第二个数组显示在第一个数组的下一行,而且每个元素都与第一个数组各元素相对应。
/*6.16.14. 编写一个程序,创建两个包含8个元素的double类型数组,使用循环提示用户为
第一个数组输入8个值。第二个数组元素的值设置为第一个数组对应的元素的累计之和。
例如,第二个数组的第4个元素的值是第一个数组前4个元素之和,第二个数组的第5个元素的值
是第一个数组前5个元素之和(用嵌套循环可以完成,但是利用第二个数组的第5个元素是第二个
数组的第4个元素与第一个数组的第5个元素之和,只用一个循环就能完成任务,不需要使用嵌套
循环)。最后,使用循环显示两个数组的内容,第一个数组显示成一行,第二个数组显示在第一
个数组的下一行,而且每个元素都与第一个数组各元素相对应。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define SIZE 8 //把8设置为常量,这样以后可以调整元素个数很方便
int main(void)
{
int i = 0;
int k = 0;
double d1[SIZE];
double d2[SIZE];
printf("输入8个浮点数:\n");
for (i = 0; i < SIZE; i++)
{
scanf("%lf", &d1[i]); //这里输入用户输入大于8个数也没关系,只会读取8个
}
d2[0] = d1[0];
for (i = 1; i < SIZE; i++)
{
d2[i] = d1[i] + d2[i - 1];
//printf("%lf ", d2[i]);
}
printf("数组d1:\n");
for (i = 0; i < SIZE; i++)
{
printf("%10g", d1[i]);
}
printf("\n");
printf("数组d2:\n");
for (i = 0; i < SIZE; i++)
{
printf("%10g", d2[i]);
}
printf("\n");
return 0;
}
运行结果:
6.16.15
编写一个程序,读取一行输入,然后把输入的内容倒序打印出来。可以把输入储存在char类型的数组中,假设每行字符不超过255。回忆一下,根据%c转换说明,scanf()函数一次只能从输入中读取一个字符,而且在用户按下Enter键时scanf()函数会生成一个换行符(\n)。
/*6.16.15. 编写一个程序,读取一行输入,然后把输入的内容倒序打印出来。可以把输入储存
在char类型的数组中,假设每行字符不超过255。回忆一下,根据%c转换说明,scanf()函数一次
只能从输入中读取一个字符,而且在用户按下Enter键时scanf()函数会生成一个换行符(\n)。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#define SIZE 255
int main(void)
{
char ch[SIZE];
int t, x;
gets(ch); //读取一整行
t = strlen(ch); //获取一整行的字符数
for (x = t -1; x >= 0; x--) //最右字符的下标是 字符数-1
{
//printf("%d %c\n", x, ch[x]); //可以测试下标对应的字符
printf("%c", ch[x]);
}
printf("\n");
return 0;
}
运行结果:
6.16.16
Daphne以10%的单利息投资了100美元(也就是说,每年投资获利相当于原始投资的10%)。Deirdre 以5%的复合利息投资了100美元(也就是说,利息是当前余额的5%,包含之前的利息)。编写一个程序,计算需要多少年Deirdre的投资额才会超过Daphne,并显示那时两人的投资额。
/*6.16.16. Daphne以10%的单利息投资了100美元(也就是说,每年投资获利相当于原始投
资的10%)。Deirdre 以5%的复合利息投资了100美元(也就是说,利息是当前余额的5%,包
含之前的利息)。编写一个程序,计算需要多少年Deirdre的投资额才会超过Daphne,并显示
那时两人的投资额。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
float x, z;
int y = 0;
float sum_da = 100; //Daphne
float sum_de = 100; //Deirdre
x = 100 * 0.1;
z = 1 + 0.05; //先把下面sum_de表达式规律找出来,再来赋值
for (y = 1; sum_de <= sum_da; y++)
{
sum_da = 100 + (x * y);
sum_de *= z;
}
printf("经过 %d 年Deirdre的投资额才会超过Daphnen\n", y - 1);
printf("%.2f\n", sum_da);
printf("%.2f\n", sum_de);
return 0;
}
运行结果:
6.16.17
Chuckie Luchy 赢得了100万美元(税后),他把奖金存入年利率8%的账户。在每年的最后一天,Chuckie 取出10万美元。编写一个程序,计算多少年后Chuckie会取完账户的钱?
/*6.16.17. Chuckie Luchy 赢得了100万美元(税后),他把奖金存入年利率8%的账户。
在每年的最后一天,Chuckie 取出10万美元。编写一个程序,计算多少年后Chuckie会取完账户的钱?*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
int y;
float x;
float sum = 100;
x = 1 + 0.08; //先把sum表达式规律找出来,再来赋值
for (y = 1; sum > 0; y++)
{
sum = sum * x - 10;
}
printf("%d\n", y - 1);
return 0;
}
运行结果:
6.16.18
Rabnud博士加入了一个社交圈。起初他有5个朋友。他注意到他的朋友数量以下面的方式增长,第1周少了1个朋友,剩下的朋友数量翻倍;第2周少了2个朋友,剩下的朋友数量翻倍。一般而言第N周少了N个朋友,剩下的朋友数量翻倍。编写一个程序,计算并显示Rabnud博士每周的朋友量。该程序一直运行,直到超过邓巴数(Dunbar's number)。邓巴数是粗略估算一个人在社交圈中有稳定关系的成员的最大值,该值大约是150。
/*6.16.18. Rabnud博士加入了一个社交圈。起初他有5个朋友。他注意到他的朋友数量以下面
的方式增长,第1周少了1个朋友,剩下的朋友数量翻倍;第2周少了2个朋友,剩下的朋友数量翻倍。
一般而言,第N周少了N个朋友,剩下的朋友数量翻倍。编写一个程序,计算并显示Rabnud博士每周
的朋友数量。该程序一直运行,直到超过邓巴数(Dunbar's number)。邓巴数是粗略估算一个人
在社交圈中有稳定关系的成员的最大值,该值大约是150。*/
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(void)
{
int y = 0;
int sum = 5;
for (y = 1; sum <= 150; y++)
{
sum = (sum - y) * 2;
printf("第 %d 周的朋友数量是:%d\n", y, sum);
}
return 0;
}
运行结果: