2017-03-02 99 views
0

(遗憾的是,一切都以代码的形式,堆栈溢出不会让我提交的理由)整理规划越来越怪异异常

我最近一直热衷于电脑排序,并试图写一个简单的批处理数字分拣机。它使用非常基本的数学,效率非常低,但主要是一种学习体验。该计划几乎适用于某些数字集。我对批处理相对来说比较新,所以就我所知,我的排序和检查没有任何特别的错误,但在排序之后,我经历了不少异常。在一组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 

任何帮助清理代码,添加代码或解决任何我遇到的问题将不胜感激。

+0

你可以初始化瓦尔更容易使用set/A'设置/ A AR = NUM​​ =检查= checknum =检查= 0' 。为代码块使用正确的缩进。使用for/l来填充你的伪数组。 – LotPings

+0

@LotPings对不起,我不是很高级的批处理,你能指定我的伪代码阵列使用/我的意思。你也认为这样做可以补救我遇到的问题。 –

回答

1

这个问题在“有趣”。独立于对批处理文件的低级知识,您并未提出关于发布代码的单个明确问题!你基本上已经邀请我们做任何我们想要的事情,所以这就是我所做的。此外,重要的是要注意,在问题中显示的假设的“输出示例”与发布的代码没有关系...

编辑:用于显示单行使用数字列表的方法一个变量,所以结果的最大数量受最大可变长度限制。例如,对于4位数的数字,每个列表可以包含最多1637个数字,恕我直言,这对于“简单批量数字分拣机”程序来说已经足够了。

我修改了用于显示结果的方法,所以它现在支持10,000个或更多的随机数。但是,您应该注意这种排序方法是slow,所以我建议在sortLoop中插入一个echo命令以便知道程序仍在运行。

@echo off 
setlocal EnableDelayedExpansion 

color b 
title sorting 

set /P "totalNumber=Values:" 
set /P "randMax=Max Random Value:" 
echo %date% : %time% 
echo PROGRAM INITIATED 
echo VALUES:%totalNumber% 
echo randMax:%randMax% 

(
echo %date% : %time% 
echo PROGRAM INITIATED 
echo VALUES:%totalNumber% 
echo randMax:%randMax% 
) > log.txt 

:array 
for /L %%i in (1,1,%totalNumber%) do set /A a[%%i]=!random! %% randMax 

echo %DATE%:%TIME% 
echo VALUE GEN COMPLETE 
(
echo %date%:%time% 
echo VALUE GEN COMPLETE 
) >> log.txt 

echo/ 
< NUL (
set /P "=UNSORTED: " 
for /L %%i in (1,1,%totalNumber%) do set /P "=!a[%%i]! " 
) 
echo/ 
echo/ 
echo sort initialized 

set "sorts=0" 
:sortLoop 
set "hold=" 
for /L %%m in (2,1,%totalNumber%) do (
    set /A n=%%m-1 
    for %%n in (!n!) do if !a[%%n]! GTR !a[%%m]! (
     set /A hold=a[%%m], a[%%m]=a[%%n], a[%%n]=hold, sorts+=1 
    ) 
) 
REM ECHO Sorts: %sorts% 
if defined hold goto sortLoop 

echo %date% : %time% 
echo SORT COMPLETED 
echo SORTS : %sorts% 
(
echo %date% : %time% 
echo SORT COMPLETED 
echo SORTS : %sorts% 
) >> log.txt 


:complete 
echo %date% : %time% 
echo PROGRAM COMPLETE 
(
echo %date% : %time% 
echo PROGRAM COMPLETE 
) >> log.txt 

echo/ 
< NUL (
set /P "=SORTED: " 
for /L %%i in (1,1,%totalNumber%) do set /P "=!a[%%i]! " 
) 
echo/ 

编辑新的排序方法添加

我原本以为这个节目代表着你“主要是在电脑排序学习经验”。但是,如果你有兴趣创建一个有效率的方式命名sorted.txtunsorted.txt随机数两个文件,您可以使用此代码来代替:

@echo off 
setlocal EnableDelayedExpansion 

