Skip to content

기글하드웨어기글하드웨어

커뮤니티 게시판 : 아주 기본적인 네티켓만 지킨다면 자유롭게 쓸 수 있는 커뮤니티 게시판입니다. 포럼에서 다루는 주제는 각각의 포럼 게시판을 우선 이용해 주시고, 민감한 소재는 비공개 게시판이나 수상한 게시판에, 홍보는 홍보/외부 사용기 게시판에 써 주세요. 질문은 포럼 게시판의 질문/토론 카테고리를 사용해 주세요.

profile
title: 컴맹임시닉네임 https://gigglehd.com/gg/14071973
"시간이 지나면 이통사 수입이 남으면 틀림없이 요금을 내릴 겁니다." - 오남석
조회 수 459 댓글 11

[잡담]

 

기글 하드웨어 레벨-포인트 변환기 만들어보기 https://gigglehd.com/gg/bbs/11288658

만든다고 끝이 아니고 왜 이런지 설명할 줄 알아야 한다고 생각하기에 써 봅니다.

107.png

108.png

 

0. 알고리즘 설계

기글 하드웨어의 레벨별 포인트는 https://gigglehd.com/gg/pointrank 에서 확인 가능합니다. 1 레벨은 3 포인트, 100 레벨은 200000 포인트 이상이 있어야 하며 3 포인트 미만은 0 레벨이 됩니다.

레벨을 의미하는 자연수 n이 2보다 크고 99보다 작을 때 필요 포인트는 (n^2)*10입니다.

자연수 n(2 이상 98 이하) 레벨의 회원이 가질 수 있는 최대 포인트 값은 n+1 레벨의 필요 포인트에서 1을 빼면 되지만, 전 이 생각을 못 해서 다소 복잡하게 계산했습니다.

곱셈 공식에 의하여 (n+1)^2=n^2+2n+1입니다. 제곱이 이루어진 후 10을 곱하기 때문에 n^2+10*(2n+1)이 되어야 하므로, 다음 레벨 필요 포인트는 (현재레벨필요포인트)+20n+10이 됩니다. 해당 레벨의 포인트 최댓값은 여기서 1 빼야 하니 (현재레벨필요포인트)+20n+9입니다.

이제 예외 처리를 해야죠. 99 레벨 회원은 (99^2)*10에서 199999까지 포인트 값을 가지고, 100 레벨 회원은 200000 이상 값을 가집니다. 현재 유일한 100 레벨 회원이 50만 포인트가 안 되므로 최댓값을 임의로 200000*3=600000으로 잡았습니다. 1 레벨 회원은 3 이상 39(2*2*10-1) 이하, 0 레벨 회원은 0 이상 2 이하. 포인트는 음수 값이 없으므로 0 미만 600000 초과는 없는 값으로 취급하기로 결정했습니다.

포인트로 레벨을 얻고자 하는 경우, 일반적으로는 10으로 나눈 뒤 제곱근을 구하고 소수 첫째 자리 버림하면 됩니다. 예외로 0~2 포인트는 0 레벨, 3~39 포인트는 1 레벨, 99^2~199999 포인트는 99 레벨, 200000 포인트 이상은 100 레벨.

 

1. #include<stdio.h>

printf() scanf() 등의 함수 사용을 위해 stdio.h 헤더 파일을 불러왔습니다.

2. #define ever ;;

ever를 ;;로 대체합니다. for(;;)을 for(ever)로 쓰기 위함입니다.

3. include<math.h>

제곱근 연산을 하는 함수 sqrt() 사용을 위해 필요했습니다.

4. #define maxlv 200000

100 레벨이 되기 위한 최소 포인트입니다. 99 레벨과 100 레벨은 예외 처리 대상이므로 대체할 수 있게 했습니다. 100lv로 쓰고자 했는데 맨 앞에 숫자가 올 수 없는 것 같더군요.

 

