1.7 For迴圈, While迴圈 + 4小練習

閱讀時間約 9 分鐘
forLoop, WhileLoop

forLoop, WhileLoop

ForLoop

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract ArtAuction {
mapping(uint => uint) public artworks;
uint public constant NUM_ARTWORKS = 5;

constructor() {
// 初始化畫作和價格
for (uint i = 0; i < NUM_ARTWORKS; i++) {
artworks[i] = (i + 1) * 100; // 價格為畫作編號乘以 100
}
}

function buyArtworks(uint[] memory _artworkIds) public payable {
require(_artworkIds.length > 0, "At least one artwork must be purchased");
uint totalCost = 0;
for (uint i = 0; i < _artworkIds.length; i++) {
uint artworkId = _artworkIds[i];
require(artworkId < NUM_ARTWORKS, "Invalid artwork ID");

totalCost += artworks[artworkId];
artworks[artworkId] = 0; // 購買後將畫作庫存設為 0
}
require(msg.value >= totalCost, "Insufficient funds");

// 購買成功,執行轉帳等操作
}
}

WhileLoop

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract ArtAuction {
mapping(uint => uint) public artworks;
uint public constant NUM_ARTWORKS = 5;

constructor() {
// 初始化畫作和價格
uint i = 0;
while (i < NUM_ARTWORKS) {
artworks[i] = (i + 1) * 100; // 價格為畫作編號乘以 100
i++;
}
}

function buyArtworks(uint[] memory _artworkIds) public payable {
require(_artworkIds.length > 0, "At least one artwork must be purchased");
uint totalCost = 0;
uint i = 0;
while (i < _artworkIds.length) {
uint artworkId = _artworkIds[i];
require(artworkId < NUM_ARTWORKS, "Invalid artwork ID");

totalCost += artworks[artworkId];
artworks[artworkId] = 0; // 購買後將畫作庫存設為 0
i++;
}
require(msg.value >= totalCost, "Insufficient funds");

// 購買成功,執行轉帳等操作
}
}
  • 有一個智能合約 ArtAuction 用於小朋友的義賣活動。
  • 每幅畫作有一個價格,小朋友爸媽可以購買畫作,直到庫存用完為止。
  • 我們需要編寫一個函式,允許小朋友爸媽購買一個或多個畫作。
  • for 迴圈和 while 迴圈都用於初始化畫作和價格,以及在購買畫作時遍歷 _artworkIds 陣列。

[4小練習]

練習題 1 (這題沒有很懂, 暫時跳過)

    • 如何寫出一個可以跑十次迴圈的函數,每次將一輸入的整數 + 1,計算 uint a = 10 經過迴圈的計算結果。
// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;

contract loop {
uint public a = 10;
function ForLoop() public {
for(uint i = 0; i < 10; i++) {
a++;
}
}
}


練習題 2

    • 如何寫出一個可以判斷奇數的函數?
// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;

contract oddNum {
function isOddNumber(uint _number) public view returns(bool) {
return (_number % 2 != 0 ? true : false);
}
}
raw-image

練習題 3 (不懂為什麼是 3000 * 10 * 18)

    • 小明賣水果,已知水果一斤 3 ether,如何寫出一個函式 sell() 每次執行可以賣出一斤水果以及一個函式 profit() 計算當前賺了多少 wei?
// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;

contract accountBalance {
uint amount = 0;
uint public Profit = 0;
function sell() public {
amount++;
}
function profit() public {
Profit = amount * 3000 * (10 **18);
}
}
  1. function sell() public { ... }: 此函式名為 sell,是一個公開(public)的函式,沒有參數。每次執行此函式,amount 變數的值會增加 1,代表賣出了一斤水果。
  2. function profit() public { ... }: 此函式名為 profit,是一個公開(public)的函式,沒有參數。當執行此函式時,會計算當前的利潤,利潤的計算方式是將 amount 變數乘以 3000(代表一斤水果的價格,以 wei 為單位)再乘以 10 的 18 次方(將結果轉換為 wei)。最後,將計算結果存儲在 Profit 變數中


