【从0学习Solidity】 10. 控制流,用solidity实现插入排序

news2024/11/20 22:40:47

【从0学习Solidity】10. 控制流,用solidity实现插入排序

在这里插入图片描述

  • 博主简介:不写代码没饭吃,一名全栈领域的创作者,专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构,分享一些项目实战经验以及前沿技术的见解。
  • 关注我们的主页,探索全栈开发,期待与您一起在移动开发的世界中,不断进步和创造!
  • 本文收录于 不写代码没饭吃 的学习汇报系列,大家有兴趣的可以看一看。
  • 欢迎访问我们的微信公众号:不写代码没饭吃,获取更多精彩内容、实用技巧、行业资讯等。您关注的是我们前进的动力!

这一讲,我们将介绍solidity中的控制流,然后讲如何用solidity实现插入排序(InsertionSort),一个看起来简单,但实际上很容易写出bug的程序。

控制流

Solidity的控制流与其他语言类似,主要包含以下几种:

  1. if-else
function ifElseTest(uint256 _number) public pure returns(bool){
    if(_number == 0){
	return(true);
    }else{
	return(false);
    }
}
  1. for循环
function forLoopTest() public pure returns(uint256){
    uint sum = 0;
    for(uint i = 0; i < 10; i++){
	sum += i;
    }
    return(sum);
}
  1. while循环
function whileTest() public pure returns(uint256){
    uint sum = 0;
    uint i = 0;
    while(i < 10){
	sum += i;
	i++;
    }
    return(sum);
}
  1. do-while循环
function doWhileTest() public pure returns(uint256){
    uint sum = 0;
    uint i = 0;
    do{
	sum += i;
	i++;
    }while(i < 10);
    return(sum);
}
  1. 三元运算符
    三元运算符是solidity中唯一一个接受三个操作数的运算符,规则条件? 条件为真的表达式:条件为假的表达式。 此运算符经常用作 if 语句的快捷方式。
// 三元运算符 ternary/conditional operator
function ternaryTest(uint256 x, uint256 y) public pure returns(uint256){
    // return the max of x and y
    return x >= y ? x: y; 
}

另外还有continue(立即进入下一个循环)和break(跳出当前循环)关键字可以使用。

solidity实现插入排序

写在前面:90%以上的人用solidity写插入算法都会出错。

插入排序

排序算法解决的问题是将无序的一组数字,例如[2, 5, 3, 1],从小到大依次排列好。插入排序(InsertionSort)是最简单的一种排序算法,也是很多人学习的第一个算法。它的思路很简单,从前往后,依次将每一个数和排在他前面的数字比大小,如果比前面的数字小,就互换位置。示意图:

[外链图片转存中…(img-95ygLCQH-1693882295806)]

python代码

我们可以先看一下插入排序的python代码:

# Python program for implementation of Insertion Sort
def insertionSort(arr):
	for i in range(1, len(arr)):
		key = arr[i]
		j = i-1
		while j >=0 and key < arr[j] :
				arr[j+1] = arr[j]
				j -= 1
		arr[j+1] = key
    return arr

改写成solidity后有BUG

一共8行python代码就可以完成插入排序,非常简单。那么我们将它改写成solidity代码,将函数,变量,循环等等都做了相应的转换,只需要9行代码:

    // 插入排序 错误版
    function insertionSortWrong(uint[] memory a) public pure returns(uint[] memory) {
        
        for (uint i = 1;i < a.length;i++){
            uint temp = a[i];
            uint j=i-1;
            while( (j >= 0) && (temp < a[j])){
                a[j+1] = a[j];
                j--;
            }
            a[j+1] = temp;
        }
        return(a);
    }

那我们把改好的放到remix上去跑,输入[2, 5, 3, 1]。BOOM!有bug!改了半天,没找到bug在哪。我又去google搜”solidity insertion sort”,然后发现网上用solidity写的插入算法教程都是错的,比如:Sorting in Solidity without Comparison

Remix decoded output 出现错误内容
10-1.jpg

正确的solidity插入排序

花了几个小时,在Dapp-Learning社群一个朋友的帮助下,终于找到了bug所在。solidity中最常用的变量类型是uint,也就是正整数,取到负值的话,会报underflow错误。而在插入算法中,变量j有可能会取到-1,引起报错。

