C语言入门3-逻辑控制

If-Else

语法

if (expression)statement1
elsestatement2

Else-If

语法

if (expression1) {// 条件expression1为真时执行的语句
} else if (expression2) {// 条件expression1为假,且expression2为真时执行的语句
} else if (expression3) {// 条件expression1和expression2为假,且expression3为真时执行的语句// 可以有更多else if分支
} else {// 所有条件expression1, expression2, expression3等都为假时执行的语句
}

举例
二分法查找。(注意:数组必须有序)

#include <stdio.h> // 引入标准输入输出库,用于printf函数// 函数声明:在已排序的数组v中使用二分查找算法查找元素x
int binsearch(int x, int v[], int n);int main() {int v[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; // 定义一个已排序的数组v// 调用binsearch函数,查找元素7在数组v中的位置,并打印返回的索引printf("%d\n", binsearch(7, v, 9));
}// 函数定义:在已排序的数组v中使用二分查找算法查找元素x
int binsearch(int x, int v[], int n) {int mid, low, high; // 定义中间索引mid,以及搜索范围的low和highlow = 0; // 初始化low为0,指向数组的开始high = n - 1; // 初始化high为n-1,指向数组的末尾// 循环进行二分查找,直到low大于highwhile (low <= high) {mid = (low + high) / 2; // 计算中间索引mid// 根据x与数组中间元素v[mid]的比较结果更新搜索范围if (x < v[mid])high = mid - 1; // 如果x小于v[mid],则更新high为mid-1else if (x > v[mid])low = mid + 1; // 如果x大于v[mid],则更新low为mid+1elsereturn mid; // 如果找到x,则返回索引mid}// 如果未找到x,则返回-1return -1;
}

练习

  1. 我们的二分查找在循环内进行了两次测试,但一次测试就足够了(代价是需要进行更多的外部测试)。编写一个循环内只进行一次测试的版本,并测量运行时间的差异。
#include <stdio.h>    // 引入标准输入输出库
#include <time.h>     // 引入时间处理库// 函数声明:二分查找算法
int binsearch(int x, int v[], int n);int main() {int v[1000]; // 定义一个大小为1000的整型数组// 初始化数组v,将每个元素设置为其索引值for (int i = 0; i < 1000; i++)v[i] = i;clock_t start, end; // 定义开始和结束时间变量double cpu_time_used; // 定义用于存储CPU时间的变量start = clock(); // 记录二分查找开始时间// 在循环中重复调用binsearch函数1000000次for (int i = 0; i < 1000000; i++)binsearch(73, v, 10);end = clock(); // 记录二分查找结束时间// 计算经过的CPU时间,并转换为秒cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;// 打印经过的时间printf("Time used: %f seconds\n", cpu_time_used);
}// 二分查找算法实现
int binsearch(int x, int v[], int n) {int mid, low, high;low = 0; // 初始化low为0high = n - 1; // 初始化high为数组末尾索引// 循环进行二分查找,直到low大于highwhile (low <= high) {mid = low + (high - low) / 2; // 计算中间索引,防止溢出// 进行查找,根据比较结果更新搜索范围if (x < v[mid]) {high = mid - 1;} else {low = mid + 1;}}// 如果未找到x,返回-1return -1;
}

Switch

语法

switch (expression) {case constant_expression1:// 代码块1break;case constant_expression2:// 代码块2break;...default:// 默认代码块,可选
}

注意:

  • switch语句开始于圆括号内的表达式(expression),这个表达式的结果通常是一个整数或枚举类型。

举例

#include <stdio.h>int main() {int month;printf("Enter a month (1-12): ");scanf("%d", &month);switch (month) {case 1:case 3:case 5:case 7:case 8:case 10:case 12:printf("%d is a month with 31 days.\n", month);break;case 4:case 6:case 9:case 11:printf("%d is a month with 30 days.\n", month);break;case 2:printf("%d is February.\n", month);// 没有break,将继续执行下一个case的代码default:printf("Invalid month.\n");}return 0;
}

