(遗憾的是,一切都以代码的形式,堆栈溢出不会让我提交的理由)整理规划越来越怪异异常
我最近一直热衷于电脑排序,并试图写一个简单的批处理数字分拣机。它使用非常基本的数学,效率非常低,但主要是一种学习体验。该计划几乎适用于某些数字集。我对批处理相对来说比较新,所以就我所知,我的排序和检查没有任何特别的错误,但在排序之后,我经历了不少异常。在一组10个值中,它排序完美,除了最大的数字被放在第一位。而在更大的两组数字,例如:
> Values:10
>
> Random Maximum:10
>
> UNSORTED: 8 5 0 0 5 4 7 1 5 1
>
> SORTED: 8 0 1 1 4 5 5 5 7
以下是调试时我迄今经历了异常:
数量最多放第一的低位置处
号(数十,数百等)随机放置在具有较高案例的大多数数字的集合中
将一些数字从在某些情况下,在不同的点未分类排序
重新排序在sorted.txt
很有可能更多的被发现
这是到目前为止我的批处理脚本:
@echo off
color b
title sorting
if exist sortedlist.txt del sortedlist.txt
if exist unsortedlist.txt del unsortedlist.txt
if exist log.txt del log.txt
setlocal enabledelayedexpansion
set ar=0
set num=0
set check=0
set checknum=0
set checks=0
set /P totalnumber="Values:"
set /P randmax="Max Random Value:"
cls
::set totalnumber=200
::set randmax=500
echo %date% : %time%
echo PROGRAM INITIATED
echo VALUES:%totalnumber%
echo RANDMAX:%randmax%
echo %date% : %time% >> log.txt
echo PROGRAM INITIATED >> log.txt
echo VALUES:%totalnumber% >> log.txt
echo RANDMAX:%randmax% >> log.txt
:array
if %num% LSS %totalnumber% (
set /A a[%num%]=%random% %% %randmax%
set /A num=%num%+1
goto array
)
if %num% EQU %totalnumber% (
echo %DATE%:%TIME%
echo VALUE GEN COMPLETE
echo %date%:%time% >> log.txt
echo VALUE GEN COMPLETE >> log.txt
goto echo1
)
:echo1
for /F "tokens=2 delims==" %%s in ('set a[') do echo %%s
for /F "tokens=2 delims==" %%s in ('set a[') do echo %%s >> unsortedlist.txt
echo sort initialized
goto sort
)
:sort
set sorts=0
set n=0
:sortloop
set /A m=%n%+1
if %n% EQU %totalnumber% (
echo %date% : %time%
echo SORT COMPLETED
echo SORTS : %sorts%
echo %date% : %time% >> log.txt
echo SORT COMPLETED >> log.txt
echo SORTS : %sorts% >> log.txt
goto check
)
if !a[%n%]! GTR !a[%m%]! (
set hold=!a[%m%]!
set a[%m%]=!a[%n%]!
set a[%n%]=%hold%
set /A n=%n%+1
set /A sorts=%sorts%+1
goto sortloop
)
if !a[%n%]! LSS !a[%m%]! (
set /A n=%n%+1
goto sortloop
)
if !a[%n%]! EQU !a[%m%]! (
set /A n=%n%+1
goto sortloop
)
pause
:check
set check=0
set checknum=0
set checks=0
:checkloop
set /A checknumplus=%checknum%+1
if %check% EQU %totalnumber% (
goto complete
)
if %checknum% EQU %totalnumber% (
set /A checks=%checks%+1
echo %date% : %time%
echo CORRECT PAIRS : %check%
echo CHECKS : %checks%
echo %date% : %time% >> log.txt
echo CORRECT PAIRS : %check% >> log.txt
echo CHECKS : %checks% >> log.txt
goto sort
)
if !a[%checknum%]! LSS !a[%checknumplus%]! (
set /A check=%check%+1
set /A checknum=%checknum%+1
goto checkloop
)
if !a[%checknum%]! GTR !a[%checknumplus%]! (
set /A checknum=%checknum%+1
goto checkloop
)
if !a[%checknum%]! EQU !a[%checknumplus%]! (
set /A check=%check%+1
set /A checknum=%checknum%+1
goto checkloop
)
pause
:complete
set a[%totalnumber%+1]=%a[0]%
set %a[0]%=0
echo %date% : %time%
echo PROGRAM COMPLETE
echo %date% : %time% >> log.txt
echo PROGRAM COMPLETE >> log.txt
for /F "tokens=2 delims==" %%s in ('set a[') do echo %%s
for /F "tokens=2 delims==" %%s in ('set a[') do echo %%s >> sortedlist.txt
任何帮助清理代码,添加代码或解决任何我遇到的问题将不胜感激。
你可以初始化瓦尔更容易使用set/A'设置/ A AR = NUM =检查= checknum =检查= 0' 。为代码块使用正确的缩进。使用for/l来填充你的伪数组。 – LotPings
@LotPings对不起,我不是很高级的批处理,你能指定我的伪代码阵列使用/我的意思。你也认为这样做可以补救我遇到的问题。 –