分支结构、循环结构深了解

本文详细介绍了C语言中的控制语句,包括if语句的多种表达方式、switch...case语句的使用以及循环语句(while、for、do...while)的执行流程和控制结构。文章通过实例代码展示了如何使用这些语句进行条件判断和循环操作,并提供了相应的练习题以加深理解。
摘要由CSDN通过智能技术生成

文章目录


前言

我们都知道C语言是结构化的程序设计语言,那么什么是所谓的结构化呢?

当我们对生活中的事务进行总结提炼之后可以发现,几乎生活中的所有事务都可以用顺序语句、选择语句、循环语句或者其中几种语句的有序组合来进行描述。

顺序语句(顺序控制语句是一类简单的语句,顾名思义就是指按照语句在程序中的先后次序一条一条的顺次执行。)

选择语句(选择语句又称为分支语句,它通过对给定的条件进行判断,从而决定执行两个或多个分支中的哪一支。因此,在编写选择语句之前,应该首先明确判断条件是什么,并确定当判断结果为“真”或“假”时应分别执行什么样的操作(算法))

循环语句(C语言中提供了三种循环控制语句:while语句,do…while语句,for语句。三种语句都由相似的三部分组成:进入循环的条件,循环体,退出循环的条件;完成的功能也类似。所不同的只是三者进入与退出循环的方式不同。)

C语言要具有解决问题的能力,这就要求C语言有能力描述以上三种语句。这也就是为什么C语言中会出现顺序语句,选择语句,循环语句。

一、什么是语句?

  • 在上面我们简单的介绍了一下顺序语句,选择语句,循环语句产生的原因,不知道大家是否对于其中涉及到的语句二字有自己的理解呢?
  • 其实在C语言中共分有五种类型的语句:1.控制语句;2.函数调用语句;3.空语句;4.表达式语句;5.复合语句。接下来我们来详细了解一下他们的含义。

二、C语言中的5种类型语句

  • C语言中共分有五种类型的语句:

1.控制语句:**控制语句即用来实现对程序流程的选择、循环、转向和返回等进行控制。**C语言中共有9种控制语句,包括32个关键字,可以分为”选择语句“,”循环语句“,”转向语句“,”返回语句“四类。

2.函数调用语句:在编程中,**函数调用语句是一种用于调用一个已定义的函数的方式。它告诉程序去执行该函数并传递任何必要的参数。**函数调用语句由函数名、实际参数加上分号";"组成。其一般形式为: 函数名(实际参数表) ;

3.空语句:空语句是编程中一个特殊的语句,它没有任何操作或指令。在许多编程语言中,空语句的语法形式是单个的分号(;) 这个语句本身没有任何意义,因为它不执行任何操作。空语句只是用于表示一个语句的占位符或是作为语法结构的一部分而存在。在某些情况下,程序员可能会使用空语句作为占位符,以便稍后添加其他语句或用于满足某些语法要求 。

4.表达式语句:C程序设计语言的表达式语句由表达式加上分号“;”组成。 分别由以下几种类:算术表达式、赋值表达式、逗号表达式、关系表达式、逻辑表达式 等

5.复合语句:C语言中的复合语句指的是由多条语句组成的语法结构。常见的复合语句有以下两种形式:

  • 使用花括号{}将多条语句包裹起来,这样可以创建一个新的作用域,并且在该作用域内定义的变量只能在其内部被访问到。
  • 使用if、for、while等控制流程关键字进行条件判断或者重复执行操作。

在实际编程中,这些语句会根据特定需求组合使用,以实现复杂的功能和逻辑。

三、控制语句详解

  • 上面我们已经将C语言中的5种类型语句进行了大概的了解,而我们今天所要学习的选择语句与循环语句就是C语言中控制语句的一部分,所以我们接下来将详细介绍一下C语言中用于控制程序执行流程的控制语句。
  • C语言提供了多种类型的控制语句,用于控制程序的执行流程,实现各种编程结构和功能。
  • 控制语句用于控制程序的执行流程,以实现程序的各种结构方式(C语言支持三种结构:顺序结构、选择结构、循环结构),它们由特定的语句定义符组成,C语言有九种控制语句。

