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

6.16编程练习

/*
编写一个程序,创建一个包含26个元素的数组,并在其中存储26个小写字母。
然后打印数组的所有内容
*/
#include <stdio.h>
#define SIZE 26
int main(void)
{
	char alphabet[SIZE];
	int index;
	for (char ch = 'a', index = 0; ch <= 'z'; ch++, index++)
		alphabet[index] = ch;
	for (int index = 0; index < SIZE; index++)
		printf("%c \n", alphabet[index]);

	return 0;
}
/*
使用嵌套循环(nested loop)按照下面的格式打印字符:
$
$$
$$$
$$$$
$$$$$
*/
#include <stdio.h>
int main(void)
{
	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < i+1; j++)
			printf("$");
		printf("\n");
	}
	
	return 0;
}
/*
使用嵌套循环nested loop,按下面的格式打印字母
F
FE
FED
FEDC
FEDCB
FEDCBA
此程序可以修改CH来打印各种字符递减的三角形
比如当CH改为H时,输出效果如下:
H
HG
HGF
HGFE
HGFED
HGFEDC
HGFEDCB
HGFEDCBA
*/
#include <stdio.h>
#define CH 'F'
int main(void)
{
	char ch = CH;
	for (int i = 0; i <=CH - 'A'; i++)
	{	
		for (int j = 0, ch = CH;  j<= i; j++, ch--)//从F开始打印,第一次打印1个
			printf("%c", ch);		  //第二次打印两个,利用与外层循环变量i的关系控制	
		printf("\n");
	}	

	return 0;	
}
  1. 此程序提供了3个版本,依次改进

/*
使用嵌套循环,按下面的格式打印字母:
A
BC
DEF
GHIJ
KLMNO
PQRSTU
*/
#include <stdio.h>
int main(void)
{	
	const char end = 'U';
	char start;
	
	for (int i=0, start = 'A'; ch <= 'U'; i++)
	{
		for (int j=0; j <= i; j++)	//利用行数与打印字符之间的关系
		{
			printf("%c", start);
			start++;		//每打印一个字符,字符递增至下一个字符	
		}
		printf("\n");			//每一行结束后,换行	
	}	

	return 0;
}
//*************************************************************************
/*
下面是增强版,简化了代码行数,并可让用户输入指定字符
打印三角形至输入字符所在行
如输入V,则打印:
A
BC
DEF
GHIJ
KLMNO
PQRSTU
VWXYZ[\
*/
#include <stdio.h>
int main(void)
{
	char end;
	char start;
	
	printf("Enter an character: \n");
	scanf("%c", &end);
	for (int i = 0, start = 'A'; start <= end; i++)
	{
		for (int j=0; j<=i; j++, printf("%c", start), start++);
		printf("\n");
	}

	return 0;
}
//*************************************************************************
/*
进了上个程序,使其只会打印至用户输入的字符处,不同于上个程序
会完整输出字符所在的整行
*/
#include <stdio.h>
int main(void)
{
	char start;
	char end;

	printf("Enter an end of the character: \n");
	scanf("%c", &end);
	for (int i = 0, start = 'A'; start <= end; i++)
	{
		for (int j = 0; j <= i; j++,start++)
		{
			if (start<= end)
				printf("%c", start);
		}
		printf("\n");
	}

	return 0;
}
/*
编写一个程序,提示用户输入大写字母
使用嵌套循环以下面金字塔型的格式打印字母
        A       
       ABA
      ABCBA
     ABCDCBA
    ABCDEDCBA
 打印这样的图形,要根据用户输入的字母来决定。
 例如,上面的图形是在输入E后的打印结果。
*/
#include <stdio.h>
int main(void)
{

	char start = 'A';
	char end;
	char ch = start;
	
	printf("Enter an character i will give you a surprise now: \n");\
 	scanf("%c", &end);
 	printf("It's your own alphabet tree(haha): \n");
	for (int i = 0; i <= end-start; i++, ch = start)
	{
		for (int j = 0; j < end - start - i; j++)
			printf(" ");
		for (int k = 0; k <= i; k++)
		{
			printf("%c", ch);
			ch++;
		}
		ch -= 2;
		for (int c = 0; c < i; c++)
		{
			printf("%c",ch);
			ch--;
		}
		printf("\n");
	}	

	return 0;
}
//*************************************************************************
//下面利用for loop的特性,使代码更加紧凑
#include <stdio.h>
int main(void)
{
 	char end;
	char start = 'A';
 	char ch = start;
 	
	printf("Enter an character i will give you a surprise now: \n");
    	scanf("%c", &end);
    	printf("It's your own alphabet tree(haha): \n");
    	for (int i = 0; i <= end-start; i++, ch = start)
 	{
  		for (int j = 0; j < end - start - i; j++)
   			printf(" ");
  		for (int k = 0; k <= i; k++, ch++)
   			printf("%c", ch);
  		ch = ch - 2;
  		for (int c = 0; c < i; c++, ch--)
   			printf("%c",ch);
		printf("\n");
	}
	
	return 0;
 }