5. int main(void){printf("lv to pt - 1, pt to lv - 2\n\a");

int main(void)가 표준이라더군요. int main(), void main() 전부 비표준이라고. 함수가 되돌리는 값이 없기 때문이라고 하더라고요. 지켜서 나쁠 것 없으니 지켜 줍니다.

어떤 값을 선택해야 내가 원하는 작업을 할 수 있는지 알려줘야 하니 printf() 하나 추가했습니다. 줄도 바꿔주고, 소리도 내 주고요.

6. for(ever){int select,input,result=0;float result2=0;

무한 반복 돌릴 것이니 초기식 조건식 증감식 모두 필요 없으므로 빈칸으로 둡니다. for(;;)로 써야 하나 2. 에 의해 ;;를 ever로 재정의했으므로 for(ever).

이어서 변수 선언합니다. 레벨 입력하면 포인트 범위를 출력하는 기능과 포인트 입력하면 레벨 출력하는 기능을 넣을 것이니 선택용, 입력값과 출력값용입니다. 제곱근 연산값은 실수로 넣어야 해서 출력값 변수는 2개를 선언했습니다. 선택값은 1과 2뿐이고 입력값은 정수뿐이므로 int로 선언.

정수 출력값도 필요하고, result를 선언하는 대신 select 재정의해서 활용해도 되긴 하지만 자원을 4 바이트 더 쓰기로 결정했습니다. 나중에 기능 추가할 때 result는 빼버리죠 뭐.

7. printf("Select - ");scanf("%d",&select);switch(select){

5. 에서 값 선택 안내를 했으니 선택하라고 하고, 선택값 표준입력으로 받고. switch()를 이용하여 분기를 만듭니다. 이용하는 값은 아까 표준입력받은 select.

 

8. case 1:printf("Input lv - ");scanf("%d",&input);

select가 1일 때 실행하는 부분입니다. 레벨 입력을 받아 input에 저장합니다.

9. result=10*pow(input,2);

해당 레벨의 최소 필요 포인트는 레벨을 제곱하고 10을 곱한 값입니다. pow()로 거듭제곱 처리.

10. switch(input){//input=level

레벨에 따라 처리하는 식이 달라집니다. 여기 한 줄에 20 분을 써서 주석 달아뒀습니다...

예외 처리부터 먼저 해 줍니다.

11. case 0:printf("%d lv is %d~%d pt(s)\n",input,0,3-1);break;

0 레벨은 0~2 포인트입니다. 2라는 값은 1레벨 최소 포인트에 1 빼서 얻었습니다. 1은 단수이므로 pt(s)로 표기합니다. 처리 끝.

12. case 1:printf("%d lv is %d~%d",input,3,40-1);break;

1 레벨은 3~39 포인트입니다. 39 얻어낸 과정은 마찬가지. pts는 나중에 처리하고, 처리 끝.

13. case 99:printf("%d lv is %d~%d",input,result,maxlv-1);break;

99 레벨의 최소 포인트 값은 98010으로 주어져 있으나 result에 들어 있으므로 그 값을 사용합니다. 최대 포인트 값은 199999이며, 4. 이용하여 서술했습니다. 처리 끝.

14. case 100:printf("%d lv is %d~",input,maxlv);break;

100 레벨은 최대값이므로 출력문이 조금 다릅니다.

15. default:if(input>1&&input<99)//2~98

아직 switch(input) 안입니다. input이 0, 1, 99, 100이 아닌데 1 초과면서 99 미만이라면. AND 연산. 주석대로 2~98 의미합니다. 가장 일반적인 경우겠지요.

16. printf("%d lv is %d~%d",input,result,result+20*input+9);

입력한 레벨, 해당 레벨의 포인트 최소값, 해당 레벨의 포인트 최대값. 왜 식이 저런지는 알고리즘 설계에 썼습니다. 지금 보니 9. 에 select=10*pow(input+1,2)-1; 추가하고 input,result,select); 해도 되지 싶네요.

17. else {printf("GiggleHD level is only 0~100");

else. input이 0, 1, 99, 100, 2~98 모두 아닐 때 여기가 실행됩니다. 기글 하드웨어의 회원 레벨 값은 0~100 사이 정수이며, 이를 안내하는 부분.

18. printf("\nplease input 0~100\a\n");break;}}

줄바꿈부터 하고, 0~100을 입력하라 안내하고 경고음 울리고 다시 줄바꿈. default:가 모두 끝났기에 break; 넣고, else 닫고, switch(input) 닫아 줍니다.

19. if(input>0&&input<101)printf(" pts\n");//1~100lv, pt"s"

input이 0 초과면서 101 미만이라면. AND 연산. 1~100 의미합니다. 1~100 레벨 포인트 출력 후 빼먹은 단위를 채우고 줄바꿈 마무리까지 해 줍니다.

 

20. break;case 2:printf("Input pt(s) - ");scanf("%d",&input);

case 1: 끝내고 case 2: 시작. 포인트 입력을 받아 input에 저장합니다.

이후에는 예외 처리를 합니다. 정상 값이 아님, 0/1/99/100 레벨에 해당하는 값들.

21. if(input<0||input>3*maxlv)printf("Invaild pts\a\n");

input이 0 미만이거나 600000 초과라면. OR 연산. 정상 값이 아니므로 틀렸다고 출력하고, 경고음 내고 줄바꿈.

22. else if(input<3)printf("%d pt is 0 lv.\n\a",input);//0 lv

0~2가 여기 걸리게 됩니다. 0 레벨에 해당.

23. else if(input<39)printf("%d pt is 1 lv.\n\a",input);//1 lv

3~39가 여기 걸리게 됩니다. 1 레벨에 해당.

24. else if(input>maxlv-1)printf("%d pt is 100 lv.\n\a",input);//100lv

99 레벨 처리를 위해 100 레벨부터 먼저 걸리게 만듭니다. maxlv-1 초과로 두어야 maxlv=200000이 들어왔을 때 걸리게 됩니다.

25. else if(input>98010-1&&input<maxlv)//98010~199999

99 레벨을 이제 처리합니다. 98010이 걸려야 하므로 98010-1 초과, maxlv부터 걸리면 안 되니 maxlv 미만. 어차피 바로 윗줄에서 걸려 나갔으니 AND 연산까지 할 필요는 없었군요.

26. printf("%d pt is 99 lv.\n\a",input);//99lv

출력입니다. 99 레벨은 꽤 특이한 경우이므로 들여쓰기 줄 바꿈을 했습니다.

27. else {result2=sqrt(input/10);

위 모든 경우가 아니면, 즉 예외 처리를 할 필요가 없으면 일반화를 시킬 수 있습니다.

sqrt()가 float 형태로 값을 저장하므로 result2를 사용합니다. //double인 것 같은데, 일단 int 형태는 아니니.

28. printf("%d pt is %d lv.\n\a",input,(int)result2);}break;

출력을 해 줍니다. result2는 강제 형 변환을 통해 실수로 만들어 줬는데, 이렇게 해야 소수 값을 버릴 수 있습니다. 제곱근 값이 50.001이건 50.999이건 전부 50 레벨이므로 버려야 합니다. %.0f도 써 봤는데 얘는 반올림을 하더라고요.

else 중괄호 닫고, case 2: 도 끝났으므로 break;로 나가 줍니다.

 

29. default:printf("Please input 1 or 2 only\n\a");break;

앞부분에 넣은 함수 switch(select)에서 이어집니다.

case 1: case 2: 를 만들었으니 나머지 경우를 지정해 줍니다. 1 아니면 2만 넣으라고 표준 출력하고, 줄도 바꿔주고 경고음도 넣고. 할 것 다 했으니 break;.

30. }}return 0;}

