C语言循环结构程序设计

内容详解

  1. while语句
  2. do—while语句
  3. for语句
  4. 循环嵌套
  5. break和continue语句

实例展示

热身小练:打印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语句

解释说明:
C语言循环结构程序设计_第1张图片
①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语句

解释说明:
C语言循环结构程序设计_第2张图片
①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;
} 

2.题目2

#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;
}

for语句

解释说明:
C语言循环结构程序设计_第3张图片
网罗到的新栗子:
新栗子

#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;
}

循环语句的比较

C语言循环结构程序设计_第4张图片
注意点:当初始条件不满足时,两种循环语句有所区别,区别点可参与上述所写的关于各个语句的“注意点”。

循环嵌套(多重循环)

一、嵌套
C语言循环结构程序设计_第5张图片
注意点:为使程序结构清晰,采用逐层缩进的方式。
二、执行过程
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;
} 

break和continue语句

1.作用:用于循环的中途退出
C语言循环结构程序设计_第6张图片

break语句:

功能:跳出循环体,即提前结束,接着执行循环下面的语句。
实战小练:
①韩信点兵:韩信有一队兵,他想知道有多少人,便让士兵排队报数:按从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;
  }
 }
}

②判断一个整数m是否为素数(要求:包含break语句)
C语言循环结构程序设计_第7张图片

#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;
}

continue语句

功能:结束本次循环,即跳过循环体中下面尚未执行的语句,结束本次循环。
举个栗子:输出100~200之间不能被3整除的数

#include 
int main()
{
 for(int i=100;i<=200;i++)
 {
  if(i%3==0)
  continue;
  printf("%d ",i);
 }
 return 0;
}

goto语句

功能:无条件转向标号所在的语句
用处:与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;
} 

小结

循环结构是结构化程序设计三大结构之一,是学习程序设计语言的基础和重点之一,同时也是难点之一。希望阅读者可以熟练掌握循环语句的使用,在此为大家提供一些小技巧:编写循环程序,一般可采用穷举法、迭代法或递推法,但有时也需要具体问题具体分析,采用其他的算法解体,结合不同的应用也会有不同的解题方法,可以通过大量不同类型的实例训练,拓宽解题思路,学会循环解题的逻辑思维方式及编程技巧,加油,奥里给!!!

你可能感兴趣的:(C语言循环结构程序设计)