【c语言】分支语句和循环语句

1、语句的定义

C语言的语句可以分为以下几类

1. 表达式语句 2. 函数调用语句 3. 控制语句 4. 复合语句 5. 空语句

函数调用语句
如printf(“Hello world.”);

表达式语句
如赋值表达式a=3;,++i;等

空语句
直接只有一个分号的一行语句。

复合语句
用{}将语句和声明括起来的复合语句,也称语句块

控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,C语 言有九种控制语句。 可分成以下三类:

1. 条件判断语句也叫分支语句:if语句、switch语句;

2. 循环执行语句:do while语句、while语句、for语句;

3. 转向语句:break语句、goto语句、continue语句、return语句。

2、分支语句

if 语句

语法结构:
if(表达式)
    语句;
if(表达式)
    语句1;
else
    语句2;
//多分支    
if(表达式1)
    语句1;
else if(表达式2)
    语句2;
else
    语句3;

如果表达式的结果为真,则语句执行。
在C语言中如何表示真假?

0表示假,非0表示真。

如果条件成立,要执行多条语句,怎应该使用代码块。

#include <stdio.h>
int main()
{
    if(表达式)
   {
        语句列表1;
   }
    else
   {
        语句列表2;
   }
    return 0;
}

常见问题

else悬空

#include <stdio.h>
int main()
{
    int a = 0;
    int b = 2;
    if(a == 1)
        if(b == 2)
            printf("hehe\n");
    else
        printf("haha\n");
    return 0;
}

代码运行结果为无任何输出

编译器中认为else和第二个if匹配,else和最近的if匹配

若想要预期的结果,应该修改代码为

//适当的使用{}可以使代码的逻辑更加清楚。
//代码风格很重要
#include <stdio.h>
int main()
{
    int a = 0;
    int b = 2;
    if(a == 1)
   {
        if(b == 2)
       {
            printf("hehe\n");
       }
   }
    else
   {
         printf("haha\n");
   }       
    return 0;
}

if中判断的书写格式

//代码1
int num = 1;
if(num == 5)
{
    printf("hehe\n");
}
//代码2
int num = 1;
if(5 == num)
{
    printf("hehe\n");
}

一般变量和常量进行比较的时候,最好将常量写在左边,避免将==写成=导致的错误难以发现

从而可以看出代码的风格比较重要

switch语句

switch(整型表达式)
{
    case 整形常量表达式:
    语句;
}

在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支。 比如

#include <stdio.h>
int main()
{
    int day = 0;
    switch(day)
   {
        case 1:
            printf("星期一\n");
            break;
        case 2:
            printf("星期二\n");
            break;
        case 3:
            printf("星期三\n");
            break;    
        case 4:
            printf("星期四\n");
            break;    
        case 5:
            printf("星期五\n");
            break;
        case 6:
            printf("星期六\n");
            break;
        case 7:
            printf("星期天\n");    
            break;
   }
    return 0;
}

若想要实现以下的要求则 

1. 输入1-5,输出的是“weekday”; 

2. 输入6-7,输出“weekend”

#include <stdio.h>
//switch代码演示
int main()
{
    int day = 0;
    switch(day)
   {
        case 1:
        case 2:
        case 3:
        case 4:
        case 5:
            printf("weekday\n");
            break;
        case 6:
        case 7:
            printf("weekend\n");
            break;
   }
    return 0;
}

可见break语句的实际效果是把语句列表划分为不同的分支部分。 

switch(整型数据(包括枚举型)或字符型数据) {
	case 常量1: 语句1; break;
	case 常量2: 语句2; break;
	case 常量3:
	case 常量4: 语句3; break;//此时常量3和常量4都进入到语句3
	...
	default: 语句n;(没有default时不符合则跳过)
}
//对于if、switch等选择语句,通常把正常情况,也即出现可能性最大的分支放前面,而可能性小的分支放后面

如果所有case都不能匹配的话,可以在switch语句中加上default语句,当所有的case都不匹配则执行default中的语句,default语句可以放在任何位置,但是switch语句中只能出现一次。

