교사들응 학기말이면 과목별 학생별 평어를 입력해야 합니다. 초등교사인 경우는 전담과목을 뺀 전과목을 입력해야 하고, 중등 교사의 경우 각 반별로 해당 과목의 평어를 입력해 줘야 하죠. 중고교생의 경우 입시가 걸려 있으므로 일괄적으로 활용하기는 어려울것 같고, 초등학교 교사들의 경우 평어 입력을 골고루 입력하기에는 상당한 압박감을 가질 수 있습니다. 그래서 해당 평어 몇가지 종류만 입력하면 해당 내용을 골고루 섞어줄 수 있는 어플리케이션을 만들어 보고자 합니다.
우선 시나리오는 다음과 같습니다.
1) 섞어서 입력할 종류를 3가지, 모든 학생에게 공통으로 입력해 줄 내용을 1가지라고 가정하겠습니다.
사용자는 아래처럼 입력할 수 있어야겠지요.
종류1 종류2 종류3 공통
AAA DDD FFF KKK
BBB EEE GGG LLL
CCC HHH
2) 다음은 해당 내용을 섞은 후 해당 결과를 보여줄 항목이 있어야겠지요. 단순히 결과창으로 나타내면 되겠습니다.
3) 다음은 어떤 방법으로 섞어줄 지를 선택해야 하는데, 편의상 원하는 숫자만큼 결과를 만드는 경우와, 입력한 갯수의 최대 경우의 수로 만드는 경우로 나누겠습니다. 위의 입력예를 가지고 설명하면 , 원하는 숫자만큼 만드는 경우는 다음과 같이 결과가 나올 수 있습니다. 원하는 입력 갯수만큼입니다.
AAA DDD FFF KKK LLL
BBB EEE GGG KKK LLL
CCC DDD HHH KKK LLL
AAA EEE FFF KKK LLL
.....
만약 최대 경우의 수를 선택하는 경우는 다음과 같이 나올 수 있습니다. 전체 갯수는 3X2X3 = 18개입니다.
AAA DDD FFF KKK LLL
BBB DDD FFF KKK LLL
CCC DDD FFF KKK LLL
AAA EEE FFF KKK LLL
BBB EEE FFF KKK LLL
....
시나리오가 완성되었으니, 다음은 실제 구현을 어떻게 해야 할지입니다.
먼저 GUI를 구성해 줘야 하고, 원하는 갯수와 만드는 옵션을 선택하고 만들기 버튼을 누르면 필요한 동작을 해 줘야 합니다.
1) GUI구성은 다음과 같이 구성할 수 있습니다. X, Y좌표는 편한대로 바꿔도 됩니다.
Gui, Add, Text, x30 y35 w150 h20, Content1 ;
Gui, Add, Edit, x30 y65 w150 h100 vcontent1, 1st items ;
Gui, Add, Text, x200 y35 w150 h20, Content2 ;
Gui, Add, Edit, x200 y65 w150 h100 vcontent2, 2nd items ;
Gui, Add, Text, x370 y35 w150 h20, Content3 ;
Gui, Add, Edit, x370 y65 w150 h100 vcontent3, 3rd items ;
Gui, Add, Text, x540 y35 w150 h20, Common ;
Gui, Add, Edit, x540 y65 w150 h100 vcommon, Common items ;
Gui, Add, Text, x30 y170 w200 h20, Result ;
Gui, Add, Edit, x30 y195 w650 h100 vresult, Result ;
Gui, Add, Radio, x30 y300 w400 h20 vrdoMethod Checked, Normal shuffle Cotent1 + Content2 + Content3 + Common ;
Gui, Add, Radio, x30 y325 w400 h20 , Max shuffle Cotent1 x Content2 x Content3 + Common ;
Gui, Add, Text, x450 y303 w70 h20, Total count ;
Gui, Add, Edit, x530 y300 w50 h20 vcnt, 10 ;
Gui, Add, Button, x450 y325 w100 h20, Generate ;
Gui, Show
2) 다음으로는 Generate버튼을 누렀을때 동작을 만들어 줘야 합니다. 우선 사용자의 입력을 가져와야 하므로 다음 문장을 실행합니다.
Gui, Submit, nohide
다음으로 해당 결과를 저장할 파일이름을 정해주는 것부터 필요할 듯 합니다. 매번 결과를 result창에서만 복사해야 한다면 좀 짜증이 날 수 있으므로 파일로 저장해 주는데 파일이름을 현재시간을 가져와서 만드는 것으로 할려면 어떻게 해야 할까요? FormatTime이라는 함수를 다음과 같이 사용하면 됩니다.
FormatTime, current, , yyyyMMddhhmmss
current는 해당 내용을 저장할 변수명이고, 다음 빈칸은 사용할 data를 지정하는 항목인데 빈칸으로 두면 모든 time변수를 사용합니다. 다음으로는 표시할 방법인데 4자리수 연도, 월,일, 시분초 모두 2자리로 지정한 것입니다.
그 결과로 current변수에는 20200809123456등으로 표시될 수 있습니다.그렇게 저장된 current변수를 이용해서 파일이름을 다음처럼 지정합니다.
fname = %A_ScriptDir%result%current%.txt
다음에는 입력한 내용을 섞어줘야 합니다. 우선 입력한 내용을 줄 단위로 구분해 줘야 하므로 StrSplit를 이용해서 구분하는데 줄바꿈을 어떻게 인식해야 할까요? 다음문장처럼 바로 `n을 이용하면 됩니다.
con1 := StrSplit(content1,"`n")
그 결과 con1[n] 배열에는 줄 단위로 입력된 내용이 저장됩니다. 따라서 입력된 모든 항목에 대해서 실행합니다.
con2 := StrSplit(content2,"`n")
con3 := StrSplit(content3,"`n")
cmm :=StrSplit(common,"`n")
이제 입력된 값들을 섞어줘야 합니다. 그런데 옵션이 2가지이므로 어떤 옵션인지에 따라 각각 다르게 구성해야 합니다.
우선 공통항목은 모두 입력해야 하므로 공통항목부터 전체 항목을 하나의 항목으로 만들어 줍니다.
먼저 cmm배열의 크기만큼 Loop를 돌면서 해당항목을 하나의 항목으로 합해 줍니다.
cmmtot =
Loop % cmm.MaxIndex()
{
tcmm := cmm[A_Index]
cmmtot = %cmmtot% %tcmm% %A_Space%
}
다음으로 섞는 옵션이 어떤 것인지에 따라 최대로 섞을지, 갯수만큼 만들지를 알아 보고 그에 맞게 섞어 주도록 Loop를 만들어 주면 됩니다.
먼저 갯수만큼 만들 경우입니다.
if( rdoMethod = 1) ; for normal case
{
idxa = 1
idxb = 1
idxc = 1
Loop % cnt
{
temp1 := con1[idxa]
temp2 := con2[idxb]
temp3 := con3[idxc]
temp = %temp1% %temp2% %temp3% %cmmtot%
result = %result%%temp%`r`n
idxb += 1
if idxb > % con2.MaxIndex()
idxb = 1
idxc += 1
if idxc > % con3.MaxIndex()
idxc = 1
idxa +=1
if idxa > % con1.MaxIndex()
idxa= 1
}
GuiControl,Text,result, %result%
}
다음은 최대 조합으로 섞는 경우입니다. 이 때는 전체의 입력 갯수만큼 Loop를 매번 순환해 줘야 합니다.
else if rdoMethod = 2
{
idxc = 1
Loop % con3.MaxIndex()
{
idxb=1
Loop % con2.MaxIndex()
{
idxa = 1
Loop % con1.MaxIndex()
{
temp1 := con1[idxa]
temp2 := con2[idxb]
temp3 := con3[idxc]
temp = %temp1% %temp2% %temp3% %cmmtot%
result = %result%%temp%`r`n
idxa +=1
if idxa > % con1.MaxIndex()
break
}
idxb += 1
if idxb > % con2.MaxIndex()
break
}
idxc += 1
if idxc > % con3.MaxIndex()
break
}
GuiControl,Text,result, %result%
}
이제 그 외의 경우는 사실 존재하지 않는 경우입니다.
모든 섞는 작업이 끝났으므로 다음과 같이 해당 결과를 파일로 저장해 줍니다.
FileAppend, %result% , %fname%
File.Close()
이제 남은 것은 해당 앱을 종료할때에 대한 처리입니다.
ESC::ExitApp
return
GUIClose:
ExitApp
이렇게 하면 모든 작업이 끝났습니다.
실제로 실행해 보면 다음과 같은 화면이 뜹니다.
입력을 시험삼아 진행해 보면 결과창에 정상적으로 결과가 보이고 파일로도 저장되는 것을 볼 수 있습니다.
학기말에 평어 입력하는 모든 선생님들의 건투를 기원합니다.
'Autohotkey강좌' 카테고리의 다른 글
Autohotkey22. SCITE4Autohotkey Editor Debugging 기본에디터 디버깅 (0) | 2020.08.25 |
---|---|
Autohotkey 21, 윈도우 예약 자동 종료 프로그램(AutoPowerDown) (1) | 2020.08.22 |
Autohotkey 19. 간단한 한글TTS(Text To Speech) 프로그램 만들기 (0) | 2020.07.27 |
Autohotkey18. 나만의 Email 관리 (0) | 2020.07.09 |
Autohotkey 17, 미니탭과 엑셀간 데이터(그래프) 이동 (0) | 2020.06.23 |