switch(select) 중괄호 닫고, for(ever) 중괄호 닫고, 표준을 지켜 0 return 후 main() 중괄호 닫고.

 

109.png

실행하면 이렇게 됩니다.

 

하나하나 써 보니 배워가는 부분이 분명 있네요. 25. 처럼 아쉬운 부분도 보이고요.



  • profile
    캐츄미      5700g, 5800x, 5950x 2023.04.11 22:36
    case문을 사용하시다니 프로그래밍 쌉고수 시군요
  • profile
    title: 컴맹임시닉네임      "시간이 지나면 이통사 수입이 남으면 틀림없이 요금을 내릴 겁니다." - 오남석 2023.04.11 22:39
    초보입니다.
  • profile
    Adora27 2023.04.11 23:14
    main에 void넣는게 표준인건 이번에 첨 알았네요
  • ?
    유입입니다 2023.04.11 23:18
    요즘엔 int main() 만하고 return 0 안해도 알잘딱하긴해요
  • profile
    360Ghz      case kill mark: BQ SB 802 white, CM H500m qube 500 FP, 3r L600/700/900/... 2023.04.11 23:21
    불편하네요 세미콜론 넣어주세요...
  • ?
    유입입니다 2023.04.11 23:22
    암튼 주석임 아 ㅋㅋ
  • profile
    낄낄 2023.04.11 23:28
    오른쪽 최근 코멘트만 보고 '시진핑인가?' 싶어서 눌렀다가 도로 나갑니다...
  • profile
    360Ghz      case kill mark: BQ SB 802 white, CM H500m qube 500 FP, 3r L600/700/900/... 2023.04.11 23:29
    대...대인...
  • ?
    유입입니다 2023.04.11 23:29
    암튼 시진핑임 아 ㅋㅋ
  • profile
    딱풀      안녕하세요. 문송합니다.   2023.04.12 09:43
    오랜만에 이 멘트를....

    문송합니다...
  • profile
    title: 컴맹임시닉네임      "시간이 지나면 이통사 수입이 남으면 틀림없이 요금을 내릴 겁니다." - 오남석 2023.04.12 09:47
    하나하나 설명까지 했는데 ㅠㅠ

