單純形法C語言程序_第1頁(yè)
單純形法C語言程序_第2頁(yè)
單純形法C語言程序_第3頁(yè)
單純形法C語言程序_第4頁(yè)
單純形法C語言程序_第5頁(yè)
已閱讀5頁(yè),還剩26頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

實(shí)驗(yàn):編制《線性規(guī)劃》計(jì)算程序一、實(shí)驗(yàn)?zāi)康模?1)使學(xué)生在程序設(shè)計(jì)方面得到進(jìn)一步的訓(xùn)練;,掌握Matlab(C或VB)語言進(jìn)行程序設(shè)計(jì)中一些常用方法。(2)使學(xué)生對(duì)線性規(guī)劃的單純形法有更深的理解.二、實(shí)驗(yàn)用儀器設(shè)備、器材或軟件環(huán)境計(jì)算機(jī),MatlabR2009a三、算法步驟、計(jì)算框圖、計(jì)算程序等本實(shí)驗(yàn)主要編寫如下線性規(guī)劃問題的計(jì)算程序:其中初始可行基為松弛變量對(duì)應(yīng)的列組成.對(duì)于一般標(biāo)準(zhǔn)線性規(guī)劃問題:1.求解上述一般標(biāo)準(zhǔn)線性規(guī)劃的單純形算法(修正)步驟如下:對(duì)于一般的標(biāo)準(zhǔn)形式線性規(guī)劃問題(求極小問題),首先給定一個(gè)初始基本可行解。設(shè)初始基為B,然后執(zhí)行如下步驟:(1).解,求得,(2).計(jì)算單純形乘子w,,得到,對(duì)于非基變量,計(jì)算判別數(shù),可直接計(jì)算令,R為非基變量集合若判別數(shù),則得到一個(gè)最優(yōu)基本可行解,運(yùn)算結(jié)束;否則,轉(zhuǎn)到下一步(3).解,得到;若,即的每個(gè)分量均非正數(shù),則停止計(jì)算,問題不存在有限最優(yōu)解,否則,進(jìn)行步驟(4).確定下標(biāo)r,使;

2、計(jì)算框圖為:開始初始可行基B是是否得到最優(yōu)解是是否不存在有限最優(yōu)解確定下標(biāo)r,使得3.計(jì)算程序(Matlab):A=input('A=');b=input('b=');c=input('c=');formatrat%可以讓結(jié)果用分?jǐn)?shù)輸出[m,n]=size(A);E=1:m;E=E';F=n-m+1:n;F=F';D=[E,F];%創(chuàng)建一個(gè)一一映射,為了結(jié)果能夠標(biāo)準(zhǔn)輸出X=zeros(1,n);%初始化Xif(n<m)%判斷是否為標(biāo)準(zhǔn)型fprintf('不符合要求需引入松弛變量')flag=0;elseflag=1;B=A(:,n-m+1:n);%找基矩陣cB=c(n-m+1:n);%基矩陣對(duì)應(yīng)目標(biāo)值的cwhileflagw=cB/B;%計(jì)算單純形乘子,cB/B=cB*inv(B),用cB/B的目的是,為了提高運(yùn)行速度。。panbieshu=w*A-c%計(jì)算判別數(shù),后面沒有加分號(hào),就是為了計(jì)算后能夠顯示出來。。[z,k]=max(panbieshu);%k作為進(jìn)基變量下標(biāo)。。fprintf('b''./(B\\A(:,%d))為',k);b'./(B\A(:,k))if(z<0.000000001)flag=0;%所有判別數(shù)都小于0時(shí)達(dá)到最優(yōu)解。。fprintf('已找到最優(yōu)解!\n');xB=(B\b')';f=cB*xB';fori=1:nmark=0;forj=1:mif(D(j,2)==i)mark=1;X(i)=xB(D(j,1));%利用D找出xB與X之間的關(guān)系。。endendifmark==0X(i)=0;%如果D中沒有X(i),則X(i)為非基變量,所以X(i)=0。。endendfprintf('基向量為:');Xfprintf('目標(biāo)函數(shù)值為:');felseif(B\A(:,k)<=0)%如果B\A(;,k)中的每一個(gè)分量都小于零。。flag=0;fprintf('\n此問題不存在最優(yōu)解!\n');%若B\A(:,k)的第k列均不大于0,則該問題不存在最優(yōu)解。。elseb1=B\b';temp=inf;fori=1:mif((A(i,k)>0)&&(b1(i)/(A(i,k)+eps))<temp)temp=b1(i)/A(i,k);%找退基變量r=i;endendfprintf('x(%d)進(jìn)基,x(%d)退基\n',k,D(r,2));%顯示進(jìn)基變量和退基變量B(:,r)=A(:,k);cB(r)=c(k);%確定進(jìn)基退基變量后,相應(yīng)的基矩陣及新基對(duì)應(yīng)的目標(biāo)值的c也相應(yīng)改變D(r,2)=k;%改變D中的映射關(guān)系endendendend程序保存為danchunxin.m文件數(shù)值實(shí)驗(yàn)及其結(jié)果:窗口輸入:rundanchunxinA=[-12100;23010;1-1001]b=[4123]c=[-4-1000]運(yùn)行后的結(jié)果為:panbieshu=41000b'./(B\A(:,2))為;ans=-463x(1)進(jìn)基,x(5)退基panbieshu=0500-4b'./(B\A(:,2))為;ans=412/5-3x(2)進(jìn)基,x(4)退基panbieshu=000-1-2b'./(B\A(:,2))為;ans=1/01/03已找到最優(yōu)解!基向量為:X=21/56/529/500目標(biāo)函數(shù)值為:f=-18S.t窗口輸入:rundanchunxinA=[2310;-1101]b=[61]c=[-1-300]運(yùn)行后的結(jié)果為:panbieshu=1300b'./(B\A(:,2))為;ans=21x(2)進(jìn)基,x(4)退基panbieshu=400-3b'./(B\A(:,2))為;ans=6/5-1x(1)進(jìn)基,x(3)退基panbieshu=00-4/5-3/5b'./(B\A(:,2))為;ans=61/0已找到最優(yōu)解!基向量為:X=3/58/500目標(biāo)函數(shù)值為:f=-27/5S.t窗口輸入>>rundanchunxinA=[33100;4-4010;2-1001]b=[301612]c=[-3-1000]運(yùn)行后的結(jié)果為:panbieshu=31000b'./(B\A(:,2))為;ans=1046x(1)進(jìn)基,x(4)退基panbieshu=040-3/40b'./(B\A(:,2))為;ans=5-1612x(2)進(jìn)基,x(3)退基panbieshu=00-2/3-1/40b'./(B\A(:,2))為;ans=-1/0161/0已找到最優(yōu)解!基向量為:X=73001目標(biāo)函數(shù)值為:f=-24窗口輸入:>>rundanchunxinA=[1-1110;-21-201]b=[510]c=[-31000]運(yùn)行后的結(jié)果為:panbieshu=3-1000b'./(B\A(:,2))為;ans=5-5x(1)進(jìn)基,x(4)退基panbieshu=02-3-30b'./(B\A(:,2))為;ans=-5-10此問題不存在最優(yōu)解!五:心得體會(huì):通過本次實(shí)驗(yàn)對(duì)單純形了解更深刻,此次實(shí)驗(yàn)中inf表示為一個(gè)無窮大的數(shù)。本次做的只是最簡(jiǎn)單的線性規(guī)劃問題,面對(duì)以后更大的、更復(fù)雜的問題,雖然起不了什么非常大的作用,但這是基礎(chǔ),所以我非常認(rèn)真對(duì)待這次實(shí)驗(yàn),做完本次實(shí)驗(yàn),使我對(duì)單純形方法,更加熟練,對(duì)matlab程序設(shè)計(jì)也更加熟悉。單純形法完全c語言程序,能運(yùn)行