这里,我们需要把j加1,让它无法取到负值。正确代码:

    // 插入排序 正确版
    function insertionSort(uint[] memory a) public pure returns(uint[] memory) {
        // note that uint can not take negative value
        for (uint i = 1;i < a.length;i++){
            uint temp = a[i];
            uint j=i;
            while( (j >= 1) && (temp < a[j-1])){
                a[j] = a[j-1];
                j--;
            }
            a[j] = temp;
        }
        return(a);
    }

运行后的结果:

"输入[2,5,3,1] 输出[1,2,3,5]
"

总结

这一讲,我们介绍了solidity中控制流,并且用solidity写了插入排序。看起来很简单,但实际很难。这就是solidity,坑很多,每个月都有项目因为这些小bug损失几千万甚至上亿美元。掌握好基础,不断练习,才能写出更好的solidity代码。

在这里插入图片描述

如果这份博客对大家有帮助,希望各位给作者一个免费的点赞👍作为鼓励,并评论收藏一下⭐,谢谢大家!!!
制作不易,如果大家有什么疑问或给作者的意见,欢迎评论区留言。

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

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

相关文章

python中的NaN在质量控制中怎么处理?

一、数据中的缺省值 气象数据中经常存在缺省值&#xff0c;比如未入库的站点数据、比如海温格点实况数据中的陆地区域。这些缺省值往往被赋予NaN&#xff08;Not a Number&#xff0c;非数&#xff09;。NaN是计算机科学中数值数据类型的一类值&#xff0c;表示未定义或不可表…

远程端点管理和安全性

当今的企业网络环境是一个分布式动态环境&#xff0c;其中有许多需要管理、验证和保护的移动部件&#xff0c;而不会对最终用户的生产力产生任何威慑力。提供有效的端点管理安全性&#xff0c;同时仍提供无缝最终用户体验的解决方案至关重要。 Endpoint Central 执行的活动可确…

Linux高性能服务器编程 学习笔记 第六章 高级IO函数

pipe函数用于创建一个管道&#xff0c;以实现进程间通信&#xff1a; fd参数是一个包含两个int的数组。该函数成功时返回0&#xff0c;并将一对打开的文件描述符填入其参数指向的数组&#xff0c;如果失败&#xff0c;则返回-1并设置errno。 pipe函数创建的这两个文件描述符f…

用Python爬取短视频列表

短视频是一款备受欢迎的短视频分享平台&#xff0c;每天都有大量精彩的视频内容等待我们去探索。在本文中&#xff0c;我们将分享如何使用Python爬取短视频的视频列表&#xff0c;让您能够发现更多有趣的视频。 一、安装必要的库 在开始之前&#xff0c;确保已安装以下库&…

Unity——对象池

对象池是一种朴素的优化思想。在遇到需要大量创建和销毁同类物体的情景时&#xff0c;可以考虑使用对象池技术优化游戏性能。 一、为什么要使用对象池 在很多类型的游戏中都会创建和销毁大量同样类型的物体。例如&#xff0c;飞行射击游戏中有大量子弹&#xff0c;某些动作游戏…

java用easyexcel按模版导出

首先在项目的resources下面建一个template包&#xff0c;之后在下面创建一个模版&#xff0c;模版格式如下&#xff1a; 名称为 financeReportBillStandardTemplateExcel.xlsx&#xff1a; {.fee}类型的属性值&#xff0c;是下面实体类的属性&#xff0c;要注意这里面的格式&a…

iPhone15拉胯,国产手机用折叠屏大反攻!

文 | 智能相对论 作者 | K星 iPhone偷懒式的15代机型发布&#xff0c;让市场大跌眼镜&#xff0c;虽然在莫名的宗教虔诚下依旧卖得很好&#xff0c;但苹果走下神坛之巅已经板上钉钉。 但是&#xff0c;苹果从最高处摔落&#xff0c;却依旧在神坛之上&#xff0c;iPhone15拉胯…

【STM32笔记】HAL库定时器捕获配置、操作及通用函数定义

【STM32笔记】HAL库定时器捕获配置、操作及通用函数定义 文章目录 定时器捕获设置输入捕获滤波器设置输入捕获极性设置输入捕获映射关系设置输入捕获分频器 定时器配置定时器捕获函数全局变量定时器回调和定时器捕获回调频率计算 附录&#xff1a;Cortex-M架构的SysTick系统定…

css自学框架之二级下拉菜单

下拉菜单是我们开发中最常见&#xff0c;最常用的&#xff0c;今天我们就自学二级下来菜单。首先看一下最终效果&#xff1a; 一、css代码 .arrow-down::before {content: ""; width: 10px;height: 10px;border: solid ;border-width: 2px 2px 0 0;border-color: …

