C/C++语言基础--分支和循环结构

本专栏目的

  • 更新C/C++的基础语法,包括C++的一些新特性

无论C还是C++,还是其他语言写的程序都是由循环结构、分支结构和循环结构所构成的。

程序最小独立单元

如果把写程序和写小说类比,变量常量等可以看成是字和词,函数可以看成是一个段落,运算符等可以看作是字词的组合方式(规则),那么,字词组成的句子就是小说的最小独立单元,表达了一定的意思,同样,程序的最小独立单元是“语句”,每个语句表达出完整的意义。

在这里插入图片描述

三种控制结构

结构化程序设计提供了3种控制结构,分别是顺序结构、分支结构和循环结构,早在1966年,牛人Bohm和Jacopini便证明了,用此3种基本结构可以构成任意复杂的算法。3种基本控制结构如所示。

在这里插入图片描述

顺序结构

顺序结构表示程序中的各操作是按照它们出现的先后顺序执行的。

顺序结构是最简单的程序结构,也是最常用的程序结构,只要按照解决问题的顺序写出相应的语句就行,它的执行顺序是自上而下,依次执行。

例如,a = 3,b = 5,现交换a,b的值,这个问题就好像交换两个杯子水,这当然要用到第三个杯子,假如第三个杯子是c,那么正确的程序为: c = a; a = b; b = c; 执行结果是a = 5,b = c = 3如果改变其顺序,写成:a = b; c = a; b = c; 则执行结果就变成a = b = c = 5,不能达到预期的目的,初学者最容易犯这种错误。

分支结构

对于要先做判断再选择的问题就要使用分支结构。分支结构的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序。

单一分支
  • 语法

    if(条件)
    {
     	分支   
    }
    
  • 规则:当条件成立时,执行分支体,否则不执行。

**示例:**输入一个数,判断是否是偶数!

int n;
printf("请输入一个数字:");
scanf("%d", &n);
if(n == 1)
{
	printf("非奇非偶\n");
}
if(n % 2 == 0)
{
	printf("是偶数\n");
}
双分支
  • 语法

    if(条件)
    {
        分支1
    }else
    {
        分支2
    }
    
  • 规则:当条件成立时,执行分支体1,否则执行分支体2。

**示例:**某公司工资按周发放,标准是每小时制20元,若员工周工作时间超过40小时,超出部分每小时30元。输入一名员工一周的工作小时数,输出他的周工资。

// h: 小时, s: 工资
if(h <= 40)
{
	printf("工资为:%d \n", h * 20);
}
else
{
	printf("工资为:%d\n", (h - 40) * 30 + 40 * 20);
}

嵌套分支
  • 语法

    if(条件1){分支1}
    else if(条件2){分支2}
    ...
    else if(条件n){分支n}
    else{分支n+1}
    
  • 规则:条件1成立时,执行分支1,然后结束分支语句,否则继续依次判断后面的条件,或者直到某个条件满足。如果条件都不满足,则会执行else分支。

**示例:**有一个函数如下,写一段程序,输入x,输出y
y = [ x x < 1 2 x − 1 1 < = x < 10 3 x − 11 x > = 10 ] y = \left[\begin{matrix} x&x<1\\ 2x-1&1<=x<10\\ 3x-11&x>=10 \end{matrix}\right] y= x2x13x11x<11<=x<10x>=10

if(x < 1)
{
	printf("%d\n", x);
}
else if (x < 10)   // x >= 1
{
	printf("%d\n", 2 * x - 1);
}
else   // x >= 10
{
	printf("%d\n", 3 * x - 11);
}

来个练习

编写程序:从屏幕上输入一个学生的成绩(0-100),对学生成绩进行评定:

<59为"E"

​ ==59为经典语录

​ 60~69为"D"

​ 70~79为"C"

​ 80~89为"B"

​ 90以上为"A"

​ <0或>100提示成绩输入出错

switch开关语句
  • 语法

    switch(exp)
    {
        case 常量表达式1:
        case 常量表达式2:
        case 常量表达式3:
        ...
        case 常量表达式4:
        [以下语句为可选]
        default:
            break;
    }++
    
  • 规则:

    • exp(表达式)和case后面的“常量表达式”的结果值的类型应该一致。其类型可以是除实型以外的任何类型(如整型、字符型、枚举类型)。
    • 在同一switch语句中,case后的常量表达式的值必须唯一。
    • switch语句中可以不含default分支;default分支并不限定在最后,几个case分支也没有顺序区别,但必须做适当处理,否则会影响执行结果。

思考:如何使用switch完成分数等级评定?

很简单,就和多重if一样,如下:

switch(x)
{
case x < 10:
	printf("F\n");
	break;
case x < 20:
	printf("E\n");
	break;
}

注意: 如果没有break,则输入x = 9的时候,会连续输出 F、E,具体原因见下面break和continue关键字的解释。

循环结构

有的时候,我们可能需要多次执行同一块代码。一般情况下,语句是按顺序执行的:函数中的第一个语句先执行,接着是第二个语句,依此类推。

编程语言提供了更为复杂执行路径的多种控制结构。

循环语句允许我们多次执行一个语句或语句组,下面是大多数编程语言中循环语句的流程图:

在这里插入图片描述

循环类型

C 语言提供了以下几种循环类型。