具体可分成以下三类:

1.条件判断语句也叫分支语句:

  • if:用于检查布尔表达式是否为真,如果是,则执行后续代码;否则,执行else下的代码。
  • else if:类似于if,用于检查多个条件,只有当第一个条件为假且第二个条件也为假时才执行后续的else代码,否则哪一条为真则执行哪一条下的代码。
  • else:用于当所有的if条件都不满足条件时所执行的代码段。

switch语句;

  • switch:用于多分支的选择,可以根据不同的条件执行不同的代码段。


2.循环执行语句:

  • do while语句:与while类似,但在每次循环之前都会执行一次语句块。
  • while语句:用于不断检查布尔表达式,只要表达式为真就持续循环。
  • for语句:用于迭代地遍历一组数值或元素。


3.转向语句:

  • break语句:用于提前结束当前循环或整个switch语句,跳转到switch后的下一个匹配项。
  • continue语句:用于提前结束当前循环,但不影响外层的循环。
  • return语句:用于从函数中返回,结束该函数的执行。
  • goto语句:goto语句也称为无条件转移语句,其一般格式如:goto 语句标号; 其中语句标号是按标识符规定书写的符号, 放在某一语句行的前面,标号后加半角冒号“:”。语句标号起标识语句的作用,与 goto 语句配合使用。
  • C语言不限制程序中使用标号的次数,但各标号不得重名。goto 语句的语义是改变程序流向, 转去执行语句标号所标识的语句。 goto 语句通常与条件语句配合使用。可用来实现条件转移, 构成循环,跳出循环体等功能。
  • 但是请注意,在结构化程序设计中一般不主张使用 goto 语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。

四、分支语句

4.1 if语句的多种表达方式

if语句的语法结构:
①单分支语句:if(表达式)+语句;
②双分支语句:if(表达式)+语句1;else+语句2;
③多分支语句:if(表达式)+语句1;else
if(表达式2)+语句2; else(表达式)+语句3;
并且if语句默认只能控制一条语句,如果要控制语句段则需要加上{
};
if(表达式)+{ 语句列表1;语句列表2;… } ;else+{语句列表1;语句列表2;… };

4.2 if语句的单分支单语句代码示例(一)

#include <stdio.h>

int main()
{
	int age = 0;
	scanf("%d",&age);
	if(age >= 0 && age < 18)
	{
		printf("未成年\n"); 
	//单分支语句。如果条件成立,则执行该语句,否则不输出。
	}
	return 0;
}

执行结果如下:
11.png1.png

4.3 if语句的双分支代码示例

4.3.1 if语句控制单语句代码示例

#include <stdio.h>

int main()
{
	int age = 0;
	scanf("%d",&age);
	if(age >= 0 && age < 18)
	{
		printf("未成年\n"); 
		//双分支语句,if表达式为真执行if下面的语句,否则执行else下的语句
	}
	else (age >= 18)
	{
		printf("成年\n");
	}
	return 0;
}

执行结果如下:
11.png1.png

4.3.2 if语句控制多语句错误代码示例(一)

#include <stdio.h>

int main()
{
	int age = 0;
	if(age >= 0 && age < 18)
		printf("未成年。\n");
		printf("不可以吸烟。\n");
    else
    {
        printf("成年。\n");  
    }
	return 0;
}

执行结果如下:
3.png

4.3.3 if语句控制多语句正确代码示例(二)

#include <stdio.h>

int main()
{
	int age = 0;
    scanf("%d", &age);
	if(age >= 0 && age < 18)
	{
		printf("未成年。\n");
		printf("不可以吸烟。\n");
	}
    else
    {
        printf("成年。\n");  
    }
	return 0;
}

执行结果如下:
1.png

4.3.3 if语句的多分支代码示例(一)

#include <stdio.h>

int main()
{
	int age = 0;
	scanf("%d",&age);
	if(age >= 0 && age < 18)
	{
		printf("未成年\n"); 
		//多分支语句。如果if语句后需要控制多条输出,则需要使用{}
	}
	else if(age >= 18)
	{
		printf("成年\n");
	}
	else
	{
		printf("输入错误\n");
	}
	return 0;
}

执行结果如下:
1.png

