문제

일반적으로 좋은 항상 선택추어 작업을 위해,그것은 때로는 유익한 것을 하려고 노력하고 언어에서는 격렬하게 부적절합니다.

  1. 그것을 이해하는 데 도움을 줄 수 있습 문제를 더합니다.어쩌면 당신은하지 않는 그것을 해결하는 방법 당신은 당신을 생각했다.
  2. 그것은 당신을 도울 수 있어 좋다.어쩌면 그것은 더 많은 기능을 지원하보다 당신이 깨달았다.

밀어 이런 생각을 그건 논리적 결론을 구현하는 퀵 배치 파일에서?그것도 가능한가요?

도움이 되었습니까?

해결책

알고 보니,그것은 없으므로 생각할 수 있습니다.구문은 추가적으로 지옥지만,일괄 구문을 실제로 가능하의 몇 가지 놀라운 것을 포함하여,재귀,지역 변수,그리고 몇 가지 놀라 울 정도로 정교한 분석의 문자열입니다.Don't get me wrong,그것은 끔찍한 언어 있지만,놀랍게도,그것은 완전히 불구하고.나는 생각하지 않을 배웠는지에 대해 아무것도 퀵지만,나에 대해 많은 것을 배웠는 배치 파일!

어떤 경우에,여기에 퀵에 배치 파일을-그리고 나는 당신과 같은 많은 재미을 이해하기 위해 노력하고 기괴한 구문을 읽는 동안 그것으로 나가 쓰는 동안.:-)

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

call :qSort %*
for %%i in (%return%) do set results=!results! %%i
echo Sorted result: %results%
ENDLOCAL
goto :eof

:qSort
SETLOCAL
    set list=%*
    set size=0
    set less=
    set greater=
    for %%i in (%*) do set /a size=size+1
    if %size% LEQ 1 ENDLOCAL & set return=%list% & goto :eof
    for /f "tokens=2* delims== " %%i in ('set list') do set p=%%i & set body=%%j
    for %%x in (%body%) do (if %%x LEQ %p% (set less=%%x !less!) else (set greater=%%x !greater!))
    call :qSort %less%
    set sorted=%return%
    call :qSort %greater%
    set sorted=%sorted% %p% %return%
ENDLOCAL & set return=%sorted%
goto :eof

그것을 부여하는 번호를 설정에서 정렬 명령줄로 구분하여 공간이 있습니다.예제:

C:\dev\sorting>qsort.bat 1 3 5 1 12 3 47 3
Sorted result:  1 1 3 3 3 5 12 47

코드가 약간의 고통의 이해합니다.그것은 기본적으로 표준 퀵.키 비트가 우리가 저장 번호 문자열에 가난한 사람의 배열입니다.두 번째는 루프가 꽤 어두,그것은 기본적으로 분리 배열로 헤드(첫 번째 요소)꼬리(다른 모든 요소가).메가와 표기법 x:xs 지만,배치 파일와 함께 할 루라/f 스위치입니다.왜?왜?

이 SETLOCAL 및 ENDLOCAL 통화는 우리가 지역 변수의 일종이다.SETLOCAL 우리에게 완료 원본의 사본 변수가 있지만,모든 변경 사항은 완전히 멸할 때 우리는 전화 ENDLOCAL,할 수 있음을 의미하는지와 통신을 호출하는 함수를 사용하여 globals.이 설명의 추"ENDLOCAL&정 return=%정%"구문을 실제로 작동하는 무엇에도 불구하고 논리를 나타내는 것입니다.줄 때 실행되는 정렬된 변수되지 않은 닦았기 때문에 라인되지 않은 실행되는 아직 그런 다음 이후에 반환한 변수는 없 닦았기 때문에선 이미 실행됩니다.논리!

또한,재미있게,당신은 기본적으로 사용할 수 없는 변수 안에 대한 반복할 수 없기 때문에 변경을 제거하는 대부분의 지점에 대한 반복입니다.해결 방법을 설정하는 것입 ENABLEDELAYEDEXPANSION 작동하는지만,구문도 더 이상 정상입니다.지 우리는 지금의 혼합 변수를 참조하여 자신의 이름을 붙여들%,붙여 그들을 두%,포장에 의해서 그들%,또는 그들을 배치하여 있다.이러한 다른 방법으로 변수를 참조하는 거의 완전하게 호환되지 않습!

다른 것보다,그것은 상대적으로 이해하기 쉽습니다!

다른 팁

여기에 더 읽 버전는 내가 쓴 전에 잠깐:

@echo off

echo Sorting:  %*

set sorted=

:sort
:: If we've only got one left, we're done.
if "%2"=="" (
  set sorted=%sorted% %1
  :: We have to do this so that sorted gets actually set before we print it.
  goto :finalset
)
:: Check if it's in order.
if %1 LEQ %2 (
  :: Add the first value to sorted.
  set sorted=%sorted% %1
  shift /1
  goto :sort
)
:: Out of order.
:: Reverse them and recursively resort.
set redo=%sorted% %2 %1
set sorted=
shift /1
shift /1
:loop
if "%1"=="" goto :endloop
set redo=%redo% %1
shift /1
goto :loop
:endloop
call :sort %redo%
:: When we get here, we'll have already echod our result.
goto :eof

:finalset
echo Final Sort:  %sorted%
goto :eof

예제:

C:\Path> sort 19 zebra blah 1 interesting 21 bleh 14 think 2 ninety figure it out

생산:

Sorting:  19 zebra blah 1 interesting 21 bleh 14 think 2 ninety figure it out
Final Sort:   1 2 14 19 21 blah bleh figure interesting it ninety out think zebra
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top