작성된지 4주일이 지난 글에는 새 코멘트를 달 수 없습니다.


List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
공지 이벤트 [23일] 마이크로닉스 MA-600T 쿨러를 드립니다 14 updatefile 낄낄 2024.04.17 568
50590 잡담 새폰을삿습니다 16 file title: 몰?루스와마망 2023.08.04 523
50589 잡담 두줄 오메데또 8 file 공탱이 2023.08.04 403
50588 잡담 당분간 집에만 있어야할것 같아요. 8 title: 몰?루먀먀먀 2023.08.04 516
50587 잡담 어우동매냐 님의 ODD수령 3 celinger 2023.08.04 339
50586 잡담 노동자에게 임금을 5배 줘도 손해 안 나는 비결 7 file title: 부장님유니 2023.08.04 799
50585 잡담 첫 사진여행을 준비중입니다. 15 title: 오타쿠바보괭이 2023.08.04 361
50584 잡담 흔한 오사카의 마을 풍경 12 file title: 부장님유니 2023.08.04 553
50583 잡담 어제 홈플러스 갔다가 돈 아낀 이야기 6 file 고자되기 2023.08.04 720
50582 잡담 네이버 피셜 3단봉급 무기 8 file Kanyy 2023.08.04 632
50581 잡담 베이스어스 콘센트 달린 GaN 충전기 접지 애매하... 13 file title: 명사수가네샤 2023.08.04 1008
50580 잡담 이번엔 네이벌 까봅니다~ 2 랩탑 2023.08.04 434
50579 잡담 태풍이 또 이상하게 움직이네요 18 file title: AI아즈텍 2023.08.04 758
50578 잡담 에어컨 없어도 되겠지 해서 에어컨만 안샀거든요? 16 성우덕후 2023.08.04 798
50577 잡담 수게갈지도 모르는 수준의 힙템... 14 360Ghz 2023.08.04 818
50576 잡담 네이마르 이번에 한국에서 풀타임 뛰었네요. 4 Marigold 2023.08.03 477
50575 잡담 친구가 플스4를 줬습니다. 13 ExpBox 2023.08.03 643
50574 잡담 20만원짜리 건담 피규어 11 file title: 부장님유니 2023.08.03 557
50573 잡담 가볍게 사용할 저가형 이어폰은 무엇이 있을까요? 36 Marigold 2023.08.03 890
50572 잡담 창녕갈릭버거가 부활했습니다. 5 file title: 부장님유니 2023.08.03 575
50571 잡담 RAZER BlackWidow Ultimate 세팅 시도기 16 file title: 컴맹임시닉네임 2023.08.03 461
목록
Board Pagination Prev 1 ... 245 246 247 248 249 250 251 252 253 254 ... 2779 Next
/ 2779

최근 코멘트 30개
MUGEN
22:52
아이들링
22:46
포도맛계란
22:35
Lynen
22:33
Lynen
22:32
Lynen
22:32
포도맛계란
22:30
MUGEN
22:28
타미타키
22:25
M16
22:14
M16
22:13
아이들링
22:07
아이들링
22:05
하이킥
22:04
Freud
21:54
까마귀
21:39
그림자
21:38
루니오스
21:36
메르메
21:35
까르르
21:33
까르르
21:32
타미타키
21:32
타미타키
21:31
낄낄
21:29
그림자
21:26
경자전성시대
21:20
타미타키
21:19
그림자
21:18
TundraMC
21:18
경자전성시대
21:16

MSI 코리아
더함
한미마이크로닉스
AMD

공지사항        사이트 약관        개인정보취급방침       신고와 건의


기글하드웨어는 2006년 6월 28일에 개설된 컴퓨터, 하드웨어, 모바일, 스마트폰, 게임, 소프트웨어, 디지털 카메라 관련 뉴스와 정보, 사용기를 공유하는 커뮤니티 사이트입니다.
개인 정보 보호, 개인 및 단체의 권리 침해, 사이트 운영, 관리, 제휴와 광고 관련 문의는 이메일로 보내주세요. 관리자 이메일

sketchbook5, 스케치북5

sketchbook5, 스케치북5

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소