安全编码课程 实验6 整数安全

news2025/4/18 1:24:56

实验项目

实现安全计数器实现 Counter 结构,确保计数范围为 0~100。

实验要求:

1、使用 struct 封装计数值value;

2、计数器初值为 0;

3、increment() 方法增加计数,但不能超过 100;

4、decrement() 方法减少计数,但不能小于 0;

5、get_count() 方法返回当前计数值;

6、释放计数器。

7、编写测试代码,注意测试边界条件。

以上1-7用c语言编写

8、用c++构造计数器类,同样包含上述功能,无需测试

提交:

1. 代码

2. 测试用例

3. 过程及结果截图

目录

实验项目

实验步骤、实验结果及结果分析:

1. 代码

1、使用 struct 封装计数值value;

2、计数器初值为 0;

3、increment() 方法增加计数,但不能超过 100;

4、decrement() 方法减少计数,但不能小于 0;

5、get_count() 方法返回当前计数值;

6、释放计数器。

2. 测试用例 

7、编写测试代码。

8、用c++构造计数器类,同样包含上述功能

3. 过程及结果截图


实验步骤、实验结果及结果分析:

1. 代码

1、使用 struct 封装计数值value;

typedef struct {
    int value;   
} Counter;

2、计数器初值为 0;

Counter* create_counter() {
    Counter* counter = (Counter*)malloc(sizeof(Counter));
    if (counter != NULL) {
        counter->value = 0;  // 初始化为0
    }
    return counter;
}

3、increment() 方法增加计数,但不能超过 100;

void increment(Counter* counter) {
    if (counter->value < 100) {
        counter->value++;
    }
}

4、decrement() 方法减少计数,但不能小于 0;

void decrement(Counter* counter) {
    if (counter->value > 0) {
        counter->value--;
    }
}

5、get_count() 方法返回当前计数值;

int get_count(Counter* counter) {
    return counter->value;   
}   

6、释放计数器。

void destroy_counter(Counter* counter) {
    free(counter);   
}   

2. 测试用例 

7、编写测试代码。

    // 创建计数器
    Counter* counter = create_counter();
    // 测试初始值
    printf("Initial count: %d \n", get_count(counter));
    // 测试增加到上限
    for (int i = 0; i < 105; i++) {
        increment(counter);
    }
    printf("After 105 increments: %d \n", get_count(counter));
    // 测试减少到下限
    for (int i = 0; i < 105; i++) {
        decrement(counter);
    }
    printf("After 105 decrements: %d \n", get_count(counter));
    // 测试边界附近的单个操作
    increment(counter);
    printf("After increment at 0: %d \n", get_count(counter));
    increment(counter);
    printf("After increment at 0: %d \n", get_count(counter));
    decrement(counter);
    printf("After decrement at 1: %d \n", get_count(counter));
    decrement(counter);
    printf("After decrement at 1: %d \n", get_count(counter));
    decrement(counter);
    printf("After decrement at 1: %d \n", get_count(counter));
    // 边界精确测试   
    for (int i = 0; i < 100; i++) increment(counter);   
    printf("After exactly 100 increments: %d\n", get_count(counter)); 
    // 混合操作测试   
    for (int i = 0; i < 200; i++) {
        if (i % 3 == 0) decrement(counter);
        else increment(counter);   
    }   
    printf("After mixed 200 operations: %d\n", get_count(counter)); 
    // 释放计数器
    destroy_counter(counter);

8、用c++构造计数器类,同样包含上述功能

#include <iostream>  
class Counter {    
private:
    int value;  
public:
    // 1. 使用类封装计数值value
    // 2. 构造函数初始化计数器为0
    Counter() : value(0) {}
    // 3. increment()方法增加计数(不超过100)
    void increment() {
        if (value < 100) {
            value++;
        }
    }
    // 4. decrement()方法减少计数(不小于0)
    void decrement() {
        if (value > 0) {
            value--;
        }
    }
    // 5. get_count()方法返回当前计数值
    int get_count() const {
        return value;
    }
    // 6. 析构函数自动释放资源
    ~Counter() = default;
};

