一,循环体中的跳转语句
1.break
作为循环体的中间退出点,直接跳出循环,另外也在switch语句中负责跳出switch。
#include<stdio.h>
int main()
{
int x;
scanf("%d", &x);
int i;
int isPrime = 1;//x是素数
for (i = 2; i < x; i++)
{
if (x % i == 0)
{
isPrime = 0;
break;
}
}
if (isPrime == 1)
{
printf("%d是素数\n", x);
}
else
{
printf("%d不是素数\n", x);
}
return 0;
}
2.continue
不会跳出循环,而是跳过本轮循环中剩余的语句,直接进入下一轮。
3.goto
可以跳转到同一个函数中任何有标记的语句处。goto
依赖于定义在语句开头的标识符,其形式为:标识符 : 语句
。 goto
语句的形式为:goto 标识符; goto
易于造成程序混乱,代码难以阅读,并且其他跳转语句、return
和exit
语句能够满足大多数需要goto
语句的情况。除非万不得已,尽量不要使用。
二,多重循环
1.嵌套的循环
(素数判断)
#include<stdio.h>
int main()
{
int x;
for(x=2;x<100;x++)
{
int i;
int isPrime = 1; //x是素数
for (i = 2; i < x; i++)
{
if (x % i == 0)
{
isPrime = 0;
break;
}
}
if (isPrime == 1)
{
printf("%d是素数\n", x);
}
else
{
printf("%d不是素数\n", x);
}
}
printf("\n");
return 0;
2.从嵌套的循环中跳出
普通的break只能跳出其所在的循环,如果需要跳出全部循环,可以采用如下方法
接力break
通过一系列break逐步跳出循环 (其中if后exit的意思与exit==1相同,但更方便)。
int main()
{//凑硬币
int one, two, five;
int x;
int exit = 0;
scanf("%d", &x);
printf("要凑成%d元需要\n",x);
for (one = 1; one < x * 10; one++)
{
for (two = 1; two < x * 10 / 2; two++)
{
for (five = 1; five < x * 10 / 5; five++)
{
if(one+two*2+five*5==x*10)
{
printf("%d个一毛%d个二毛%d个五毛\n", one, two, five, x);
exit = 1;
break;
}
if (exit) break;
}
if (exit) break;
}
if (exit) break;
}
return 0;
}
goto的方法
一个遍布goto语句的程序会让让人很难抓住重心,不便于对程序的理解和维护。
不过有的情况可以可以使用goto,比如:从多重循环中直接跳出 ,减少了接力break。
int main()
{//凑硬币
int one, two, five;
int x;
scanf("%d", &x);
printf("要凑成%d元需要\n",x);
for (one = 1; one < x * 10; one++)
{
for (two = 1; two < x * 10 / 2; two++)
{
for (five = 1; five < x * 10 / 5; five++)
{
if(one+two*2+five*5==x*10)
{
printf("%d个一毛%d个二毛%d个五毛\n", one, two, five, x);
goto out;
}
}
}
}
out:
return 0;
}
三,循环应用例子
1.前n项求和
int main()
{
int i;
int n;
double sum = 0.0;
int turn = 1;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
sum += turn * 1.0 / i;
turn = -turn;
}
printf("%lf", sum);
return 0;
}
2.求最大公约数
#include<stdio.h>
int main()
{
int a, b;
int min;
scanf("%d %d", &a, &b);
if (a < b)
{
min = a;
}
else
{
min = b;
}
int ret = 0;
int i;
for(i=1;i<min;i++)
{
if( (a % i == 0) && (b % i == 0))
{
ret = i;
}
}
printf("%d和%d的最大公约数是%d",a, b, ret);
return 0;
//辗转相除法
int main()
{
int a, b;
int t;
scanf("%d %d", &a, &b);
while (b != 0)
{
t = a % b;
a = b;
b = t;
}
printf("ret=%d\n", a);
return 0;
}
3.整数分解
正序
int main()
{
int x;
scanf("%d", &x);
do
{
int d = x % 10;
printf("%d", d);
if (x >= 10)
{
printf(" ");
}
x /= 10;
}
while (x > 0);
return 0;
}
逆序
int main()
{
int x;
int t=0;
int d;
scanf("%d", &x);
do
{
d = x % 10;
t = t * 10 + d;
x /= 10;
}
while (x > 0);
printf("%d\n",t);