蓝桥杯准备训练(lesson4 ,c++)

蓝桥杯准备训练(lesson4 ,c++)

算术操作符

5.1 算术操作符

在写代码时候,⼀定会涉及到计算。为了⽅便运算,提供了⼀系列操作符,其中有⼀组操作符叫:算术操作符。分别是: + - * / % ,这些操作符都是双⽬操作符。
注:操作符也被叫做:运算符,是不同的翻译,意思是⼀样的。

#include<iostream>usingnamespace std;intmain(){int a =7+2;//加法运算int b =7-2;//减法运算int c =7*2;//乘法运算int d =7/2;//除法运算,得到的是整除后的商int e =7%2;//取余运算,得到的是整除后的余数 cout << a << endl; cout << b << endl; cout << c << endl; cout << d << endl; cout << e << endl;return0;}

易错点:
• / 除法的操作符,除数不能为0,如果除数为0,程序会崩溃的。
• % 取模操作符的计算结果是两个操作数进⾏除法运算后的余数。
• 取模操作符的操作数只能是整型,不能是浮点型,这个编译器会报语法错误的。

#include<iostream>usingnamespace std;intmain(){int a =10;int b =0;int c = a / b;float d =6.0;float e = d %2;return0;}

5.2 浮点数的除法

#include<iostream>usingnamespace std;intmain(){float x =6/4; cout << x << endl;// 1float y =6.0/4;// 6/4.0结果是⼀样的 cout << y << endl;// 1.5return0;}

上⾯⽰例中,尽管变量 x 的类型是 float (浮点数),但是 6 / 4 得到的结果是 1.0 ,⽽不是
1.5 。原因就在于 整数除法是整除,只会返回整数部分,丢弃⼩数部分。
如果希望得到浮点数的结果,两个运算数必须⾄少有⼀个浮点数,这时就会进⾏浮点数除法。

5.3 负数取模

• 负数也是⽀持取模的,但是负数求模结果的正负号由第⼀个运算数(操作数)的正负号决定

#include<iostream>usingnamespace std;intmain(){ cout <<11%-5<< endl;// 1 cout <<-11%-5<< endl;// -1 cout <<-11%5<< endl;// -1return0;}

5.4 数值溢出

前⾯我们了解到数据类型都有对应的数值范围,⽽在实际运算过程中可能会存在加法操作导致数据范围超过当前数据类型规定的范围,如下:

#include<iostream>usingnamespace std;intmain(){char a ='Z';char b = a +'Z'; cout << b << endl;// 输出了不显⽰的内容//printf是格式化输出,后⾯章节会讲,这⾥暂不做讲解printf("%d", b);// -76,char的⼗进制内容return0;}

以 char 类型为例, char 的数值范围在 -128 ~ 127 ,当字符相加超过最⼤值后,打印出来的结
果会变成负数,这与数据的存储有关

在这里插入图片描述


意识到数据类型的取值是有其范围的,那么我们在编程的时候就要选择合适的数据类型,才能得到正确的结果。正所谓:⼗年 IO ⼀场空,不开 long long ⻅祖宗。

5.5 练习

练习1:计算(a+b)*c

链接:https://www.luogu.com.cn/problem/B2008

#include<iostream>usingnamespace std;int a, b, c;intmain(){ cin >> a >> b >> c;int r =(a + b)* c; cout << r << endl;return0;}

练习2:带余除法

链接:https://www.luogu.com.cn/problem/B2010

#include<iostream>usingnamespace std;int a, b;intmain(){ cin >> a >> b; cout << a / b <<" "<< a % b << endl;}

练习3:整数个位

链接:https://ac.nowcoder.com/acm/problem/21990

#include<iostream>usingnamespace std;int a;intmain(){ cin >> a; cout << a %10<< endl;return0;}

练习4:整数⼗位

链接:https://ac.nowcoder.com/acm/problem/21991

#include<iostream>usingnamespace std;int a;intmain(){ cin >> a; cout << a %100/10<< endl;return0;}

练习5:时间转换

链接:https://ac.nowcoder.com/acm/contest/18839/1031

#include<iostream>usingnamespace std;int time;intmain(){ cin >> time; cout << time /60/60<<" "<< time /60%60<<" "<< time %60<< endl;return0;}

解释:

  1. time除以60(1分钟有60秒)先换算出分钟数,分钟数除以60(1⼩时有60分钟)交换算
    成⼩时。
  2. time除以60(1分钟有60秒)先换算出分钟数,分钟数对60取模,就是换完⼩时后剩余的
    分钟数
  3. time对60取模,每60秒凑1分钟,还剩多少多少秒,没办法凑够⼀分钟。

练习6:⼩⻥的游泳时间

链接:https://www.luogu.com.cn/problem/P1425

#include<iostream>usingnamespace std;intmain(){int a, b, c, d; cin >> a >> b >> c >> d;int h, m;int t = c *60+ d - a *60- b;//计算机出时间差,单位是分钟 h = t /60; m = t %60; cout << h <<" "<< m << endl;return0;}

6.1 连续赋值

赋值操作符也可以连续赋值,如:

int a =3;int b =5;int c =0; c = b = a +3;//连续赋值,从右向左依次赋值的。

虽然⽀持这种连续赋值,但是写出的代码不容易理解,建议还是拆开来写,这样⽅便观察代码的执⾏细节。

6.2 复合赋值符

在写代码时,我们经常可能对⼀个数进⾏⾃增、⾃减的操作,如下代码:

int a =10; a = a +3; a = a -2;

这样代码C++给提供了更加⽅便的写法:

