Solidity 小白教程:10. 控制流,用 solidity 实现插入排序

news2024/10/1 9:42:48

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)是最简单的一种排序算法,也是很多人学习的第一个算法。它的思路很简单,从前往后,依次将每一个数和排在他前面的数字比大小,如果比前面的数字小,就互换位置。示意图:

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 出现错误内容
image.png

正确的 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);
    }

运行后的结果:

总结

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

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

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

相关文章

系统架构设计师(第二版)学习笔记----计算机系统基础

【原文链接】系统架构设计师&#xff08;第二版&#xff09;学习笔记----计算机系统基础 文章目录 一、计算机硬件1.1 计算机硬件的组成1.2 处理器指令集1.3 处理器层次1.4 总线分类1.5 接口的种类 二、计算机操作系统2.1 计算机软件分类2.2 操作系统的作用2.3 操作系统的特征2…

【FusionInsight 迁移】HBase从C50迁移到6.5.1(01)迁移概述

【FusionInsight 迁移】HBase从C50迁移到6.5.1&#xff08;01&#xff09;迁移概述 HBase从C50迁移到6.5.1&#xff08;01&#xff09;迁移概述迁移范围迁移前的准备HDFS文件检查确认HBase迁移目录确保数据落盘停止老集群HBase服务停止新集群HBase服务 HBase从C50迁移到6.5.1&a…

L1-063 吃鱼还是吃肉(Python实现) 测试点全过

前言&#xff1a; {\color{Blue}前言&#xff1a;} 前言&#xff1a; 本系列题使用的是&#xff0c;“PTA中的团体程序设计天梯赛——练习集”的题库&#xff0c;难度有L1、L2、L3三个等级&#xff0c;分别对应团体程序设计天梯赛的三个难度。更新取决于题目的难度&#xff0c;…

如何在opensuse build service (obs)打包deb包用于分发各个发行版

1.打开网页 https://build.opensuse.org/ 注册账号 创建home project 创建项目 需要配置需要打包的镜像如debian12 ubuntu等 先配置整体home仓库的全部 ​由于是home的&#xff0c;可能不同的项目有些不需要&#xff0c;可以在项目中禁用一些&#xff0c;再配置某个项目需要…

c语言 4.0

&#x1f482; 个人主页: 程序员爱摸鱼&#x1f91f; 版权: 本文由【程序员爱摸鱼】原创、在CSDN首发、需要转载请联系博主&#x1f4ac; 如果文章对你有帮助、欢迎关注点赞收藏(一键三连)哦&#x1f485; 想寻找共同成长的小伙伴&#xff0c;可以互粉哦 &#x1f4ac;文章目录…

如何用Python机器学习、深度学习提升气象、海洋、水文领域实践能力!!!

Python是功能强大、免费、开源&#xff0c;实现面向对象的编程语言&#xff0c;能够在不同操作系统和平台使用&#xff0c;简洁的语法和解释性语言使其成为理想的脚本语言。除了标准库&#xff0c;还有丰富的第三方库&#xff0c;Python在数据处理、科学计算、数学建模、数据挖…

测试用例设计方法真的很重要啊

记得我刚入职到部门的第一个星期&#xff0c;除了去熟悉公司部门的一些业务流程&#xff0c;就是去看我将要去测的系统的系统说明书&#xff0c;然后去熟悉各种业务流程&#xff0c;自己还是有点放不开&#xff0c;虽然之前也在一家公司实习过&#xff0c;主要是功能测试&#…

Apache HTTPD 多后缀解析漏洞复现

Apache HTTPD 支持一个文件拥有多个后缀&#xff0c;并为不同后缀执行不同的指令。比如&#xff0c;如下配置文件&#xff1a; AddType text/html .html AddLanguage zh-CN .cn 其给.html后缀增加了media-type&#xff0c;值为text/html&#xff1b;给.cn后缀增加了语言&…

vue 弹框中包含avue-curd /el-table第一次点击样式正常 再次点击表格序号列和其他列错位

1.首先这里点击时获取接口数据需要等数据返回之后再打开弹框 2.给表格使用v-if 参数就是和弹框的参数一样 弹框显示再重新渲染表格就OK了

超低保证金!揭秘期权卖方的保证金是多少?