//小结一下,此题还是利用的是内外层循环的数值关系,搞清楚当中的关系也就不难了
/*
编写一个程序打印一个表格,每行打印一个整数、该数的平方、该数的立方
要求用户输入表格的上下限。使用一个for loop
*/
#include <stdio.h>
int main(void)
{
	int start;
	int end;

	printf("Enter a number as start: \n");
	scanf("%d", &start);
	printf("Enter a number as end: \n");
	scanf("%d", &end);
	printf("_____________________________________\n");
	for (printf("original \t suqare \t cube\n"), start; start <= end; start++)
	{
		printf("%8d %14d %13d\n", start, start*start, start*start*start);
	}
	printf("_____________________________________\n");
	printf("That's all");
	
	return 0;		
}
/*
编写一个程序把一个单词读入一个字符数组中,然后倒序打印这个单词。
提示strlen()函数可用于计算数组最后一个字符的下标。
*/
#include <stdio.h>
#include <string.h>
#define SIZE 40
int main(void)
{	
	char words[SIZE];
	int end_index;
	
	printf("Please enter a word that"
			"you want to know it's revers order: \n");
	scanf("%s", words);
	end_index = strlen(words);
	for (end_index--; end_index >= 0; end_index--)
		printf("%c", words[end_index]); 
	
	return 0;
}
/*
编写一个程序,要求用户输入两个浮点数,并打印两数之差除以两数乘积的结果
在用户输入非数字之前,程序应循环处理用户输入的每对值。
*/
// 使用 do while loop 可以处理用户的非法输入,但是没有控制结束的方法......读错题了
//正确的答案在下面,可以看看
#include <stdio.h>
int main(void)
{
	float f_op;
	float s_op;
		
	do
	{
		printf("Please enter two number: \n");
     		fflush(stdin);	//用来清除输入缓冲区,否则如果输入非float类型的值,这个值将在输入缓冲区中一直被失败读取,导致无限循环“Please enter two number:”		
	}while ((scanf("%f %f", &f_op, &s_op)) != 2);
	printf("(%.3g - %.3g) / (%.3g * %.3g) = %.5g",f_op, s_op, f_op, s_op, (f_op-s_op) / (f_op * s_op));

	return 0;
}
//*************************************************************************
// 使用 while loop 当用户输入非数值类型时,结束
#include <stdio.h>
int main(void)
{
	double n, m;
	double res;

	printf("Enter a pair of numbers: ");
	while (scanf("%lf %lf", &n, &m) == 2)
	{
		res = (n - m) / (n * m);
		printf("(%.3g - %.3g) / (%.3g * %.3g) = %.5g \n", n, m, n, m, res );
		printf("Enter next pair (non-numeric to quit)");
	}
}
/*
修改练习8,使用一个函数返回计算的结果。
*/
#include <stdio.h>
float func1(float f_op, float s_op);
int main(void)
{	
	float f_op;
 	float s_op;
 	int states;
 	do
 	{
	  	printf("Please enter two number: \n");
       		fflush(stdin);
       		states = scanf("%f %f", &f_op, &s_op);
	}while (states != 2);
	printf("Result: %f \n", func1(f_op, s_op));

	return 0;
}
float func1(float f_op, float s_op)
{
	return (f_op-s_op) / (f_op * s_op);
} 
/*
编写一个程序,要求用户输入一个上限整数和一个下限整数,
计算从上限到下限范围内所有整数的平方和,并显示计算结果
直到用户输入的上限整数小于下限整数为止。
程序的运行示例如下:
Enter lower and upper integer limits: 5 9
The sums of the squares from 25 to 81 is 255
Enter next set of limits: 3 25
The sums of the squares from 9 to 625 is 5520
Enter next set of limits: 5 5
Done
*/
#include <stdio.h>
int main(void)
{	
	int lower_num;
	int upper_num;
	
	printf("Enter lower and upper integer limits: ");
	scanf("%d %d", &lower_num, &upper_num);
	while (upper_num > lower_num)
	{
		int sum = 0;
		for (int count = lower_num; count <= upper_num; count++)
		{
			sum += count * count;
		}
		printf("The sums squares frome %d to %d is %d \n", 
			lower_num * lower_num, upper_num * upper_num, sum);
		printf("Enter lower and upper integer limits: ");
		scanf("%d %d", &lower_num, &upper_num);
	}
	printf("Done\n");
	
	return 0;
}
/*
编写一个程序,在数组中读入8个整数,然后按倒序打印这8个整数
*/
#include <stdio.h>
#define SIZE 8
int main(void)
{	
	int num[SIZE];
	printf("Start:");
	printf("Please enter %d integers.\n", SIZE); 
	for (int i = 0; i < SIZE; i++)
		scanf("%d", &num[i]);	
	printf("Here, in reverse order, are the values you entered:\n"); 
	for (int j = SIZE-1; j >= 0; j--)
		printf("%d \n", num[j]);
	printf("Done! \n");
	
	return 0;
}
/*
考虑下面两个无限序列:
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
让用户交互的输入指定的次数,当用户输入0或负值时结束输入
查看运行100项、1000项、10000项后的总和,是否发现每个序列都收敛于某值?
*/
#include <stdio.h>
int main(void)
{	
	int times;
	float count1 = 1.0f;
	float count2 = 1.0f;
	float sum1 = 0.0;
	float sum2 = 0.0;

	printf("How many times adddtion you want : \n");
	scanf("%d", &times);
	for (int i = 1; i <= times; i++, count++)
	{
		sum += 1.0 / count;	
	}
	for (int j = 1; j <= times; j++, count2++)
	{
		if (j % 2 == 0)
		{
			sum2 -= 1.0 / count2;
		}
		else
		{
			sum2 += 1.0 / count2;	
		}
	}
	printf("The first infinite series: %f\n", sum1);
	printf("The second infinite series: %f \n", sum2);

	return 0;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

第二个级数是收敛的,第一个级数不收敛,数学过程怎么证明来着我忘了 = =待我看完书再补上ORZ
13.

/*
编写一个程序,创建一个包含八个元素的int类型数组,
分别把数组元素设置为2的前8次幂。
使用for循环设置数组元素的值,使用do while循环显示数组的值
*/
#include <stdio.h>
#define SIZE 8
int main(void)
{
	int num[SIZE];
	int power_of_two;
	int index = 0;
	
	for (int i = 0; i < SIZE; i++)
	{
		power_of_two = 1;
		for (int j = 1; j <= i+1; j++)
			power_of_two = power_of_two * 2;   
		num[i] = power_of_two;
	}
	do
	{
		printf("%d \n", num[index]);
		index++;
	} while (index < SIZE);
	
	return 0;
}

/*
编写一个程序,创建两个包含8个元素的double类型数组
使用循环提示用户为第一个数组输入8个值。
第二个元素的值设置为第一个数组对应元素的累积之和。
例如:第二个数组的第4个元素是第一个数组前4个元素之和
(利用嵌套循环完成,但是第二个数组的第5个元素是第二个数组的第4个元素
与第一个数组的第5个元素之和,只用一个循环就能完成任务,不需要使用嵌套循环)
最后,使用循环显示两个数组的内容,每个数组各占一行且相应元素上下对齐
*/
#include <stdio.h>
#define SIZE 8
int main(void)
{
	double arr1[SIZE];
	double arr2[SIZE];

	printf("Please input the value of the first array: \n");
	for (int i = 0; i < SIZE; i++)
	{	
		scanf("%lf", &arr1[i]);
		for (int j = 1 ; j <= i; j++)
		{
			arr2[0] = arr1[0];	//这条初始化语句放在for loop里会报错,原因尚不得知
			arr2[j] =  arr2[j-1] + arr1[j]  ; 
		}
	}	
	printf("Good job ! \n");
	printf("————————————————————————————————————————\n");
	for (int i = 0; i < SIZE; i++)
	{
		printf ("%7.2f", arr1[i]);
	}
	printf("\n");
	for (int i = 0; i < SIZE; i++)
	{
  		printf ("%7.2f", arr2[i]);
 	}
 	 printf("\n————————————————————————————————————————\n");

	return 0;
}
//*************************************************************************
//法2 待补充
/*
编写一个程序,读取一行输入,让后把输入的内容倒序打印出来。
可以把输入储存在char类型的数组中,假设每行字符不超过255.
回忆一下,根据%c转换说明(conversation specification)
scanf()每次只能中输入中读取一个字符,
而且在用户按下Enter键时,scanf()会生成一个换行字符(\n).
*/
#include <stdio.h>
#define SIZE 256
int main(void)
{
	char str[SIZE];	
	int index = -1;
	
	printf("Please input everyting your like,"
		" but no more than 255 characters: \n");
	for (int i = 0; i < SIZE; i++)
	{	
		scanf("%c", &str[i]);
		index++;		//统计字符个数
		if (str[i] == '\n')
			break;	//用到了后一章的break,暂时没找到用前几章的解法
	}	
	for (int j = index - 1; j >= 0; j--)	//从index处倒序打印
		printf("%c", str[j]);
	
	return 0;
}
/*
Daphne以10%的单利息投资了100美元(也就是说,每年投资获利相当于原始投资的10%)
Deirdre以5%的复合利息投资了100美元(也就是说,利息是当前余额的5%,包含之前的利息)
编写一个程序,计算需要多少年Deirade的投资额才会超过Daphne,并显示那时两人的投资额
*/
#include <stdio.h>
#define SIMP_RATE 10%
#define COM_RATE 5%
int main(void)
{
	int base_money = 100;
	float simple_interest = (float)base_money;
	float compound_interest = (float)base_money; 
	int years = 0;
	
	while (compound_interest <= simple_interest)
	{
		simple_interest += base_money * (10.0 / 100);
		compound_interest *= (105.0 / 100);
		years++;
		printf("The %d year \n", years);
  		printf("simple interest: %16.3f \n", simple_interest);
  		printf("compound interest: %14.3f \n", compound_interest);
  		printf("---------------------------------\n");
	}
	printf("Finally it spend %d Years.", years);

	return 0;
}
/*
Chuckie Lucky 赢得了100万美元(税后),他把奖金存入年利率8%的账户。
在每年的最后一天,Chuckie取出10万美元。
编写一个程序,计算需要多少年后Chuckie会取完账户的钱?
*/
#include <stdio.h>
int main(void)
{	
	int base_money = 100;
	const float RATE = 108.0 / 100;
	float total = 100;
	int years;
	
	while (total > 0)
	{
		total *= RATE;
		total -= 10; 	
		years++;
		printf("%4d years %f\n", years, total);
	}
	printf("%4d years later you have no money in the bank", years);

	return 0;
}
/*
Rabnud博士加入了一个社交圈。起初他有5个朋友,他注意到他的朋友以下面的方式进行增长
第1周少了1个朋友,剩下的朋友数量翻倍;第二周少了两个朋友,剩下朋友数量翻倍
一般而言,第N周少了N个朋友,剩下的朋友数量翻倍。
编写一个程序,计算并显示Rabnud博士每周朋友的数量。
该程序一直运行,直到超过邓巴数(Dunbar's number)。
邓巴数是粗略估计一个人在社交圈中有稳定关系的成员的最大值,该值大约是150
*/
#include <stdio.h>
#define DUNBAR 150
int main(void)
{	
	int start_f = 5;
	int total_f = start_f;
	int weeks = 1;
	
	while (total_f < DUNBAR)
	{
		
		total_f = (total_f - weeks) * 2; 
		printf(" %d weeks later, %d friends\n", weeks, total_f);
		weeks++;
	}
	printf("After %d weeks your have touch the Dunbar. \n", weeks-1);

	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42912350/article/details/82825308
今日推荐