while循环

  • 语法

    while(condition)
    {
        循环体;
    }
    
  • 规则

    • 只要condition为真,C 语言中的 while 循环语句会重复执行循环体。

do…while循环

  • 语法

    do
    {
        循环体;
    }while(condition);
    
  • 规则

    • 不像 forwhile 循环,它们是在循环头部测试循环条件。在 C 语言中,do…while 循环是在循环的尾部检查它的条件。
    • do…while 循环与 while 循环类似,但是 do…while 循环会确保至少执行一次循环。

for 循环

  • 语法

    for(init;condition;increment)
    {
        循环体;
    }
    
  • 规则

    • init 会首先被执行,且只会执行一次。这一步允许声明并初始化任何循环控制变量。您也可以不在这里写任何语句,只要有一个分号出现即可。

    • 接下来,会判断 condition。如果为真,则执行循环体。如果为假,则不执行循环主体,且控制流会跳转到紧接着 for 循环的下一条语句。

    • 在执行完 for 循环主体后,控制流会跳回上面的 increment 语句。该语句允许您更新循环控制变量。该语句可以留空,只要在条件后有一个分号出现即可。

    • 条件再次被判断。如果为真,则执行循环,这个过程会不断重复(循环主体,然后增加步值,再然后重新判断条件)。直到条件变为假时,for 循环终止。

循环控制语句

循环控制语句改变你代码的执行顺序。通过它你可以实现代码的跳转。

C 提供了下列三个循环控制语句。

break语句

作用:终止循环switch 语句,程序流将继续执行紧接着循环或 switch 的下一条语句。

  • break只能跳出一层循环,多层循环需要使用标志。

  • break不能用在处循环和switch之外的任意语句中。

continue语句

**作用:**告诉一个循环体立刻停止本次循环迭代,重新开始下次循环迭代。

  • continue 语句有点像 break 语句。但它不是跳出,而是会跳过剩下的循环代码,直接开始下一次循环。
  • 对于 for 循环,continue 语句执行后自增语句仍然会执行。对于 whiledo…while 循环,continue 语句执行后,重新执行条件判断语句。
goto语句

**作用:**将控制转移到被标记的语句。但是不建议在程序中使用 goto 语句。

  • C 语言中的 goto 语句允许(在同一函数内)跳转到任何的被标记的语句。

    注意:在任何编程语言中,都不建议使用 goto 语句。因为它使得程序的控制流难以跟踪,使程序难以理解和难以修改。任何使用 goto 语句的程序可以改写成不需要使用 goto 语句的写法。

无限循环

如果条件永远不为假,则循环将变成无限循环。for 循环在传统意义上可用于实现无限循环。由于构成循环的三个表达式中任何一个都不是必需的,您可以将某些条件表达式留空来构成一个无限循环。

实例

#include <stdio.h>  
int main()
{   
    for( ; ; )   
    {      
        printf("该循环会永远执行下去!\n");   
    }   
    return 0; 
}

当条件表达式不存在时,它被假设为真。您也可以设置一个初始值和增量表达式,但是一般情况下,C 程序员偏向于使用 for(;😉 结构来表示一个无限循环。

**注意:**您可以按 Ctrl + C 键终止一个无限循环。

练习

  • 求[1,100]的和。
  • 写一个九九乘法表。
  • 求100以内的素数
    • 素数又称质数。所谓素数是指除了 1 和它本身以外,不能被任何整数整除的数,例如17就是素数,因为它不能被 2~16 的任一整数整除。
    • 思路1):因此判断一个整数m是否是素数,只需把 m 被 2 ~ m-1 之间的每一个整数去除,如果都不能被整除,那么 m 就是一个素数。
    • 思路2):另外判断方法还可以简化。m 不必被 2 ~ m-1 之间的每一个整数去除,只需被 2 ~ 之间的每一个整数去除就可以了。如果 m 不能被 2 ~ 在这里插入图片描述
      间任一整数整除,m 必定是素数。例如判别 17 是是否为素数,只需使 17 被 2~4 之间的每一个整数去除,由于都不能整除,可以判定 17 是素数。
    • 原因:因为如果 m 能被 2 ~ m-1 之间任一整数整除,其二个因子必定有一个小于或等于 在这里插入图片描述
      ,另一个大于或等于 在这里插入图片描述
      。例如 16 能被 2、4、8 整除,16=28,2 小于 4,8 大于 4,16=44,4=√16,因此只需判定在 2~4 之间有无因子即可。

练习答案:

//求[1,100]的和。
void summation()
{
	int sum = 0;
	for(int i=0;i<=100;i++)
	{
		sum+=i;
	}
	printf("[1,100]的和为:%d\n",sum);
}
//写一个九九乘法表。
void multiTable()
{
    for (int i = 1; i <= 9; i++)
	{
		for (int k = 1; k <= i; k++)
		{
			printf("%d*%d=%2d ", k, i, i * k);
		}
		printf("\n");
	}
}

//求100以内的素数
void  primeNumber()
{
	for (int i = 2; i <= 100; i++)
	{
		bool flag = true;
		for (int k = 2; k < i; k++)
		{
			if (i % k == 0)
			{
				flag = false;
				break;
			}
		}
		if (flag)
		{
			printf("i%d是素数\n", i);
			flag = true;
		}
	}
}
  • 16
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值