Skip to content

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

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

profile
임시닉네임 https://gigglehd.com/gg/14071973
"시간이 지나면 이통사 수입이 남으면 틀림없이 요금을 내릴 겁니다." - 오남석
조회 수 458 댓글 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
    임시닉네임      "시간이 지나면 이통사 수입이 남으면 틀림없이 요금을 내릴 겁니다." - 오남석 2023.04.11 22:39
    초보입니다.
  • profile
    Adora27 2023.04.11 23:14
    main에 void넣는게 표준인건 이번에 첨 알았네요
  • ?
    유입입니다 2023.04.11 23:18
    요즘엔 int main() 만하고 return 0 안해도 알잘딱하긴해요
  • profile
    title: AI360Ghz      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
    title: AI360Ghz      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
    title: 컴맹딱풀      안녕하세요. 문송합니다.   2023.04.12 09:43
    오랜만에 이 멘트를....

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

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


List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
81115 퍼온글 예멘에서 열린 열병식 1 file 고자되기 2024.01.18 427
81114 잡담 S24 보고 있는데 실물이 훨씬 낫네요 15 file title: 흑우슈베아츠 2024.01.18 937
81113 퍼온글 Mz공무원 퇴사 막는방법... 21 file title: 부장님유니 2024.01.18 896
81112 잡담 읽기전용으로 변해버린 삼성 SSD 10 file ProRes 2024.01.18 808
81111 잡담 하암님의 라이젠 본체 수령기입니다. 5 file 시로이소닉 2024.01.18 467
81110 잡담 가끔씩 날라오는 PayPal 계약 개정 이메일. Z80 2024.01.18 431
81109 잡담 걸장판 최종장 4 보고왔습니다 5 title: AIGPT 2024.01.18 331
81108 잡담 하츠네 미쿠와 공식 콜라보한 GaN 충전기... 7 file title: 오타쿠마초코 2024.01.18 655
81107 잡담 윈도우 11 및 이후 윈도우의 사양 제한 문제가 남... 17 file milsa 2024.01.17 1363
81106 장터 완료 ASUS RX 6900 XT TUF Gaming T16G 팝니다 6 file nsys 2024.01.17 577
81105 퍼온글 업혀가는놈이 잘난척을 요란하게 한다 6 file 고자되기 2024.01.17 965
81104 잡담 어라.... 이거 저희학교만 해당되는건가요? 17 file Respect 2024.01.17 941
81103 잡담 우왕 명사수 14 file title: 명사수린네 2024.01.17 475
81102 잡담 카메라 가방에 곰팡이... 6 file 낄낄 2024.01.17 476
81101 잡담 저렴이 c타입 컨버터 4 file title: 흑우허태재정 2024.01.17 503
81100 장터 [판매완료] 시루이 아나모픽 50mm F1.8 캐논 RF ... 2 Mr.10% 2024.01.17 221
81099 잡담 뭐~어? NC가 바닥을 쳤다고? 3 file 록키베어 2024.01.17 562
81098 잡담 또 신용 카드를 갈아 타려고 하네요~ 12 랩탑 2024.01.17 579
81097 잡담 씽패를 쓰면 알 수 없는 뽕이 차오릅니다 22 file Respect 2024.01.17 577
81096 방구차 배터리 방구차? 뿡뿡뿡 file Respect 2024.01.17 151
81095 잡담 러브딜리버리2... 3 히토히라 2024.01.17 405
81094 퍼온글 전성기 NC의 위엄 10 file 고자되기 2024.01.17 754
81093 잡담 난민착취의 맛 주문했습니다. file 고자되기 2024.01.17 462
81092 잡담 (스압) 건담 양산공장 돌리는 중입니다.. 4 file title: 부장님유니 2024.01.17 303
81091 잡담 그것은 저희가 도와드릴수 없는부분입니다 3 file 고자되기 2024.01.17 410
81090 잡담 여름의 오사카에 돌아다니는 성가신 독충 16 file title: 부장님유니 2024.01.17 592
81089 방구차 아이폰 배터리 5 file 냥뇽녕냥 2024.01.17 412
81088 잡담 응급실 6 file title: 가난한AKG-3 2024.01.17 519
81087 퍼온글 아직 점심 못먹었는데 소화했군요 5 file title: AMD툴라 2024.01.17 500
81086 잡담 아이폰 배터리는 진짜 합리적 주작 의심이... 16 file title: 흑우슈베아츠 2024.01.17 1477
목록
Board Pagination Prev 1 ... 56 57 58 59 60 61 62 63 64 65 ... 2764 Next
/ 2764

최근 코멘트 30개
dmy01
09:27
프로리뷰어
09:26
아무개
09:22
TundraMC
09:13
AKG-3
09:07
임시닉네임
09:04
임시닉네임
09:00
임시닉네임
08:46
임시닉네임
08:45
임시닉네임
08:44
임시닉네임
08:41
임시닉네임
08:40
photino65
08:34
임시닉네임
08:33
임시닉네임
08:31
임시닉네임
08:31
임시닉네임
08:30
이게뭘까
08:23
캐츄미
08:15
탐린
08:13
탐린
08:12
툴라
08:03
슬렌네터
08:00
유니
07:58
yamsengyi
07:58
360Ghz
07:49
반다크홈
07:11
라데니안
07:11
라데니안
07:10
아라
07:03

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

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


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

sketchbook5, 스케치북5

sketchbook5, 스케치북5

나눔글꼴 설치 안내


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

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

설치 취소