3. 过程及结果截图

计数器程序运行结果符合预期,边界条件和操作逻辑都实现。

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

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

相关文章

解决上传PDF、视频、音频等格式文件到FTP站点时报错“将文件复制到FTP服务器时发生错误。请检查是否有权限将文件放到该服务器上”问题

一、问题描述 可以将文本文件(.txt格式),图像文件(.jpg、.png等格式)上传到我们的FTP服务器上;但是上传一些PDF文件、视频等文件时就会报错“ 将文件复制到FTP服务器时发生错误。请检查是否有权限将文件放到该服务器上。 详细信息: 200 Type set to l. 227 Entering Pas…

【Linux操作系统】:信号

Linux操作系统下的信号 一、引言 首先我们可以简单理解一下信号的概念&#xff0c;信号&#xff0c;顾名思义&#xff0c;就是我们操作系统发送给进程的消息。举个简单的例子&#xff0c;我们在写C/C程序的时候&#xff0c;当执行a / 0类似的操作的时候&#xff0c;程序直接就挂…

经典频域分析法(Bode图、Nyquist判据) —— 理论、案例与交互式 GUI 实现

目录 经典频域分析法(Bode图、Nyquist判据) —— 理论、案例与交互式 GUI 实现一、引言二、经典频域分析方法的基本原理2.1 Bode 图分析2.2 Nyquist 判据三、数学建模与公式推导3.1 一阶系统的频域响应3.2 多极系统的 Bode 图绘制3.3 Nyquist 判据的数学描述四、经典频域分析…

使用scoop一键下载jdk和实现版本切换

安装 在 PowerShell 中输入下面内容&#xff0c;保证允许本地脚本的执行&#xff1a; set-executionpolicy remotesigned -scope currentuser然后执行下面的命令安装 Scoop&#xff1a; iwr -useb get.scoop.sh | iex国内用户可以使用镜像源安装&#xff1a;powershell iwr -us…

对状态模式的理解

对状态模式的理解 一、场景二、不采用状态模式1、代码2、缺点 三、采用状态模式1、代码1.1 状态类1.2 上下文&#xff08;这里指&#xff1a;媒体播放器&#xff09;1.3 客户端 2、优点 一、场景 同一个东西&#xff08;例如&#xff1a;媒体播放器&#xff09;&#xff0c;有一…

vue2(webpack)集成electron和 electron 打包

前言 之前发过一篇vue集成electron的文章&#xff0c;但是用vue3vite实现的&#xff0c;在vue2webpack工程可能不适用&#xff0c;所以这篇文章就主要介绍vue2webpack集成electron方法 创建项目 vue create vue-electron-demo目录架构 vue-electron-demo/ ├── src/ …

C++内存管理优化实战:提升应用性能与效率

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开发技术&#xff0c;能熟练应用常用数据库SQL server,Oracle…

redis数据迁移之通过redis-dump镜像

这里写目录标题 一、redis-dump 镜像打包1.1 安装windows docker1.2 idea项目创建1.3 idea镜像打包 二、redis数据迁移2.1 数据导出2.2 数据导入 一、redis-dump 镜像打包 没有找到可用的redis-dump镜像&#xff0c;需要自己打包一下&#xff0c;这里我是在idea直接打包的 1.…

redis导入成功,缺不显示数据