Loops - While, For and Do-While

  1. For循环
  • 语法
for (初始化表达式; 条件表达式; 递增/递减表达式) {// 循环体
}
  • 举例
for (int i = 0; i < 10; i++) {printf("%d ", i);
}
  1. While循环
  • 语法
while (条件表达式) {// 循环体
}
  • 举例
int i = 0;
while (i < 10) {printf("%d ", i);i++;
}
  1. Do-While循环
  • 语法
do {// 循环体
} while (条件表达式);
  • 举例
int i = 0;
do {printf("%d ", i);i++;
} while (i < 10);

举例
将整数转换为字符串。

void atoi(int n, char s[]) {int i, sign;// 检查整数n是否为负数,并保存符号if ((sign = n) < 0) // 此处存在逻辑错误,应使用'='进行赋值,而非比较n = -n;i = 0; // 初始化字符串索引do {// 将数字n的最低位加到字符串s的末尾,并递增索引is[i++] = n % 10 + '0';} while ((n /= 10) > 0); // 循环直到n变为0// 缺少reverse函数的定义,该函数应该用于反转字符串sreverse(s);
}

练习

  1. 关于atoi函数有一个漏洞,当n=-2,147,483,648时,n = -n会溢出。请修改atoi,使其不会出现溢出问题。
void atoi(int n, char s[]) {int i, sign;// 判断 n 的符号并存储if ((sign = n) < 0)  // 如果 n 是负数;  // sign 被赋值为负数i = 0;do {// 取 n 的个位数转换为字符并存储到 s 中// 如果 n 是正数,直接取余数// 如果 n 是负数,先取余数再取负值s[i++] = (sign > 0) ? (n % 10 + '0') : (-1 * (n % 10) + '0');} while ((n /= 10) != 0);  // 将 n 除以 10 并更新 n,直到 n 变为 0if (sign < 0)s[i++] = '-';  // 如果 n 是负数,添加负号到 s 中s[i] = '\0';  // 在字符串末尾添加结束符 '\0'reverse(s);  // 反转字符串 s
}
  1. 编写一个函数itob(int n, char s[], int b),将整数n转为b进制的字符串。
#include <stdio.h>
#include <string.h>void itob(int n, char s[], int b);
void reverse(char s[]);int main() {char str[12];  // 声明一个大小为 12 的字符数组,用于存储转换后的字符串itob(-235, str, 16);  // 将 -235 转换为十六进制并存储在 str 中printf("%s\n", str);  // 打印转换后的字符串return 0;
}// 反转字符串 s 的函数
void reverse(char s[]) {int i, j;char temp;// 使用双指针法进行字符串反转for (i = 0, j = strlen(s) - 1; i < j; i++, j--) {temp = s[i];s[i] = s[j];s[j] = temp;}
}// 将整数 n 转换为指定进制 b 的字符串表示存储在 s 中的函数
void itob(int n, char s[], int b) {int i, sign, c;if ((sign = n) < 0);  // 如果 n 是负数,sign 被赋值为负数,但此处没有实际操作i = 0;do {// 取 n 对 b 取模的结果,转换为对应的字符并存储到 s 中// 如果 n 是正数,直接取余数// 如果 n 是负数,先取余数再取负值c = (sign > 0) ? (n % b + '0') : (-1 * (n % b) + '0');if (c > '9')s[i++] = c - '9' - 1 + 'a';  // 如果超过 9,转换为 a-f 的字母形式elses[i++] = c;} while ((n /= b) != 0);  // 将 n 除以 b 并更新 n,直到 n 变为 0if (sign < 0)s[i++] = '-';  // 如果 n 是负数,添加负号到 s 中s[i] = '\0';  // 在字符串末尾添加结束符 '\0'reverse(s);  // 反转字符串 s,使得最终结果正确表示 n 的 b 进制数
}

Break and Continue

Break

  • break 用于立即终止包含它的最内层循环的执行。
