分支和循环语句(2)

news/2024/4/20 3:06:20/文章来源:https://blog.csdn.net/weixin_73077334/article/details/130359028

文章目录

      • 3.2 for循环
        • 3.2.1 for语句的语法
        • 3.2.2 for循环中的break和continue
        • 3.2.3 for语句的循环控制变量
        • 3.2.4 一些for循环的变种
        • 3.2.5 一道笔试题
      • 3.3 do while循环
        • 3.3.1 do语句的语法
        • 3.3.2 do语句的特点
        • 3.3.3 do while循环中的break和continue
      • 3.4 练习
        • 3.4.1 计算 n的阶乘
        • 3.4.2 计算 1!+2!+3!+……+10!
        • 3.4.3 在一个有序数组中查找具体的某个数字n
        • 3.4.4 多个字符从两端移动,向中间汇聚
        • 3.4.5 模拟用户登录情景
  • 附:

3.2 for循环

3.2.1 for语句的语法

for语句语法结构

使用for循环在屏幕上打印1-10的数字。

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

for语句的执行流程如下:
for语句执行流程


现在我们对比一下for循环和while循环:

#include <stdio.h>int main()
{int i = 1;//1.初始化while (i <= 10)//2.判断{printf("%d ", i);i++;//3.调整}return 0;
}

可以发现在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较远,这样查找修改就不够集中和方便。所以,for循环的风格更胜一筹,for循环使用的频率也最高。

3.2.2 for循环中的break和continue

break:

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

continue:

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

3.2.3 for语句的循环控制变量

建议:

  1. 不可在for循环体内修改循环变量,防止for循环失去控制。
  2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
#include <stdio.h>int main()
{int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };//              0  1  2  3  4  5  6  7  8  9int i = 0;//[0,10)for (i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}

3.2.4 一些for循环的变种

#include <stdio.h>int main()
{//初始化和调整部分的省略就是啥都不做//判断部分省略了,意味着判断是恒为真的//建议不要随便省略for (;;){printf("hehe\n");}return 0;
}

#include <stdio.h>int main()
{int i = 0;int j = 0;for (i = 0; i < 4; i++){for (j = 0; j < 4; j++){printf("hehe\n");}}return 0;
}//打印16个hehe

#include <stdio.h>int main()
{int i = 0;int j = 0;for (; i < 4; i++){for (; j < 4; j++){printf("hehe\n");}}return 0;
}//打印4个hehe

//使用多余一个变量控制循环#include <stdio.h>int main()
{int x = 0;int y = 0;for (x=0, y=0; (x<2) && (y<5); ++x, y++){printf("hehe\n");}return 0;
}//打印2个hehe

3.2.5 一道笔试题

//请问循环要循环多少次?#include <stdio.h>int main()
{int i = 0;int k = 0;for (i = 0, k = 0; k = 0; i++, k++)k++;return 0;
}//循环0次

3.3 do while循环

3.3.1 do语句的语法

do语句语法结构
那么do语句的执行流程是怎样的呢?
do语句执行流程

3.3.2 do语句的特点

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

//使用do while语句打印1~10#include <stdio.h>int main()
{int i = 1;do{printf("%d ", i);i++;} while (i <= 10);return 0;
}

3.3.3 do while循环中的break和continue

break:

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

continue:

#include <stdio.h>int main()
{int i = 1;do{		if (5 == i){continue;}printf("%d ", i);i++;} while (i <= 10);return 0;
}//1 2 3 4 死循环

3.4 练习

3.4.1 计算 n的阶乘

//5! = 1*2*3*4*5
//n! = 1~n 累积相乘//不考虑溢出
#include <stdio.h>int main()
{int n = 0;scanf("%d", &n);int i = 0;int ret = 1;for (i = 1; i <= n; i++){ret = ret * i;}printf("%d\n", ret);return 0;
}

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

#include <stdio.h>int main()
{int i = 0;int n = 0;int sum = 0;for (n = 1; n <= 10; n++){int ret = 1;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 = 0;int ret = 1;int sum = 0;//1!//2! = 1*2//3! = 1*2*3//4! = 1*2*3*4//每次在前面一次的基础上多乘了一个数,所以不需要每次都把ret改成1重来一遍for (n = 1; n <= 10; n++){ret *= n;sum += ret;}printf("%d\n", sum);return 0;
}

3.4.3 在一个有序数组中查找具体的某个数字n

#include <stdio.h>int main()
{int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };//升序int k = 7;int i = 0;for (i = 0; i < 10; i++){if (k == arr[i]){printf("找到了,下标是%d\n", i);break;}}if (10 == i){printf("找不到了\n");}return 0;
}

