《大学计算机基础实验教程(C语言版)》解析
《大学计算机基础实验教程(C语言版)》东北大学出版社
源代码解析
作者:
辽宁工业大学 电子202 宋家盛制作
如有错误,请告知:jff_16@163.com
注:
- 解析为增加代码的可读性均使用函数实现
- 代码均可在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);
}
本文解析了《大学计算机基础实验教程(C语言版)》中的循环结构程序设计案例,包括求和、斐波那契数列等典型算法实现,并对代码进行了详细注释说明。
1609

被折叠的 条评论
为什么被折叠?



