Solidity 기본 문제풀이

심재원·2023년 12월 26일
0

0. 첫 코딩 테스트

// SPDX-License-Identifier: MIT
pragma solidity >=0.8.2 <0.9.0;

contract STUDENTMANAGEMENT {
    // 학생정보는 이름, 번호, 점수, 학점 그리고 듣는 수업들이 포함됨
    struct Student {
        string name;
        uint number;
        uint score;
        string grade;
        string[] classes;
    }

    mapping(uint256 => Student) public students;

    // 번호는 1번부터 시작하여 정보를 기입하는 순으로 순차적으로 증가함
    function getStudentsByNumbers(uint256[] memory _numbers) public view returns (Student[] memory) {
        Student[] memory studentList = new Student[](_numbers.length);
        for (uint256 i = 0; i < _numbers.length; i++) {
            studentList[i] = students[_numbers[i]];
        }
        return studentList;
    }
    // 학점은 90점 이상 A, 80점 이상 B, 70점 이상 C, 60점 이상 D, 나머지는 F
    function calculateGrade(uint256 _score) public pure returns (string memory) {
        if (_score >= 90) {
            return "A";
        } else if (_score >= 80) {
            return "B";
        } else if (_score >= 70) {
            return "C";
        } else if (_score >= 60) {
            return "D";
        } else {
            return "F";
        }
    }

    // * 학생 추가 기능 - 특정 학생의 정보를 추가
    // * 학생 조회 기능(1) - 특정 학생의 번호를 입력하면 그 학생 전체 정보를 반환
    // * 학생 조회 기능(2) - 특정 학생의 이름을 입력하면 그 학생 전체 정보를 반환
    // * 학생 점수 조회 기능 - 특정 학생의 이름을 입력하면 그 학생의 점수를 반환
    // * 학생 전체 숫자 조회 기능 - 현재 등록된 학생들의 숫자를 반환
    // * 학생 전체 정보 조회 기능 - 현재 등록된 모든 학생들의 정보를 반환
    // * 학생들의 전체 평균 점수 계산 기능 - 학생들의 전체 평균 점수를 반환
    // * 선생 지도 자격 자가 평가 시스템 - 학생들의 평균 점수가 70점 이상이면 true, 아니면 false를 반환
    // * 보충반 조회 기능 - F 학점을 받은 학생들의 숫자와 그 전체 정보를 반환
    // * S반 조회 기능 - 가장 점수가 높은 학생 4명을 S반으로 설정하는데, 이 학생들의 전체 정보를 반환하는 기능 (S반은 4명으로 한정)
    

}
  • Solidity
    • 문제
      • 기초 문제
        • 1 ~ 10

1. 더하기, 빼기, 곱하기, 나누기 그리고 제곱을 반환받는 계산기를 만드세요

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.15;

contract Q1 {
    function add(uint _a, uint _b) public pure returns(uint) {
        return _a + _b;
    }

    function sub(int _a, int _b) public pure returns(int) {
        return _a - _b;
    }

    function mul(uint _a, uint _b) public pure returns(uint) {
        return _a * _b;
    }

    function div(uint _a, uint _b) public pure returns(uint, uint) {
        return (_a/_b, _a%_b);
    }

    function sqr(uint _a) public pure returns(uint) {
        return _a**2;
    }
}

가스비는 고객들이 내는 것. 같은 기능을 해도 가스비가 싼 곳으로 고객이 몰려갈 것

uint에서 int로 변환이 안 됨. uint-uint가 계산해서 Int가 나오는 것을 안 받아줌. 그래서 둘 다 Int를 넣은 것!

.

2. 2개의 Input값을 가지고 1개의 output값을 가지는 4개의 함수를 만드시오. 각각의 함수는 더하기, 빼기, 곱하기, 나누기(몫)를 실행합니다.

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.15;

// 2개의 Input값을 가지고 1개의 output값을 가지는 4개의 함수를 만드시오. 
// 각각의 함수는 더하기, 빼기, 곱하기, 나누기(몫)를 실행합니다.

contract Q2 {
    function add(uint _a, uint _b) public pure returns(uint) {
        return _a + _b;
    }

    function sub(uint _a, uint _b) public pure returns(uint) {
        return _a-_b;
    }

    function mul(uint _a, uint _b) public pure returns(uint) {
        return _a*_b;
    }

    function div(uint _a, uint _b) public pure returns(uint) {
        return _a/_b;
    }
}

3. 1개의 Input값을 가지고 1개의 output값을 가지는 2개의 함수를 만드시오. 각각의 함수는 제곱, 세제곱을 반환합니다.

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.15;

contract Q3 {
    function sqr(uint _a) public pure returns(uint) {
        return _a**2;
    }

    function cube(uint _a) public pure returns(uint) {
        return _a**3;
    }
}

4. 이름(string), 번호(uint), 듣는 수업 목록(string[])을 담은 student라는 구조체를 만들고 그 구조체들을 관리할 수 있는 array, students를 선언하세요.

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.15;

// 이름(string), 번호(uint), 듣는 수업 목록(string[])을 담은 student라는 구조체를 만들고 
// 그 구조체들을 관리할 수 있는 array, students를 선언하세요.

contract Q4 {
    struct Student {
        string name;
        uint number;
        string[] classes;
    }

    Student[] students;

}