練習題 4

    • 如何寫出一個函數可以讀取 Operation:add、sub,並且回傳 1+1 分別經過 +、- 兩種運算的結果。
// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;

contract String {
int public answer = 10;
function Operator(string memory operation) public {
if(keccak256(abi.encodePacked(operation)) == keccak256(abi.encodePacked("add"))){
answer = 1+1;
}
if(keccak256(abi.encodePacked(operation)) == keccak256(abi.encodePacked("sub"))){
answer = 1-1;
}
}
}
  • 函數參數string memory operation。這個參數是函數的輸入,用於指定要進行的數學運算。memory關鍵字表示這個參數是在內存中分配的,不會影響合約的永久存儲。
  • 運算判斷:使用keccak256(abi.encodePacked(operation))來對輸入的操作進行哈希處理,以確保無論操作是大寫還是小寫,都能正確識別。這裡使用了keccak256函數來生成哈希值,因為它是Solidity中可用的哈希函數之一。

[Reference]

  1. Solidity 教學: 流程控制 Selection and Repetition,  KryptoCamp - 智能合約教學與區塊鏈工程師課程
    尋大神腳印, 亦步亦趨。
    留言0
    查看全部
    發表第一個留言支持創作者!
    // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract GiftShop { mapping(address => uint) public loyaltyPoints; mapping(string =>
    // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract TuitionPayment { address public school; uint public tuitionFee; mapping(
    // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract SchoolGreetings { address public principal; event GreetingReceived(string g
    一個智能合約,名為 UniformShop,它用於販售學校制服。 我們希望合約在收到以太幣後自動處理購買制服的操作。 UniformShop 合約定義了一個 fallback 函式,用於接收以太幣並購買制服。 當有人向合約地址轉帳時,如果轉帳金額足夠支付制服的價格,則 fallback 函式將
    try-catch 語句用於處理外部函數調用或合約創建過程中可能發生的錯誤 以下是一個使用小朋友睡著作為例子的簡單程式碼 // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract Child { bool publ
    // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract GiftShop { mapping(address => uint) public loyaltyPoints; mapping(string =>
    // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract TuitionPayment { address public school; uint public tuitionFee; mapping(
    // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract SchoolGreetings { address public principal; event GreetingReceived(string g
    一個智能合約,名為 UniformShop,它用於販售學校制服。 我們希望合約在收到以太幣後自動處理購買制服的操作。 UniformShop 合約定義了一個 fallback 函式,用於接收以太幣並購買制服。 當有人向合約地址轉帳時,如果轉帳金額足夠支付制服的價格,則 fallback 函式將
    try-catch 語句用於處理外部函數調用或合約創建過程中可能發生的錯誤 以下是一個使用小朋友睡著作為例子的簡單程式碼 // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract Child { bool publ
    你可能也想看
    Google News 追蹤
    Thumbnail
    這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
    Thumbnail
    11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
    Thumbnail
    Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
    Thumbnail
    友人Chinyi給了我五個錄音檔,是她在台灣西海岸小鎮以磁帶錄音機採集來的。Branches(Bernoulli Gate)是我最近喜歡使用的小工具之一,它可以把聲音轉變成隨機的gates,將它們送進Ripples(Liquid Filter)這類Filter之後就可以創造出與音源截然不同卻又彼此關
    Thumbnail
    今天就比較沒事了,早上先帶家裡的文鳥看醫生,然後去新家巡水田。
    Thumbnail
    1/5 今日加權指數開盤往上走一小段之後就往下,在平盤附近震盪,振幅111點,收一根小黑K,收17519,成交量縮2697億。 1/5 今日otc開高走高之後撐在高檔震盪,上漲1.17點,收小紅K,收230.61,成交量縮497.92億。 今天三大法人,外資賣超42億、投信買超51億、自營商
    Thumbnail
    關於人生,我確實知道:歐普拉的生命智慧 What I Know for Sure 作者:歐普拉.溫弗蕾 Oprah G. Winfrey 分類:自我成長 書說什麼? 我想什麼! 不想面對的事,終究會在你脆弱時強迫你去突破! 那些無法放下,完全沒有因為時間慢慢流逝而慢慢淡化, 推薦
    Thumbnail
    不知道大家在學習日文時,或在日本旅遊時, 有沒有看過又像文字又像符號的「々」與「ヶ」? 到底怎麼唸?到底是什麼意思? 是文字?是符號?是火星文? 還是有什麼意涵呢? 今天來問問我的日本同事,一解我多年疑惑
    Thumbnail
    2015年,六月六號。 「Hallo, Ich bin ein sexy einhorn! (哈囉,我是一隻性感的獨角獸!)」 「......」空氣瞬間凝結,時空好像暫停一樣,沒有人出聲音。然後他愣了幾秒後露出又驚訝又疑惑又尷尬的笑容,似乎不知道要接下什麼話,我心想是不是我發音有問題。
    無內疚的消費 在上一節討論了銀行的戶頭規劃,在這一節裡面輕鬆討論一下其他注意的事項,不要忘記即便是想要積極理財,也不要忘記你是人不是機器,要注意到人性化的部分。  一般上班族每天所需要面對的不外乎的固定成本像是居住的租金、水電費、一些債務如學貸、信貸。可能光生活費的部分就占了收入的50%,另外投資1
    Thumbnail
    這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
    Thumbnail
    11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
    Thumbnail
    Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
    Thumbnail
    友人Chinyi給了我五個錄音檔,是她在台灣西海岸小鎮以磁帶錄音機採集來的。Branches(Bernoulli Gate)是我最近喜歡使用的小工具之一,它可以把聲音轉變成隨機的gates,將它們送進Ripples(Liquid Filter)這類Filter之後就可以創造出與音源截然不同卻又彼此關
    Thumbnail
    今天就比較沒事了,早上先帶家裡的文鳥看醫生,然後去新家巡水田。
    Thumbnail
    1/5 今日加權指數開盤往上走一小段之後就往下,在平盤附近震盪,振幅111點,收一根小黑K,收17519,成交量縮2697億。 1/5 今日otc開高走高之後撐在高檔震盪,上漲1.17點,收小紅K,收230.61,成交量縮497.92億。 今天三大法人,外資賣超42億、投信買超51億、自營商
    Thumbnail
    關於人生,我確實知道:歐普拉的生命智慧 What I Know for Sure 作者:歐普拉.溫弗蕾 Oprah G. Winfrey 分類:自我成長 書說什麼? 我想什麼! 不想面對的事,終究會在你脆弱時強迫你去突破! 那些無法放下,完全沒有因為時間慢慢流逝而慢慢淡化, 推薦
    Thumbnail
    不知道大家在學習日文時,或在日本旅遊時, 有沒有看過又像文字又像符號的「々」與「ヶ」? 到底怎麼唸?到底是什麼意思? 是文字?是符號?是火星文? 還是有什麼意涵呢? 今天來問問我的日本同事,一解我多年疑惑
    Thumbnail
    2015年,六月六號。 「Hallo, Ich bin ein sexy einhorn! (哈囉,我是一隻性感的獨角獸!)」 「......」空氣瞬間凝結,時空好像暫停一樣,沒有人出聲音。然後他愣了幾秒後露出又驚訝又疑惑又尷尬的笑容,似乎不知道要接下什麼話,我心想是不是我發音有問題。
    無內疚的消費 在上一節討論了銀行的戶頭規劃,在這一節裡面輕鬆討論一下其他注意的事項,不要忘記即便是想要積極理財,也不要忘記你是人不是機器,要注意到人性化的部分。  一般上班族每天所需要面對的不外乎的固定成本像是居住的租金、水電費、一些債務如學貸、信貸。可能光生活費的部分就占了收入的50%,另外投資1