C语言——4-循环结构
写一个C程序,求 sum = 1 + 2 + 3 + 4 + ...+ 100
int sum = 0;//保存结果 和
int i = 1;
sum = sum + i;// 0 + 1
i++;// i = 2
sum = sum + i;//0 + 1 + 2
i++;//i = 3
sum = sum + i;//0 + 1 + 2 + 3
i++;
sum = sum + i;//0 + 1 + 2 + 3
i++;
sum = sum + i;//0 + 1 + 2 + 3
i++;
sum = sum + i;//0 + 1 + 2 + 3
i++;
//...
把上面的两行代码,重复做100遍...
但是, 不科学,
能不能想办法,让计算机帮我重复做100遍?
C语言中,有没有这种指令让计算机重复执行一些语句呢?
循环
1.什么是循环呢?
循环的本质是 : 重复
所有重复的代码,都可以用循环来实现.
在C语言中,能够达到循环效果的("重复") 的语句有下面几种 :
(1) if 和 goto 构造循环效果
(2) while语句
(3) do while语句
(4) for语句
2 goto语句
go to school 去学校
go to bed 睡觉
...
"goto" 去哪儿
goto语句 : 让CPU去指定的地方执行, "无条件跳转语句"
语法 :
goto 行标识(语句标识);"行标识" : 用来标识一行的地址
行标识一般写在一行的最前面,当然行标识前面允许有空白符(如 : 空格,tab,...)
行标识也属于标识符(字母,数字,下划线,第一个字符不能为数字).
每一行C代码,都可以有一个行标识.
loop:
sum = sum + i;
i++;
if(i <= 100)
goto loop;
//一般 goto 和 if 配合练习 :
求1000以内 3 的倍数之和, 用goto语句实现循环效果 .
==注意==
主张结构化程序设计的人,建议限制使用goto语句,
不是因为goto语句有问题,goto语句本身没有任何问题.
但是使用goto语句的人可能会有问题.
乱用goto语句,会使程序的可读性变差.
3 while语句
语法形式 :
while(表达式)
语句 -----> 循环体语句,要重复执行的语句当 "表达式" 的值为真(非0) ,则执行"语句",然后再跳转到上面,继续判断"表达式"的值,
当 "表达式" 的值为真(非0) ,则执行"语句",然后再跳转到上面,继续判断的值,......
如此重复,直到"表达式" 的值为假(0) 为止.
"表达式" : 任意合法的表达式都可以, 只要有一个值就行.
"语句" : 循环体语句,要重复执行的语句
单语句 : 只有一个 ; 的语句
复合语句 : { } /if/switch/while/do while/for...
例子 :
int sum = 0;
int i = 1;
while(i <= 100)
sum = sum + i;
i++;
printf("sum = %d\n",sum);上面的while,只能管到 "sum = sum + i" 这一行.
编程建议 :
不管while 后面有没有语句,先打一个 { } ,以确定其"管辖范围"
while()
{
}例子 :
描述一下 : 见你一次, 打你一次
if(见到你)
打一次
while(见到你)
打一次
while(见到你)
{
打一次
sleep
}
while(1)
{
if(见到你)
打一次
if(死啦)
{
break;
}
}练习 :
(1) 用while循环实现, 逆序输出一个非负整数的各个位上的数字.
int a; scanf("%d",&a); int geiwei;//保存a个位上的数字 while(a) //a != 0 { //1.先把a个位数字给取出来 geiwei = a %10; printf("%d ",gewei); //2.把a的个位给干掉 a = a/10; } printf("\n");#include <stdio.h> int main() { int a; scanf("%d",&a); int gewei;//保存a个位上的数字 while(a) //a != 0 { //1.先把a个位数字给取出来 gewei = a %10; printf("%d ",gewei); //2.把a的个位给干掉 a = a/10; } printf("\n"); return 0; }
4 do while循环
语法形式 :
do 语句 -----> "循环体语句, 要重复执行的语句" while(表达式);先执行"语句",然后再判断"表达式" 的值,当"表达式" 的值为真(非0),则继续跳转到上面,
执行"语句" ,然后再判断"表达式" 的值,当"表达式" 的值为真(非0时,则继续跳转到上面,
....
如此重复,直到"表达式" 的值为假(0) 为止.
"语句" : 循环体语句,要重复执行的语句
单语句 : 只有一个 ; 的语句
复合语句 : { } /if/switch/while/do while/for...
"表达式" : 任意合法的表达式都可以, 只要有一个值就行.
例子 :
int i = 1; int sum = 0; do sum = sum + i; i++; while(i <= 100); printf("sum = %d\n",sum); /* 5.dowhile100求和.c: In function ‘main’: 5.dowhile100求和.c:10:3: error: expected ‘while’ before ‘i’ i++; ^ */编程建议 :
不管do有没有语句,先打一对{}.以确定其"管辖范围"
do { }while();
5 for 循环
语法形式 :
for( 表达式1 ; 表达式2 ; 表达式3 ) 语句 ----> 循环体语句先执行一次"表达式1" ,
判断 "表达式2" 的值 , 当值为真 , 则执行 "语句" ,然后再挑转到
"表达式3" 执行,
判断"表达式2" 的值,当值为真,则执行 "语句" , 然后再跳转到
"表达式3" 执行,
....
如此重复,直到 " 表达式2" 的值为假(0) 为止.
"表达式1" , "表达式2" , "表达式3"
任意合法的表达式都可以 ;
并且 表达式1, 表达式2 , 表达式3, 都可以省略(也可以省略部分, 但是 ; 号不能省略)
当 "表达式 2" 省略时, 则表示 "循环条件永远为真"
"语句"
单语句 : 只有一个 ; 号的语句
复合语句 : {}/if/switch/while/do while/for/...
for( ; ; ) { } ==> for( ; 1 ; ) { }编程建议 :
不管for后面有没有语句,先打一对 {} , 以确定其 "管辖范围"
for( ; ; ) { }例子 :
int i; int sum = 0; //用for循环完成1-100的求和 for(i = 1 ;i <= 100 ; i++ ) { sum = sum + i; }
练习 :
从键盘上输入一个正整数 x , 判断 x 是否为 质数(prime)
假设 m , n都为整数 if m%n == 0, ==> m 是 n 的倍数,n 是 m的因子(约数) 当一个整数 x ,除了 1 和 本身之外, 没有其他的因数, 那么我们说x 为质数(素数,prime) 143 除了 1 和 143以外, 如果没有其他的因数,就表明 143是一个质数, 否则(有一个及以上的其他因数),就表明143不是一个质数. 2 3 4 5 6 ... 142 if 143%2 == 0,则停止,143 有一个因子是 2 if 143%3 == 0,则停止,143 有一个因子是 3 if 143%4 == 0,则停止,143 有一个因子是 4 ... x for(i = 2; i < x ; ) { if(x%i == 0) { 停止,表明 x 有一个因数是 i //"停止" 要提前结束循环 } i++; }#include <stdio.h> int main() { int x,i; scanf("%d",&x); for(i = 2; i < x ;i++ ) { if(x%i == 0) { //停止,表明 x 有一个因数是 i //"停止" 要提前结束循环 break; } // else // x%i != 0 ,==> i不是x的因数,只能说 i 一个数不是x的因数 // { // printf("%d 是一个质数\n",x); // } } if( i == x) //上面的那个循环, i 都试了一遍,都不是x的因数 ==> "没有提前break" { printf("%d 是一个质数\n",x); } else { printf("%d 不是一个质数\n",x); printf("因为 %d 至少有一个因数 : %d\n",x,i); } return 0; }
6 break 和 continue
(1) break 跳出
break 用在switch语句 和 循环语句(while,do while,for) 中,
用来跳出他所属的 switch语句 或 循环语句.
(2) continue "继续下一次"
continue 只能用在循环语句中(while,do while,for),作用是 :
结束本次循环,继续下一次循环.
//用for循环完成1-100的求和 for(i = 1 ;i <= 100 ; i++ ) { sum = sum + i; continue; printf("sum = %d\n",sum); //加上continue后,continue后面的语句不执行了,继续下一次循环 }
浙公网安备 33010602011771号