set /P "totalNumber=Values:" 
set /P "randMax=Max Random Value:" 

echo/ 
set /P "=UNSORTED: " < NUL 
< NUL (for /L %%i in (1,1,%totalNumber%) do (
    set /A a=!random! %% randMax 
    set /P "=!a! " > CON 
    set "a= !a!" 
    echo !a:~-5! 
)) > unsorted.txt 
echo/ 

sort unsorted.txt /O sorted.txt 

echo/ 
< NUL (
set /P "=SORTED: " 
for /F %%a in (sorted.txt) do set /P "=%%a " 
) 
echo/ 

请记住,最大随机数是32767,但数字量没有限制。

+0

我的问题似乎很模糊,而不是一个具体的问题,那是因为我甚至不知道该问什么,我正在接受这些结果,并且完全不知道可能是什么原因造成的。我花了一些时间试图调试和研究这个问题,但是我没有发现任何有助于这种情况的东西。我本质上是问有没有人知道我做错了什么。此外,与10个值一起测试时,相关的数据集是程序的结果,最大随机值为10时,它显示了代码的一个错误。 –

+0

您错误的原因是:在排序过程中,您通过其下标管理每个数组元素,但是当您显示结果时,使用'set'命令的顺序,即_alphabetic_!!只要定义'set a [1] = 1'并且'set a [10] = 1'并输入'set a ['来检查这一点。 – Aacini

+0

这个程序似乎也遇到了一些我得到的错误,就数字而言,低位值在代码中的各个点看似随机插入,当我输入大数值时,它似乎崩溃了 –

0

由于aacini提到的设置将按字母顺序排列环境变量,使用前导零排序填充数字,并将随机数字放入var名称中,以便能够多次存储相同的数字并附加索引。

编辑修改批输出列表,以unsorted.txtsorted.txt

@echo off 
setlocal EnableDelayedExpansion 

set /P "totalNumber=Number of Values:" 
set /P "randMax=Max Random Value:" 

echo %date% : %time% PROGRAM INITIATED VALUES:%totalNumber% randMax:%randMax% 
(echo %date% : %time% PROGRAM INITIATED VALUES:%totalNumber% randMax:%randMax%) > log.txt 

:array 
(for /L %%i in (1,1,%totalNumber%) do (
    set /A "Rno=!random! %% randMax + 10*randMax" 
    Set a_!Rno!_%%i=0 
    Echo:!Rno! 
))> unsorted.txt 

echo/ 
echo %date% : %time% Generated %totalNumber% numbers 
(echo %date% : %time% Generated %totalNumber% numbers) >> log.txt 

(for /F "tokens=2 delims=_" %%i in ('set a_') do (
    Set /A No=%%i - 10*randMax,Diff=No-Prev,Prev=No 
    Echo:!No! 
))> sorted.txt 

:complete 
echo %date% : %time% PROGRAM COMPLETE 
(echo %date% : %time% PROGRAM COMPLETE) >> log.txt 
+0

如果您阅读问题描述,OP是_“对计算机排序感兴趣,并且试图编写一个简单的批量数字分类器,它使用非常基本的数学算法,效率极低,但主要是一种学习体验“,但是您的解决方案并没有提供任何这些要点!一个更简单的解决方案是使用随机数字创建一个文本文件并使用'sort'命令... **':/'** – Aacini

+0

嗯,根据[wikipedia](https://en.wikipedia.org/wiki)/Sorting_algorithm)我的排序方法是第一个,插入排序。 ;-) – LotPings

+0

当然不是。在链接的维基百科文章中对插入排序的描述指定:_“它通过逐个获取列表中的元素并将它们插入到正确的位置到新的排序列表中来工作......但插入代价昂贵,需要将所有后续元素超过一个“_。请告诉我,代码的哪个部分通过移动后续元素来执行昂贵的插入操作,因为我无法找到它。你的代码甚至没有一个_comparison_(GTR或LSS),这是所有[排序算法](https://en.wikipedia.org/wiki/Comparison_sort)中的一个基本概念! – Aacini

相关问题