一、循环结构语句
C语言提供了三种循环语句(for语句)、while语句和do-while语句。
for语句:
for(表达式1 ; 表达式2 ; 表达式3)
{
循环体语句;
}for语句的执行过程:
- 首先计算表达式1。
- 判断表达式2,若其值为真(非0),则执行循环语句,然后执行第3步;若值为假(0),结束循环,执行第5步。
- 计算表达式3。
- 返回第二步继续执行。
- 循环结束,继续执行for语句的下一个语句
while语句:(先判断后循环)
while(表达式)
循环体;
while语句执行流程:
- 计算表达式的值,若其值为真(非0),则执行第2步;若值为假(0),执行第4步。
- 执行循环体语句。
- 返回第一步。
- 结束循环,执行while语句的下一条语句。
do-while语句:(先循环后判断)
do
循环体
while(表达式);
do-while语句执行流程:
- 执行循环体语句
- 计算表达式的值,若其值为真(非0),则执行第1步;若值为假(0),执行第3步。
- 结束循环,执行do-while语句的下一条语句。
break语句:
break;
break语句用于循环语句中时,可使程序终止循环而去执行循环体语句的后续语句
continue语句
continue;
continue语句跳出本次循环,进入下一轮循环
二、循环语句举例
【例5.1】假设今年我国的人口总数为13亿,若按每年2%增长,计算我国从现在开始十年内每年的人口的数量。
#include<stdio.h>
#include<math.h>
int main()
{
int year;
double number=13;
for(year=1;year<11;year++)
{
number=number*1.02;
printf("%d年后,人口的数量为%.2f亿\n",year,number);
}
return 0;
}
运行结果:
【例5.3】输入一个正整数n,求 的值
#include<stdio.h>
int main()
{
int sum,n,i;
sum=0;
printf("请输入一个正整数:");
scanf("%d",&n);
for(i=1;i<=n;i++)
sum=sum+i;
printf("前n项的和为%d",sum);
return 0;
}
运行结果:
【例5.15】当键盘输入一串字符,分别统计字符中的数字字符、英文字符、字母字符以及其他字符的个数。
#include<stdio.h>
int main()
{
char s;
int h=0,i=0,j=0,k=0;
printf("请输入一串字符:\n");
//输出完毕后会按换行从而结束循环
//原因主要是因为getcher只能从键盘上读取一个字符
while((s=getchar())!='\n')
{
if(s>='a'&&s<='z'||s>='A'&&s<='Z') h++;
else if(s==' ')i++;
else if(s>='0'&&s<='9')j++;
else k++;
}
printf("\n请输入英文字母的个数:%d\n",h);
printf("\n请输入空格字母的个数:%d\n",i);
printf("\n请输入数字字母的个数:%d\n",j);
printf("\n请输入其他字符的个数:%d\n",k);
return 0;
}
运行结果:
【例 5.26】输出乘法口诀表
#include <stdio.h>
int main() {
int i, j;
for (i = 1; i <= 9; i++) {
for (j = 1; j <= i; j++) {
printf("%d * %d = %d\t", j, i, i * j);
}
printf("\n");
}
return 0;
}
运行结果:
【例5.27】求100以内的素数。要求每行输出10个
#include<stdio.h>
#include<math.h>
int main()
{
int i,n,k,count=0;
n=2;
while(n<100)
{
//求一个素数只需看2-n的开平方根中有没有被整除
k=sqrt(n);
for(i=2;i<=k;i++)
{
if(n%i==0)break;
}
if(i>k)
{
printf("%4d",n);
if(++count%10==0)printf("\n");
}
n++;
}
return(0);
}
运行结果:
【例5.28】将10-20之间的正整数分解质因数
#include<stdio.h>
int main()
{
int i,n,m;
for(m=10;m<=20;m++)
{
n=m,i=2;
printf("%d=",n);
do
{if(n%i==0)
{printf("%d*",i);
n=n/i;
}
else
i++;
}while(n!=i);
printf("%d\n",n);
}
return 0;
}
运行截图:
三、典型算法举例
1、递推法
【例 5.29】猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将第一天剩下的桃子吃掉一半,有多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第 10 天早上想再吃时,发现只剩下一个桃子了。编写程序求猴子第一天摘了多少个桃子
#include<stdio.h>
int main()
{
int peach = 0;//桃子总数
int rest = 1;//第10 天只剩一个桃子
int day = 0;
for(day = 9; day > 0; day--)
{
peach = (rest + 1) * 2;//每天的桃子总数是后一天剩余桃子加1乘2
rest = peach;
}
printf("猴子第一天一共摘了%d个桃子\n",peach);
return 0;
}
运行结果:
【例5.30】求 的近似值,要求精确到
#include<stdio.h>
#include<math.h>
int main()
{
int n=1;
float x;
double fz,fm=1,sinx;
printf("请输入x的值:");
scanf("%f",&x);
fz=x;
sinx=x;
//递推法求sin(x)
do
{
n=n+1;
fz=-fz*x*x;
fm=fm*(2*n-1)*(2*n-2);
sinx=sinx+fz/fm;
}while(fabs(fz/fm)>1e-6);
printf("sin(%f)=%0.6f\n",x,sinx);
return 0;
}
运行结果:
2、迭代法
【例5.31】用牛顿迭代法求方程在1.0附近的一个实根
牛顿迭代公式:x=x0-f(x0)/f '(x0);,
#include<stdio.h>
#include<math.h>
int main()
{
float x0,x1,f,f1;
x1=1.0;
//x1=x0-f(x0)/f'(x0);
do{
x0=x1;
f=2*pow(x0,3)-4*pow(x0,2)+3*x0-6;
f1=6*pow(x0,2)-8*x0+3;
x1=x0-f/f1;
} while (fabs(x1-x0)>1e-6);
printf("%6.2f",x1);
return 0;
}
运行结果:
3、穷举法
【例5.32】搬砖问题36块砖,男搬4,女搬3,两个小孩抬一块砖,要求一次搬完,问男人、女人和小孩各需多少人?
#include<stdio.h>
int main()
{
int men,women,child;
for(men=1;men<=9;men++){
for(women=1;women<=12;women++){
for(child=1;child<=36;child++){
if(4*men+3*women+0.5*child==36)
printf("男的有%d个,女的有%d个,小孩有%d个。\n",men,women,child);
}
}
}
return 0;
}
运行结果:
四、循环程序设计示例
【例5.34】编写输出下列图形
#include<stdio.h>
int main()
{
int i,j;
for(i=1;i<=5;i++)
{
for(j=1;j<=20-i;j++)
printf(" ");
for(j=1;j<=2*i-1;j++)
printf("*");
printf("\n");
}
return 0;
}
运行结果:
【例5.35】猜数字游戏:由计算机随机产生一个10-80之间的数据,然后由用户进行猜数,在五次之内猜中则成功,否则给出大小提示。猜五次之后结束程序。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int m,n,count;
m=rand()%(80-10+1)+10;
printf("请输入1个10 - 80 间的一个数字:");
while(1)
{
scanf("%d", &n);
count++;
if (m==n)
{
printf("恭喜!你猜对了,你真棒!\n");
break;
}
else if (m<n&&count<5)
{
printf("对不起!你猜大了!再来一次!\n");
}
else if(m>n&&count<5)
{
printf("对不起!你猜小了!再来一次!\n");
}
if(count==5)
{
printf("对不起!你没有机会了!\n这个数是:%d,游戏结束!\n",m);
break;
}
}
return 0;
}
运行结果:
【例5.36】 编写程序输出100-1000内的回文素数。回文素数是指即是回文数同时也是素数的整数
#include <stdio.h>
#include <math.h>
main()
{
int x,i,j=0,n,k=0;
for (x=100;x<1000;x++)
{
k=sqrt(x);
for(i=2;i<=k;i++)
if(x%i==0)
break;
if(i>k)
{ k=x;
n=0;
while(k>0)
{
n=n*10+k%10;
k/=10;
}
if(x==n)
{
printf("%d\t",x);
if(++j%5==0)
printf("\n");
}
}
}
return 0;
}
运行结果:
【例5.37】在所有三位整数中找出平方数中有连续的三位数字是该数本身的数。例如,250的平方数是62500,250便是所要找的一个满足条件的三位整数。
#include<stdio.h>
int main()
{
int x,t;
printf("i\tpower\n");
for(x=100;x<1000;x++)
{ t=x*x;
while(t!=0)
{ if(x==t%1000)
{ printf("%d\t%d\n",x,x*x);
break;
}
else
t=t/10;
}
}
return 0;
}
运行结果: