第六章习题
/*第六章 练习题1
题目:1.编写一个程序,创建一个包含26个元素的数组,并在其中储存
26个小写字母。然后打印数组的所有内容。
分析:定义一个26元素的字符型数组,所以占用26个字节,然后还有把
他们全部打印出来,所以循环的次数要与元素的长度相等。
*/
#include <stdio.h>
#define length 26//声明循环长度。
unsigned char letter = 'A';//letter字母 声明起始字母‘A’。
char ch[26] ;//创建26个元素数组
unsigned char i; //声明循环变量‘i’。
int main ()
{
/*初始化数组元素*/
for(i = 0;i < length;i++)
ch[i] = i + 'a';
/*打印数组元素*/
for(i = 0;i < length;i++)//循环26次
// printf("%c ",letter++);//每次输出完毕之后letter加1。
printf("%c ", ch[i]);
return 0;
}
/*第六章 练习题2
题目:2.使用嵌套循环,按下面的格式打印字符:
$
$$
$$$
$$$$
$$$$$
分析:关键要点是嵌套循环,然后这个规律是五行,每行递增一个。
*/
#include <stdio.h>
#define line 5//声明行数。
unsigned char i,j; //声明循环变量‘i’'j'。
int main ()
{
/*设定循环次数即行数*/
for(i = 0;i < line;i++)
{
/*设定每行循环几次即每行的个数*/
for(j = 0;j <= i;j++)//j <= i是重点
{
printf("$");
}
printf("\n");
}
return 0;
}
/*第六章 练习题3
题目:3.使用嵌套循环,按下面的格式打印字母:
F
FE
FED
FEDC
FEDCB
FEDCBA
分析:关键要点是嵌套循环,然后这个规律是六行,起始字母是'F'每行倒序递增一个。
*/
#include <stdio.h>
#define line 6//声明行数。
unsigned char i,j,ch = 'A'; //声明循环变量‘i’'j'。
int main ()
{
/*设定循环次数即行数*/
for(i = 0;i < line;i++)
{
/*设定没行输出几个字符*/
for(j = 0;j <= i;j++)
{
printf("%C",ch--);//倒序递增
}
printf("\n");
ch = 'F';//重置ch初值
}
return 0;
}
/*第六章 练习题4
题目:4.使用嵌套循环,按下面的格式打印字母:
A
BC
DEF
GHIJ
KLMNO
PQRSTU
分析:关键要点是嵌套循环,然后这个规律起始A到U截止是六行,每行字符正序递增数量=行数
*/
#include <stdio.h>
#define line 6//声明行数。
unsigned char i,j,ch = 'A'; //声明循环变量‘i’'j'和字符变量'A'。
int main ()
{
/*设定循环次数即行数*/
for(i = 0;i < line;i++)
{
/*设定每行循环的次数*/
for(j = 0;j <= i;j++)
{
printf("%c",ch++);//打印ch后且加1.
}
printf("\n");
}
return 0;
}
/*第六章 练习题5
题目:5.编写一个程序,提示用户输入大写字母。使用嵌套循环以下面
金字塔型的格式打印字母:
A
ABA
ABCBA
ABCDCBA
ABCDEDCBA
分析:关键要点是嵌套循环,然后这个规律起始字符A截止字符=行数,
每一行打印的字符数量是相同的,只是字符类型数量不同,
其规律是空格递减字符由正序和倒序递增
*/
#include <stdio.h>
int main()
{
int i, j;
char ch;
printf("Please enter a upper letter: ");
scanf("%c", &ch);
printf("The pyramid of %c is:\n", ch);
char length = ch - 'A';//计算字母长度。
/*循环行数*/
for (i = 0; i <= length; i++)
{
char letter = 'A' - 1;//计算起始字母。
/*空格递减*/
for (j = 0; j < length - i; j++)
printf(" ");//打印递减空格;
/*递增字母*/
for (j = 0; j <= i; j++)
printf("%c", ++letter);//打印递增字母;
/*递减字母*/
for (j = 0; j < i; j++)
printf("%c", --letter);//打印递减字母
printf("\n");
}
return 0;
}
/*第六章 练习题6
题目:6.编写一个程序打印一个表格,每一行打印一个整数、该数的平
方、该数的立方。要求用户输入表格的上下限。使用一个for循环。
分析:
*/
#include <stdio.h>
int main(void)
{
/*声明上下限*/
int i, upper, lower;
/*输入上限*/
printf("Please input the upper limits: ");
scanf("%d", &upper);
/*输入下限*/
printf("Please input the lower limits: ");
scanf("%d", &lower);
/*输出格式*/
printf("%-10s%-10s%-10s\n", "number", "square", "cube");
for (i = lower; i <= upper; i++)
{
/*输出结果*/
printf("%-10d%-10d%-10d\n", i, i * i, i * i * i);
}
/*完成*/
printf("Done.\n");
return 0;
}
/*第六章 练习题7
题目:7.编写一个程序把一个单词读入一个字符数组中,然后倒序打印
这个单词。提示:strlen()函数(第4章介绍过)可用于计算数组最后
一个字符的下标。
分析:
*/
#include <stdio.h>
#include <string.h>
#define LEN 20//声明数组长度
int main()
{
int i;
char str[LEN];//字符串数组.
printf("Please enter a word: ");//请输入一个单词
scanf("%19s", str);//输入最大19个字节,字符串不用加&,逐个需要
printf("The word is:\n");
printf("%s\n", str);//打印出来刚才输入的单词
printf("Reversing the word is:\n");
// printf("%d",strlen(str));
// printf("\0\n");
// printf("\0\n");
for (i = strlen(str) - 1; i >= 0; i--)//-1是因为单词属于字符串,字符串储存在数值中的最后一位是\0
{
printf("%c", str[i]);
}
return 0;
}
/*第六章 练习题8
题目:8.编写一个程序,要求用户输入两个浮点数,并打印两数之差
除以两数乘积的结果。在用户输入非数字之前,程序应循环
处理用户输入的每对值。
分析:浮点数用 flaot,double
*/
#include <stdio.h>
int main()
{
double i, j;
printf("Please enter two numbers (q to quit): ");//请输入两个数字q退出
while (scanf("%lf %lf", &i, &j) == 2) //成功输入两个变量scanf返回2
{
printf("(%g - %g) / (%g * %g)", i, j, i, j);
printf(" = %g\n", (i - j) / (i * j));
printf("You can enter again (q to quit): ");
}
printf("Done.\n");
return 0;
}
/*第六章 练习题9
题目:9.修改练习8,使用一个函数返回计算的结果。
分析:
*/
#include <stdio.h>
double ret (double a,double b)
{
return (a-b) / (a*b);
}
int main()
{
double i, j;
printf("Please enter two numbers (q to quit): ");//请输入两个数字q退出
while (scanf("%lf %lf", &i, &j) == 2) //成功输入两个变量scanf返回2
{
printf("(%g - %g) / (%g * %g)", i, j, i, j);
printf(" = %g\n",ret(i,j));//调用ret函数将ij的值发送到ab中经过(a-b) / (a*b)后返回double类型的数
printf("You can enter again (q to quit): ");
}
printf("Done.\n");
return 0;
}
/*第六章 练习题10
题目:10.编写一个程序,要求用户输入一个上限整数和一个下限整数, 计算从上限到下限范围内所有整数的平方和,并显示计算结果。然后 程序继续提示用户输入上限和下限整数,并显示结果,直到用户输入
的上限整数小于下限整数为止。
分析:
*/
#include <stdio.h>
int main()
{
/*声明上限和下限*/
int upp, low, i;
printf("Enter lower and upper integer limits: ");
while ((scanf("%d %d", &upp, &low) == 2) && (upp > low))//如果上限 > 下限而且scanf返回2,条件成立进入循环,否则跳过,
{
/*声明一个变量保存平方和*/
int sum = 0;
/*范围*/
for (i = low; i <= upp; i++)
{
sum += i * i;//等价于sun = sun + i * i
}
/*打印*/
printf("The sums of the squares ");
printf("from %d to %d is %d\n", low * low, upp * upp, sum);
/*继续输入*/
printf("Enter next set of limits: ");
}
printf("Done\n");//完成
return 0;
}
/*第六章 练习题11
题目:11.编写一个程序,在数组中读入8个整数,然后按倒序打印这8个
整数。
分析:
*/
#include <stdio.h>
#define length 8
int numer[length];
int main()
{
int i;
printf("Please enter 8 numbers:\n", length);
for (i = 0; i < length; i++)
{
scanf("%8d", &numer[i]);//因为是八个独立的整数所以要加&取地址
}
for(i = length - 1; i >= 0;i--)
printf("%-2d",numer[i]);//左对齐整数占两位
return 0;
}
/*第六章 练习题12
题目: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项后的总和,
是否发现每个序列都收敛于某值?
分析: 简单点说就是输入一个循环次数 ,这个次数要大于零才行
然后导入这两个公式,这第一个公式的规律杯除数随循环的次数变化而变化
第二个公式同样也是,但是奇数相减,偶数相加。
*/
#include <stdio.h>
int main ()
{
double num ,i;//声明输入次数和循环次数
printf("Please enter a number greater than zero (less than zero exit)");//请输入一个大于零的次数(小于零退出)
/*判断用户输入是否满足*/
while((scanf("%lf",&num) == 1) && (num > 0))
{
double sum1 = 0,sum2 = 0;//结果保存在这里
int sign = 1;//用于更改符号
/*循环累加*/
for(i = 1.0;i <= num;i++,sign = 0 - sign)//sign随i++变化
{
sum1 += 1.0/i;
sum2 += sign*1.0/i;
}
/*打印*/
printf("%.lf The sum of subformula 1 is %g\n",num,sum1);//公式一的和为
printf("%.lf The sum of subformula 2 is %g\n",num,sum2);//公式二的和为
/*继续输入*/
printf("Please continue tying");//请继续输入
}
printf("Done");
return 0;
}
/*第六章 练习题13
题目:13.编写一个程序,创建一个包含8个元素的int类型数组,
分别把数组元素设置为2的前8次幂。使用for循环设置
数组元素的值,使用do while循环显示数组元素的值。
分析: 就是创建一个8个int类型元素的数组,先计算2的当前次幂在保存到第7次结束(前8次)
然后用do while 打印
*/
#include <stdio.h>
#define NUM 8
int main(void)
{
int array[NUM];
int i;
int value = 2;
for(i = 0;i < NUM;i++)
{
array[i] = value;
value *= 2;//*2为下一次保存做铺垫.
}
i = 0;
do
{
printf("%d\t", array[i++]);
} while (i < NUM);
printf("\nDone.\n");
return 0;
}
/*第六章 练习题14
题目:14.编写一个程序,创建两个包含8个元素的double类型数组,
使用循环提示用户为第一个数组输入8个值。
第二个数组元素的值设置为第一个数组对应元素的累积之和。
分析:
*/
#include <stdio.h>
#define NUM 8
int main(void)
{
int i;
double value1[NUM], value2[NUM];
printf("Please enter %d numbers:\n", NUM);
for (i = 0; i < NUM; i++)
{
scanf("%lf", &value1[i]);
/* 第二个数组元素的值设置为第一个数组对应元素的累积之和。*/
value2[i] = value1[i] + value2[i-1];
}
printf("Here are the results for array 1:\n");
for (i = 0; i < NUM; i++)
{
printf("%-g\t", value1[i]);
}
printf("\nHere are the results for array 2:\n");
for (i = 0; i < NUM; i++)
{
printf("%-g\t", value2[i]);
}
printf("\nDone.\n");
return 0;
}
/*第六章 练习题15
题目:15.编写一个程序,读取一行输入,然后把输入的内容倒序打印出来。
可以把输入储存在char类型的数组中,假设每行字符不超过255。
回忆一下,根据%c转换说明,scanf()函数一次只能从输入中读
取一个字符,而且在用户按下Enter键时scanf()函数会生成一个换行
字符(\n)。
*/
#include <stdio.h>
#define LEN 255
int main(void)
{
/*声明输出以及循环变量*/
int i = 0;
char str[LEN];
printf("Please enter a string:\n");//请输入一个字符串
/*do while先执行在判断*/
do
{
scanf("%c", &str[i]);//i = 0所以指向第0个元素
} /*因为是\n结束 所以先++i载判断,时候收到\n,小于数组*/
while (str[i] != '\n' && i < LEN && ++i);
printf("Reversing print the string is:\n");//反转输入的字符串
for (i-1; i >= 0; i--)//i-1避免打印换行符;
{
printf("%c", str[i]);
}
printf("\nDone.\n");
return 0;
}
/*第六章 练习题16
题目:16.Daphne以10%的单利息投资了100美元(也就是说,每年投资获利相当于原始投资的10%)。
Deirdre以 5%的复合利息投资了100 美元(也就是说,利息是当前余额的 5%,包含之前的利息)。
编写一个程序,计算需要多少年Deirdre的投资额才会超过Daphne,
并显示那时两人的投资额。
*/
#include<stdio.h>
double Daphne = 100,Deirdre = 100;
int i;
int main(void)
{
while(Daphne >= Deirdre)
{
Daphne += 100 * 0.1;
Deirdre += Deirdre * 0.05;
i++;
}
printf("%d 年后Deirdre的钱会超过Daphne\n",i);
printf("DaphneMoney: %.lf\n",Daphne);
printf("DeirdreMoney: %.lf\n",Deirdre);
return 0;
}
/*第六章 练习题17
题目:17.Chuckie Lucky赢得了100万美元(税后),他把奖金存入年利率8%的账户。
在每年的最后一天, Chuckie取出10万美元。编写
一个程序,计算多少年后Chuckie会取完账户的钱?
*/
#include <stdio.h>
int main(void)
{
int i = 0;
double Chuckie = 100.0;
do
{
Chuckie += Chuckie * 0.08;
Chuckie -= 10;
i++;
printf("第(%d)年余额:%g万美元\n", i, Chuckie);
} while (Chuckie >= 10);//每年取出来10万
printf(" %d 年后:\n", ++i);
printf("Chuckie 的钱就取完了\n");
return 0;
}
/*第六章 练习题18
题目:18.Rabnud博士加入了一个社交圈。起初他有5个朋友。他注意 到他的朋友数量以下面的方式增长。
第1周少了1个朋友,剩下的朋友 数量翻倍;第2周少了2个朋友,剩下的朋友数量翻倍。一般而言,
第 N周少了N个朋友,剩下的朋友数量翻倍。编写一个程序,计算并显示 Rabnud博士每周的朋友数量。
该程序一直运行,直到超过邓巴数 (Dunbar’s number)。邓巴数是粗略估算一个人在社交圈中有稳定
关系的成员的最大值,该值大约是150。
*/
#include <stdio.h>
int main(void)
{
int i = 1;
int friends = 5;
while (friends < 150)
{
printf("At %d weeks, Rabnud has", i);
printf("%4d friends.\n", friends);
/*计算下一周*/
friends = 2 * (friends - i++);
}
printf("At %d weeks, over Dunbar's number(150).\n", i);
return 0;
}