BIGEMAP在土地规划中的应用

工具 Bigemap gis office地图软件 BIGEMAP GIS Office-全能版 Bigemap APP_卫星地图APP_高清卫星地图APP 1.使用软件一般都用于套坐标&#xff0c;比如我们常见的&#xff08;kml shp CAD等土建规划图纸&#xff09;以及一些项目厂区红线&#xff0c;方便于项目选址和居民建…

软考复习 -- 计算机网络

1 网络互连设备 物理层&#xff1a;中继器和集线器&#xff08;多路中继器&#xff09;数据链路层&#xff1a;网桥和交换机&#xff08;多端口网桥&#xff09;网络层&#xff1a;路由器应用层&#xff1a;网关 2 广播域和冲突域 3 协议簇 4 网际层协议 4 TCP和UDP 4.1 TC…

零基础学前端(五)HTML+CSS实战:模仿百度网站首页

1. 该篇适用于从零基础学习前端的小白 2. 初学者不懂代码得含义也要坚持模仿逐行敲代码&#xff0c;以身体感悟带动头脑去理解新知识 一、实战&#xff1a;将百度网站首页补全 上一篇零基础学前端&#xff08;三&#xff09;重点讲解 HTML-CSDN博客我们已经将顶部两侧内容已经…

人机交互——对话管理

​人机交互中的对话管理主要是指在人机交互过程中&#xff0c;对交互的对话内容和流程进行管理&#xff0c;以实现自然、流畅、高效的交互效果。对话管理包括对话状态追踪、对话策略优化等多个方面。 对话状态追踪是指对当前对话的状态进行跟踪&#xff0c;例如对用户输入的语…

Observability:检测 OpenTelemetry 的推荐指南

作者&#xff1a;Bahubali Shetti OpenTelemetry (OTel) 正在稳步获得广泛的行业采用。 作为主要的云原生计算基金会 (CNCF) 项目之一&#xff0c;其提交数量与 Kubernetes 一样多&#xff0c;它正在获得主要 ISV 和云提供商的支持&#xff0c;为该框架提供支持。 许多来自金融…

ChatGLM GPT原理介绍

图解GPT 除了BERT以外,另一个预训练模型GPT也给NLP领域带来了不少轰动,本节也对GPT做一个详细的讲解。 OpenAI提出的GPT-2模型(https://openai.com/blog/better-language-models/) 能够写出连贯并且高质量的文章,比之前语言模型效果好很多。GPT-2是基于Transformer搭建的,相…

【校招VIP】前端JS之深拷贝和浅拷贝

考点介绍 js中的浅拷贝和深拷贝&#xff0c;只是针对复杂数据类型(Objcet&#xff0c;Array)的复制问题。简单来讲浅拷贝和深拷贝都可以实现在原有对象的基础上再生成一份的作用。但是根据新生成的对象能否影响到原对象可以分为浅拷贝和深拷贝。 前端JS之深拷贝和浅拷贝-相关题…

ArcGIS 10.3软件安装包下载及安装教程!

【软件名称】&#xff1a;ArcGIS 10.3 【安装环境】&#xff1a;Windows 【下载链接 】&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1K5ab7IHMYa23HpmuPkFa1A 提取码&#xff1a;oxbb 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 软件解压码点击原文…

Flink--4、DateStream API(执行环境、源算子、基本转换算子)

星光下的赶路人star的个人主页 注意力的集中&#xff0c;意象的孤立绝缘&#xff0c;便是美感的态度的最大特点 文章目录 1、DataStream API1.1 执行环境&#xff08;Execution Environment&#xff09;1.1.1 创建执行环境 1.2 执行模式&#xff08;Execution Mode&#xff09;…

安装gpu版本的paddle

安装gpu版本的paddle python -m pip install paddlepaddle-gpu2.3.2.post111 -f https://www.paddlepaddle.org.cn/whl/windows/mkl/avx/stable.html以上支持cuda11.1版本 其他需求可查阅文档在这里

redis如何清空当前缓存和所有缓存

Windows环境下使用命令行进行redis缓存清理 redis安装目录下输入cmdredis-cli -p 端口号flushdb 清除当前数据库缓存flushall 清除整个redis所有缓存keys * 查看所有key值del key 删除指定索引的值 注意&#xff1a; 我们清空缓存的时候&#xff0c;需要确保redis-…