4.3.3 if语句的多分支代码示例(二)

#include <stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age >= 0 &&age < 16)
		printf("少年。\n");
	else if (age >= 16 && age < 30 )
		printf("青年。\n");
	else if (age >= 30 && age < 40)
		printf("中年。\n");
	else if (age >= 40 && age < 56)
		printf("壮年。\n");
	else if (age >= 56 && age < 80)
		printf("老年。\n");
	else 
		printf("老寿星。\n");
		
	return 0;
}

执行结果如下:
4.png5.png

4.3.3 if语句的多分支代码示例(三)

#include <stdio.h>

int main()
{
	int day = 0;
	scanf("%d", &day);
    
	if (1 == day)
		printf("星期一。\n");
	else if (2 == day)
		printf("星期二。\n");
	else if  (3 == day)
		printf("星期三。\n");
	else if  (4 == day)
		printf("星期四。\n");
	else if  (5 == day)
		printf("星期五。\n");
    else if  (6 == day)
        printf("星期六。\n");
    else if  (7 == day)
        printf("星期天。\n");
	else 
		printf("输入错误。\n");
		
	return 0;
}

执行结果如下:
1.png2.png

4.4 悬空else语句

#include <stdio.h>

int main()
{
	int day = 1;
	int date = 2;
	if(day == 0)
	{
		if(date == 2)
			printf("上早八\n");
		else
			printf("今天上早八\n");
	//else是与离它最近的if相匹配的,所以只有当if中的条件成立的时候,下面的语句才有可能
	}
	return 0;
}

执行结果如下:
1.png

#include <stdio.h>

int main()
{
	int day = 1;
	int date = 2;
	if(day == 1)
	{
		if(date == 2)
        {
            printf("上早八\n");
        }
    }
	else
    {
		printf("不用上早八\n");
	}
    //此时的else只能与第一个if匹配
	return 0;
}

执行结果如下:
1.png

学习小贴士:

从上述两个代码中我们能总结2个经验:

1、else语句是与离它最近的if语句相匹配的,而不单单是对齐。
2、大括号很重要,{ }在不同的位置上会导致出现不同的结果。

4.5 if语句学后练习

4.5.1 利用if语句判断一个数是否为奇数

//1.判断一个数是否为奇数
#include <stdio.h>

int main()
{
	int num = 0;
	scanf("%d", &num);
	if (num % 2 == 1)
	{
		printf("奇数\n", num);
	}
	return 0;
}

执行结果如下:
2.png

4.5.2将随机输入的三个数字按从大到小的顺序输出

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>

int main()
{
	int a = 0;
	int b = 0;
	int c = 0;
	scanf("%d %d %d", &a, &b, &c);
	if (a < b)
	{
		int tmp = a;
		a = b;
		b = tmp;
	}

	if (a < c)
	{
		int tmp = a;
		a = c;
		c = tmp;
	}

	if (b < c)
	{
		int tmp = b;
		b = c;
		c = tmp;
	}
	printf("%d %d %d\n", a, b, c);
	return 0;
}

执行结果如下:
2.png

4.6 switch…case 语句

4.6.1 什么是switch…case 语句?

1. switch 语句也是一种分支语句,主要用于多分支的情况。其中case决定分支的入口,break决定分支的出口。其中default 语句可以放置在任何适当的位置,无所谓前后。

2. switch 语句的语法结构是:switch(常量表达式)+{语句项};其中case 后面跟的是整型常量表达式:{语句};break语句可以根据自己的需要添加。

3. switch语句中可以嵌套switch语句使用,并且一个break只能跳出一次case,无法跳出多层case语句。

4.6.2 利用switch…case 语句分别判断星期代码示例

//通过case语句进入不同的分支,并进行相对应的输出
#include <stdio.h>

int main()
{
	int day = 0;
	scanf("%d", &day);
	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;
	default:
		printf("输入错误\n");
		break;
	}
	return 0;
}

执行结果如下:
2.png

4.6.3 利用switch语句中的break实现顺滑功能代码示例

#include <stdio.h>

