在实际生活中经常会将同一件事情重复做很多次,比如走路会重复使用左右脚,打乒乓球会重复挥拍的动作等。同样在C语言中,也经常需要重复执行同一代码块,这时就需要使用循环语句。
循环语句分为while循环语句、do…while循环语句和for循环语句三种。
定义:
在某一条件成立的情况下反复做重复性的事情,这就是循环。
(1)循环从什么时候开始,即“循环变量赋初值"。
(2)满足什么条件要循环,即“循环控制条件表达式”。
(3)每次循环要做什么,即“反复执行的语句",称为”循环体“。
while(表达式) 循环控制条件表达式
{
循环体; 由一条或多条语句组成,当”循环体“仅有一条语句时,可省略“{}”。
}
(1)while是C语言的关键字
(2)表达式可以是C语言中任意合法的表达式,但是不能为空,由它控制循环体是否执行
(3)进入循环的循环条件唯一判断标准是循环体条件的值非零
while(1){}.......进入循环且为死循环
while(3){}.......进入循环且为死循环
(4)while语句的循环体可能一次都不执行,即当条件表达式一开始就为0。
(5)循环体只能是一条可执行语句,若循环体内有多个语句,应该使用复合语句。
(6)循环可以没有循环体,以分号结束,即不执行任何操作。但是不意味着循环不执行,当循环没有执行完之前,后面的语句不执行。
#include
int main()
{
int x;
while(x); //死循环
printf("%d",x);
}
(7)通常应在循环体内改变条件表达式中有关变量的值,使条件表达式的值最终变成0,结束循环。
若此表达式的值不变,则循环体内应有在某种条件下强行终止循环的语句(如break等)。
#include
int main(){
int i=1;
while(i<=20)
{
printf("*");
i++;
}
}
#include
int main(){
int i=1;
while(i<=100){
printf("1\n");
i++;
}
printf("a");//实验一个1一个a还是100个1一个a,实验结果100个1一个a
}
#include //求和的过程就算循环
int main(){
int i=1;
int sum=0; //初始化
while(i<=100){
sum+=1;
i++;
}
printf("sum=%d",sum);
}
#include
int main(){
int i=1;
int sum=0; //初始化
while(i<=100) //循环控制
{ //循环体
sum=sum+i; //sum+=i
i++;
}
printf("%d",sum);
}
#include
int main(){
int i=1;
int s=1;
while(i<=8){
s=s*2;
i++;
}
printf("%d",s);
}
#include
int main()
{
int a,b;
int i=1;
int s=1;
printf("请输入a和b的值:\n");
scanf("%d%d",&a,&b);
while(i<=b)
{
s=s*a;
i++;
}
printf("%d的%d次方结果为%d\n",a,b,s);
}
#include
int main(){
int i=1;
int s=0;
while(i<=10){
if(i%2==0){
s=s+i;
}
i++;
}
printf("%d",s);
}
#include
int main(){
float score;
float sum=0;
int i=1;
while(i<=10){
printf("请输入%d位评委的打分:\n",i);
scanf("%f",&score);
sum+=score;
i++;
}
printf("%f",sum);
}
遇到数列求和、求积的一类问题,一般可以考虑使用循环解决。
注意循环初值的设置:
一般对于累加器常常设置为0,累乘器常常设置为1。
循环体中做要重复的工作,同时要保证使循环倾向于结束。
do{ 循环体; }while(表达式); //表达式后必须有;
(1) do是C语言的关键字,必须和while联合使用。
(2) do - while循环由do开始,至while结束。
(3) while(表达式)后的“;"不可少,它表示do - while语句的结束。
(4)表达式可以是C语言中任意合法的表达式,但不能为空,由它控制循环体是否执行。 (5)do-while语句的循环体至少执行一次。
#include
int main(){
float score;
float sum=0;
int i=1;
do{
printf("请输入第%d位评委的成绩:\n",i);
scanf("%f",&score);
sum+=score;
i++;
}while(i<=10);
printf("该选手的总分为%f",sum);
}
#include
int main(){
int i=1;
int sum=0;
do{
if(i%2!=0){ //if(i%2==1)
sum+=i;
}
i++;
}while(i<=10);
printf("10以内奇数和为%d",sum);
}
#include
int main(){
int i=1;
int sum=1;
do{
sum=sum*i;
i++;
}while(i<=20);
printf("%d",sum);
}
哈哈,看到这我还以为我自己的代码出现问题了
算出来负数要么没初始化要么溢出
方案一:
改成长整型,没有解决问题
#include
int main(){
long i=1;
long sum=1;
do{
sum=sum*i;
i++;
}while(i<=20);
printf("%u",sum); //无符号,有一定的缺陷,负数不太适用
}
2、b>INTMAX/a
#include
int main(){
int n;
int i=1;
float sum=0;
printf("请输入n的值:");
scanf("%d",&n);
do{
sum=sum+1.0/i; //注意这里是1.0,如果输入1将会舍弃后面的小数部分
i++;
}while(i<=n);
printf("sum的值为%lf",sum);
}
#include
int main(){
int i=1;
while(i<=3){
printf("%d\n",i);
i++;
}
}
#include
int main(){
int i=1;
do{ // while(i<=3)
printf("%d\n",i);
i++;
}while(i<=3);
}
while
#include
int main(){
int i=1;
while(i<1){
printf("%d\n",i);
i++;
}
}
do-while
#include
int main(){
int i=1;
do{
printf("%d\n",i);
i++;
}while(i<1);
}
for(表达式1;表达式2;表达式3) //表达式之间用;分开
//for(初始化表达式;循环条件(条件为true);操作表达式;
{
循环体;//在执行完表达式2之后循环体被执行
}
//循环体被执行完之后执行表达式3
#include
int main(){
int k;
for(k=0;k<10;k++){
printf("*");
}
}
1.初始条件(表达式1)可以省略,可以放在for循环前声明
#include
int main(){
int k=0;
for(;k<10;k++){ //注意循环条件前的分号不能省略
printf("*");
}
}
2.循环条件(表达式2)可以省略,相当于无限循环
#include
int main(){
int k=0;
for(;;k++){ //注意循环条件前的分号不能省略
printf("*");
}
}
3.操作表达式(表达式3)可以省略,可以在循环体中保证循环正常结束
#include
int main(){
int k=0;
for(;k<10;){ //注意循环条件前的分号不能省略
printf("*");
k++;
}
}
4.初始条件、循环条件、操作表达式(即表达式1.2.3)都可以省略
#include
int main(){
int k=0;
for(;;){ //注意两个分号不能省略
printf("*");
}
}
此时相当于while(1) {语句-------死循环
5.初始条件(表达式1)可以是设置循环变量初值的赋值表达式,也可以是与循环无关的其他表达式
#include
int main(){
int i=1;
int sum;
for(sum=0;i<=5;i++)
{ sum+=i; }
printf("%d" ,sum);
}
6.初始条件(表达式1)和操作表达式(表达式3)可以是一-个简单的表达式,也可以是逗号表达式,即包含一个以上的简单表达式,中间用逗号间隔
#include
int main(){
int i;
int sum;
for(sum=0,i=1;i<=5;i++)
{ sum+=i; }
printf("%d" ,sum);
}
#include
int main(){
int i;
float sum;
float sorce;
for(sum=0,i=1;i<=10;i++)
{
printf("请输入第%d位评委的评分:",i);
scanf("%f",&sorce);
sum+=sorce;
}
printf("%f" ,sum);
}
#include
int main(){
int i;
int sum=0;
for(i=1;i<=100;i++){
if(i%2==0){
sum+=i;
}
}
printf("sum的值为%d",sum);
} //2550
#include
int main(){
int i=1;
int r=1;
int n;
printf("请输入n的值:");
scanf("%d",&n);
for(;i<=n;i++){
r=r*2;
}
printf("2的%d次方等于%d",n,r);
}
简略版
#include
#define pi 3.14
int main(){
float r=0.5;
float s;
int i;
for(i=1;i<=5;i++){
s=pi*r*r;
printf("当半径为%5.3fmm时,圆面积为%f\n",r,s);
r=r+0.5;
}
}
更进版
#include
#define pi 3.14
int main(){
float r,s;
for(r=0.5;r<=2.5;r+=0.5){
s=pi*r*r;
printf("当半径为%5.3fmm时,圆面积为%f\n",r,s);
}
}
/*有一只猴子第一天摘下一堆果子,
//当即吃了一半再多一个,直到第十天,
只剩下一个桃子。问第一天这堆果子有多少个?
第10天:1个
第9天:(1+1)*2=4个
第8天 (1+4)*2=10个
算不出来算法可以根据实际问题写写
*/
#include
int main(){
int sum=1;
int i=9;
printf("第10天有1个桃子。");
for(;i>0;i--){
sum=(1+sum)*2;
printf("第%d天有%d个桃子。\n",i,sum);
}
printf("%d",sum);
}
break;
使程序运行时中途退出switch结构或一个循环体
1. break语句 只能用在switch语句和循环语句中;
2. 嵌套循环结构中,break语句只能退出包含它的那层循环。
while(表达式1)
{
...
if(表达式2)
break;
...
}
◆正常情况下,该循环结构的执行由循环控制条件“表达式1"控制,当“表达式1”为假时,循环结束。
◆在程序执行的过程中,如果“表达式2”为真,则执行break语句,此时也会终止循环。
要求跑步跑十圈,跑到第二圈时因为受伤离场
1.定义一个循环控制变量;
2.利用for语句实现跑10圈;
3.判断如果为第2圈,停止跑步
4.如果不是第2圈,输出结果。
#include
int main(){
int i;
for(i=1;i<=10;i++){
printf("这是跑的第%d圈。\n",i);
if(i==2){
break;
}
}
printf("跑步受伤离场,这是跑的第%d圈。\n",i);
}
个人见解:我觉得他判断的条件应该是是否摔倒不应该是第几圈
#include
int main(){
int sum=0;
int i=1;
for(;;i++){
sum=sum+i;
if(sum>5000){
break;
}
}
printf("这是sum为%d,i为%d",sum,i);
}
#include
int main(){
int sum=0;
int i=1;
for(;sum<=5000;i++){
sum=sum+i;
}
printf("这时sum=%d,i=%d",sum,i-1); //这里的i要减一
}
#include
int main(){
char ch;
while(1){
ch=getchar();
if(ch=='\n')
break;
else if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')
putchar(ch);
}
}
while(表达式1)
{
...
if(表达式2)
continue;
...
}
提前结束本次循环,跳过continue语句下面未执行的语句,继续进行下一-次循环。
1. continue语句通常和if语句配合使用, 只能提前结束本次循环,不能使整个循环终止。
◆在循环控制条件“表达式1"成立的情况下,则执行循环体。
◆在执行循环体的过程中。如果“表达式2”为真,执行continue语句,即不再执行continue后面的循环体语句,转到“表达式1”进行下一-次循环控制条件的判定。
◆continue语句在for语句中结束本次循环,但for语句中的表达式3仍然执行。
#include
int main(){
int i=1;
for(;i<=10;i++){
if(i==2){
printf("第%d圈我不跑\n",i);
continue;
}
printf("这是第%d圈\n",i);
}
}
#include
int main(){
int i;
for(i=100;i<=200;i++){ //如果不算100和300就改成 for(i=101;i<200;i++)
if(i%3==0)
continue;
printf("%d\n",i);
}
}
#include
int main(){
char ch;
while((ch=getchar())!='\n'){
if(!(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z'))
continue;
putchar(ch);
}
}
- break语句
(1)只能用于循环语句和switch语句。
(2)嵌套循环结构中,break语句 只能退出包含它的那层循环。
- continue语句
只能用于循环语句。
有时为了解决一个较为复杂的问题,需要在一个循环中再定义一 个循环,这样的方式被称作循环嵌套。在C语言中,while、 do--while. for循环语句都可以进行嵌套,并且它们之间也可以互相嵌套。
//操场跑步,每天跑4圈,三天跑12圈。
#include
int main(){
int i; //一开始定义的i=1,然后只执行第一天的 因为i没有重置,所以第二层for,只会执行一次
int t=1;
for(;t<=3;t++){
for(i=1;i<=4;i++){
printf("跑的第%d天的第%d圈\n",t,i);
}
}
}
#include
int main(){
int i,j;
for(i=1;i<=5;i++){
for(j=1;j<=4;j++){
printf("*");
}
printf("\n");
}
}
//其实只是4个星星,我觉得用单for循环也行,但是万一下次是10个100个呢
*
**
***
****
*****
/* 输出星型组成的直角三角形,图形如下。
*
**
***
****
*****
*/
#include
int main(){
int i,j; //i为行,j为列,i<=j
for(j=1;j<=5;j++){
for(i=1;i<=j;i++){
printf("*");
}
printf("\n");
}
}
*****
****
***
**
*
/*输出星型组成的直角三角形,图形如下
*****
****
***
**
*
*/
#include
int main(){
int i,j;//i为行,j为列,i<=j
for(j=5;j>0;j--){
for(i=1;i<=j;i++){
printf("*");
}
printf("\n");
}
}
/*语句练习5:百钱百鸡问题。一只公鸡值五钱,
一只母鸡值三钱,三只小鸡值一钱,
现在要用百钱买百鸡,请问公鸡、母鸡、小鸡各多少只?
*/
/*
x、y、z的取值范围:
(1) x的取值范围为0 ~ 20;
(2) y的取值范围为0~ 33;
(3) z的取值范围为3~99,,步长为3.
*/
/*
1、先定义三个整型变量分别用来存储公鸡、母鸡和小鸡;
2、第一 层for循环控制公鸡的数量;
3、第二层for循环控制母鸡的数量;
4、第三层for循环控制小鸡的数量; .
5、5*x+*y+1/3*z=100; x+y+z=100
*/
#include
int main(){
int x,y,z; //公鸡、母鸡、小鸡
for(x=0;x<=20;x++){
for(y=0;y<=33;y++){
for(z=3;z<=99;z+=3){
if(x+y+z==100&&(5*x+3*y+z/3==100)){ //不可以用1/3*z
printf("x=%d,y=%d,z=%d\n",x,y,z);
}
}
}
}
}
/*语句练习5:百钱百鸡问题。一只公鸡值五钱,
一只母鸡值三钱,三只小鸡值一钱,
现在要用百钱买百鸡,请问公鸡、母鸡、小鸡各多少只?
*/
/*
x、y、z的取值范围:
(1) x的取值范围为0 ~ 20;
(2) y的取值范围为0~ 33;
(3) z的取值范围为3~99,,步长为3.
*/
/*
1、先定义三个整型变量分别用来存储公鸡、母鸡和小鸡;
2、第一 层for循环控制公鸡的数量;
3、第二层for循环控制母鸡的数量;
4、第三层for循环控制小鸡的数量; .
5、5*x+*y+1/3*z=100; x+y+z=100
*/
#include
int main(){
int x,y,z; //公鸡、母鸡、小鸡
for(x=0;x<=20;x++){
for(y=0;y<=33;y++){
z=100-x-y;
if(5*x+3*y+z/3.0==100){ //这里的三必须是浮点型三,拿4只鸡举例int(4/3)=3
printf("x=%d,y=%d,z=%d\n",x,y,z);
}
}
}
}
/*语句练习5:百钱百鸡问题。一只公鸡值五钱,
一只母鸡值三钱,三只小鸡值一钱,
现在要用百钱买百鸡,请问公鸡、母鸡、小鸡各多少只?
*/
/*
x、y、z的取值范围:
(1) x的取值范围为0 ~ 20;
(2) y的取值范围为0~ 33;
(3) z的取值范围为3~99,,步长为3.
*/
/*
1、先定义三个整型变量分别用来存储公鸡、母鸡和小鸡;
2、第一 层for循环控制公鸡的数量;
3、第二层for循环控制母鸡的数量;
4、第三层for循环控制小鸡的数量; .
5、5*x+*y+1/3*z=100; x+y+z=100
*/
#include
int main(){
int x,y,z; //公鸡、母鸡、小鸡
for(x=0;x<=20;x++){
for(z=3;z<=100-x;z+=3){
y=100-z-x;
if(5*x+3*y+z/3==100){
printf("x=%d,y=%d,z=%d\n",x,y,z);
}
}
}
}
/*语句练习5:百钱百鸡问题。一只公鸡值五钱,
一只母鸡值三钱,三只小鸡值一钱,
现在要用百钱买百鸡,请问公鸡、母鸡、小鸡各多少只?
*/
/*
x、y、z的取值范围:
(1) x的取值范围为0 ~ 20;
(2) y的取值范围为0~ 33;
(3) z的取值范围为3~99,,步长为3.
*/
/*
1、先定义三个整型变量分别用来存储公鸡、母鸡和小鸡;
2、第一 层for循环控制公鸡的数量;
3、第二层for循环控制母鸡的数量;
4、第三层for循环控制小鸡的数量; .
5、5*x+*y+1/3*z=100; x+y+z=100
*/
#include
int main(){
int x,y,z; //公鸡、母鸡、小鸡
for(x=0;x<=20;x++){
for(z=3;z<=99;z+=3){
y=100-z-x;
if(y<0)
continue;
else if(5*x+3*y+z/3==100){ //这里的三必须是浮点型三,拿4只鸡举例int(4/3)=3
printf("x=%d,y=%d,z=%d\n",x,y,z);
}
}
}
}
//xyz+yzz=532,求x、 y、z的值
#include
int main(){
int x,y,z;
for(x=0;x<10;x++){
for(y=0;y<10;y++){
for(z=0;z<10;z++){
if((x*100+y*10+z)+(y*100+z*10+z)==532){
printf("x=%d,y=%d,z=%d\n",x,y,z);
}
}
}
}
}
//xyz+yzz=532,求x、 y、z的值
//xyz+yzz=532 数字组合,xyz取值均在0-9
//由此x+y<5;x<=5,y<=5;2z个位数=1或6
#include
int main(){
int x,y,z;
for(x=0;x<=5;x++){
for(y=0;y<=5;y++){
for(z=1;z<=6;z=z+5){
if((x*100+y*10+z)+(y*100+z*10+z)==532){
printf("x=%d,y=%d,z=%d\n",x,y,z);
}
}
}
}
}
#include
int main(){
int i,j,r; //行、列 i<=j,j<=9
for(j=1;j<=9;j++){
for(i=1;i<=j;i++){ //i<=9
r=i*j;
printf("%d*%d=%d ",i,j,r); //%d*%d=%-2d
}printf("\n");
}
}
1、有无返回值
void main没有返回值,int main有返回值。
2、返回值类型
int main返回int类型的数据,void main不返回。
但是在C语言推荐写法中,建议使用int main,因为在有的编译器虽然viod main可以通过编译,但在其他编译器就会报错。为了代码拥有更好的可移植性,一般写int main。
3、书写
可以一律都写成 int main ,然后在方法体中最后加个return 0 ;就行了,这样写基本上所有的编译器都可以通过。
main函数,又称主函数。作为绝大部分C程序唯一的入口(比如windows编程中可以编写一个其他windows程序都可以使用的动态链接库(DLL)模块,由于DLL模块不是独立的程序,因此不需要main函数。再比如,用于专业环境的程序(如机器人中的控制芯片有可能不需要main函数),是要求有返回值的,该返回值返回给操作系统来表明改程序的执行状况。
返回0代表程序正常执行成功,返回非0值代表程序异常结束,因此返回值需要是int整型,于是有了int main()的规范。如果使用void main,既声明主函数没有返回值的话,程序随能编译、运行成功,却不利于操作系统判断其状态,这对于由很多C程序构成的大型项目来说是可能会是致命的。