《大学计算机基础实验教程(C语言版)》解析实训8

本文解析了《大学计算机基础实验教程(C语言版)》中的循环结构程序设计案例,包括求和、斐波那契数列等典型算法实现,并对代码进行了详细注释说明。

《大学计算机基础实验教程(C语言版)》解析

《大学计算机基础实验教程(C语言版)》东北大学出版社
源代码解析


作者:
辽宁工业大学 电子202 宋家盛制作


如有错误,请告知:jff_16@163.com


注:

  1. 解析为增加代码的可读性均使用函数实现
  2. 代码均可在Visual Studio 2019与Code::Blocks上运行通过,若在VC++6.0不可通过请自行调试

实训8循环结构程序设计(三)

/*
时间:2020.12.12
*/

#include <stdio.h>
#include <math.h>

void J8_1(void);
void J8_2(void);
void J8_3(void);
void C8_1(void);
void C8_2(void);
void C8_3(void);
void T8_1(void);
void T8_2(void);

int main(void)
{
    printf("\nJ8_1:\n");
    J8_1();

    printf("\nJ8_2:\n");
    J8_2();

    printf("\nJ8_3:\n");
    J8_3();

    printf("\nC8_1:\n");
    C8_1();

    printf("\nC8_2:\n");
    C8_2();

    printf("\nC8_3:\n");
    C8_3();

    printf("\nT8_1:\n");
    T8_1();

    printf("\nT8_2:\n");
    T8_2();

    return 0;
}


void J8_1(void)
{
	int i;		//计数作用

	for (i = 0; i < 999; i++)
	{
		if (i % 5 == 0)
		{
			printf(" %d ", i);
		}
	}
	/*
	* 解析:
	* for循环的作用是使得i的值从0到999
	* if的作用是判断i是否为5的倍数
	*/
}

void J8_2(void)
{
	double sum = 0, a = 1, p = 1;	//sum为和,a为分母,p为每一项
	int n = 0;
	int i;		//计数器

	printf("\n n = ");
	scanf("%d", &n);

	for (i = 0; i < n; i++)
	{
		sum += p;
		a *= (i+1) + 1;
		p = 1.0 / a;
	}
	/*
	* 解析:
	* sum += p的作用是累加p的值放到sum中
	* a *= (i+1) + 1的作用是表示n!
	* 例如:(a的初始值为1)
	* 第一项:i = 0时,a = 1 * (0+1)+1 = 1*2 = 2
	* 第二项:i = 1时,a = 2 * (1+1)+1 = 2*3 = 6
	* 第三项:i = 2时,a = 3 * (2+1)+1 = 3*4 = 12
	* 以此类推
	* p = 1.0/a的作用是将n!表示成 1/n!符合题意
	*/
	printf("\n S= %lf", sum);


}

void J8_3(void)
{
	int i = 1;
	int sum = 0;

	while (1)
	{
		sum += i;
		i++;
		if (sum > 10)
		{
			break;
		}
	}

	printf("\nsum =%d\n", sum);
}

void C8_1(void)
{
	long f1 = 1, f2 = 1, n, s = 0;

	for (n = 1; n <= 10; n++)
	{
		s = s +  f1 + f2;
		f1 = f1 + f2;
		f2 = f2 + f1;
	}
	/*
	* 解析:
	* for(n = 1; n <= 30; n++)	//error
	* 根据s = s + f1 + f2可以判定求和时加两项
	* 例如:
	*   n = 1, s = 0+1+1 = 2(前两项之和)
	*		   f1 = 2, f2 = 3
	*	n = 2, s = 2+2+3 = 7(前四项之和)
	*		   f1 = 5, f2 = 8
	*	n = 3, s = 7+5+8 = 20(前六项之和)
	*由此规律可知,求前20项之和n需递增至10
	* 补充	fibonacci数列:
	* fibonacci数列(斐波那契数列)指的是这样一个数列:
	* 0,1,1,2,3,5,8....
	*这个数列从第3项开始,每一项都等于前两项之和。
	*/
	printf("\n%ld", s);
}

void C8_2(void)
{
	int i, n, m, a = 0;
	float s = 0;

	scanf("%d", &n);

	for (size_t i = 0; i <= n; )
	{
		scanf("%d", &m);
		if (m % 2 == 0)
		{
			a = a + 1;
			s = s + m;
		}
		i++;
	}
	/*
	* 解析:
	* for(i = 1; i <= n)	//error
	* for语句括号里应有三项表达式用;分开
	* 故该处缺少一个表达式
	* 由题意可知i++在for循环内部,故第三处的语句应为空语句
	*/
	printf("%f", s / a);
}

void C8_3(void)
{
	int i;
	for (i = 2; i < 100; i++)
	{
		if (i == (i * i) % 10 || i == (i * i) % 100)
			printf("%5d", i);
	}
	/*
	* 解析:
	* if (i == (i * i) % 10 && i == (i * i) % 100)	//error
	* &&是逻辑与运算符,符号两边需同时成立
	* 应改为||逻辑或运算符,即符号两边只需其中一个成立
	*/
}

void T8_1(void)
{
	int n;
	for (n = 100; n <= 200; n++)
	{
		if (n % 3 == 0)
		{
			continue;
		}
		/*
		* 解析:
		* if( )
		* 该空填如n % 3 == 0
		* 因为continue的功能是跳过该语句下面的循环内容重新执行循环
		* 所以当执行continue语句的时候pirintf的内容不会输出
		* 题目要求输出不能被3整除的数故该空填入n % 3 == 0
		*/
		printf("%5d", n);
	}
}

void T8_2(void)
{
	float m = 2, n = 1, sum = 0, t;
	int i = 1;

	for (; i <= 20; i++)
	{
		sum += m / n;
		t = m;
		m = m + n;
		n = t;
	}
	/*
	* 解析:
	* sum += ____
	* 找规律,进行第一次循环后sum的值应该为2/1
	* 且此时m = 2,n = 1,t未进行初始化,只能填m/n
	*/
	printf("%.2f", sum);
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值