int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)       
	//case决定分支的入口,break决定分支的出口。
    //所以在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支。
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
        printf("工作日\n");
		break;
	case 6:
	case 7:
        printf("节假日\n");
		break;
	default:
        printf("输入错误\n");
	//当整型表达式中输入的值无法从case语句中进入,则从default语句中进入
		break;
	}
	return 0;
}

执行结果如下:
3.png2.png

4.7 switch语句学后练习

#include <stdio.h>

int main()
{
	int n = 1;
	int m = 2;
	switch (n)//n = 1,从case 1 语句进入
	{
	case 1:
		m++;//m = 3
	case 2:
		n++;//n = 2
	case 3:
		switch (n)//n = 2,从case 2 语句进入
		{
        //switch语句运行嵌套
		case 1:
			n++;
		case 2:
             {
                 m++;//m = 4
				n++;//n = 3       
            }
			break;
		}
	case 4:
		m++;//m = 5
		break;//break跳出整体switch语句
	default:
		break;
	}
	printf("m=%d,n=%d\n", m, n);  //5 3
	
	return 0;
}

执行结果如下:
1.png

五、循环语句

5.1 什么是循环语句?

循环语句是编程中一种重要的控制结构,用于重复执行一段代码,直到满足某个条件为止。

在大多数编程语言中,循环语句有几种常见的形式,包括for循环、while循环和do-while循环。

5.2 什么是while语句?

while是计算机的一种基本循环模式。当满足条件时进入循环,进入循环后,当条件不满足时,跳出循环。 这也就意味着只要条件为真,就会一直重复执行一段代码。因此,如果条件一开始就是假的,那么while循环体内的代码将永远不会执行。

while语句的语法结构是:while(表达式){循环体};

5.2.1 利用while循环打印出1-100之间的奇数代码示例(一)

#include <stdio.h>

int main()
{
	int num = 1;
	while(num <= 100)
	{
		if(num % 2 == 1)
		{
			printf("%d ",num);
		}
		num++;
	}
	return 0;
}

执行结果如下:
CT-20240129122044.png

5.2.1.1 利用while循环打印出1-100之间的奇数代码示例(改进版)
#include <stdio.h>

int main()
{
	int num = 1;
	while(num <= 100)
	{
		if(num % 2 == 1)
		{
			printf("%d ",num);
		}
		num+=2;
	}
	return 0;
}

执行结果如下:
CT-20240129122044.png

5.2.1.2利用while循环打印出1-100之间的奇数代码示例(改进版)
#include <stdio.h>

int main()
{
	int num = 1;
	while(num <= 100)
	{
		printf("%d ",num);
		num+=2;
	}
	return 0;
}

执行结果如下:
CT-20240129122044.png

5.2.2 利用while循环打印出1-10之间的数代码示例

#include <stdio.h>

int main()
{
	int i = 1;
	while(i <= 10)
	{
		printf("%d ",i);  //1~10
		i++;
	} 
	return 0;
}

执行结果如下:
2.png

5.3 while语句的执行流程(break/continue)

CT-20240129115628.png

5.3.1 while语句中break的作用

#include <stdio.h>

int main()
{
	int i = 1;
	while(i <= 10)
	{
		if(5 == i)
		{
			break;        
//while中的break是用于永久终止循环的,当循环中满足某个条件时直接终止后期所有循环
		}
		printf("%d ",i);  //1~4
		i++;
	} 
	return 0;
}

执行结果如下:
CT-20240129115628.png

#include <stdio.h>

int main()
{
	int i = 1;
	while(i <= 10)
	{
		//if(5 == i)
			break;        
		printf("%d ",i);  
		i++;
	} 
	return 0;
}

执行结果如下:

由这段代码我们可以清晰地知道:只要break被成功执行就会直接跳出循环不再执行。
CT-20240129122044.png

5.3.2 while语句中continue的作用

#include <stdio.h>

int main()
{
	int i = 1;
	while(i <= 10)
	{
		if(5 == i)
		{
			continue;        
		}
		printf("%d ",i);  //1~4 死循环
		i++;
	} 
	return 0;
}

执行结果如下:
CT-20240129123032.png

#include <stdio.h>

