前言
使用循环可以多次重复地执行多条语句,从而实现更加复杂的问题。这里的“多条语句”称为循环体。在C语言中,可以使用三种循环,分别是:while、do...while和for。在本文中还会介绍break和continue在循环中的使用。
在这些语句中,循环体被重复执行的次数由循环条件控制,称为控制表达式。这是一个标量类型的表达式,也就是说,它属于一个算术表达式或指针表达式。如果控制表达式的值不等于 0,循环条件为 true,反之,循环条件为 false。
while循环
while循环的使用方式:
while (条件)
{
// 循环体
}
在while循环中,首先上来是执行判断表达式,表达式的值为0,循环直接结束,如果不为0,则执行循环语句,在语句执行结束后,再重复上述操作。
接下来看一个小练习
#include <stdio.h>
int main(){
int i=0;
while(i<=10){
printf("%d ",i);
i++;
}
return 0;
}
通过上述代码即可打印出1~10的数字。
接下来再完成一个逆序打印正整数吧?
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
while(n)
{
printf("%d ", n%10);
n /= 10;
}
return 0;
}
在上述代码中%为取模运算符。在上述代码中通过这个来完成打印末尾数字。
for循环
for循环是三种循环中使用最多的,使用方式如下:
for(表达式1; 表达式2; 表达式3)
//循环语句 如果有多行还需加大括号
表达式1用来初始化循环变量
表达式2用来判断循环是否结束
表达式3用于对循环变量的调整
来一个例子来实践一下吧。
#include <stdio.h>
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
printf("%d ", i);
}
return 0;
}
通过上述代码即可实现打印1~10.
先用for循环罗列一下1~100内3的倍数:
#include <stdio.h>
int main()
{
int i = 0;
for(i=1; i<=100; i++)
{
if(i % 3 == 0)
printf("%d ",i);
}
return 0;
}
想一想怎么进行优化呢?
#include <stdio.h>
int main()
{
int i = 0;
for(i=3; i<=100; i+=3)
{
printf("%d ",i);
}
return 0;
}
将i初始化为3,i+=3;就会使输出的i都为3的倍数。接下来看一下1~100的3的倍数的和为多少.
#include <stdio.h>
int main()
{
int i = 0;
int sum = 0;
for(i=3; i<=100; i+=3)
{
sum += i;
}
printf("%d\n", sum);
return 0;
}
do while 循环语句
与上述循环不同的是,do while循环是先执行一次语句再进行判断,所以语句至少会执行一次。它的语法如下:
do
语句;
while(表达式);
使用do while循环打印1~10数字
#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i);
i += 1;
}while(i<=10);
return 0;
}
使用do while 循环语句来实现计算整数的位数。
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
int cnt = 0;
do
{
cnt++;
n = n / 10;
} while (n);
printf("%d\n", cnt);
return 0;
}
do while 循环可以判断0也为个位数。
break 和continue 语句的
while循环与do while 循环
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
break; //当i等于5后,就执⾏break,循环就终⽌了
printf("%d ", i);
i = i+1;
}
return 0;
}
运行上述代码产生1 2 3 4.在do while语句和for循环中也是。break语句是可以直接跳出循环,在循环中的使用方式相同。
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
continue; //当i等于5后,就执⾏continue,就跳出这次循环的剩余语句到循环判断部分
printf("%d ", i);
i = i+1;
}
return 0;
}
上述代码的运行结果为 1 2 3 4_,在该代码中会陷入死循环,因为i==5后i的值一只为5不再变化。同样在do while循环中也是这样。
#include <stdio.h>
int main()
{
int i = 1;
do
{
if(i == 5)
continue;
printf("%d ", i);
i = i + 1;
}while(i<=10);
return 0;
}
for 循环
#include <stdio.h>
int main()
{
int i = 1;
for(i=1; i<=10; i++)
{
if(i == 5)
break;//结束循环
printf("%d ", i);
}
return 0;
}
运行结果为1 2 3 4
但如果在for 循环中使用continue函数呢,结果与while循环的大为不同。
#include <stdio.h>
int main()
{
int i = 1;
for(i=1; i<=10; i++)
{
if(i == 5)
continue; //这⾥continue跳过了后边的打印,来到了i++的调整部分
printf("%d ", i);
}
return 0;
}
观察上述函数发现输出结果变为1~10没有5了。
100~200之间的素数
#include <stdio.h>
int main() {
int i = 0;
int count =0;
for (i = 100; i <= 200; i++) {
int j = 0;
int flag = 1;
for (j = 2; j < i; j++) {
if (i % j == 0) {
flag = 0;
break;
}
}
if (flag == 1) {
printf("%d ", i);
count++;
}
}
printf("\ncount=%d \n",count);
return 0;
}
想一想如何对上述代码进行优化呢?取模时可以通过sqrt函数对第二个for循环中j的范围进行缩减,进而提高运行速度。
#include <stdio.h>
#include <math.h>
int main() {
int i = 0;
int count = 0;
for (i = 100; i <= 200; i++) {
int j = 0;
int flag = 1;
for (j = 2; j < sqrt(i); j++) {
if (i % j == 0) {
flag = 0;
break;
}
}
if (flag == 1) {
printf("%d ", i);
count++;
}
}
printf("\ncount=%d \n", count);
return 0;
}
来一个猜数字小游戏吧
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void game() {
int r = rand() % 100 + 1;
int guess = 0;
int count = 5;
while(count){
printf("\n你还有%d次机会\n", count);
printf("请猜数字:>");
scanf("%d", &guess);
if (guess < r) {
printf("猜小了\n");
}
else if (guess > r) {
printf("猜大了\n");
}
else {
printf("恭喜你猜对了\n");
break;
}
count--;
}
if (count == 0) {
printf("你失败了,正确值是%d\n", r);
}
}
void menu() {
printf("*********************\n");
printf("*******1.play********\n");
printf("*******0.exit********\n");
printf("*********************\n");
}
int main() {
int input = 0;
srand((unsigned int)time(NULL));
do {
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input) {
case 1:
game();
break;
case 0:
printf("游戏结束\n");
break;
default:
printf("输入错误,请重新选择\n");
break;
}
} while (input);
return 0;
}
复制下来在你的电脑上试试吧(叫朋友过来也不错)
循环结构是极其重要的,希望大家在看完这个文章后能对循环有一定的了解。