5. 아래의 함수를 만드세요

                1~3을 입력하면 입력한 수의 제곱을 반환받습니다.
                
                4~6을 입력하면 입력한 수의 2배를 반환받습니다.
                
                7~9를 입력하면 입력한 수를 3으로 나눈 나머지를 반환받습니다.
                
// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.15;

contract Q5 {
    function cal(uint _n) public pure returns(uint) {
        if(_n>=1 && _n<=3) {
            return n**2;
        } else if(_n>=4 && n<=6) {
            return _n*2;
        } else if(_n>=7 && _n<=9) {
            return _n%3;
        } else {
            return 99999999999999;
        }
    }
}

6. 숫자만 들어갈 수 있는 array numbers를 만들고 그 array안에 0부터 9까지 자동으로 채우는 함수를 구현하세요.(for 문)

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.15;

/*
숫자만 들어갈 수 있는 array numbers를 만들고 
그 array안에 0부터 9까지 자동으로 채우는 함수를 구현하세요.(for 문)
*/

contract Q6 {
    uint[] numbers;

    function pushNumbers() public {
        for(uint i=0; i<10; i++) {
            numbers.push(i);
        }
    }
}

7. 숫자만 들어갈 수 있는 array numbers를 만들고 그 array안에 0부터 5까지 자동으로 채우는 함수와 array안의 모든 숫자를 더한 값을 반환하는 함수를 각각 구현하세요.(for 문)

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.15;

contract Q7 {
    uint[] numbers;

    function pushNumbers() public {
        for(uint i=0; i<6; i++) {
            numbers.push(i);
        }
    }

     function sum() public view returns(uint) {
        uint _sum;
        for(uint i=0; i<numbers.length; i++) {
            _sum += numbers[i];
        }

        return _sum;
    }
}

8. 아래의 함수를 만드세요

                1~10을 입력하면 “A” 반환받습니다.
                
                11~20을 입력하면 “B” 반환받습니다.
                
                21~30을 입력하면 “C” 반환받습니다.
                
// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.15;

/*
아래의 함수를 만드세요

1~10을 입력하면 “A” 반환받습니다.

11~20을 입력하면 “B” 반환받습니다.

21~30을 입력하면 “C” 반환받습니다.
*/

contract Q8 {
    function getLetter(uint _n) public pure returns(string memory) {
        if(_n>=0 && _n<=10) {
            return "A";
        } else if(_n>=11 && _n<=20) {
            return "B";
        } else if(_n>=21 && _n<=30) {
            return "C";
        } else {
            return "X";
        }
    }
}

9. 문자형을 입력하면 bytes 형으로 변환하여 반환하는 함수를 구현하세요.

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.15;

/*
문자형을 입력하면 bytes 형으로 변환하여 반환하는 함수를 구현하세요.
*/

contract Q9 {
    function stringToBytes(string memory _s) public pure returns(bytes memory) {
        return bytes(_s);
    }
}

10. 숫자만 들어가는 array numbers를 선언하고 숫자를 넣고(push), 빼고(pop), 특정 n번째 요소의 값을 볼 수 있는(get)함수를 구현하세요.

11 ~ 20

  1. uint 형이 들어가는 array를 선언하고, 짝수만 들어갈 수 있게 걸러주는 함수를 구현하세요.

  2. 숫자 3개를 더해주는 함수, 곱해주는 함수 그리고 순서에 따라서 a*b+c를 반환해주는 함수 3개를 각각 구현하세요.

  3. 3의 배수라면 “A”를, 나머지가 1이 있다면 “B”를, 나머지가 2가 있다면 “C”를 반환하는 함수를 구현하세요.

  4. 학번, 이름, 듣는 수험 목록을 포함한 학생 구조체를 선언하고 학생들을 관리할 수 있는 array를 구현하세요. array에 학생을 넣는 함수도 구현하는데 학생들의 학번은 1번부터 순서대로 2,3,4,5 자동 순차적으로 증가하는 기능도 같이 구현하세요.

  5. 배열 A를 선언하고 해당 배열에 0부터 n까지 자동으로 넣는 함수를 구현하세요.

  6. 숫자들만 들어갈 수 있는 array를 선언하고 해당 array에 숫자를 넣는 함수도 구현하세요. 또 array안의 모든 숫자의 합을 더하는 함수를 구현하세요.

  7. string을 input으로 받는 함수를 구현하세요. 이 함수는 true 혹은 false를 반환하는데 Bob이라는 이름이 들어왔을 때에만 true를 반환합니다.

  8. 이름을 검색하면 생일이 나올 수 있는 자료구조를 구현하세요. (매핑) 해당 자료구조에 정보를 넣는 함수, 정보를 볼 수 있는 함수도 구현하세요.

  9. 숫자를 넣으면 2배를 반환해주는 함수를 구현하세요. 단 숫자는 1000이상 넘으면 함수를 실행시키지 못하게 합니다.

  10. 숫자만 들어가는 배열을 선언하고 숫자를 넣는 함수를 구현하세요. 15개의 숫자가 들어가면 3의 배수 위치에 있는 숫자들을 초기화 시키는(3번째, 6번째, 9번째 등등) 함수를 구현하세요. (for 문 응용 → 약간 까다로움)

0개의 댓글