int main()
{
	int i = 0;
	while(i < 10)
	{
		i++;
		if(5 == i)
		{
			continue;     
		//continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行
		}                 
		//直接跳转到while语句的判断部分。进行下一次循环的入口判断 
		printf("%d ",i);  //1,2,3,4,6,7,8,9,10 
	} 
	return 0;
}

执行结果如下:

由这段代码我们可以清晰地知道:只要continue被成功执行就会直接终止本次循环,直接跳转到while语句的判断部分。进行下一次循环的入口判断 。

CT-20240129123032.png

5.4 学习总结

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

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

5.5 while语句测试密码逻辑

#include <stdio.h>

int main()
{
	printf("请输入密码:>");
	char password[20] = { 0 };
	scanf("%s", password);
	//ABC\n(回车触发scanf函数读取)
	//默认读取到空格或者\n就不读了,所以需要清理缓冲区
	getchar();
	printf("请确认密码(Y/N):>");
	int ch = getchar();
	if (ch == 'Y')
	{
		printf("密码输入正确。\n");
	}
	else
	{
		printf("密码输入错误。\n");
	}
	return 0;
}

执行结果如下:在这里插入图片描述

#include <stdio.h>

int main()
{
	printf("请输入密码:>");
	char password[20] = { 0 };
	scanf("%[^\n]", password);
	printf("请确认密码(Y/N):>");
	int ch = getchar();
	if (ch == 'Y')
	{
		printf("密码输入正确。\n");
	}
	else
	{
		printf("密码输入错误。\n");
	}
	return 0;
}

执行结果如下:在这里插入图片描述

#include <stdio.h>

int main()
{
	char password[20] = { 0 };
	int ch = 0;
	printf("请输入密码:>");
	scanf("%s", password);

	while (getchar() != '\n')
	{
		;
	}

	printf("请确认密码(Y/N):>");
	
	if (getchar() == 'Y')
	{
		printf("密码输入正确。\n");
	}
	else
	{
		printf("密码输入错误。\n");
	}
	return 0;
}

执行结果如下:
1.png

5.5.1 测试scanf库函数的作用
int main()
{
    char password[20] = { 0 };
    char password2[40] = { 0 };
    scanf("%s", password);
    printf("%s\n", password);
    while (getchar() != '\n')
    {
        ;
    }
    scanf("%[^\n]", password2);
    printf("%s\n", password2);
    return 0;
}

执行结果如下:
1.png

5.5.2 测试getchar库函数的作用
#include <stdio.h>

int main()
{
	int ch = getchar();
	putchar(ch);
//getchar和putchar只针对字符类型的数据,并且getchar函数不需要接收参数,putchar函数需要接收
	return 0;
}

执行结果如下:
2.png


#include <stdio.h>

int main()
{
    char ch = '\0';
    while ((ch = getchar()) != EOF)
    {
        if (ch < '0' || ch > '9')
            continue;
        putchar(ch);
    }

    return 0;
}

执行结果如下:
1.png

#include <stdio.h>

int main()
{
	int m = 0;
	int n = 0;
	scanf("%d %d", &m, &n);
	int k = (m > n ? n : m);
	while (1)
	{
		if (m % k == 0 && n % k == 0)
		{
			break;
		}
		k--;
	}
	printf("%d", k);
	return 0;
}
#include <stdio.h>

int main()
{
	int m = 0;
	int n = 0;
	scanf("%d %d", &m, &n);
	//scanf()读到空格或者\0停止
	int k = 0;                                    
	while (k = m % n)                              
	{                                              
		m = n;
		n = k;
	}
	printf("%d",n);
	return 0;
}
//求两个数的最大公倍数
#include <stdio.h>

int main()
{
	int m = 0;
	int n = 0;
	scanf("%d %d", &m, &n);
	int k = 0;   
	int c = m * n;
	while (k = m % n)                              
	{                                              
		m = n;
		n = k;
	}
	printf("%d",c/n);   
	//最小公倍数=两数相乘/最大公约数
	return 0;
}
5.5.3 在有序数组中找出某个固定的值
#include <stdio.h>