//以下方法更好#include <stdio.h>int main()
{int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };//升序//printf("%d\n", sizeof(arr));//计算数组的总大小,单位是字节//printf("%d\n", sizeof(arr[0]));//4//printf("%d\n", sizeof(arr) / sizeof(arr[0]));int k = 7;int sz = sizeof(arr) / sizeof(arr[0]);//1int left = 0;int right = sz - 1;int flag = 0;//flag的作用是标志是否找到了//2while (left <= right){int mid = (left + right) / 2;if (k == arr[mid]){printf("找到了,下标是:%d\n", mid);flag = 1;break;}else if (arr[mid] < k){left = mid + 1;}else{right = mid - 1;}}if (0 == flag){printf("没找到\n");}return 0;
}

二分查找

3.4.4 多个字符从两端移动,向中间汇聚

//welcome to bit!!!!!
//###################
//w#################!
//we###############!!
//wel#############!!!
//...
//welcome to bit!!!!!//welcome to bit!!!!!
//####################include <stdio.h>
#include <string.h>
#include <windows.h>//Sleep需要一个windows.h的头文件int main()
{char arr1[] = "welcome to bit!!!!!";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");//system函数可以执行系统命令,cls是清理屏幕left++;right--;}printf("%s\n", arr2);return 0;
}

3.4.5 模拟用户登录情景

编写代码实现模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确,则提示登录成功;如果三次均输入错误,则退出程序。)