SpringBootTest class SecurityApplicationTests {AutowiredStringRedisTemplate template; //添加这句代码&#xff0c;自动装载&#xff0c;即可解决文章三处代码报错Testvoid contextLoads() {String compact Jwts.builder().signWith(Jwts.SIG.HS512.key().build()).subj…

从表格到序列:Swift 如何优雅地解 LeetCode 251 展开二维向量

文章目录 摘要描述题解答案题解代码分析示例测试及结果时间复杂度空间复杂度总结 摘要 在这篇文章中&#xff0c;我们将深入探讨 LeetCode 第 251 题——“展开二维向量”的问题。通过 Swift 语言&#xff0c;我们不仅会提供可运行的示例代码&#xff0c;还会结合实际场景进行…

小型园区网实验

划分VLAN SW3 [sw3]vlan batch 2 3 20 30 [sw3]interface GigabitEthernet 0/0/1 [sw3-GigabitEthernet0/0/1]port link-type access [sw3-GigabitEthernet0/0/1]port default vlan 2 [sw3-GigabitEthernet0/0/1]int g0/0/2 [sw3-GigabitEthernet0/0/2]port link-type acces…

c# 数据结构 链表篇 有关单链表的一切

本人能力有限,本文仅作学习交流与参考,如有不足还请斧正 目录 0.单链表好处 0.5.单链表分类 1.无虚拟头节点情况 图示: 代码: 头插/尾插 删除 搜索 遍历全部 测试代码: 全部代码 2.有尾指针情况 尾插 全部代码 3.有虚拟头节点情况 全部代码 4.循环单链表 几个…

VS Code连接服务器编写Python文件

1、下载 Visual Studio Code 2、打开扩展&#xff08;ctrl shift x ) 3、搜索 Remote - SSH&#xff0c;安装 4、F1 或者 点金左下角 5、选择&#xff1a;Remote-SSH: Connect to Host……&#xff0c;回车 6、第一次用的时候&#xff0c;VS Code 会提示添加 SSH 主机。输…

Gitea的安装和配置以及应用

Gitea的安装和配置以及应用 一、安装 1、创建数据库和数据库账户&#xff08;pg&#xff09; su – postgres -c "psql" CREATE ROLE gitea WITH LOGIN PASSWORD gitea; CREATE DATABASE giteadb WITH OWNER gitea TEMPLATE template0 ENCODING UTF8 LC_COLLATE …

$_GET变量

$_GET 是一个超级全局变量&#xff0c;在 PHP 中用于收集通过 URL 查询字符串传递的参数。它是一个关联数组&#xff0c;包含了所有通过 HTTP GET 方法发送到当前脚本的变量。 预定义的 $_GET 变量用于收集来自 method"get" 的表单中的值。 从带有 GET 方法的表单发…

TBE(TVM的扩展)

算子 张量 一个张量只有一种数据类型 在内存中只能线性存储&#xff0c;最终形成一个长的一维数组 晟腾AI的数据格式 AIPP是对我们常见的数据格式转化成AI core支持的数据格式 广播机制 TVM TBE的第一种开发方式&#xff1a;DSL TBE的第二种开发方式&#xff1a;TVM TBE的第…

【Function Calling与Tool Calling】深度解析大模型智能中枢的架构革命

目录 一、范式转移&#xff1a;从对话引擎到智能中枢 二、核心技术解析 2.1 Function Calling技术栈 2.2 Tool Calling实现模式 三、企业级应用架构设计 3.1 智能工单系统案例 3.2 性能优化策略 四、安全与治理框架 4.1 权限控制矩阵 4.2 审计追踪设计 五、开发者实…

知识表示方法之六:过程表示法(Procedural Representation)

在人工智能的发展史中&#xff0c;关于知识的表示方法曾存在两种不同的观点。一种观点认为知识主要是陈述性的&#xff0c;其表示方法应着重将其静态特性&#xff0c;即事物的属性以及事物间的关系表示出来&#xff0c;称以这种观点表示知识的方法为陈述式或说明式表示法&#…

sql-labs靶场 less-2

文章目录 sqli-labs靶场less 2 联合注入 sqli-labs靶场 每道题都从以下模板讲解&#xff0c;并且每个步骤都有图片&#xff0c;清晰明了&#xff0c;便于复盘。 sql注入的基本步骤 注入点注入类型 字符型&#xff1a;判断闭合方式 &#xff08;‘、"、’、“”&#xf…

git clone(复制)下载

1、复制 下载地址 2、打开网页&#xff0c;点击 克隆/下载按扭 3、按提示复制命令行到终端 4、VS里打开终端&#xff0c;并粘贴以下命令 5、 下载完毕 6、复制文件夹到你选定的位置 7、用VSCODE打开文件夹&#xff0c;开始你接下来的工作