int main()
{
	int arr[10] = {1,2,3,4,5,6,7,8,9,10};
	int k = 7;
	int i = 0;
	int flag = 0;
	int sz = sizeof(arr) / sizeof(arr[0]) ;
	for(i = 0;i < sz;i++)
	{
		if(arr[i] == k)
		{
			printf("找到了,下标为:%d",i);
			flag = 1;
			break;
		}
	}
	
	if(flag == 0)
	{
		printf("找不到。\n")}
	
	return 0 ;
	}
在有序数组中找出某个固定的值(改进版本)
#include <stdio.h>

int main()
{
    int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
    int k = 7;
    int i = 0;
    int sz = sizeof(arr) / sizeof(arr[0]);
    int left = 0;
    int right = sz - 1;
    int flag = 0;

    while (left <= right)
    {
        int mid = left + (right - left) / 2;
        if (arr[mid] > k)
        {
            right = mid - 1;
        }
        else if (arr[mid] < k)
        {
            left = mid + 1;
        }
        else
        {
            printf("找到了,下标为%d\n", mid);
            flag = 1;
            break;
        }
    }
    if (flag == 0)
    {
        printf("找不到。\n");
    }

    return 0;
}

执行结果如下:CT-20240130114621.png

#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>

int main()
{
	char arr1[] = "welcome to my party!!!!!";
	char arr2[] = "************************";
	int left = 0;
	int right = strlen(arr1) - 1;
	while (left <= right)
	{
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		printf("%s\n", arr2);
		sleep(1000);
		system("cls");
		left++;
		right--;
	}

	printf("%s\n", arr2);

	return 0;
}

5.3 for循环语句

5.3.1 什么是for循环语句

1.for循环语句的语法结构:for(表达式1;表达式2;表达式3)循环语句;
其中表达式1为初始化部分,表达式2为条件判断部分,表达式3为调整部分。

2.for循环语句用于重复执行一段代码指定的次数。它包含三个基本部分:for循环的初始化部分,条件判断部分,调整部分均可以被省略,但当判断部分被省略时,判断部分即恒为真,循环为死循环。初始化语句在循环开始前执行一次,后续语句在每次循环结束后执行,而条件语句则在每次循环开始前检查。如果条件为真,循环就会继续执行;否则,循环就会结束。

3. 请注意:不可在for循环体内修改循环变量,以防for循环失去控制。

5.3.2 for语句的执行流程(break/continue)

CT-20240130061018.png

5.3.3利用for循环打印出1-100之间的奇数

#include <stdio.h>

int main()
{
	int num = 1;
	for(num = 1; num <=100;num+=2)
	{
		printf("%d ",num);
	}
	return 0;
}

执行结果如下:
CT-20240129122044.png

5.3.4 利用for循环输出1~10的数字(一)

#include <stdio.h>

int main()
{
	int i = 0;
	for(i = 1;i <= 10;i++)
	{
		printf("%d ",i);
	}
	return 0;
}

执行结果如下:
2.png

5.3.4 利用数组下标循环输出1~10的数字(二)

#include <stdio.h>

int main()
{
	int arr[10] = {1,2,3,4,5,6,7,8,9,10};
	int i = 0;
	for(i = 0; i < 10;i++)
	{
		printf("%d ",arr[i]);
	}
	return 0;
}

执行结果如下:
2.png

5.3.5 for循环中break的作用

#include <stdio.h>

int main()
{
	int i = 0;
	for(i = 1;i <= 10;i++)
	{
		if(5 == i)
		{
			break;//直接跳出循环不再执行后续代码
		}
		printf("%d ",i);  //1,2,3,4
	}
	return 0;
}

执行结果如下:
CT-20240129123032.png

5.3.6 for循环中continue的作用

#include <stdio.h>

int main()
{
	int i = 0;
	for(i = 1;i <= 10;i++)
	{
		if(5 == i)
		{
			continue;
		}
		printf("%d ",i);  //1,2,3,4,6,7,8,9,10
	}
	return 0;
}

执行结果如下:
CT-20240130061018.png

5.3.7 for 循环的变种

#include <stdio.h>

int main()
{
	int i = 0;
	int j = 0;
	for(i = 0;i < 3;i++)
	{
		for(j = 0;j < 3;j++)
		{
			printf("我爱学习\n");//打印九次
		}
	}

	return 0;
}

