[C初阶]循环和分支语句

news2024/11/25 7:52:34

目录

if...else语句

​编辑

 易犯错误

打印100以内的奇数 

switch...case语句

输出星期

 循环语句

对比判断 

1.break终止循环

2.continue

读取字符

缓冲区读取

只输出数字字符 

 for循环

do...while循环

n的阶乘求和

 循环实现动态打印

猜数字游戏【总结】

 goto

​编辑 关机程序

 goto

while循环


if...else语句

我们先引入一个重要的概念:0为真,非0为假。

分支判断语句if...else,默认情况下都只控制一条语句,如果我们想执行多条语句可以添加大括号。{}内表示代码段。

if语句默认与最近的else相匹配。

那我们如何按照自己意愿决定if...else的匹配关系呢?答案是加上大括号:

//形式1
if (condition)
	{
		return x;
	}
	return y;
//形式2
if (condition)
	{
		return x;
	}
else
		return y;

一般推荐第二种形式代替第一种,以提高可读性。

 易犯错误
int num = 1;
if (num = 5)
{
	printf("hehe\n");
}

这段代码会陷入死循环,注意区分赋值和等于

//正确
if (num == 5)
//容易检查错误
if(5 == num)

打印100以内的奇数 

我们可以使用判断语句来输出100以内的所有奇数

	int i = 1;
	while (i <= 100)
	{
		if(i%2 == 1)
			printf("%d\n", i);
		i++;
	}
	

但我们可以凭借尝试不用判断直接利用循环语句跳过2个数也能实现这个功能:

while (i <= 100)
	{
		printf("%d\n", i);
		i+=2;
	}

switch...case语句

switch...case语句作为分支语句,意为开关。有的时候它比if...else语句更方便,可读性更高。

输出星期

正常模式:

int day = 0;
scanf("%d", &day);
if (1 == day)
	printf("星期1\n");
	else if (2 == day)
		printf("星期2\n");
	else if (3 == day)
		printf("星期3\n");
	else if (4 == day)
		printf("星期4\n");
	else if (5 == day)
		printf("星期5\n");
	else if (6 == day)
		printf("星期6\n");
	else if (7 == day)
		printf("星期天\n");

switch改写: 

当我们输入4的时候程序进入了第4个语句,成功输出了星期4但是输出了后面的分支, 你可以把它想象成电流水流,需要一个闸门控制关闭——break意为中断,类似与闸门的关闭键,遇到它就会停止。

int day = 0;
	scanf("%d", &day);
	int n = 1;
	switch (day)//整型表达式
	{
	case 1:  //case 后必须是整型常量表达式
		printf("星期1\n");
		break;
	case 2:
		printf("星期2\n");
		break;
	case 3:
		printf("星期3\n");
		break;
	case 4:
		printf("星期4\n");
		break;
	case 5:
		printf("星期5\n");
		break;
	case 6:
		printf("星期6\n");
		break;
	case 7:
		printf("星期天\n");
		break;
	}

现在我们打印休息日和工作日,可以这样修改代码:

switch (day)//整型表达式
	{
	case 1:  //case 后必须是整型常量表达式
	case 2:
	case 3:
	case 4:
	case 5:
		printf("工作日\n");
		break;
	case 6:
	case 7:
		printf("休息日\n");
		break;
	default:
		printf("输入错误\n");
		break;
	}

这里就体现了switch语句的自由性,当我们输出1-7以外的数字时,我们可以使用default关键字(默认)来处理。default不一定要写在语句最后,可以为任意位置,所以我们最好在后面加上break。

 循环语句

顾名思义,循环就是满足判断条件后就会继续重复执行的操作。

对比判断 

  

当满足条件的时候他就会一直循环,我们输入一个横真条件就会进入死循环,为了灵活的控制循环,我们还添加了break和continue对循环进行控制。

1.break终止循环

遇到break循环跳出当前循环

2.continue

遇到continue忽略循环体内后面的内容,重新开始循环(跳过本次循环)

该循环到5的时候程序会进入死循环,正确做法是将i++放到循环第一句中使其不打印5。

读取字符

如果我们想从键盘中读取多个字符的话该怎么操作呢?

读取成功时返回它的整型值(对应ascii码值),这是为了适应当它读取失败时返回EOF(-1),我们也可以手动结束读取——键盘输入ctrl+z

