今天将介绍C语言中的循环结构经典基础题,与选择结构相比,循环结构更增大了对数学思维的运用。它不是非此即彼,一次次的循环下去该怎样设计程序才能使循环结构有意义?怎样才能达到题中要求的目的?我认为这是循环结构对于我们初学者的难点,重在将数学逻辑与程序与语言的结合,转换以往数学解题思维,从而实现让计算机巧妙、简单解题的目的。
C语言循环结构有(while循环,for循环,do…while循环),具体使用方法不再赘述,
主要提醒自己以下几个点:
**(1)**do…while 循环在控制表达式被第一次计算之前,循环体语句会首先被执行一次。与 while 和 for 循环不同,do…while 循环会确保循环体语句至少执行一次。如果控制表达式的值为 true,那么另一次循环就会继续;如果是 false,则循环结束。
**(2)**for 循环头部中的三个表达式可以省略一个或多个。这意味着 for 循环头部最短的形式是: for ( ; ; )
如果没有控制表达式,则表示循环条件始终是 true,也就是说,这定义了一个死循环。
**(3)**每个while循环都可写成for循环 。
示例:
for ( ;表达式; )这样的循环,
可写成
while(表达式)
**(4)**每个for循环也都可写成while循环。
示例:
for(i=1;i++;i<n)
a+=2;
可写成
i=1 ;
while(i<n)
{
i++;
a+=2;
}
注:理论上for循环和while循环是可以相互转换,但实际中一定是看哪个表示更方便、整洁 用哪个的,就像(4)中的用for循环只用两行代码,而用while则需要四五行,所以当然选择最优解。
测试用例:
输入 Input a,n:2 4
输出 sum=2468
解答:
分析: 这道题主要突破的点就是如何实现a,aa,aaa…a(n个)的输入,就要想到设出另一个数X,依次让X乘10,a只用加到个位上即可。
代码如下:
#include <stdio.h>
int main()
{
int sum = 0, a, n, i, x = 0;
printf("Input a,n:");
scanf_s("%d%d", &a, &n);
for (i = 1; i <= n; i++)
{
x = x * 10 + a; //这点一定要记住,实现a...(n个)的方法
//第一次循环的目的即先让x=a
sum += x;
}
printf("sum=%d\n", sum);
return 0;
}
运行结果:
程序运行结果: sum=0.693092
解答:
分析:分母依次加一,设出a=1,在循环结构中进行a++。分子+1、-1交替出现,设出b=1,循环中进行b=0-b。循环结束条件是最后一项绝对值小于10的-4次方,还要使用绝对值函数fabs,注意要引头文件include<math.h>
代码如下:
#include<stdio.h>
#include<math.h>
int main()
{
int a = 1;
float sum = 0, term = 1.0, b = 1;
while (fabs(term) >= 0.0001) //这里10的n次方表示方法有三种,详见上一篇博客
{
term = b / a;
sum += term;
a++;
b= 0-b ; //实现一正一负相加的方法其实很简单,就是依次循环用0-b !!!
}
printf("sum=%f", sum);
return 0;
}
运行结果
程序运行结果: e=2.718282,count=10
解答:
分析:此题主要是要想到如何表示出阶乘,那就要设出一个中间变量term,因为是阶乘分之一,所以就是运用循环让这次运算的term等于上次运算的term/a,a再依次加一即可。
代码如下:
#include<stdio.h>
#include<math.h> //用绝对值函数fabs()要引头文件
int main()
{
float e = 1, term = 1;
int a = 1, count = 1;
while (fabs(term) >= 1e-5)
{
term = term / a; //这次运算的term等于上次运算的term/a,这样就能达到阶乘的目的
e += term;
a++;
count++; //统计相加的项数
}
printf("e=%f,count=%d", e, count);
return 0;
}
运行结果:
测试用例:
输入 Input n:20
输出 sum=32.66
解答:
分析:观察规律,后一项数的分子等于前一项数的分子分母相加,后一项数的分母等于前一项数的分子(具体数学分析见下方的代码注释)。所以就想到用for循环。
代码如下:
#include<stdio.h>
#include<math.h>
int main()
{
int n = 1, i = 1;
float x=0,sum = 0,a , b;
printf("Input n:");
scanf_s("%d",&n);
for(a=1,b=2;i<=n; i++)
{x =b/a;
sum += x;
b=a+b;
a = b - a;
//(a=b-a)这点一定要注意!!!最终目的是实现a2=b1,b2=a1+b1
// 因为若上面第一次循环为a1、b1则要想让b2=a1+b1,a2=b1
//这种形式,当经过b=a+b后,b2=a1+b1了,
//所以要想让a2=b1,则需要b-a(即b2-a1即a1+b1-a1)
//从而类推到n和n+1
//!!!且给b的赋值一定先于a的赋值,因为最终目的是让a2=b1,b2=a1+b1,若
//a2一旦等于b1,则再做加减运算就无法得到a1+b1(因为a被赋值成b1,a1已经消失了无法表示出来了)
}
printf("sum=%.2f", sum);
return 0;
}
运行结果:
循环结构初学时我是晕了半天的,但我觉得它又不像是高考试卷中的数学题一样不会做就是干瞪眼,程序设计是很耐人寻味的,只要一点一点的去看去学,还是可以接受的。当把一道程序题琢磨透,就会豁然开朗,就会明白它理所当然就该这么去想。当从去模仿去查找甚至是去直接记住某些代码,到逐渐尝试自己边理解边不借助外物写出来时,就会油然而生一种成就感,正是这些小小的激励才让我这样的小白有动力去学下去。哈哈哈,今天也是有感而发,分享一句自己摘抄的话:生命中最遗憾的事不是失败,而是我本可以。加油!