执行结果如下:
CT-20240130061018.png

5.3.7.1 学习小贴士:

所谓for 循环的变种就是把初始化,判断,或者是调整中的几项或者每一项全部省略,这会导致代码中bug不经意的出现,所以在省略的时候一定要格外注意。

5.3.7.2 for循环省略初始化,判断,调整
#include <stdio.h>

int main()
{
	for(; ; )
	{
		printf("我爱学习\n");//死循环
//for循环的初始化,判断,调整三个部分均可以省略,如果把判断部分省略了,这也就意味着判断恒为真
	}

	return 0;
}

执行结果如下:
CT-20240130061018.png

5.3.7.2 for循环省略初始化
#include <stdio.h>

int main()
{
	int i = 0;
	int j = 0;
	for(;i < 3;i++)
	{
		for(;j < 3;j++)
		{
			printf("我爱学习\n");//i = 1时执行三次,j = 3后并没有初始化,所以不在执行
		}
	}

	return 0;
}

执行结果如下:
CT-20240130061018.png

5.3.7.3 使用多于1个变量控制循环
#include <stdio.h>

int main()
{
	int x = 0;
	int y = 0;
	for(x = 0,y = 0;x < 3 && y < 5;++x,++y)
	{
		printf("我爱学习\n");
	}
	return 0;
}

执行结果如下:
CT-20240130061018.png

5.3.7.4 判断恒为假
#include <stdio.h>
int main()
{
	int i = 0;
	int k = 0;
	for(i =0,k=0; k=0; i++,k++)  //k=0,判断恒为假,循环不进入
    	k++;
	return 0;
}

5.3.8 判断密码输入是否正确

#include <stdio.h>
#include <string.h>

int main()
{
	int i = 0;
	char password[20] = { 0 };
	int flag = 0 ;
	
	for(i = 1;i <= 3; i++)
	{	
		printf("请输入密码:>");	
	    scanf("%s",password);			 
	    //判断两个字符串是否相等,需要使用strcmp库函数										
		if(0 = strcmp(password,"123456"))
		//如果第一个字符串小于第二个字符串,strcmp返回小于0的数字;
		{								 
		//如果第一个字符串大于第二个字符串,strcmp返回大于0的数字;										
			printf("密码输入正确,登录成功。\n");   
			//如果第一个字符串等于第二个字符串,strcmp返回0的;	
			flag = 0;
			break;
		}
        else
        {
        	printf("第%d次密码输入错误。\n",i);
        }
   	}
   
   	if(flag = 0)
   	{
   		printf("三次密码均输入错误,退出程序。\n");
   	}
	
	return 0;
}

5.3.9 for循环计算n的阶乘

//计算n的阶乘
#include <stdio.h>

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

执行结果如下:
CT-20240130114621.png

5.3.10 for循环计算1-n的阶乘的和

#include <stdio.h>

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

执行结果如下:
CT-20240130114621.png

5.3.11 利用for循环写出一个关机程序

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
	char input[20] = { 0 };
	system("shutdown -s -t 60");
	while (1)
	{
		printf("您的电脑将在60s内自动关机,如果输入:大宝贝 指令将自动取消。\n");
		scanf("%s", &input);
		if (strcmp(input, "大宝贝") == 0)
		{
			system("shutdown -a");
			printf("输入正确,指令已取消。\n");
			break;
		}
	}
	return 0;
}
#include <stdio.h>

int main()
{
	int n = 0;
	int i = 0;
	int ret = 1;
	int sum = 0;	
	scanf("%d",&n);
	for(i = 1;i <= n;i++)
	{
		ret = ret * i;
		sum = sum + ret;
	}
		
	printf("%d\n",sum);
		
	return 0;
	}
#include <stdio.h>
int main()
{
	int n = 4;
	int i = 1;
	int sum = 1;
	int add = 0;
	for (i = 1; i <= n; i++)
	{
		sum = sum * i;
		add = sum + add;
	}
	printf("%d", add);
	return 0;
}
//输出100~200之间的素数
#include <stdio.h>
#include <math.h>
int main()
{
	int i = 0;
	for (i = 101; i <= 200; i+=2)
	{
		int j = 0;
		int flag = 1;
		for (j = 2; j <= (int)sqrt(i); j++)
		{
			if (i % j == 0)
			{
				flag = 0;
				break;
			}
		}

		if (flag == 1)
		{
			printf("%d ", i);
		}
	}
		return 0;
	}