putchar是输出字符, 成功将返回字符并输出在屏幕上,失败返回EOF。

ch通过接收getchar的返回值,对每个字符进行判断。当我们键入回车时,getchar也会读取并判断,然后通过屏幕打印出来,所以会出现单个字符占一行的效果。

缓冲区读取

 我们实现一个简单的密码确认程序来验证一下缓存区是否存在。

当我们输入密码后敲出的回车直接被ch读取,导致直接打印确认失败,这是因为scanf在遇到\n或空格后会停止输入,剩下的内容被留在了缓冲区。为了避免这种情况,我们可以用getchar将空格给读走。

添加getchar后我们的代码能成功运行

 还有一种情况需要考虑

 为什么会发生这样的事呢?

换句话说还是没有处理干净,这时候我们利用循环来清除缓冲区的内容

只输出数字字符 

int ch = 0;
while ((ch = getchar()) != EOF)//多组输入,注意优先级加括号
{
	
	if (ch < '0' || ch > '9')
		continue;
/*if(ch <= '9' && ch >= '0')*/
	putchar(ch);
}

需要注意的是,虽然用char类型也能接收getchar的返回值,但最好还是用int(可能截断)

 for循环

for循环是对while循环的一个整合,使得我们能精确地调整循环。

for(代码1;代码2;代码3)

分别代表初始条件,判断和更新

这段代码打印了除5之外的1到10的所有数字,与while循环不同的是,当更新条件放在continue后将不会执行,而for循环中使用continue能继续执行更新条件。 

for的初始化,判断,调整三个部分可以省略, 但是省略掉判断部分,就意味着判断恒为真

 如果我们省略初始部分,可能会出现这样的结果:

 不省略前打印100次,省略后由于打印10次后j的值没有被重新初始化,导致它仍然为10。

所以最好不要随便省略判断条件

do...while循环

它的特点是:至少执行一次,一般不常用。

 下面代码的结果是?

int i = 1;
do
{
	if (i == 5)
		continue;
	printf("%d ", i);
	i++;
} 
while (i <= 10);

答案是输出1 2 3 4,同样地,由于更新条件放在continue后,执行continue后进入while循环(死循环)。

n的阶乘求和

具体思路是从1到n依次求阶乘,并依次求和。

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

注意每次循环后需要将ret变为1

第二种方法(消耗低)

n!= (n-1)! * n

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

 循环实现动态打印

给定一段字符串和同等长度的#号,使其每循环一次,左右两边进行覆盖直到#被覆盖成字符串。

#include<stdio.h>
#include<windows.h>
#include<string.h>
int main(){
char arr1[] = "welcome to here!!!!";
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(100);//休眠命令
	system("cls");//清空屏幕命令
		left++;
		right--;
}
printf("%s\n", arr2);
}

大家可以复制这段代码到编译器中运行,可以观察到一个简单的动态效果。

猜数字游戏【总结】

我们结合本篇学的知识,用猜数字游戏做一个复习。 

编写一个建议菜单:

void menu()
{
	printf("*********************************\n");
	printf("**********  1. play  ************\n");
	printf("**********  0. exit  ************\n");
	printf("*********************************\n");
}
int main()
{
	int n = 0;
	do
	{
		menu();
		scanf("%d", &n);
		switch (n)
		{
		case 1:
			//game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,重新选择!\n");
			break;
		}
	}
while (n);
	return 0;
}

 接下来我们完善game函数 

要想实现猜数字这个功能,我们得需要电脑生成随机数,而rand是专门用来生成随机数的函数。

但rand生成的数字是伪随机,第二次运行程序的数字和第一次一模一样

所以我们用srand(随机数初始化设置器)来让随机数变成真随机。

一直在变的是时间,所以用时间函数来设置初始化。它的返回值是一个时间戳(整形)我们这里是产生随机值,所以可以传NULL来产生随机值。

 注意srand只能设置一次,所以不参与循环,我们可以把它添加到do...while循环里

	srand((unsigned int)time(NULL));

 由于time函数返回类型是time_t,而srand的参数是无符号整形,所以我们得强制转换。

void game()
{
	int num = rand()%100+1;//1-100之间
	int guess = 0;
	while (1)
	{
		printf("请猜数字:>");
		scanf("%d", &guess);

		if (guess < num)
			printf("猜小了\n");
		else if (guess > num)
			printf("猜大了\n");
		else
		{
			printf("猜对\n");
			break;
		}
	}
}