很多期权老手交易一段时间后&#xff0c;开始对期权卖方有了兴趣。“对于期权卖方的保证金是一笔不低的费用&#xff0c;如果是在分仓平台注册的账户&#xff0c;保证金是固定在大概在3000-4000元一张了。下文介绍超低保证金&#xff01;揭秘期权卖方的保证金是多少&#xff1f…

LeetCode刷题笔记【23】:贪心算法专题-1(分发饼干、摆动序列、最大子序和)

文章目录 前置知识贪心算法的本质什么时候用贪心算法?什么时候不能用贪心?贪心算法的解题步骤 455.分发饼干题目描述解题思路代码 376. 摆动序列题目描述解题思路代码 53. 最大子序和题目描述暴力解法动态规划贪心算法 总结 前置知识 贪心算法的本质 贪心的本质是选择每一阶…

Android文字识别-阿里云OCR调用

0&#xff0c;阿里云OCR有在线识别接口&#xff0c;直接用httpPOST调用就能实现&#xff0c;开发起来很快捷。识别率还蛮好&#xff0c;摄像头斜着拍也能识别出来。实测识别时间单次在2s左右&#xff0c;普通使用使能满足需求的。 1&#xff0c;在阿里云页面先注册申请免费试用…

工作失误合集,这个月的工资被扣没咯!

俗话说“马有失蹄&#xff0c;人有失足”&#xff0c;不管是程序员还是其他行业&#xff0c;在工作的的时候即便是职场老手也有失手的时候。 工作中出现纰漏不可避免&#xff0c;但是总有那么些人秀的即使是工作出错&#xff0c;也错的惊为天人。今天就带大家来看看那些在工作…

C语言嵌入式系统编程注意事项之内存操作

C语言嵌入式系统编程注意事项之内存操作 在嵌入式系统的编程中&#xff0c;常常要求在特定的内存单元读写内容&#xff0c;汇编有对应的MOV指令&#xff0c;而除C/C以外的其它编程语言基本没有直接访问绝对地址的能力 数据指针 在嵌入式系统的编程中&#xff0c;常常要求在特…

04-JVM对象创建深度剖析

上一篇&#xff1a;03-JVM内存模型剖析与优化 对象创建的主要流程: 1.类加载检查 虚拟机遇到一条new指令时&#xff0c;首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有…

别看了!亚马逊选品工具全都在这儿了(上)

Tool哥翻遍了全网资料&#xff0c;找了30款亚马逊选品工具&#xff0c;几乎囊括了各种主流、小众的选品工具&#xff0c;而且会一直更新&#xff0c;直接收藏就完事儿了~ Amztracker AMZ Tracker&#xff08;抓客&#xff09;官网 | 亚马逊关键词|亚马逊选品数据分析工具|亚马…

vue2.X 中使用 echarts5.4.0实现项目进度甘特图

vue2.X 中使用 echarts5.4.0实现项目进度甘特图 效果图&#xff1a; 左侧都是名称&#xff0c;上面是时间&#xff0c;当中的内容是日志内容 组件&#xff1a; gantt.vue <template><div id"main" style"width: 100%; height: 100%"></…

Lumion 和 Enscape 应该选择怎样的笔记本电脑?

Lumion 和 Enscape实时渲染对配置要求高&#xff0c;本地配置不够&#xff0c;如何快速解决&#xff1a; 本地普通电脑可一键申请高性能工作站&#xff0c;资产安全保障&#xff0c;供软件中心&#xff0c;各种软件插件一键获取&#xff0c;且即开即用&#xff0c;使用灵活&am…

电力4G变倍云台摄像头低功耗测试对比

4G变倍云台摄像头是一种智能化的视频监控摄像头设备。具有4G无线通信和无线网络摄像头的功能&#xff0c;同时还集成了变焦、变倍、云台等多种功能&#xff0c;适用于各种场景的视频监控。 以下是主要的特点和功能&#xff1a; 支持4G无线网络通信&#xff0c;远距离实时监控&…

1.3 BEV开源数据集介绍

本文来自自动驾驶之心知识星球的国内首个BEV感知全栈系列学习教程 文章目录 BEV开源数据集介绍&#xff1a;KITTIBEV开源数据集介绍&#xff1a;nuScenesBEV开源数据集介绍&#xff1a;Waymo BEV开源数据集介绍&#xff1a;KITTI 传感器位置 KITTI数据怎么采集&#xff1f; 通…