int a =10; a +=3; a -=2;

C++中提供了复合赋值符,⽅便我们编写代码,这些赋值符有:

在这里插入图片描述

6.3 练习

练习:交换值

链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=2064

#include<iostream>usingnamespace std;intmain(){int a =0;int b =0; cin >> a >> b;int c = a;//c是⼀个临时变量,作为中间变量实现交换的 a = b; b = c; cout << a <<" "<< b << endl;return0;}

Read more

【Linux】线程池(二)C++ 手写线程池全流程:从核心设计到线程安全、死锁深度解析

【Linux】线程池(二)C++ 手写线程池全流程:从核心设计到线程安全、死锁深度解析

文章目录 * 实现线程池 * ThreadPool类设计 * 构造函数 * Start接口 * 线程池接入日志 * 初步实现源码及效果图 * 总结代码执行逻辑 * 实现回调函数Routine * enqueue接口实现 * 线程池退出stop接口优化 * 线程池源码 * 线程安全和重入问题 * 结论 * 死锁 * 死锁四个必要条件 * 避免死锁 * STL、智能指针和线程安全 实现线程池 我们之前已经接触了进程池,其实线程池和进程池核心思路差不多,对于线程池来说,会有一个任务队列和若干线程,用户往任务队列里添加任务,若干线程在任务队列里拿任务并完成。 ThreadPool类设计 构造函数 对于线程来说,启动线程池分为两步: 1.先创建线程本身(Thread类对象)2.再启动线程(调用Thread的start接口) 所以在构造函数我们要先创建线程本身(thread t(回调函数,线程名)),创建线程需要传递回调函数(假设是hello)和线程名,但这里有一个问题,一般来说传递的

By Ne0inhk
【C++】平衡树优化实战:如何手搓一棵查找更快的 AVL 树?

【C++】平衡树优化实战:如何手搓一棵查找更快的 AVL 树?

🎬 个人主页:MSTcheng · ZEEKLOG 🌱 代码仓库 :MSTcheng · Gitee 🔥 精选专栏: 《C语言》 《数据结构》 《C++由浅入深》 💬座右铭:路虽远行则将至,事虽难做则必成! 前言:前两篇文章我们已经向大家介绍了map和set这两个容器,他们的底层都是平衡二叉搜索树,而今天我们就来介绍一种平衡二叉搜索树——AVL树。 文章目录 * 一、AVL树的认识 * 1.1AVL树的概念 * 二、AVL树的实现 * 2.1AVL树的基本框架 * 2.2AVL树的插入 * 2.3AVL树的中序遍历 * 2.4AVL树其他功能实现 * 三、总结 一、AVL树的认识 1.1AVL树的概念 AVL树是由G. M. Adelson-Velsky和E. M. Landis两个前苏联的科学家所发明的,它的具体定义如下: * AVL树是最先发明的自平衡⼆叉查找树,AVL是⼀颗空树,

By Ne0inhk
Qt步进电机上位机控制程序源代码:跨平台C/C++编写,支持多种端口类型与详细注释

Qt步进电机上位机控制程序源代码:跨平台C/C++编写,支持多种端口类型与详细注释

Qt步进电机上位机控制程序源代码Qt跨平台C/C++语言编写 支持串口Tcp网口Udp网络三种端口类型 提供,提供详细注释和人工讲解 1.功能介绍: 可控制步进电机的上位机程序源代码,基于Qt库,采用C/C++语言编写。 支持串口、Tcp网口、Udp网络三种端口类型,带有调试显示窗口,接收数据可实时显示。 带有配置自动保存功能,用户的配置数据会自动存储,带有超时提醒功能,如果不回复则弹框提示。 其中三个端口,采用了类的继承与派生方式编写,对外统一接口,实现多态功能,具备较强的移植性。 2.环境说明: 开发环境是Qt5.10.1,使用Qt自带的QSerialPort,使用网络的Socket编程。 源代码中包含详细注释,使用说明,设计文档等。 请将源码放到纯英文路径下再编译。 3.使用介绍: 可直接运行在可执行程序里的exe文件,操作并了解软件运行流程。 本代码产品特点: 1、尽量贴合实际应用,细节考虑周到。 2、注释完善,讲解详细,还有相关扩展知识点介绍。

By Ne0inhk
软件解耦与扩展:插件式开发方式(基于 C++ 与 C# 的实现)

软件解耦与扩展:插件式开发方式(基于 C++ 与 C# 的实现)

软件解耦与扩展:插件式开发方式 * 🤔 什么是插件式开发? * 🧩 为何选择插件式开发?—— 解耦与扩展的艺术 * 1. 高度解耦 * 2. 极致的扩展性 * 3. 增强可维护性 * 4. 支持动态加载与卸载 * 🏗️ 插件系统的核心架构 * 💻 实践篇:C# 下的插件式开发 * 1. 定义插件契约 * 2. 实现一个具体插件 * 3. 构建宿主程序(插件加载器) * 应用案例:可扩展的日志系统 * ⚙️ 实践篇:C++ 下的插件式开发 * 1. 定义插件契约 * 2. 实现一个具体插件 * 3. 构建宿主程序(插件加载器) * 📊 C# 与 C++ 实现对比 * ⚠️ 挑战与注意事项 * 🎯 总结:何时使用插件式架构? 🚀在软件工程的漫长演进中,我们始终在追求一个核心目标:构建稳定而灵活的系统。一个优秀的软件架构,如同人体的骨骼,既要坚实稳固,又要具备生长与适应的能力。

By Ne0inhk