#include"math.h"

#include"stdio.h"

#defineN2

voidpaixu(p,n)

intn;

doublep[];

{intm,k,j,i;

doubled;

k=0;m=n-1;

while(k<m)

{j=m-1;m=0;

for(i=k;i<=j;i++)

if(p>p[i+1])

{d=p;p=p[i+1];p[i+1]=d;m=i;}

j=k+1;k=0;

for(i=m;i>=j;i--)

if(p[i-1]>p)

{d=p;p=p[i-1];p[i-1]=d;k=i;}

}

return;

}

doublemubiao(double*x)

{doubley;

y=x[1]-x[0]*x[0];y=100.0*y*y;

y=y+(1.0-x[0])*(1.0-x[0]);

return(y);

}main()

{inti,j,k,l,m=0;

doublec,xx[N+1][N],f0[N+1],f[N+1],x0[N]={1.2,1},x1[N],s=0.0;

doublea,b;

doublexa[N],xb[N],xc[N],xe[N],xw[N],xr[N],xo[N];

doublefr,fe,fw,fc,fo;

doubleaef=1.0,r=1.0,eps1=1.0e-30,eps2=1.0e-30,bt=0.5,rou=0.5;

c=1.0;

b=(c/(N*sqrt(2)))*(sqrt(N+1)-1);

a=b+c/sqrt(2);

//printf("a=%13.7eb=%13.7e",a,b);

//printf("\n");

//給xx[N][N+1]賦值,每一行構(gòu)成單純形的一個(gè)定點(diǎn)

//***********************

for(i=0;i<N;i++)

xx[0]=x0;

for(i=1;i<N+1;i++)

for(j=0;j<N;j++)

{if(j==i-1)

xx[j]=x0[j]+a;

else

xx[j]=x0[j]+b;

}

for(i=0;i<N+1;i++)

{for(j=0;j<N;j++)

printf("xx[%d][%d]%13.7e",i,j,xx[j]);

printf("\n");

}

loop1:

//求單純形的每個(gè)定點(diǎn)的函數(shù)值f0,f和x1是過渡數(shù)組

printf("\n");

printf("\n");

for(i=0;i<N+1;i++)

{for(j=0;j<N;j++)

x1[j]=xx[j];

f0=mubiao(x1);

f=mubiao(x1);

printf("f0[%d]=%13.7ef[%d]=%13.7e\n",i,f0,i,f);

}

printf("\n");

//比較f的大小,f[0]是最小值,f[N]是最大值

paixu(f,N+1);

for(i=N;i>=0;i--)

printf("f[%d]=%13.7e\n",i,f);

//找最好點(diǎn)和最壞點(diǎn)分別是哪一個(gè)點(diǎn),即xx[][]的行數(shù)

for(i=0;i<N+1;i++)

{if(f0==f[0])

k=i;

if(f0==f[N])

l=i;

}

printf("最好點(diǎn)k=%d\n",k);

printf("最壞點(diǎn)l=%d\n",l);

//終止判斷條件

printf("f[N]-f[0]=%13.7e\n",f[N]-f[0]);

if((f[N]-f[0])<eps1+eps2*fabs(f[N]))

{printf("迭代次數(shù)m=%d\n",m);

for(j=0;j<N;j++)

printf("optx[%d]=%13.7e\n",j,xx[k][j]);

printf("fmin=%13.7e\n",f[0]);

}

else

{

m=m+1;

//把xx[][]中最好點(diǎn)移到第一行,最壞點(diǎn)移到最后一行

for(j=0;j<N;j++)

{xb[j]=xx[k][j];

xx[k][j]=xx[0][j];

xx[0][j]=xb[j];

//

xw[j]=xx[l][j];

xx[l][j]=xx[N][j];

xx[N][j]=xw[j];

}

for(i=0;i<N+1;i++)

{for(j=0;j<N;j++)

printf("xx[%d][%d]=%13.7e",i,j,xx[j]);

printf("\n");

}

//求除最壞點(diǎn)f[N]外其余點(diǎn)的中點(diǎn)xc[]

for(i=0;i<N;i++)

xa=0;

for(j=0;j<N;j++)

{{for(i=0;i<N;i++)xa[j]=xa[j]+xx[j];}

xa[j]=xa[j]/N;

}

for(i=0;i<N;i++)

printf("xa[%d]=%13.7exb[%d]=%13.7exw[%d]=%13.7e\n",i,xa,i,xb,i,xw);

//求xw[N]的反射點(diǎn)xr[N];

for(i=0;i<N;i++)

{xr=xa+aef*(xa-xw);

printf("xr[%d]=%13.7e",i,xr);

}

printf("\n");

//求xr[N]的函數(shù)值fr

fr=mubiao(xr);

printf("fr=%13.7e\n",fr);

//判斷xr與xb的好壞

if(fr<=f[0])

{for(i=0;i<N;i++)

{xe=xr+r*(xr-xa);

//printf("xe[%d]=%13.7e",i,xe);

}

printf("\n");

fe=mubiao(xe);

if(fe<=f[0])

for(j=0;j<N;j++)

xx[N][j]=xe[j];

else

for(j=0;j<N;j++)

xx[N][j]=xr[j];

gotoloop1;

}

else

{

fw=f[N];

if(fr>=fw)

{for(i=0;i<N;i++)

xc=xa-bt*(xa-xw);

fc=mubiao(xc);

if(fc>=fw)

{for(i=1;i<N+1;i++)

for(j=0;j<N;j++)

xx[j]=xx[0][j]-rou*(xx[j]-xx[0][j]);

gotoloop1;

}

else

{for(j=0;j<N;j++)

xx[N][j]=xc[j];

gotoloop1;

}

}

else

{if(fr>=fe)

{

for(i=0;i<N;i++)

xo=xa+bt*(xa-xw);

fo=mubiao(xo);

if(fo>=fr)

{for(i=1;i<N+1;i++)

for(j=0;j<N;j++)

xx[j]=xx[0][j]-rou*(xx[j]-xx[0][j]);

gotoloop1;

}

else

{for(j=0;j<N;j++)

xx[N][j]=xo[j];

gotoloop1;

}

}

else

{for(j=0;j<N;j++)

xx[N][j]=xr[j];

gotoloop1;

}

}

}

}

}附錄資料:不需要的可以自行刪除bat文件的基本應(yīng)用bat是dos下的批處理文件.cmd是nt內(nèi)核命令行環(huán)境的另一種批處理文件從更廣義的角度來看,unix的shell腳本以及其它操作系統(tǒng)甚至應(yīng)用程序中由外殼進(jìn)行解釋執(zhí)行的文本,都具有與批處理文件十分相似的作用,而且同樣是由專用解釋器以行為單位解釋執(zhí)行,這種文本形式更通用的稱謂是腳本語言。所以從某個(gè)程度分析,batch,unixshell,awk,basic,perl等腳本語言都是一樣的,只不過應(yīng)用的范圍和解釋的平臺(tái)各有不同而已。甚至有些應(yīng)用程序仍然沿用批處理這一稱呼,而其內(nèi)容和擴(kuò)展名與dos的批處理卻又完全不同。===================================首先批處理文件是一個(gè)文本文件,這個(gè)文件的每一行都是一條DOS命令(大部分時(shí)候就好象我們?cè)贒OS提示符下執(zhí)行的命令行一樣),你可以使用DOS下的Edit或者Windows的記事本(notepad)等任何文本文件編輯工具創(chuàng)建和修改批處理文件。====注===================批處理文件中完全可以使用非dos命令,甚至可以使用不具有可執(zhí)行特性的普通數(shù)據(jù)性文件,這緣于windows系統(tǒng)這個(gè)新型解釋平臺(tái)的涉入,使得批處理的應(yīng)用越來越"邊緣化"。所以我們討論的批處理應(yīng)該限定在dos環(huán)境或者命令行環(huán)境中,否則很多觀念和設(shè)定都需要做比較大的變動(dòng)。========================其次,批處理文件是一種簡(jiǎn)單的程序,可以通過條件語句(if)和流程控制語句(goto)來控制命令運(yùn)行的流程,在批處理中也可以使用循環(huán)語句(for)來循環(huán)執(zhí)行一條命令。當(dāng)然,批處理文件的編程能力與C語言等編程語句比起來是十分有限的,也是十分不規(guī)范的。批處理的程序語句就是一條條的DOS命令(包括內(nèi)部命令和外部命令),而批處理的能力主要取決于你所使用的命令。====注==================批處理文件(batchfile)也可以稱之為批處理程序(batchprogram),這一點(diǎn)與編譯型語言有所不同,就c語言來說,擴(kuò)展名為c或者cpp的文件可以稱之為c語言文件或者c語言源代碼,但只有編譯連接后的exe文件才可以稱之為c語言程序。因?yàn)榕幚砦募旧砑染哂形谋镜目勺x性,又具有程序的可執(zhí)行性,這些稱謂的界限是比較模糊的。===========================第三,每個(gè)編寫好的批處理文件都相當(dāng)于一個(gè)DOS的外部命令,你可以把它所在的目錄放到你的DOS搜索路徑(path)中來使得它可以在任意位置運(yùn)行。一個(gè)良好的習(xí)慣是在硬盤上建立一個(gè)bat或者batch目錄(例如C:\BATCH),然后將所有你編寫的批處理文件放到該目錄中,這樣只要在path中設(shè)置上c:\batch,你就可以在任意位置運(yùn)行所有你編寫的批處理程序。====注=====純以dos系統(tǒng)而言,可執(zhí)行程序大約可以細(xì)分為五類,依照?qǐng)?zhí)行優(yōu)先級(jí)由高到低排列分別是:DOSKEY宏命令(預(yù)先駐留內(nèi)存),COMMAND.COM中的內(nèi)部命令(根據(jù)內(nèi)存的環(huán)境隨時(shí)進(jìn)駐內(nèi)存),以com為擴(kuò)展名的可執(zhí)行程序(由直接載入內(nèi)存),以exe位擴(kuò)展名的可執(zhí)行程序(由重定位后載入內(nèi)存),以bat位擴(kuò)展名的批處理程序(由解釋分析,根據(jù)其內(nèi)容按優(yōu)先級(jí)順序調(diào)用第2,3,4,5種可執(zhí)行程序,分析一行,執(zhí)行一行,文件本身不載入內(nèi)存)============第四,在DOS和Win9x/Me系統(tǒng)下,C:盤根目錄下的AUTOEXEC.BAT批處理文件是自動(dòng)運(yùn)行批處理文件,每次系統(tǒng)啟動(dòng)時(shí)會(huì)自動(dòng)運(yùn)行該文件,你可以將系統(tǒng)每次啟動(dòng)時(shí)都要運(yùn)行的命令放入該文件中,例如設(shè)置搜索路徑,調(diào)入鼠標(biāo)驅(qū)動(dòng)和磁盤緩存,設(shè)置系統(tǒng)環(huán)境變量等。下面是一個(gè)運(yùn)行于Windows98下的autoexec.bat的示例:@ECHOOFFPATHC:\WINDOWS;C:\WINDOWS\COMMAND;C:\UCDOS;C:\DOSTools;C:\SYSTOOLS;C:\WINTOOLS;C:\BATCHLHSMARTDRV.EXE/XLHDOSKEY.COM/insertLHCTMOUSE.EXESETTEMP=D:\TEMPSETTMP=D:\TEMP====注=====AUTOEXEC.BAT為DOS系統(tǒng)的自動(dòng)運(yùn)行批處理文件,由COMMAND.COM啟動(dòng)時(shí)解釋執(zhí)行;而在Win9x環(huán)境中,不僅增加支持了DOSSTART.BAT,WINSTART.BAT等許多其它自動(dòng)運(yùn)行的批處理文件,對(duì)AUTOEXEC.BAT也增加了.DOS.W40.BAK.OLD.PWS等許多變體以適應(yīng)復(fù)雜的環(huán)境和多變的需求。====willsort編注=============以下關(guān)于命令的分類,有很多值得推敲的地方。常用命令中的@本不是命令,而dir、copy等也很常用的命令卻沒有列入,而特殊命令中所有命令對(duì)我來說都是常用命令。建議將批處理所引用的命令分為內(nèi)部命令、外部命令、第三方程序三類。而內(nèi)部命令和外部命令中別有一類是專用于或常用于批處理中的命令可稱之為"批處理命令"。以下摘錄MS-DOS6.22幫助文檔中關(guān)于"批處理命令"的文字,當(dāng)然,其中有些概念和定義已經(jīng)有些落后了。批處理命令批處理文件或批處理程序是一個(gè)包含若干MS-DOS命令的正文文件,擴(kuò)展名為.BAT。當(dāng)在命令提示符下敲入批處理程序的名稱時(shí),MS-DOS成組執(zhí)行此批處理程序中的命令。任何在命令提示符下可使用的命令都可用在批處理程序中。此外,下面MS-DOS命令是專門在批處理程序中使用的。==========常用命令echo、@、call、pause、rem(小技巧:用::代替rem)是批處理文件最常用的幾個(gè)命令,我們就從他們開始學(xué)起。====注===========首先,@不是一個(gè)命令,而是DOS批處理的一個(gè)特殊標(biāo)記符,僅用于屏蔽命令行回顯.下面是DOS命令行或批處理中可能會(huì)見到的一些特殊標(biāo)記符:CR(0D)命令行結(jié)束符Escape(1B)ANSI轉(zhuǎn)義字符引導(dǎo)符Space(20)常用的參數(shù)界定符Tab(09);=不常用的參數(shù)界定符+COPY命令文件連接符*?文件通配符""字符串界定符|命令管道符<>>>文件重定向符@命令行回顯屏蔽符/參數(shù)開關(guān)引導(dǎo)符:批處理標(biāo)簽引導(dǎo)符%批處理變量引導(dǎo)符其次,::確實(shí)可以起到rem的注釋作用,而且更簡(jiǎn)潔有效;但有兩點(diǎn)需要注意:第一,除了::之外,任何以:開頭的字符行,在批處理中都被視作標(biāo)號(hào),而直接忽略其后的所有內(nèi)容,只是為了與正常的標(biāo)號(hào)相區(qū)別,建議使用goto所無法識(shí)別的標(biāo)號(hào),即在:后緊跟一個(gè)非字母數(shù)字的一個(gè)特殊符號(hào).第二,與rem不同的是,::后的字符行在執(zhí)行時(shí)不會(huì)回顯,無論是否用echoon打開命令行回顯狀態(tài),因?yàn)槊罱忉屍鞑徽J(rèn)為他是一個(gè)有效的命令行,就此點(diǎn)來看,rem在某些場(chǎng)合下將比::更為適用;另外,rem可以用于config.sys文件中.=====================echo表示顯示此命令后的字符echooff表示在此語句后所有運(yùn)行的命令都不顯示命令行本身@與echooff相象,但它是加在每個(gè)命令行的最前面,表示運(yùn)行時(shí)不顯示這一行的命令行(只能影響當(dāng)前行)。call調(diào)用另一個(gè)批處理文件(如果不用call而直接調(diào)用別的批處理文件,那么執(zhí)行完那個(gè)批處理文件后將無法返回當(dāng)前文件并執(zhí)行當(dāng)前文件的后續(xù)命令)。pause運(yùn)行此句會(huì)暫停批處理的執(zhí)行并在屏幕上顯示Pressanykeytocontinue...的提示,等待用戶按任意鍵后繼續(xù)rem表示此命令后的字符為解釋行(注釋),不執(zhí)行,只是給自己今后參考用的(相當(dāng)于程序中的注釋)。====注=====此處的描述較為混亂,不如直接引用個(gè)命令的命令行幫助更為條理ECHO當(dāng)程序運(yùn)行時(shí),顯示或隱藏批處理程序中的正文。也可用于允許或禁止命令的回顯。在運(yùn)行批處理程序時(shí),MS-DOS一般在屏幕上顯示(回顯)批處理程序中的命令。使用ECHO命令可關(guān)閉此功能。語法ECHO[ON|OFF]若要用echo命令顯示一條命令,可用下述語法:echo[message]參數(shù)ON|OFF指定是否允許命令的回顯。若要顯示當(dāng)前的ECHO的設(shè)置,可使用不帶參數(shù)的ECHO命令。message指定讓MS-DOS在屏幕上顯示的正文。CALL從一個(gè)批處理程序中調(diào)用另一個(gè)批處理程序,而不會(huì)引起第一個(gè)批處理的中止。語法CALL[drive:][path]filename[batch-parameters]參數(shù)[drive:][path]filename指定要調(diào)用的批處理程序的名字及其存放處。文件名必須用.BAT作擴(kuò)展名。batch-parameters指定批處理程序所需的命令行信息。PAUSE暫停批處理程序的執(zhí)行并顯示一條消息,提示用戶按任意鍵繼續(xù)執(zhí)行。只能在批處理程序中使用該命令。語法PAUSEREM在批處理文件或CONFIG.SYS中加入注解。也可用REM命令來屏蔽命令(在CONFIG.SYS中也可以用分號(hào);代替REM命令,但在批處理文件中則不能替代)。語法REM[string]參數(shù)string指定要屏蔽的命令或要包含的注解。=======================例1:用edit編輯a.bat文件,輸入下列內(nèi)容后存盤為c:\a.bat,執(zhí)行該批處理文件后可實(shí)現(xiàn):將根目錄中所有文件寫入a.txt中,啟動(dòng)UCDOS,進(jìn)入WPS等功能。批處理文件的內(nèi)容為:命令注釋:@echooff不顯示后續(xù)命令行及當(dāng)前命令行dirc:\*.*>a.txt將c盤文件列表寫入a.txtcallc:\ucdos\ucdos.bat調(diào)用ucdosecho你好顯示"你好"pause暫停,等待按鍵繼續(xù)rem準(zhǔn)備運(yùn)行wps注釋:準(zhǔn)備運(yùn)行wpscducdos進(jìn)入ucdos目錄wps運(yùn)行wps批處理文件的參數(shù)批處理文件還可以像C語言的函數(shù)一樣使用參數(shù)(相當(dāng)于DOS命令的命令行參數(shù)),這需要用到一個(gè)參數(shù)表示符"%"。%[1-9]表示參數(shù),參數(shù)是指在運(yùn)行批處理文件時(shí)在文件名后加的以空格(或者Tab)分隔的字符串。變量可以從%0到%9,%0表示批處理命令本身,其它參數(shù)字符串用%1到%9順序表示。例2:C:根目錄下有一批處理文件名為f.bat,內(nèi)容為:@echooffformat%1如果執(zhí)行C:\>fa:那么在執(zhí)行f.bat時(shí),%1就表示a:,這樣format%1就相當(dāng)于formata:,于是上面的命令運(yùn)行時(shí)實(shí)際執(zhí)行的是formata:例3:C:根目錄下一批處理文件名為t.bat,內(nèi)容為:@echoofftype%1type%2那么運(yùn)行C:\>ta.txtb.txt%1:表示a.txt%2:表示b.txt于是上面的命令將順序地顯示a.txt和b.txt文件的內(nèi)容。====注===============參數(shù)在批處理中也作為變量處理,所以同樣使用百分號(hào)作為引導(dǎo)符,其后跟0-9中的一個(gè)數(shù)字構(gòu)成參數(shù)引用符.引用符和參數(shù)之間(例如上文中的%1與a:)的關(guān)系類似于變量指針與變量值的關(guān)系.當(dāng)我們要引用第十一個(gè)或更多個(gè)參數(shù)時(shí),就必須移動(dòng)DOS的參數(shù)起始指針.shift命令正充當(dāng)了這個(gè)移動(dòng)指針的角色,它將參數(shù)的起始指針移動(dòng)到下一個(gè)參數(shù),類似C語言中的指針操作.圖示如下:初始狀態(tài),cmd為命令名,可以用%0引用cmdarg1arg2arg3arg4arg5arg6arg7arg8arg9arg10^^^^^^^^^^||||||||||%0%1%2%3%4%5%6%7%8%9經(jīng)過1次shift后,cmd將無法被引用cmdarg1arg2arg3arg4arg5arg6arg7arg8arg9arg10^^^^^^^^^^||||||||||%0%1%2%3%4%5%6%7%8%9經(jīng)過2次shift后,arg1也被廢棄,%9指向?yàn)榭?沒有引用意義cmdarg1arg2arg3arg4arg5arg6arg7arg8arg9arg10^^^^^^^^^|||||||||%0%1%2%3%4%5%6%7%8遺憾的是,win9x和DOS下均不支持shift的逆操作.只有在nt內(nèi)核命令行環(huán)境下,shift才支持/n參數(shù),可以以第一參數(shù)為基準(zhǔn)返復(fù)移動(dòng)起始指針.=================特殊命令ifgotochoicefor是批處理文件中比較高級(jí)的命令,如果這幾個(gè)你用得很熟練,你就是批處理文件的專家啦。一、if是條件語句,用來判斷是否符合規(guī)定的條件,從而決定執(zhí)行不同的命令。有三種格式:1、if[not]"參數(shù)"=="字符串"待執(zhí)行的命令參數(shù)如果等于(not表示不等,下同)指定的字符串,則條件成立,運(yùn)行命令,否則運(yùn)行下一句。例:if"%1"=="a"formata:====if的命令行幫助中關(guān)于此點(diǎn)的描述為:IF[NOT]string1==string2command在此有以下幾點(diǎn)需要注意:1.包含字符串的雙引號(hào)不是語法所必須的,而只是習(xí)慣上使用的一種"防空"字符2.string1未必是參數(shù),它也可以是環(huán)境變量,循環(huán)變量以及其他字符串常量或變量3.command不是語法所必須的,string2后跟一個(gè)空格就可以構(gòu)成一個(gè)有效的命令行=============================2、if[not]exist[路徑\]文件名待執(zhí)行的命令如果有指定的文件,則條件成立,運(yùn)行命令,否則運(yùn)行下一句。如:ifexistc:\config.systypec:\config.sys表示如果存在c:\config.sys文件,則顯示它的內(nèi)容。******注********也可以使用以下的用法:ifexistcommanddevice是指DOS系統(tǒng)中已加載的設(shè)備,在win98下通常有:AUX,PRN,CON,NULCOM1,COM2,COM3,COM4LPT1,LPT2,LPT3,LPT4XMSXXXX0,EMMXXXX0A:B:C:...,CLOCK$,CONFIG$,DblBuff$,IFS$HLP$具體的內(nèi)容會(huì)因硬軟件環(huán)境的不同而略有差異,使用這些設(shè)備名稱時(shí),需要保證以下三點(diǎn):1.該設(shè)備確實(shí)存在(由軟件虛擬的設(shè)備除外)2.該設(shè)備驅(qū)動(dòng)程序已加載(aux,prn等標(biāo)準(zhǔn)設(shè)備由系統(tǒng)缺省定義)3.該設(shè)備已準(zhǔn)備好(主要是指a:b:...,com1...,lpt1...等)可通過命令mem/d|find"device"/i來檢閱你的系統(tǒng)中所加載的設(shè)備另外,在DOS系統(tǒng)中,設(shè)備也被認(rèn)為是一種特殊的文件,而文件也可以稱作字符設(shè)備;因?yàn)樵O(shè)備(device)與文件都是使用句柄(handle)來管理的,句柄就是名字,類似于文件名,只不過句柄不是應(yīng)用于磁盤管理,而是應(yīng)用于內(nèi)存管理而已,所謂設(shè)備加載也即指在內(nèi)存中為其分配可引用的句柄.==================================3、iferrorlevel<數(shù)字>待執(zhí)行的命令很多DOS程序在運(yùn)行結(jié)束后會(huì)返回一個(gè)數(shù)字值用來表示程序運(yùn)行的結(jié)果(或者狀態(tài)),通過iferrorlevel命令可以判斷程序的返回值,根據(jù)不同的返回值來決定執(zhí)行不同的命令(返回值必須按照從大到小的順序排列)。如果返回值等于指定的數(shù)字,則條件成立,運(yùn)行命令,否則運(yùn)行下一句。如iferrorlevel2gotox2====注===========返回值從大到小的順序排列不是必須的,而只是執(zhí)行命令為goto時(shí)的習(xí)慣用法,當(dāng)使用set作為執(zhí)行命令時(shí),通常會(huì)從小到大順序排列,比如需將返回碼置入環(huán)境變量,就需使用以下的順序形式:iferrorlevel1setel=1iferrorlevel2setel=2iferrorlevel3setel=3iferrorlevel4setel=4iferrorlevel5setel=5...當(dāng)然,也可以使用以下循環(huán)來替代,原理是一致的:for%%ein(12345678...)doiferrorlevel%%esetel=%%e更高效簡(jiǎn)潔的用法,可以參考我寫的另一篇關(guān)于獲取errorlevel的文章出現(xiàn)此種現(xiàn)象的原因是,iferrorlevel比較返回碼的判斷條件并非等于,而是大于等于.由于goto的跳轉(zhuǎn)特性,由小到大排序會(huì)導(dǎo)致在較小的返回碼處就跳出;而由于set命令的"重復(fù)"賦值特性,由大到小排序會(huì)導(dǎo)致較小的返回碼"覆蓋"較大的返回碼.另外,雖然iferrorlevel=<數(shù)字>command也是有效的命令行,但也只是解釋命令行時(shí)將=作為命令行切分符而忽略掉罷了===========================二、goto批處理文件運(yùn)行到這里將跳到goto所指定的標(biāo)號(hào)(標(biāo)號(hào)即label,標(biāo)號(hào)用:后跟標(biāo)準(zhǔn)字符串來定義)處,goto語句一般與if配合使用,根據(jù)不同的條件來執(zhí)行不同的命令組。如:gotoend:endechothisistheend標(biāo)號(hào)用":字符串"來定義,標(biāo)號(hào)所在行不被執(zhí)行。====willsort編注label常被譯為"標(biāo)簽",但是這并不具有廣泛的約定性.goto與:聯(lián)用可實(shí)現(xiàn)執(zhí)行中途的跳轉(zhuǎn),再結(jié)合if可實(shí)現(xiàn)執(zhí)行過程的條件分支,多個(gè)if即可實(shí)現(xiàn)命令的分組,類似C中switchcase結(jié)構(gòu)或者Basic中的selectcase結(jié)構(gòu),大規(guī)模且結(jié)構(gòu)化的命令分組即可實(shí)現(xiàn)高級(jí)語言中的函數(shù)功能.以下是批處理和C/Basic在語法結(jié)構(gòu)上的對(duì)照:BatchC/Basicgoto&:goto&:goto&:&ifif{}&else{}/if&elseif&endifgoto&:&if...switch&case/selectcasegoto&:&if&set&envar...function()/function(),sub()==================================三、choice使用此命令可以讓用戶輸入一個(gè)字符(用于選擇),從而根據(jù)用戶的選擇返回不同的errorlevel,然后于iferrorlevel配合,根據(jù)用戶的選擇運(yùn)行不同的命令。注意:choice命令為DOS或者Windows系統(tǒng)提供的外部命令,不同版本的choice命令語法會(huì)稍有不同,請(qǐng)用choice/?查看用法。choice的命令語法(該語法為Windows2003中choice命令的語法,其它版本的choice的命令語法與此大同小異):CHOICE[/Cchoices][/N][/CS][/Ttimeout/Dchoice][/Mtext]描述:該工具允許用戶從選擇列表選擇一個(gè)項(xiàng)目并返回所選項(xiàng)目的索引。參數(shù)列表:/Cchoices指定要?jiǎng)?chuàng)建的選項(xiàng)列表。默認(rèn)列表是"YN"。/N在提示符中隱藏選項(xiàng)列表。提示前面的消息得到顯示,選項(xiàng)依舊處于啟用狀態(tài)。/CS允許選擇分大小寫的選項(xiàng)。在默認(rèn)情況下,這個(gè)工具是不分大小寫的。/Ttimeout做出默認(rèn)選擇之前,暫停的秒數(shù)??山邮艿闹凳菑?到9999。如果指定了0,就不會(huì)有暫停,默認(rèn)選項(xiàng)會(huì)得到選擇。/Dchoice在nnnn秒之后指定默認(rèn)選項(xiàng)。字符必須在用/C選項(xiàng)指定的一組選擇中;同時(shí),必須用/T指定nnnn。/Mtext指定提示之前要顯示的消息。如果沒有指定,工具只顯示提示。/?顯示幫助消息。注意:ERRORLEVEL環(huán)境變量被設(shè)置為從選擇集選擇的鍵索引。列出的第一個(gè)選擇返回1,第二個(gè)選擇返回2,等等。如果用戶按的鍵不是有效的選擇,該工具會(huì)發(fā)出警告響聲。如果該工具檢測(cè)到錯(cuò)誤狀態(tài),它會(huì)返回255的ERRORLEVEL值。如果用戶按Ctrl+Break或Ctrl+C鍵,該工具會(huì)返回0的ERRORLEVEL值。在一個(gè)批程序中使用ERRORLEVEL參數(shù)時(shí),將參數(shù)降序排列。示例:CHOICE/?CHOICE/CYNC/M"確認(rèn)請(qǐng)按Y,否請(qǐng)按N,或者取消請(qǐng)按C。"CHOICE/T10/Cync/CS/DyCHOICE/Cab/M"選項(xiàng)1請(qǐng)選擇a,選項(xiàng)2請(qǐng)選擇b。"CHOICE/Cab/N/M"選項(xiàng)1請(qǐng)選擇a,選項(xiàng)2請(qǐng)選擇b。"====willsort編注===============================我列出win98下choice的用法幫助,已資區(qū)分Waitsfortheusertochooseoneofasetofchoices.等待用戶選擇一組待選字符中的一個(gè)CHOICE[/C[:]choices][/N][/S][/T[:]c,nn][text]/C[:]choicesSpecifiesallowablekeys.DefaultisYN指定允許的按鍵(待選字符),默認(rèn)為YN/NDonotdisplaychoicesand?atendofpromptstring.不顯示提示字符串中的問號(hào)和待選字符/STreatchoicekeysascasesensitive.處理待選字符時(shí)大小寫敏感/T[:]c,nnDefaultchoicetocafternnseconds在nn秒后默認(rèn)選擇ctextPromptstringtodisplay要顯示的提示字符串ERRORLEVELissettooffsetofkeyuserpressesinchoices.ERRORLEVEL被設(shè)置為用戶鍵入的字符在待選字符中的偏移值如果我運(yùn)行命令:CHOICE/CYNC/M"確認(rèn)請(qǐng)按Y,否請(qǐng)按N,或者取消請(qǐng)按C。"屏幕上會(huì)顯示:確認(rèn)請(qǐng)按Y,否請(qǐng)按N,或者取消請(qǐng)按C。[Y,N,C]?例:test.bat的內(nèi)容如下(注意,用iferrorlevel判斷返回值時(shí),要按返回值從高到低排列):@echooffchoice/Cdme/M"defrag,mem,end"iferrorlevel3gotoendiferrorlevel2gotomemiferrorlevel1gotodefrag:defragc:\dos\defraggotoend:memmemgotoend:endechogoodbye此批處理運(yùn)行后,將顯示"defrag,mem,end[D,M,E]?",用戶可選擇dme,然后if語句根據(jù)用戶的選擇作出判斷,d表示執(zhí)行標(biāo)號(hào)為defrag的程序段,m表示執(zhí)行標(biāo)號(hào)為mem的程序段,e表示執(zhí)行標(biāo)號(hào)為end的程序段,每個(gè)程序段最后都以gotoend將程序跳到end標(biāo)號(hào)處,然后程序?qū)@示goodbye,批處理運(yùn)行結(jié)束。四、for循環(huán)命令,只要條件符合,它將多次執(zhí)行同一命令。語法:對(duì)一組文件中的每一個(gè)文件執(zhí)行某個(gè)特定命令。FOR%%variableIN(set)DOcommand[command-parameters]%%variable指定一個(gè)單一字母可替換的參數(shù)。(set)指定一個(gè)或一組文件??梢允褂猛ㄅ浞ommand指定對(duì)每個(gè)文件執(zhí)行的命令。command-parameters為特定命令指定參數(shù)或命令行開關(guān)。例如一個(gè)批處理文件中有一行:for%%cin(*.bat*.txt)dotype%%c則該命令行會(huì)顯示當(dāng)前目錄下所有以bat和txt為擴(kuò)展名的文件的內(nèi)容。====willsort編注=====================================================需要指出的是,當(dāng)()中

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論