把上面的代码整合一下,我们的猜数字游戏就可以运行起来了,赶快去体验一下自己的第一个c语言小游戏吧!

 goto

作为一个跳出一层或多层循环的函数,goto语句能实现的功能都能被其他语句实现,而且它的使用可能会导致程序出现一些问题(例如跳过某些程序可能导致程序出现不可调试的bug等)。它的出场率并不高,一般出现在需要一次性跳出多个循环的场景。(break只能跳出一层循环)

 关机程序

顾名思义,就是能让电脑在特定时间关机的程序。我会用两种方式来写这个程序

 goto

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
    system("shutdown -s -t 60");//60秒内关机
again:
	
	printf("请注意,你的电脑在1分钟内关机,如果输入:我是猪,就取消关机\n");
	char input[20] = { 0 };
	scanf("%s", input);
	if (strcmp(input, "我是猪") == 0)
	{
		system("shutdown -a");
		printf("关机取消\n");
	}
	else
		goto again;
	return 0;
}

运行结果:

while循环

int main()
{
	char input[20] = { 0 };
	system("shutdown -s -t 60");

	while (1)
	{
		printf("请注意,你的电脑在1分钟内关机,如果输入:我是猪,就取消关机\n");
		scanf("%s", input);
		if (strcmp(input, "我是猪") == 0)
		{
			system("shutdown -a");
			printf("关机取消\n");
			break;
		}
	}
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/781029.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++的各种用法展示

&#xff43;&#xff0b;&#xff0b;与数学典型算法的结合 阿姆斯特朗数 // A number is called as Armstrong number if sum of cubes of digits of number is // equal to the number itself. // For Example 153 is an Armstrong number because 153 153. #include <…

K8S初级入门系列之十二-计算资源管理

一、前言 K8S集群中着这各类资源&#xff0c;比如计算资源&#xff0c;API资源等&#xff0c;其中最重要的是计算资源&#xff0c;包括CPU&#xff0c;缓存&#xff0c;存储等。管理这些资源就是要在资源创建时进行约束和限制&#xff0c;在运行时监控这些资源的指标&#xff0…

[23] HeadSculpt: Crafting 3D Head Avatars with Text

paper | project 本文主要想解决&#xff1a;1&#xff09;生成图像的不连续问题&#xff1b;2&#xff09;3D修改中的保ID问题。针对第一个问题&#xff0c;本文引入了Landmark-based ControlNet特征图和<back-view>的text embedding&#xff1b;针对第二个问题&#x…

Python 算法基础篇:插入排序和希尔排序

Python 算法基础篇&#xff1a;插入排序和希尔排序 引言 1. 插入排序算法概述2. 插入排序算法实现实例1&#xff1a;插入排序 3. 希尔排序算法概述4. 希尔排序算法实现实例2&#xff1a;希尔排序 5. 插入排序与希尔排序的对比总结 引言 插入排序和希尔排序是两种常用的排序算法…

java后端导出前端展示

效果图 前端代码 exportExcelAll(){window.location.href getBaseUrl() Action/excelDataAll?happenDatethis.params.happenDate;},后端代码 try{Workbook workbooknew XSSFWorkbook();//创建sheetSheet sheet1workbook.createSheet("结果总数拦截记录");//写入…

第一百一十二天学习记录:数据结构与算法基础:循环链表和双向链表以及线性表应用(王卓教学视频)

循环链表 带尾指针循环链表的合并 双向链表 单链表、循环链表和双向链表的时间效率比较 顺序表和链表的比较 链式存储结构的优点 1、结点空间可以动态申请和释放&#xff1b; 2、数据元素的逻辑次序靠结点的指针来指示&#xff0c;插入和删除时不需要移动数据元素。 链式存储…

【pytho】request五种种请求处理为空和非空处理以及上传excel,上传图片处理

一、python中请求处理 request.args获取的是个字典&#xff0c;所以可以通过get方式获取请求参数和值 request.form获取的也是个字典&#xff0c;所以也可以通过get方式获取请求的form参数和值 request.data&#xff0c;使用过JavaScript&#xff0c;api调用方式进行掺入jso…

[数据结构 -- C语言] 二叉树(BinaryTree)

目录 1、树的概念及结构 1.1 树的概念 1.2 树的相关概念&#xff08;很重要&#xff09; 1.3 树的表示 2、二叉树的概念及结构 2.1 概念 2.2 特殊二叉树 2.3 二叉树的性质&#xff08;很重要&#xff09; 2.4 练习题 2.5 二叉树的存储结构 2.5.1 顺序存储 2.5.2 链…

Windows10 下 Neo4j1.5.8 安装教程

前言 Neo4j 是一个高性能的、NOSQL 图形数据库&#xff0c;它将结构化数据存储在网络上而不是表中。基于磁盘的、具备完全的事务特性的 Java 持久化引擎&#xff0c;这里就不把他和常用关系型数据库做对比了。因为篇幅有限&#xff0c;我这里也是第一次使用&#xff0c;所以以…

windows安装cmake快速教程

1、下载cmake cmake官网直直接下载速度都很慢&#xff0c;可以到点击下载地址进行下载。 点击下载地址进去之后&#xff0c;可以看到有很多的版本&#xff0c;这里根据自己的需要选一个版本即可&#xff08;建议不要选择太早的版本&#xff09;&#xff0c;我这里选择的3.22版…

【Python】串口通信-与FPGA、蓝牙模块实现串口通信(Python+FPGA)

&#x1f389;欢迎来到Python专栏~与FPGA、蓝牙模块实现串口通信 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;Python学习专栏 文章作者技术和水平有限&#xff0c;如果文中出现错误&#…

基于Java+SpringBoot+vue前后端分离校园周边美食探索分享平台设计实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

SpringCloud nacos 集成 feign 实例

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

【运维工程师学习七】DNS底层原理及搭建自己的DNS服务器

【运维工程师学习七】DNS底层原理及搭建自己的DNS服务器 0、前言1、域名&#xff08;Domain&#xff09;的由来2、域名&#xff08;Domain&#xff09;的级别3、域名&#xff08;Domain&#xff09;的命名规则4、域名&#xff08;Domain&#xff09;的后缀有哪些5、域名&#x…

[QT编程系列-32]:科学计算 - QT支持的科学计算库

目录 第1章 QT中如何支持科学计算&#xff1f; 1.1 QT没有专门的科学计算库 1.2 QT没有专门的数学运算库 1.3 QT没有数字信号DSP处理库 1.4 QT没有类numpy库 1.5 QT支持的数学运算 第2章 QT数学库详解 2.1 QtMath 2.2 QVector 2.3 QMatrix 第1章 QT中如何支持科学计算…

【数据结构】——LRU Cache

这里写目录标题 什么是LRU CacheLRU Cache的实现LRU Cache的OJ 什么是LRU Cache LRU是Least Recently Used的缩写&#xff0c;意思是最近最少使用&#xff0c;它是一种Cache替换算法。 什么是Cache&#xff1f;狭义的Cache指的是位于CPU和主存间的快速RAM&#xff0c; 通常它不…

【Soft NMS】《Soft-NMS – Improving Object Detection With One Line of Code》

ICCV-2017 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method5 Experiments5.1 Results5.2 Sensitivity Analysis5.3 When does Soft-NMS work better?5.4 Qualitative Results 6 Conclusion&#xff08;own&#xff09; 1 Background…

【Android】Ubuntu20.04编译Android 13并用模拟器运行

前言 一直好奇Android系统是怎么定制的&#xff0c;直到亲自走一遍Android系统编译流程才发现并没想象的复杂。 这就跟app开发一样&#xff0c;Google官方其实都提供了平台、文档、IDE及一些工具&#xff0c;咱们只要按照官方提供的指南来操作就行了。 如果Android没有提供这…

15 QMessageBox消息对话框

错误提示对话框 信息提示对话框 循环对话框 默认是Yes和No&#xff0c;可以修改属性。第5个参数关联回车键 QMessageBox::Save | QMessageBox::Cancel 可以通过捕获按键获取点击结果 警告提示 代码&#xff1a; //QMessageBox 消息对话框//错误提示QMessageBox::critical(th…

11 spring-boot的MVC配置原理

11.1 spring-boot为MVC提供的自动配置 1.ContentNegotiatingViewResolver视图解析器&#xff1b; 2.静态资源或者支持WebJars&#xff1b; 3.自动注册类型转换器&#xff1a;比如说前台提交user的字段&#xff0c;后台自动封装的意思&#xff1b; 4.HttpMessageConverters&…