C语言分支循环语句(第三弹)

前言

      使用循环可以多次重复地执行多条语句,从而实现更加复杂的问题。这里的“多条语句”称为循环体。在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;
}

        复制下来在你的电脑上试试吧(叫朋友过来也不错)

        循环结构是极其重要的,希望大家在看完这个文章后能对循环有一定的了解。

        

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值