contract abc {
struct Student {
string name;
uint number;
string[] classes;
}
Student[] Students;
//students 안에 정보 넣기
function setStudents(string memory _name, uint _number, string[] memory _classes) public {
Students.push(Student(_name, _number, _classes));
}
//n번째 학생을 알려주는 getStudent
function getStudents(uint _n) public view returns(Student memory) {
return Students[_n-1];
}
//n번째 학생의 이름만 받기 string
function getStudentsName(uint _n) public view returns(string memory) {
return Students[_n-1].name;
}
//선생님 - 학생들 정보
mapping(string => Student[]) Teacher_student;
//선생님 - 학생 or 학생들 연결 정보 넣는 함수
function setTeacher_student(string memory _Teacher, string memory _name, uint _number, string[] memory _classes) public {
Teacher_student[_Teacher].push(Student(_name, _number, _classes));
}
//선생님반 안에 특정 학생의 번호를 바꾼다.(추가)
function set2(string memory _student1, uint _n, uint _number) public {
Teacher_student[_student1][_n-1].number = _number;
}
function getTeacher_student(string memory _Teacher) public view returns(Student[] memory) {
return Teacher_student[_Teacher];
}
}
array와 mapping을 사용해 학생의 정보 또는 선생님의 대리고있는 학생들의 정보를 가져올 수 있는 코드.
복습은 반복뿐!!!!!
contract IF {
// 점수가 50점이상이면 P, 아니면 F
function setGrade(uint _score) public pure returns(string memory) {
if(_score >=50) { /*if(조건문), <- 이번 경우는 _score가 50보다 높을 때*/
return "P";
} else {
return "F";
}
}
// 점수가 70점이상이면 A, 50점 이상이면 B, 아니면 C반
function setGrade2(uint _score) public pure returns(string memory) {
if(_score >=70) {
return "A";
} else if(_score >=50) {
return "B";
} else {
return "C";
}
}
// 짝수면 even array에, 홀수면 odd array에 넣기
uint[] even;
uint[] odd;
function evenOrOdd(uint _n) public {
if(_n%2==0) {
even.push(_n);
} else {
odd.push(_n);
}
}
function getEvenAndOdd() public view returns(uint[] memory, uint[] memory) {
return (odd, even);
}
// 3으로 나누었을 때, 나머지가 1이면 A, 2이면 B, 0이면 C
uint[] A;
uint[] B;
uint[] C;
function ternary(uint _n) public {
if(_n%3==1) {
A.push(_n);
} else if(_n%3==2) {
B.push(_n);
} else {
C.push(_n);
}
}
}
"이 점수는 몇 학점이야" 라고 묻고싶기 때문에 input값이 있다.
상태변수 없이 지역변수를 사용하기 때문에 pure를 사용한다.
output값은 문자형으로 보여주기 때문에 string memory를 사용한다.
if문을 사용해 조건을 작성하고 조건에 부합하면 "pass", 조건에 부합하지 않으면 else에 "False"이 실행되도록 한다.
값을 넣어주기 위해 input값이 필요.
pure를 사용하면 상태변수를 변화시키기 때문에 사용하지 않음.
값을 넣을것이기 때문에 output값이 필요없음.
/ 는 몫이 나오고, % 는 나머지가 나온다.
위 문제와 같다.
default 값을 처리할때 else를 사용한다.
contract IF {
struct student {
uint number;
string name;
uint score;
string credit;
}
student a;
student b;
student c;
student[] Students;
/*
1. 1, Alice, 90 -> setA()
2. 2, Bob, 75 -> setB()
3. 3. Charlie, 85 -> setC()
*/
// 학생 정보 중 번호, 이름, 점수만 입력하면 학점은 자동 계산해 주는 함수
// 점수가 90점 이상이면 A, 80점 이상이면 B, 70점 이상이면 C, 나머지는 F
function setA(uint _number, string memory _name, uint _score) public {
string memory _credit;
if(_score>=90) {
_credit = 'A';
} else if(_score >=80) {
_credit = 'B';
} else if(_score >=70) {
_credit = 'C';
} else {
_credit = 'F';
}
a = student(_number, _name, _score, _credit);
}
function setB(uint _number, string memory _name, uint _score) public {
string memory _credit;
if(_score>=90) {
_credit = 'A';
} else if(_score >=80) {
_credit = 'B';
} else if(_score >=70) {
_credit = 'C';
} else {
_credit = 'F';
}
b = student(_number, _name, _score, _credit);
}
function setC(uint _number, string memory _name, uint _score) public {
string memory _credit;
if(_score>=90) {
_credit = 'A';
} else if(_score >=80) {
_credit = 'B';
} else if(_score >=70) {
_credit = 'C';
} else {
_credit = 'F';
}
c = student(_number, _name, _score, _credit);
}
function getStudentsABC() public view returns(student memory, student memory, student memory) {
return (a, b, c);
}
function pushStudent(uint _number, string memory _name, uint _score) public {
string memory _credit;
if(_score>=90) {
_credit = 'A';
} else if(_score >=80) {
_credit = 'B';
} else if(_score >=70) {
_credit = 'C';
} else {
_credit = 'F';
}
Students.push(student(_number, _name, _score, _credit));
}
// 요녀석이 깔끔한 버전. 이걸 사용하면 위에 내용을 지울 수 있음.
function getStudents2(uint _number, string memory _name, uint _score) public {
Students.push(student(_number, _name, _score, setGrade(_score)));
}
function getStudents() public view returns(student[] memory) {
return Students;
}
function setGrade(uint _score) public pure returns(string memory) {
if(_score>=90) {
return 'A';
} else if(_score >=80) {
return 'B';
} else if(_score >=70) {
return 'C';
} else {
return 'F';
}
}
}
인풋값 4개가 필요한데 3개만 넣고 나머지 하나는 자동으로 만들어지도록 하는 코드를 만들어 보려고 함.
썼다가 날릴것이기 때문에 string memory _creadit;을 지역변수 밖에 작성해준다.
output값이 없기 때문에 return을 쓰지않고, _creadit을 써준다.
마찬가지로 setB, setC도 만들어준다.
//조건이 2개인 경우의 If문.
contract IF2 {
// 50 이상이거나 10보다 작으면 -> or
// 50 이상이고, 3의 배수이면 -> and ("3의배수는 3으로 나눴을때 0이다." 로 표현하면됨)
function setNumber(uint _n) public pure returns(string memory) {
if(_n>=70 || _n<=10) { // or -> ||
return "A";
} else if(_n>=50 && _n%3==0) {
return "B";
} else {
return "C";
}
}
}
or = 둘 중 하나만 성립해도 된다.(이거 또는 이거)
and = 둘 다 성립해야 된다.(이거 그리고 이거)
"_n%3==0 "= 3의배수는 3으로 나눴을때 0이다.라고 표현하면 된다.
여기서 기존 코드에 아쉬운 부분이 있었는데 if문 첫번째 부분에 _n>=50 으로 작성되어 있었음.
// ENUM = 열거형
contract ENUM {
// enum 변수명 안에 새로운 상태를 넣는것은 힘듦.
enum Food { //enum 변수명 {변수1, 변수2, 변수3, 변수4}
Chicken,
Suish,
Bread,
Coconut
}
Food a; // Food형 변수 a
Food b; // Food형 변수 b
Food c;
function setA() public {
a = Food.Chicken;
}
function setB() public {
b = Food.Suish;
}
function setC() public {
c = Food.Bread;
}
function getABC() public view returns(Food, Food, Food) {
return (a,b,c);
}
//uint8과 형변환 가능
function getABC2() public view returns(uint8, uint8, uint8) {
return (uint8(a),uint8(b),uint8(c));
}
}
자동차로 ENUM에 대한 강사님의 비유.
위 내용을 바탕으로 나중에 펀딩 관련 프로젝트를 만들게 된다고 가정했을 때
또 다른 예시로 게임케릭터가 있다고 가정했을 때 케릭터가 무기나 장신구를 착용할 수 있다고 하면 상황에 따라 무기나 장신구를 바꿀 수 있는데 바뀌는 과정을 참고할 수 있도록 할 때 ENUM형 사용.
변수 안에 값을 넣어주고 싶을때 " 변수명.변수; " 를 입력해준다.
uint8은 16진수 기준 2자리.
ENUM은 문자가 들어가서 숫자로 나온다.
contract ENUM2 {
enum color {
red, // 0으로 저장
yellow, //1로 저장
green,
blue,
purple,
rainbow
}
color c;
function setC() public {
c = color.red;
}
function setC2(uint _n) public {
c = color(_n);
}
function getC() public view returns(color) {
return c;
}
}
contract ENUM3 {
enum Status {
neutral,
high,
low
}
Status st;
uint a=5;
function higher() public {
a++;
setA();
}
function lower() public {
a--;
setA();
}
function setA() public {
if(a >= 7) {
st = Status.high;
} else if(a<= 3) {
st = Status.low;
} else {
st = Status.neutral;
}
}
function getA() public view returns(uint) {
return a;
}
function getST() public view returns(Status) {
return st;
}
}
하나는 값을 올리고 하나는 값을 내린다는 기준으로 시작.
특정한 값을 넣으면 high인 상태로 특정한 값보다 낮으면 low 상태로 만든다.
neutral 상태
high 상태
low 상태
- array 같은 경우, 우리가 필요한 것들을 한곳에 모아뒀다가 해체도 시키는것이 array의 역할.
- ENUM 같은 경우, 기존에 변하지 않는 규칙을 설정해놓고 그 규칙에 따라서 상태를 변화시켜줘야 할때 사용.
contract BOOL {
bool isFun;
function getVar() public view returns(bool) {
return isFun;
}
function Fun() public {
isFun = true;
}
function notFun() public {
isFun = false;
}
function funtoNotFunToFun() public {
isFun = !isFun;
}
function Fun(bool _a) public {
isFun = _a;
}
}
BOOL- 기냐 아니냐.(true or false로만 관리됨.)
기본적으로 아무 값이 없을때는 false가 뜬다.
둘 중 하나 뭔가 값이 들어가면 일단 true가 뜬다.
오늘은 4시부터 새로운 아기사자를 했다. 새로운 아기사자의 멘토님은 지난번과 똑같이 은찬매니저님이 해주셨다! 내일 우리가 테스트가 있기 때문에 한시간은 서로 이런저런 이야기도 하고 한시간은 테스트를 위해 모의고사를 해주셨다. 생각보다 막상 혼자 할때랑 다르게 허둥지둥하게 되고 풀지 못하는 부분들도 있어서 많이 당황스러웠다. 역시 계속적으로 반복하는게 필요할 것 같다.