//假设密码是:"123456"#include <stdio.h>
#include <string.h>int main()
{int i = 0;char password[20] = { 0 };for (i = 0; i < 3; i++){printf("请输入密码:>");scanf("%s", password);//判断密码是否正确//两个字符串比较相等是不能使用==的,应该使用strcmp库函数	//strcmp返回0表示2个字符串相等//strcmp返回>0的数字,表示第一个字符串大于第二个字符串//strcmp返回<0的数字,表示第一个字符串小于第二个字符串//字符串比较大小是比较对应位置上的ASCII码值////abcd\0//abq\0////abq大于abcdif (0 == strcmp(password, "123456")){printf("登录成功\n");break;}else{printf("密码错误\n");}}if (3 == i){printf("退出程序\n");}return 0;
}

//也可以这样写#include <stdio.h>int main()
{int i = 0;char password[20] = { 0 };int flag = 0;for (i = 0; i < 3; i++){printf("请输入密码:>");scanf("%s", password);if (0 == strcmp(password, "123456")){printf("登录成功\n");flag = 1;break;}else{printf("密码错误\n");}}if (0 == flag){printf("退出程序\n");}return 0;
}

附:

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Compiler- 尾调用

我们还是用例子来引入本次要探讨的问题--尾调用 #include <stdio.h>int fib(int a) {return a < 2 ? 1 : fib(a - 1) fib(a - 2); }int main() {int n,result;scanf("%d",&n);result fib(n);printf("result is %d.\n",result);return 0; …

创建路由React router(使用react-router dom V6版本)

React路由 隔了很长一段时间&#xff0c;重新捡起来React学习。 发现React的路由从原来的 Switch改成了Routes。nice&#xff0c;nice&#xff0c;nice&#xff01;&#xff01;&#xff01;&#xff01; 刚开始接触确实还是有一点生疏的。之前的关于【传参】【js跳转】【跳转模…

矿井下无人值守变电所电力监控系统的探讨与产品选型

摘要&#xff1a;为了探讨井下无人值守变电所的电力监控系统技术&#xff0c;以西山煤电马兰矿为背景&#xff0c;详细阐述了井下无人值守变电所电力监控系统技术的各项基本参数&#xff0c;如额定工作电压及整机输入视在功率、交换机或监控分站的传输口、高压配电装置的传输口…

下载VMWare

1、首先登录到vmware官网 官网&#xff1a;https://www.vmware.com/ 2、点击Resource 3、找到Product Downloads 4、找到我们要下载的产品&#xff0c;点击download product 5、选择自己要下载的版本和对应的系统 6、点击去下载 7、点击download now

国云筑基“翼”气风发,天翼云以科技创新绘就数字中国蓝图

科技云报道原创。 全球新一轮技术革命方兴未艾&#xff0c;特别是以数字技术为核心的信息技术革命&#xff0c;正在实现群体突破和加快广泛深度应用。 从2017年的“促进数字经济加快成长”&#xff0c;到2019年的“壮大数字经济”&#xff0c;到2020年的“全面推进‘互联网&am…

SpringBoot的配置和日志

1.配置文件的作用和意义 配置文件中配置整个项目中所有重要的数据&#xff0c;比如&#xff1a; 1.数据库的连接信息&#xff08;包含用户名和密码的设置&#xff09;&#xff1b; 2.项目的启动端口&#xff1b; 3.第三方系统的调用秘钥等信息&#xff1b; 4.用于发现和定位问…

Unity之OpenXR+XR Interaction Toolkit实现 抓取物体

前言 我们今天来说一下如何使用XR Interaction Toolkit来实现和3D物体的交互之&#xff1a;抓取&#xff0c;简单说就是通过VR手柄拿起来一个物体。 二.准备工作 有了前两篇的配置介绍,我们就不在详细说明这些了&#xff0c;大家自行复习 Unity之OpenXRXR Interaction Toolk…

BPF技术学习与整理

目录 eBPF是什么&#xff1f; eBPF是做什么的&#xff1f;可以解决什么问题&#xff1f; eBPF可以带来的解决方案是什么&#xff1f; eBPF的技术点 eBPF hookeBPF MapeBPF Helper FunctioneBPF有什么限制吗&#xff1f; 前言 21年因为项目需求而要开发一个工具&#xff0c;可以…

每日一个小技巧:1招教你wav格式如何转换mp3

wav是一种质量较高的音频格式&#xff0c;但它的文件大小通常比较大。为了更方便地分享和存储音频文件&#xff0c;许多人都会选择将其转换为mp3格式。因为mp3格式能够在保持较高音质的同时&#xff0c;尽量降低文件大小&#xff0c;帮助你节省许多磁盘空间。那你们知道wav格式…

Java基础——多线程创建

&#xff08;1&#xff09;什么是线程&#xff1f; 线程(thread)是一个程序内部的一条执行路径。程序中只有一条执行路径&#xff0c;那么这个程序就是单线程的程序。 &#xff08;2&#xff09;多线程是什么&#xff1f; 多线程是指从软硬件上实现多执行流程的技术。 &…

让 ChatGPT 扮演一个艺术家,协助我们生成绘图 prompt

stable-diffusion Prompt 生成 直接生成 按照惯用的扮演思路&#xff0c;我们可以让 ChatGPT 扮演一个艺术家&#xff0c;协助我们生成绘图 prompt。考虑到 ChatGPT 和 DallE 同为 openai 公司产品&#xff0c;且 stable-diffusion 开源模型出现较晚&#xff0c;ChatGPT 训练…

【软件工程】UML序列图

一.概述 序列图&#xff08;时序图&#xff09;是一种软件工程行化建模方法&#xff0c;用于可视化系统或应用程序中多个对象之间 的交互。在序列图中&#xff0c;每个对象都表示为竖直线&#xff0c;对象之间的消息则表示为水平箭头 从一个对象指向另一个对象。 序列图可以…

搞懂 API ,地图 API 制作方法分享

地图 API 是一种基于 Web 开发的应用程序编程接口&#xff0c;可以用于创建和展示地图及地理信息。以下是一些地图 API 制作的方法&#xff1a; 选择地图 API 平台&#xff1a;目前市场上有很多地图 API 平台供选择&#xff0c;比如 Google Maps API、百度地图 API、高德地图 A…

2023年五月份图形化三级打卡试题

活动时间 从2023年5月1日至5月21日&#xff0c;每天一道编程题。 本次打卡的规则如下&#xff1a; 小朋友每天利用10~15分钟做一道编程题&#xff0c;遇到问题就来群内讨论&#xff0c;我来给大家答疑。 小朋友做完题目后&#xff0c;截图到朋友圈打卡并把打卡的截图发到活动群…

在阿里做测试开发的这5年,收获与感悟...

正好在离职交接空档期&#xff0c;就抽空简单分享自己的一些个人经历给大家&#xff0c;希望对刚毕业不久或者工作三五年的同学能有一些帮助。 测试新人 我的职业生涯开始和大多数测试人一样&#xff0c;开始接触都是纯功能界面测试。那时候在一家电商公司做测试&#xff0c;做…

基于异常值鲁棒性问题的极限学习机的回归问题研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

2023年五月份图形化四级打卡试题

活动时间 从2023年5月1日至5月21日&#xff0c;每天一道编程题。 本次打卡的规则如下&#xff1a; 小朋友每天利用10~15分钟做一道编程题&#xff0c;遇到问题就来群内讨论&#xff0c;我来给大家答疑。 小朋友做完题目后&#xff0c;截图到朋友圈打卡并把打卡的截图发到活动群…

【独具匠心设计】全网最好的国学,历代文学,名著,小说网推荐

极力推荐一个功能简单、易用、访问快捷、界面大气,清爽、资源丰富、设计专业、完全免费的文学网站。它的名字叫“历代文学”&#xff0c;是由成都心海科技公司所研发&#xff0c;设计真可谓独具匠心。 “历代文学”收录了来自古今中外 20 多个朝代&#xff0c;近 30个 国家的作…

消息队列选型

消息队列选型 大家好&#xff0c;我是易安&#xff01;今天我们聊下消息队列常见选型。 消息队列作用 谈选型之前我们先讲下我们为什么需要消息队列。 消息队列是一种很流行的技术&#xff0c;自从系统间开始通信时&#xff0c;消息队列就出现了。然而&#xff0c;对消息队列给…

Windows 远程桌面提示没有远程桌面授权服务器可以提供许可证

可参考之前发布的一篇文章&#xff0c;帮助你远程登录&#xff1a;远程连接提示 由于没有远程桌面授权服务器提供许可证_计算机没有远程桌面客户端访问许可证_csdn_aspnet的博客-CSDN博客 虽然上述文章命令可以远程进入系统&#xff0c;但是每次都需要使用上述文章中的命令进入…