热身小练:打印6行6列的 “ * ”矩阵,两个“ * ”之间用空格隔开
#include
int main()
{
for(int i=1;i<=6;i++)
{
for(int j=1;j<=6;j++)
{
printf("* ");
}
printf("\n");
}
return 0;
}
解释说明:
①while语句可以是单语句,也可以是复合语句
②循环体中应有使循环趋于结束的语句
举个栗子:求解前100项和
#include
int main()
{
int i = 1; //设置循环初值
int sum = 0;
while(i<=100)
{
sum+=i; //循环主体,累加求和
i++; //修改循环的控制变量
}
printf("前100项和为:%d",sum);
return 0;
}
注意点:
while语句的作用范围
循环体如果包含一个以上的语句,应当用花括号括起来作为复合语句,否则while循环体的作用范围只到while后面的第一个分号处。
例如:
while(a>1);
{a++
}
复合语句{a++;}不是循环体,while(a>1);后的分号所代表的空语句才是这里的循环体内嵌语句。
算法实例:
1.求解300~800之间7的倍数和
#include
int main()
{
int num = 300; //循环初值
int sum = 0;
while(num<=800)
{
if(num%7==0) //筛选7的倍数
{
sum+=num; //对筛选的数据进行求和
}
num++; //修改循环变量
}
printf("300~800间7的倍数和为:%d",sum);
return 0;
}
2.依次输入一批正数,并求所有输入的正数之和,当输入负数或0时结束。
#include
int main()
{
float num,sum = 0.0;
scanf("%f",&num);
while(num>0.0)
{
sum+=num;
scanf("%f",&num);
}
printf("这批正数的和为:%f",sum);
return 0;
}
解释说明:
①do—while先执行循环体,后判断循环条件
②do—while作为一个整体,while后必须加“;”
栗子依旧:求解前100项和
#include
int main()
{
int i = 1;
int sum = 0;
do
{
sum+=i;
i++;
}while(i<=100);
printf("前100项和为:%d",sum);
return 0;
}
1.依次输入一批正数,并求所有输入的正数之和,当输入负数或0时结束。
#include
int main()
{
float num,sum = 0.0;
do
{
scanf("%f",&num);
sum+=num;
}while(num>=0.0);
printf("这批正数的和为:%f",sum);
return 0;
}
#include
#include
int main()
{
float t,pi,n,s;
t=1;pi=0;n=1.0;s=1;
do
{
pi = pi+t;
n+=2;
s=-s; //符号位,正负号变换
t=s*1./n;
}while((fabs(t))>1e-6); //fabs(t)为绝对值函数
pi=pi*4;
printf("pi=%f\n",pi);
return 0;
}
#include
#include
int main()
{
int a,s,k;
scanf("%d",&a);
s = 0;
for(k=1;k<=100;k++)
{
s+=(k+a);
}
if(s>0)
printf("s=%d\n",sqrt(s));
else
printf("s=0\n");
}
2.打印斐波那契数列:1,1,2,3,5,8····的前20个数,并按每行打印5个数的格式输出
#include
int main()
{
int f1 = 1,f2 = 1,f3;
printf("%d %d ",f1,f2);
for(int i = 3;i <= 20;i++)
{
f3 = f1+f2;
f1 = f2;
f2 = f3;
printf("%d ",f3);
if(i%5==0)
{
printf("\n");
}
}
return 0;
}
3.计算1!+2!+3!+···+n!,其中n=1,2,···20
#include
int main()
{
int sum = 0,j = 1;
for(int i = 1;i <= 20;i++)
{
j = i*j; //计算n!
sum+=j; //各阶乘的求和
}
printf("1!+2!+···+20!=%d",sum);
return 0;
}
4.判断一个整数m是否是素数
#include
#include
int main()
{
int m,n,flag = 1; //flag作为一个标志
scanf("%d",&m);
for(n = 2;n<sqrt(m)&&flag==1;n++) //sqrt函数用于加快运行速度
{
if(m%n==0)
flag=0;
}
if(flag)
{
printf("%d is a prime number",m);
}else
{
printf("%d is not a prime number",m);
}
return 0;
}
注意点:当初始条件不满足时,两种循环语句有所区别,区别点可参与上述所写的关于各个语句的“注意点”。
一、嵌套
注意点:为使程序结构清晰,采用逐层缩进的方式。
二、执行过程
1.打印九九乘法表
#include
int main()
{
int k;
for(int i = 1;i<=9;i++)
{
for(int j = 1;j<=i;j++)
{
k = i*j;
printf("%d*%d=%d ",j,i,k);
}
printf("\n");
}
return 0;
}
注意点:
①内循环必须完全嵌套在外循环内,不得互相交叉;
②嵌套循环的循环控制变量不可同名,并列循环的循环控制变量可以同名
2.百鸡问题:“鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问鸡翁、母、雏各几何?”
#include
int main()
{
int i,j,k;
for(int i = 0;i <= 20;i++)
{
for(int j = 0;j <= 33;j++)
{
for(int k = 0;k <= 100;k++)
{
if((i+j+k)==100&&(5*i+3*j+(1/3)*k)==100)
{
printf("%d %d %d\n",i,j,k);
}
}
}
}
return 0;
}
功能:跳出循环体,即提前结束,接着执行循环下面的语句。
实战小练:
①韩信点兵:韩信有一队兵,他想知道有多少人,便让士兵排队报数:按从1至5报数,最末一个士兵报的数为1;按从1至6报数,最末一个士兵报的数为4;最后再按从1至11报数,最末一个士兵报的数为10,计算韩信至少有多少兵?
#include
int main()
{
for(int i = 1; ;i++ )
{
if(i%5==1 && i%6==5 && i%7==4 && i%11==10)
{
printf("i = %d\n",i);
break;
}
}
}
#include
#include
int main()
{
int m,i,k;
scanf("%d",&m);
k=sqrt(m);
for(i=2;i<=k;i++)
{
if(m%i==0);
break;
}
if(i>=k+1)
{
printf("%d is a prime number",m);
}else
{
printf("%d is not a prime number",m);
}
return 0;
}
扩展:输出100~200之间的全部素数
#include
#include
int main()
{
int m,n=0,k,i;
for(m=101;m<=200;m=m+2) //m=m+2用于加快循环速度
{
if(n%10==0&&n!=0)
{
printf("\n");
}
k=sqrt(m);
for(i=2;i<=k;i++)
{
if(m%i==0)
break;
}
if(i>=k+1)
{
printf("%d ",m);
n=n+1;
}
}
return 0;
}
功能:结束本次循环,即跳过循环体中下面尚未执行的语句,结束本次循环。
举个栗子:输出100~200之间不能被3整除的数
#include
int main()
{
for(int i=100;i<=200;i++)
{
if(i%3==0)
continue;
printf("%d ",i);
}
return 0;
}
功能:无条件转向标号所在的语句
用处:与if语句构成循环
举个栗子:求1~100之间的奇数和,即求1+3+5+7+···+99
#include
int main()
{
int i = 1,sum = 0;
loop:sum+=i;
i+=2;
if(i<100)goto loop;
printf("sum=%d\n",sum);
return 0;
}
①求两个非负整数的最大公约数
分析:此题目是循环次数不固定的实例,采用相除取余的迭代算法
已知:两正整数 x,y,两数的余数为 r ,gcd()为求公因数函数
则: gcd(x,y)=gcd(y,r)
直到第二项值为0,第一项即为最大公因数
范例:(24,9)=(9,6)=(6,3)=(3,0)=3
#include
int main()
{
int a,b,x,y,r;
scanf("%d %d",&a,&b);
x=a;
y=b;
while(y!=0)
{
r=x%y;
x=y;
y=r;
}
printf("最大公约数=%d\n",x);
return 0;
}
同理可求解最小公倍数:a*b/最大公因数
生成两个10以内的随机数,选菜单完成两个随机数的算法四则运算
分析:该题目采用菜单完成,主要训练做题者用程序实现人机交互以及程序的持续执行。在四则运算的基础上,加上循环while(1),在循环中使用菜单实现与用户反复交互,可执行多遍运算。选菜单0退出循环,用break实现;选菜单超值,继续显示菜单,用continue实现。生成两个10以内的随机数,用函数rand()%d获取,函数srand(time(0))使每次初始产生的随机数不同。
C语言中有如下几种几种产生随机数的常见函数,其头文件:stdlib.h,time.h
①rand() 函数产生一个0到32767之间的随机数,例如rand()%10产生一个10以内的随机数
②srand(time(n))函数和rand函数配合使用,产生随机数的初始发生数据,n为任意时间数值,例如srand(time(0))使随机数初始化函数,使每次初始产生的随机数不同。
#include
#include
#include
int main()
{
int op;
int a=1,b=2,c;
srand(time(0));
//随机数初始化函数,使每次初始产生的随机数不同
while(1) //循环使用菜单
{
a=rand()%10; //产生两个0~10的随机数a,b
b=rand()%10;
printf(" ****************************************\n");
printf(" * 请输入选项代码(0-4) *\n");
printf(" * 1——加法 *\n");
printf(" * 2——减法 *\n");
printf(" * 3——乘法 *\n");
printf(" * 4——除法 *\n");
printf(" * 0——退出 *\n");
printf(" ****************************************\n");
scanf("%d",&op); //接受菜单选项
switch(op) //判断所选菜单值,做相应的四则运算
{
case 1: c=a+b;break;
case 2: c=a-b;break;
case 3: c=a*b;break;
case 4: if(b!=0) c=a/b;break;
}
if(op<0||op>5) continue; //选菜单超界,继续显示菜单
if(op==0) break;
printf("a=%d b=%d c=%d\n",a,b,c);
getchar();
}
return 0;
}
循环结构是结构化程序设计三大结构之一,是学习程序设计语言的基础和重点之一,同时也是难点之一。希望阅读者可以熟练掌握循环语句的使用,在此为大家提供一些小技巧:编写循环程序,一般可采用穷举法、迭代法或递推法,但有时也需要具体问题具体分析,采用其他的算法解体,结合不同的应用也会有不同的解题方法,可以通过大量不同类型的实例训练,拓宽解题思路,学会循环解题的逻辑思维方式及编程技巧,加油,奥里给!!!