for (int i = 0; i < 10; i++) {if (i == 5) {break; // 当i等于5时,退出循环}printf("%d ", i);
}
// 输出: 0 1 2 3 4

Continue

  • continue 用于跳过当前循环迭代的剩余部分,并立即进入下一次迭代。
for (int i = 0; i < 10; i++) {if (i % 2 == 0) {continue; // 跳过偶数,不执行下面的打印语句}printf("%d ", i);
}
// 输出: 1 3 5 7 9

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

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

相关文章

nvidia历史版本驱动

打开官网 https://www.nvidia.cn windows GTX-1060为例 标准

【中学教资科目二】03中学教学

03中学教学 第一节 教学的任务1.1 教学的任务 第二节 教学过程2.1 教学过程的本质2.2 教学过程的基本规律 第三节 教学原则3.1 因材施教原则 第四节 教学方法4.1 我国中学常用的教学方法4.2 国外常用的教学方法 第五节 教学组织形式、教学工作基本环节和教学评价5.1 现代其他教…

OpenHarmony角落里的知识:WPA_Supplicant连接方式

WPA_Supplicant连接方式简析 /third_party/wpa_supplicant |-- CONTRIBUTIONS # 贡献说明 |-- COPYING # 版权说明 |-- wpa_supplicant-2.9 # 轻量级系统的wpa_supplicant | |-- hostapd # Wi-Fi热点相关功能&#xff08;Acces…

基于Web的图书管理系统运行教程

1.5、安装数据库和数据库管理工具 目前作者所有毕设源码数据库都用 MySQL5.7版本&#xff0c;强烈建议初学者跟作者保持一致&#xff0c;避免出现其他错误&#xff0c;待运行成功后再根据需要调整数据库版本。 MySQL5.7安装教程请看作者另一篇文章&#xff1a;《MySQL绿色版安…

设计模式(三)代理模式

目录 一、什么是代理模式 二、静态代理 1、定义 2、代码 2.1、接口 2.2、被代理对象 2.3、代理对象 2.4、测试 三、动态代理 1、定义 2、代码 2.1、接口 2.2、目标对象 2.3、代理对象 2.4、测试 一、什么是代理模式 代理模式(Proxy Pattern)是一种结构性模式。代理模…

MySQL_常用配置

一、忽略大小写 1.1 查看大小写配置 mysql> show variables like %lower_case_table_names%; ------------------------------- | Variable_name | Value | ------------------------------- | lower_case_table_names | 0 | ------------------------------…

【前端】[vue3] [uni-app] 组件样式击穿:deep

我是在开发uni-app时测试的思路&#xff0c;大家可以借鉴一下。 我这边测试的是uni组件&#xff0c;但是我觉得即便你用element-plus之类的&#xff0c;样式击穿的思路都相同。 我自定义了一个全局样式scss文件&#xff0c;并引入到了项目中。(如图) 利用vue3 中的 deep 方式…

为什么Transformer的编码器和解码器如此重要?一文带你读懂

Transformer 模型是一种基于自注意力&#xff08;self-attention&#xff09;机制的深度学习模型&#xff0c;最初是为了解决自然语言处理&#xff08;NLP&#xff09;中的序列到序列&#xff08;sequence-to-sequence&#xff09;任务而提出的&#xff0c;如机器翻译。Transfo…

人脸识别——可解释的人脸识别(XFR)人脸识别模型是根据什么来识别个人的

可解释性人脸识别&#xff08;XFR&#xff09;&#xff1f; 人脸识别有一个任务叫1:N&#xff08;识别&#xff09;。这个任务将一个人的照片与N张注册照片进行比较&#xff0c;找出相似度最高的人。 这项任务用于刑事调查和出入境点。在犯罪调查中&#xff0c;任务从监控摄像…

【论文笔记】Parameter-Effificient Transfer Learning for NLP

题目:Parameter-Effificient Transfer Learning for NLP 阅读 文章目录 0.摘要1.引言2 Adapter tuning for NLP3 实验3.1 参数/性能平衡3.2 讨论 4.相关工作 0.摘要 克服微调训练不高效的问题&#xff0c;增加一些adapter模块&#xff0c;思想就是固定原始的网络中的参数&…

.input只读,禁用,必填,提示词(占位符)属性分别是什么?

在HTML中&#xff0c;<input>元素有几个常用的属性&#xff0c;包括只读&#xff08;readonly&#xff09;、禁用&#xff08;disabled&#xff09;、必填&#xff08;required&#xff09;和提示词&#xff08;占位符&#xff0c;placeholder&#xff09;。以下是这些属…

mysql model_path longblob 类型文件操作

在 MySQL 中&#xff0c;如果你有一个表包含一个 LONG BLOB 类型的字段&#xff08;例如 model_path&#xff09;&#xff0c;你可以使用 SQL 查询来提取该字段中的二进制数据&#xff0c;并将其下载为文件。以下是一个完整的步骤来实现这个过程&#xff1a; 步骤1&#xff1a;…

开源低代码平台,JeecgBoot v3.7.0 里程碑版本发布

项目介绍 JeecgBoot是一款企业级的低代码平台&#xff01;前后端分离架构 SpringBoot2.x&#xff0c;SpringCloud&#xff0c;Ant Design&Vue3&#xff0c;Mybatis-plus&#xff0c;Shiro&#xff0c;JWT 支持微服务。强大的代码生成器让前后端代码一键生成! JeecgBoot引领…

90V转12V1A恒压WT6039

90V转12V1A恒压WT6039 WT6039降压DC-DC转换器芯片专为处理宽泛的电压输入范围设计&#xff0c;支持从12V至90V。该芯片集成了关键功能&#xff0c;如使能控制开关、参考电源、误差放大器、过热保护、限流保护及短路保护等&#xff0c;以确保系统在各种操作条件下的安全与稳定性…

qt开发-05_QPushButton

按钮是最常用的控件&#xff1b; 如果找不到文件可以这样&#xff1a; 选择这个复制文件的路径&#xff0c;粘贴就可以了。 在qt中新建一个项目&#xff0c;并且打开ui界面添加一个按钮&#xff1b; 右键这个按钮可以有很多功能&#xff1a; 先是这个转到槽&#xff0c;这个就…

netcore 生成验证码

安装依赖 Install-Package Lazy.Captcha.Core 注册服务 builder.Services.AddCaptcha(); 自定义注册服务 // 注册服务的时候增加配置 services.AddCaptcha(Configuration, option > {option.CaptchaType CaptchaType.WORD; // 验证码类型option.CodeLength 6; // 验证…

六月惊喜| 事件分析Plus上线

前情回顾 ClkLog在四月先上线了一版<事件分析>&#xff0c;可以通过元数据的配置&#xff0c;创建并统计自定义事件的数据情况&#xff08;例如&#xff1a;用户数、触发次数、人均次数&#xff09;。 功能上线后好多小伙伴说希望我们加紧上线自定义的事件分析。ClkLog实…

【Java】已解决java.net.HttpRetryException异常

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例 已解决java.net.HttpRetryException异常 在Java的网络编程中&#xff0c;尤其是使用Apache HttpClient或其他类似的HTTP客户端库时&#xff0c;可能会遇到java.net.HttpRetryException异常。这个…

动态IP与静态IP,如何选择更适合你的类型?

在当今数字化时代&#xff0c;互联网已成为我们日常生活和工作中不可或缺的一部分。而IP地址作为互联网通信的基础&#xff0c;扮演着至关重要的角色。在选择IP地址类型时&#xff0c;动态IP和静态IP是两种常见的选择。IPIDEA代理IP将为大家详细解析这两种IP的特点&#xff0c;…

【SPIE出版】第六届无线通信与智能电网国际会议(ICWCSG 2024,7月26-28)

随着科技的飞速发展和能源需求的日益增长&#xff0c;智能电网技术逐渐成为电力行业的重要发展方向。与此同时&#xff0c;无线通信技术在近年来也取得了显著的进步&#xff0c;为智能电网的发展提供了强有力的支持。为了进一步推动无线通信与智能电网的结合与发展&#xff0c;…