编程的好习惯:最后一个case语句和default语句都加上break。

练习1

#include <stdio.h>
  int main()
{
  	int x = 3;
  	int y = 3;
  	switch (x % 2) 
{  // x%2的结果为1,因此执行case1
  	case 1:
  		switch (y)   // y是3,因此会执行case3,而case3不存在,那只能执行default
  		{
  		case 0:
  			printf("first");
  		case 1:
  			printf("second");
  			break;
  		default: printf("hello"); // 打印hello,打印完之后,内部switch结束,此时外部case1结束
  		}             // 因为外部case1之后没有添加break语句,所以继续执行case2
  	case 2:             // 打印third
  		printf("third");      // 外部switch结束
  	}
  	return 0;

练习2

#include <stdio.h>
int main()
{
    int n = 1;
    int m = 2;
    switch (n)
   {
    case 1:
            m++;    //此处执行
    case 2:
            n++;    //此处执行
    case 3:
            switch (n)
           {//switch允许嵌套使用
             case 1:
                    n++;
             case 2:
                    m++;    //此处执行
                    n++;
                    break;
           }
    case 4:
            m++;    //此处执行
            break;
    default:
            break;
   }
    printf("m = %d, n = %d\n", m, n);
    return 0;
}

输出结果:5 3

3、循环语句

while循环

类似于if语句

if(条件)
     语句;

但是if语句只会执行一次

如果需要重复循环执行多次的话,可以使用while语句

//while 语法结构

while(表达式)

        循环语句;

while语句执行过程:

 while语句的使用:实现打印1~10

#include <stdio.h>
int main()
{
 int i = 1;
 while(i<=10)
 {
 printf("%d ", i);
 i = i+1;
 }
 return 0;
}

while语句中的break和continue

//break 代码实例
#include <stdio.h>
int main()
{
     int i = 1;
     while(i<=10)
     {
         if(i == 5)
             break;
         printf("%d ", i);
         i = i+1;
    }
     return 0;
}

代码输出结果:1 2 3 4

//continue 代码实例1
#include <stdio.h>
int main()
{
     int i = 1;
     while(i<=10)
     {
         if(i == 5)
             continue;
         printf("%d ", i);
         i = i+1;
     }
     return 0;
}

代码输出结果:打印1~4后进入死循环

由此可知

在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。 所以:while中的break是用于永久终止循环的

continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行, 而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。

代码案例

//代码1
#include <stdio.h>
int main()
{
 int ch = 0;
 while ((ch = getchar()) != EOF)
       putchar(ch);
    return 0;
}
//这里的代码适当的修改是可以用来清理缓冲区的.
//输入函数都是从缓冲区中读取数据的
//比如说在scanf读取缓冲区的时候,把scanf未读取的数据清理掉,
//scanf不会读取空格和换行,空格和换行会留在缓存区

//代码2
#include <stdio.h>
int main()
{
    char ch = '\0';
 while ((ch = getchar()) != EOF)
 {
     if (ch < ‘0’ || ch > ‘9’)
        continue;
     putchar(ch);
 }
 return 0;
}
//这个代码的作用是:只打印数字字符,跳过其他字符的

for循环语句

for(表达式1; 表达式2; 表达式3)

         循环语句;

表达式1  

表达式1为初始化部分,用于初始化循环变量的。

表达式2

表达式2为条件判断部分,用于判断循环时候终止。

表达式3

表达式3为调整部分,用于循环条件的调整。 

对比while语句和for语句

int i = 0;
//实现相同的功能,使用while
i=1;//初始化部分
while(i<=10)//判断部分
{
 printf("hehe\n");
 i = i+1;//调整部分
}
//实现相同的功能,使用while
for(i=1; i<=10; i++)
{
 printf("hehe\n");
}

 for循环中的break和continue

//代码1
#include <stdio.h>
int main()
{
     int i = 0;
     for(i=1; i<=10; i++)
     {
         if(i == 5)
             break;
         printf("%d ",i);
     }
     return 0;
}
//代码2
#include <stdio.h>
int main()
{
     int i = 0;
     for(i=1; i<=10; i++)
     {
     if(i == 5)
         continue;
     printf("%d ",i);
     }
     return 0;
}

使用for循环的建议:

  1. 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
  2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。

for循环的其他形式

#include <stdio.h>
int main()
{
 //代码1
     for(;;)
     {
         printf("hehe\n");
     }
        //for循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问题。
    
    //代码2
    int i = 0;
    int j = 0;
    //这里打印多少个hehe?
    for(i=0; i<10; i++)
    {
        for(j=0; j<10; j++)
       {
           printf("hehe\n");
       }
    }
    
    //代码3
    int i = 0;
    int j = 0;
    //如果省略掉初始化部分,这里打印多少个hehe?
    for(; i<10; i++)
    {
        for(; j<10; j++)
        {
             printf("hehe\n");
        }
   }
    
 //代码4-使用多余一个变量控制循环
     int x, y;
     for (x = 0, y = 0; x<2 && y<5; ++x, y++)
     {
        printf("hehe\n");
     }
     return 0;
}

do...while循环语句

循环至少执行一次,使用的场景有限,所以不是经常使用。

do

        循环语句;

while(表达式);

循环语句的典型案例

求n的阶乘

int main()
{
    int n = 0;
    scanf("%d", &n)
    int ret = 1;
    for(i = 1; i <= n ;i++)
    {
        ret *= i;
    }
    print("%d\n", ret);
    return 0;
}

计算 1!+2!+3!+……+10!

方法一

int main()
{
    int n = 0;
    int ret = 1;
    int sum = 0;
    for(n = 1; n<=10; n++)
    {   
        ret = 1;
        for(i = 1; i <= n ;i++)
        {
            ret *= i;
        }
        sum +=ret;

    }
    print("%d\n", sum);
    return 0;
}

方法二

int main()
{
    int n = 0;
    scanf("%d", &n)
    int ret = 1;
    int sum = 0;
    for(i = 1; i <= n ;i++)
    {
        ret *= i;
        sum += ret;
    }
    print("%d\n", sum);
    return 0;
}

在有序数组中查找某个具体的数字(二分查找法)

实现在主函数内:
int main()
{
    int arr[] = {1,2,3,4,5,6,7,8,9,10};
    int left = 0;
    int right = sizeof(arr)/sizeof(arr[0])-1;
    int key = 7;
    int mid = 0;
    while(left<=right)
    {
        mid = (left+right)/2;
        if(arr[mid]>key)
        {
            right = mid-1;
        }
        else if(arr[mid] < key)
        {
           left = mid+1;
        }
        else
            break;
        }
        if(left <= right)
             printf("找到了,下标是%d\n", mid);
        else
            printf("找不到\n");
}

函数实现

int bin_search(int arr[], int left, int right, int key)
{
    int mid = 0;
    while(left<=right)
    {
        mid = (left+right)/2;
        if(arr[mid]>key)
        {
            right = mid-1;
        }
        else if(arr[mid] < key)
        {
           left = mid+1;
        }
        else
            return mid;
    }
    return -1;
}

猜数字游戏 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
	printf("**********************************\n");
	printf("*********** 1.play     **********\n");
	printf("*********** 0.exit     **********\n");
	printf("**********************************\n");
}
//RAND_MAX--rand函数能返回随机数的最大值。
void game()
{
	int random_num = rand() % 100 + 1;
	int input = 0;
	while (1)
	{
		printf("请输入猜的数字>:");
		scanf("%d", &input);
		if (input > random_num)
		{
			printf("猜大了\n");
		}
		else if (input < random_num)
		{
			printf("猜小了\n");
		}
		else
		{
			printf("恭喜你,猜对了\n");
			break;
		}
	}
}
int main()
{
	int input = 0;
	srand((unsigned)time(NULL));
	do
	{
		menu();
		printf("请选择>:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			break;
		default:
			printf("选择错误,请重新输入!\n");
			break;
		}
	} while (input);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值