return 0;
}

6、do while循环

6.1 什么是do … while( )语句?

do…while 循环是 while 循环的变体。在检查while条件是否为真之前,该循环首先会执行一次do之内的语句,然后在while内检查条件是否为真,如果条件为真的话,就会重复do…while这个循环,直至while为假。

do{循环体;}while (条件表达); 【先循环后判断,循环语句至少执行一次】

6.2 do…while( )语句的执行流程(break/continue)

CT-20240130114621.png

6.3 do…while( )语句中break的作用

#include <stdio.h>

int main()
{
	int i = 0;
	do
	{
		printf("%d ",i);
		i++;
	}while(i <= 10);
	
	return 0;
}

执行结果如下:
2.png

#include <stdio.h>

int main()
{
	int i = 0;
	do
	{
		printf("%d ",i);
		if( 4 == i)
		{
			break;
		}
		i++;
	}while(i <= 10); //1,2,3,4
	
	return 0;
}

执行结果如下:
CT-20240130114621.png

6.4 do…while( )语句中continue的作用

#include <stdio.h>

int main()
{
	int i = 0;
	do
	{
		printf("%d ",i);
		if( 4 == i)
		{
			continue;
		}
		i++;
	}while(i <= 10); //1,2,3,4,4的死循环
	
	return 0;
}

执行结果如下:
CT-20240129123032.png

//猜数字游戏

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

void menu()
{
	printf("***********************\n");
	printf("******** 1.play *******\n");
	printf("******** 0.exit *******\n");
	printf("***********************\n");
}
//rand函数是专门用来生成随机数的
//rand函数返回的是0~RAND_MAX(32767)之间的一个随机数
//  #define RAND_MAX 0x7fff
//  rand函数在使用之前要使用一个srand函数来设置随机数的生成器
//  srand函数在程序中只要调用一次就可以,不需要频繁调用
//  时间戳
//  在C语言中,time函数会返回时间戳
//  NULL - 空指针
//
void game()
{
  int num = 0;
//   1.生成随机数  
	int ret = rand() % 100 + 1;
//   2.猜数字	
	while (1)
	{
		printf("请猜数字:>");
		scanf("%d", &num);
		if (num < ret)
		{
			printf("猜小了,请继续猜\n");
		}
		else if (num > ret)
		{
			printf("猜大了,请继续猜\n");
		}
		else
		{
			printf("恭喜你!猜对了!\n");
			break;
		}
	}
  system("cls");
}

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		//打印菜单
		printf("请选择是否进入游戏(1/0):>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game(); //game函数中是猜数字游戏的整体逻辑
			break;
		case 0:
			printf("退出游戏程序!\n");
			break;
		default:
			printf("输入错误,请重新输入!\n");
			break;
		}
	} while (input);
	
	return 0;
}

7.goto语句

7.1 什么是goto语句?

1. C语言中提供了可以随意滥用的goto语句和标记转跳的标记。从理论上来说goto语句是没有必要的,实践中没有goto语句也可以很轻松的写出写出代码。

2. 但在某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。

3. 例如:一次跳出两层或多层循环。多层循环这种情况使用break是达不到目的的,它只能从最内层循环退出到上一层的循环。

7.2 利用goto语句写出一个死循环

#include <stdio.h>

int main()
{
again:
	printf("helloworld\n");
	goto again;
	return 0;
}

7.3 利用goto语句写出一个关机程序

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main()
{
	char input[20] = { 0 };
	system("shutdown -s -t 60");
again:
	printf("您的电脑将在60s内自动关机,如果输入:大宝贝 指令将自动取消。\n");
	scanf("%s", &input);
	if (strcmp(input, "大宝贝") == 0)
	{
		system("shutdown -a");
		printf("输入正确,指令已取消。\n");
	}
	else
	{
		printf("输入错误。\n");
		goto again;
	}
	return 0;
}
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mo_吉托的莫。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值