代碼編程樣本
❶ 利用matlab編程模擬生成100個長度為1024點的隨機過程樣本
b = randn(100,1024);
❷ 計算機編程中的pattern level和sample level是什麼意思如何用中文表達
pattern level=模式級別(應該有可選擇的編程模式);
sample level=樣本級別。
❸ Excel VBA編程,通配符,批量替換、篩選所有數字、字母、常見標點符號、中文字元
代碼如下:(樣本文件見附件)
Subtest()
DimregXAsObject,sAsString,i,j
SetregX=CreateObject("vbscript.regeXP")
Fori=1ToCells(Rows.Count,1).End(3).Row
WithregX
.Global=True
Forj=2To5
SelectCasej
Case2
s="[^u4e00-u9fa5]"'取漢字
Case3
s="D"'取數字
Case4
s="[^a-zA-Z]"'取字母
Case5
s="[u4e00-u9fa50-9a-zA-Z]"'取符號
EndSelect
.Pattern=s
Cells(i,j)=.Replace(Cells(i,1),"")
Nextj
EndWith
Next
EndSub
❹ 在線的等,用c語言編程實現如下功能。
代碼如下:調試無誤:
#include"stdio.h"
#include"math.h"
#include"stdlib.h"
#include"string.h"
#definePI 3.1415926
intmain(){
intn,i;
double*x;
double*y;
scanf("%d",&n);
x=(double*)malloc(sizeof(double)*n);
y=(double*)malloc(sizeof(double)*n);
memset(y,0,sizeof(double)*n);
memset(x,0,sizeof(double)*n);
for(i=0;i<n;i++)
scanf("%lf",&x[i]);
for(i=0;i<n;i++)
y[i]=(PI*(x[i]/2)*(x[i]/2)/4-(x[i]/2)*(x[i]/2)/2)*8;
for(i=0;i<n;i++)
printf("案例%d:%.2lf ",i+1,y[i]);
free(x);
free(y);
}
結果:
❺ C語言編程!幫幫忙!
讀寫文件,教科書上有。都寫出來是你做作業還是我做作業?
還有別亂用嘆號,這不是問人的態度
只給出關鍵代碼。請自行閱讀並組合。
0.讀入文件
1.分割文件成為token(關鍵點)
2.統計token數目
3.輸出統計信息
1.分割token用C標准庫中的strtok()函數完成。
strtok()的原型為:
char *strtok( char *strToken, const char *strDelimit );
strToken為目標字元串,strDelimit為分割符集合。返回值是一個分割好的Token。
例子程序:
#include <string.h>
#include <stdio.h>
char string[] = "A string\tof ,,tokens\nand some more tokens"; // 目標字元串
char seps[] = " ,\t\n"; // 分割符集
char *token;
void main( void )
{
printf( "%s\n\nTokens:\n", string );
/* 將目標字元串和分割符集給入strtok,返回第一個token */
token = strtok( string, seps );
while( token != NULL )
{
/* 列印一個token */
printf( " %s\n", token );
/* 獲取下一個token */
token = strtok( NULL, seps );
}
}
輸出結果如下:
moose@iBookG4:~/Projects/svn_repo/trunk/data_struct/glibc$ ./a.out
A string of ,,tokens
and some more tokens
Tokens:
A
string
of
tokens
and
some
more
tokens
可見所有單詞都被分割出來了。
另外,ANSI還可以用wcstok()對漢字(寬字元集)進行分割。
再另,如果你的作業考查點在實現一個自己的strtok(),請自行分析之。
其他幾個功能都是比較基本的功能。不再贅述。請自行思考。
給出一個我做的樣本,很多情況沒有考慮(不用文件輸入/輸出,不考慮內存消耗,不考慮token數量等等),僅作參考:
#include <string.h>
#include <stdio.h>
char string[] = "DESCRIPTION\n For strtok(): [CX] [Option Start] The functionality described on this reference page is aligned with the ISO C standard. Any conflict between the requirements described here and the ISO C standard is unintentional. This volume of IEEE Std 1003.1-2001 defers to the ISO C standard. [Option End]\n A sequence of calls to strtok() breaks the string pointed to by s1 into a sequence of tokens, each of which is delimited by a byte from the string pointed to by s2. The first call in the sequence has s1 as its first argument, and is followed by calls with a null pointer as their first argument. The separator string pointed to by s2 may be different from call to call.\n The first call in the sequence searches the string pointed to by s1 for the first byte that is not contained in the current separator string pointed to by s2. If no such byte is found, then there are no tokens in the string pointed to by s1 and strtok() shall return a null pointer. If such a byte is found, it is the start of the first token.\n The strtok() function then searches from there for a byte that is contained in the current separator string. If no such byte is found, the current token extends to the end of the string pointed to by s1, and subsequent searches for a token shall return a null pointer. If such a byte is found, it is overwritten by a null byte, which terminates the current token. The strtok() function saves a pointer to the following byte, from which the next search for a token shall start.\n Each subsequent call, with a null pointer as the value of the first argument, starts searching from the saved pointer and behaves as described above.";
char seps[] = " ,.[]:\t\n";
char *token;
struct _token_stat{
char token[64];
int stat;
};
// 至多允許出現1024個單詞
struct _token_stat gTokens[1024];
void main( void )
{
int i;
for (i = 0; i < 1024; i++)
{
gTokens[i].token[0]='\0';
gTokens[i].stat=0;
}
printf( "%s\n\nTokens:\n", string );
/* Establish string and get the first token: */
token = strtok( string, seps );
while( token != NULL )
{
// 統計信息
{
int i;
for (i=0;i<1024;i++)
{
if ( strlen(gTokens[i].token)==0)
{
strcpy(gTokens[i].token, token);
gTokens[i].stat++;
break;
}
else
{
if ( strcmp(gTokens[i].token,token)==0)
{
gTokens[i].stat++;
break;
}
}
}
}
/* Get next token: */
token = strtok( NULL, seps );
}
for (i=0;i<1024;i++)
{
if (strlen(gTokens[i].token)>0)
{
printf("token=%s, stat=%d\n", gTokens[i].token, gTokens[i].stat);
}
}
}
輸出結果:
moose@iBookG4:~/Projects/svn_repo/trunk/data_struct/glibc$ ./a.out
DESCRIPTION
For strtok(): [CX] [Option Start] The functionality described on this reference page is aligned with the ISO C standard. Any conflict between the requirements described here and the ISO C standard is unintentional. This volume of IEEE Std 1003.1-2001 defers to the ISO C standard. [Option End]
A sequence of calls to strtok() breaks the string pointed to by s1 into a sequence of tokens, each of which is delimited by a byte from the string pointed to by s2. The first call in the sequence has s1 as its first argument, and is followed by calls with a null pointer as their first argument. The separator string pointed to by s2 may be different from call to call.
The first call in the sequence searches the string pointed to by s1 for the first byte that is not contained in the current separator string pointed to by s2. If no such byte is found, then there are no tokens in the string pointed to by s1 and strtok() shall return a null pointer. If such a byte is found, it is the start of the first token.
The strtok() function then searches from there for a byte that is contained in the current separator string. If no such byte is found, the current token extends to the end of the string pointed to by s1, and subsequent searches for a token shall return a null pointer. If such a byte is found, it is overwritten by a null byte, which terminates the current token. The strtok() function saves a pointer to the following byte, from which the next search for a token shall start.
Each subsequent call, with a null pointer as the value of the first argument, starts searching from the saved pointer and behaves as described above.
Tokens:
token=DESCRIPTION, stat=1
token=For, stat=1
token=strtok(), stat=5
token=CX, stat=1
token=Option, stat=2
token=Start, stat=1
token=The, stat=6
token=functionality, stat=1
token=described, stat=3
token=on, stat=1
token=this, stat=1
token=reference, stat=1
token=page, stat=1
token=is, stat=12
token=aligned, stat=1
token=with, stat=3
token=the, stat=24
token=ISO, stat=3
token=C, stat=3
token=standard, stat=3
token=Any, stat=1
token=conflict, stat=1
token=between, stat=1
token=requirements, stat=1
token=here, stat=1
token=and, stat=5
token=unintentional, stat=1
token=This, stat=1
token=volume, stat=1
token=of, stat=7
token=IEEE, stat=1
token=Std, stat=1
token=1003, stat=1
token=1-2001, stat=1
token=defers, stat=1
token=to, stat=12
token=End, stat=1
token=A, stat=1
token=sequence, stat=4
token=calls, stat=2
token=breaks, stat=1
token=string, stat=8
token=pointed, stat=7
token=by, stat=10
token=s1, stat=5
token=into, stat=1
token=a, stat=13
token=tokens, stat=2
token=each, stat=1
token=which, stat=3
token=delimited, stat=1
token=byte, stat=9
token=from, stat=5
token=s2, stat=3
token=first, stat=7
token=call, stat=5
token=in, stat=5
token=has, stat=1
token=as, stat=4
token=its, stat=1
token=argument, stat=3
token=followed, stat=1
token=null, stat=5
token=pointer, stat=6
token=their, stat=1
token=separator, stat=3
token=may, stat=1
token=be, stat=1
token=different, stat=1
token=searches, stat=3
token=for, stat=4
token=that, stat=2
token=not, stat=1
token=contained, stat=2
token=current, stat=4
token=If, stat=4
token=no, stat=3
token=such, stat=4
token=found, stat=4
token=then, stat=2
token=there, stat=2
token=are, stat=1
token=shall, stat=3
token=return, stat=2
token=it, stat=2
token=start, stat=2
token=token, stat=5
token=function, stat=2
token=extends, stat=1
token=end, stat=1
token=subsequent, stat=2
token=overwritten, stat=1
token=terminates, stat=1
token=saves, stat=1
token=following, stat=1
token=next, stat=1
token=search, stat=1
token=Each, stat=1
token=value, stat=1
token=starts, stat=1
token=searching, stat=1
token=saved, stat=1
token=behaves, stat=1
token=above, stat=1
❻ 急!關於VB,簡單的程序設計
分類:電腦IT
四、數組中常見錯誤和注意事項
1.靜態數組聲明下標出現變數
n = InputBox("輸入數組的上界")
Dim a(1 To n) As Integer
2.數組下標越界
引用的下標比數組聲明時的下標范圍大或小。
Dim a(1 To 30) As Long, I as integer
a(1) = 1: a(2) = 1
For i = 3 To 30
a(i) = a(i - 2) + a(i - 1)
Next I
3.數組維數錯
數組聲明時的維數與引用數組元素時的維數不一致。
Dim a(3, 5) As Long
a(I)=10
4.Aarry函數使用問題
只能對Variant 的變數或動態數組賦值。
5.獲得數組的上界、下界
UBound 、Lbound函數
1.Dim數組聲明
有時用戶為了程序的通用性,聲明數組的上界用變數來表示,如下程序段:
n=InputBox("輸入數組的上界")
Dim a(1 To n)As Integer
程序運行時將在Dim語句處顯示"要求常數表達式"的出錯信息。即Dim語句中聲明的數組上、下界必須是常數,不能是變數。
解決程序通用的問題,一是將數組聲明的很大,這樣浪費一些存儲空間;二是利用動態數組,將上例改變如下:
Dim a()As Integer
n=InputBox ("輸入數組的上界")
ReDim a(1 To n) As Integer
2.數組下標越界
引用了不存在的數組元素,即下標比數組聲明時的下標范圍大或小。例如,要形成有如下30項的斐波那契數列:
1,1,2,3,5,8,13,21,34,…,317811,514229,832040
正確的程序段如下:
Dim a(1 To 30) As Long, i%
若將For i=3 To 30改為For i=1 To 30,程序運行時會顯示"下標越界"的出錯信息,因為開始循環時i=l,執行到循環體語句a(i)=a(i-2)+a(i-1),數組下標i-2、i-1均小於下界1。
同樣若將上例:a(i)=a(i-2)+a(i-1)語句改為:a(i+2)=a(i)+a(i+1)。
程序運行時也會顯示"下標越界"的出錯信息,這時是數組下標大於上界30。
3.數組維數錯
數組聲明時的維數與引用數組元素時的維數不一致。例如,下程序段為形成和顯示3×5的矩陣:
Dim a(3,5) As Long
For i=1 To 3
For j=1 To 5
a(i)=i*j
Print a(i);"";
Next j
Print
Next i
程序運行到a(i)=i*j語句時出現"維數錯誤"的信息,因為在Dim聲明時是二維數組,引用時的一個下標。
4.Array函數使用問題
Array函數可方便地對數組整體賦值,但此時只能聲明Variant的變數或僅由括弧括起的動態數組。賦值後的數組大小由賦值的個數決定。
例如,要將1,2,3,4,5,6,7這些值賦值給數組a,表2.5.1列出了三種錯誤及相應正確的賦值方法。
表2.5.1 Array函數表示方法
錯誤的Array函數賦值
改正的Aarry函數賦值
Dim a(1 To 8)
a=Array(1,2,3,4,5,6,7,8)
Dim a( ) a=Array(1,2,3,4,5,6,7)
Dim a As Integer a=Array(1,2,3,4,5,6,7)
Dim a a=Array(1,2,3,4,5,6,7)
Dim a
a()=Array(1,2,3,4,5,6,7)
Dim a a=Array(1,2,3,4,5,6,7)
5.如何獲得數組的上界、下界
Array函數可方便地對數組整體賦值,但在程序中如何獲得數組的-上界、下界,以保證訪問的數組元素在合法的范圍內,可使用UBound和LBound函數來決定數組訪問。
在上例中,若要列印a數組的各個值,可通過下面程序段實現:
For i=Lbound(A) To Ubound(A)
Print a(i)
Next i
6.給數組賦值
VB6.0提供了可對數組整體賦值的新功能,方便了數組對數組的賦值操作。但真正使用不那麼方便,有不少限制。數組賦值形式如下:
數組名2=數組名1
我們就此形式作討論:這里的數組名2,實際上在前面的數組聲明時,只能聲明為Variant的變數,賦值後的數組2的大小、維數、類型同數組名1;否則,若聲明成動態或靜態的數組,例如:
Dim數組名2()或Dim數組名2 (下標)
程序在運行到上述賦值語句時顯示"不能給數組賦值"的出錯信息。
所以,為了程序的安全、可靠,建議讀者還是忍痛割愛,少用VB6.0的這一新功能,使用傳統的循環結構來給數組賦值。基於此原因,我們也就在教程中不作展開。
五、過程中常見錯誤和注意事項
1.程序設計演算法問題
該章程序編寫難度較大,主要是演算法的構思有困難,這也是程序設計中最難學習的階段。經驗告訴每一位程序設計的初學者,沒有捷徑可走,多看、多練、知難而進。上機前一定要先編寫好程序,仔細分析、檢查,才能提高上機調試的效率。每當一個程序通過艱苦的努力調試通過時,那苦盡甘來的喜悅令你一言難盡。
2.確定自定義的過程是子過程還是函數過程
實際上過程是一個具有某種功能的獨立程序單位,供多次調用。子過程與函數過程的區別是前者子過程名無值,後者函數過程名有值。若過程有一個返回值,則習慣使用函數過程;若過程無返回值,則使用子過程,若過程返回多個值,一般使用子過程,通過實參與形參的結合帶回結果,當然也可通過函數過程名帶回一個,其餘結果通過實參與形參的結合帶回。
3.過程中形參的個數和傳遞方式的確定
對初學者,在定義過程時不能確定形參的個數和傳遞方式。
過程中參數的作用是實現過程與調用者的數據通信。一方面,調用者為子過程或函數過程提供初值,這是通過實參傳遞給形參實現的,另一方面,子過程或函數過程將結果傳遞給調用者,這是通過地址傳遞方式實現的,因此,決定形參的個數就是由上述兩方面決定的。對初學者,往往喜歡把過程體中用到的所有變數作為形參,這樣就增加了調用者的負擔和出錯概率,也有的初學者全部省略了形參,則無法實現數據的傳遞,既不能從調用者得到初值,也無法將計算結果傳遞給調用者。
VB中形參與實參的結合有傳值和傳地址兩種方式。區別如下:
(1)在定義形式上前者在形參前加即ByVal關鍵字。
(2)在作用上值傳遞只能從外界向過程傳入初值,但不能將結果傳出,而地址傳遞既可傳入又可傳出。
(3)如果實參是數組、自定義類型、對象變數等,形參只能是地址傳遞。
4.實參與形參類型對應問題
在地址傳遞方式時,調用過程實參與形參類型要一致。例如:
函數過程定義如下:
Public Function f!(x!)
f=x+x
End Function
主調程序如下:
Privme Sub Commandl_Click()
Dim y%
y=3
Print f(y)
End Sub
上例形參x是單精度型、實參y是整型,程序運行時會顯示"ByRef參數類型不符"的編譯出錯信息。
在值傳遞時,若是數值型,則實參按形參的類型將值傳遞給形參。例如:
函數過程定義如下:
Public Function f!(ByVal x%)
f=x+x
End Function
主調程序如下:
Priva~SubCommandI_Click()
Dim y!
Y=3.4
Print f(y)
End Sub
程序運行後顯示的結果是6。
5.變數的作用域問題
局部變數,在對該過程調用時,分配該變數的存儲空間,當過程調用結束,回收分配的存儲空間,也就是調用一次,初始化一次,變數不保值,窗體級變數,當窗體裝入,分配該變數的存儲空間,直到該窗體從內存卸掉,才回收該變數分配的存儲空間。
例如,要通過文本框輸入若干個值,每輸入一個按Eeter鍵,直到輸入的值為9999,輸入結束,求輸入的數的平均值。
Private Sub Textl_Key Press(Key Ascii As Integer)
Dim sum!,n%
If KeyAscii=13 Then
If Val(Text1)=9999 Then
sum=sum/n
Print sum
Else
Sum=sum+Text1
n=n+1
Text1=""
End If
End If
End Sub
該過程沒有語法錯,運行程序可輸入若干個數,但當輸入9999時,程序顯示"溢出"的錯誤。原因sum和n是局部變數,每按一個鍵,局部變數初始化為0,所以會有上述錯誤產生。
改進方法:將要保值的局部變數聲明為Static靜態變數或聲明為窗體級變數。也可將要保值的變數在通用聲明段進行聲明為窗體級變數。
6.遞歸調用出現"棧溢出"
如下求階乘的遞歸函數過程:
Public Functionfac(n As Integer)As integer
If n=1 Then
fac=1
Else
fac=n*fac(n-1)
End If
End Function
Private Sub Commandl_Click() '調用遞歸函數,顯示出fac(5)=120
Print "fac(5)";fac(5)
End Sub
當主調程序調用時,n的值為5時,顯示120結果;當n的值為-5時,顯示"溢出堆棧空間"的出錯信息。
實際上每遞歸調用一次,系統將當前狀態信息(形參、局部變數、調用結束時的返回地址)壓棧,直到到達遞歸結束條件。上例當n=5時,每遞歸調用一次,參數n-l,直到n=l遞歸調用結束,然後不斷從棧中彈出當前參數,直到棧空。而當n=-5時,參數n-1為-6、壓棧,再遞歸調用、n-1永遠到不了n=l的終止條件,直到棧滿,產生棧溢出的出錯信息。
所以設計遞歸過程時,一定要考慮過程中有終止的條件和終止時的值或某種操作,而且每遞歸調用一次,其中的參數要向終止方向收斂,否則就會產生棧溢出。
六、常用控制項常見錯誤和難點分析
1.遺漏對象名稱
在VB程序設計時,初學者常犯的一個錯誤是遺漏對象名稱,特別是在使用列表框時。例如,如果要引用列表框(List1)中當前選定的項目,Listl.list(Listlndex)是錯誤的。即使當前焦點在Listl上,VB也不是認為Listlndex是List l的屬性,而是一個變數。所以正確的引用方式是:Listl. 1ist(Listl.Listlndex)。
2.列表框的Columns屬性
列表框的Columns屬性決定列表框是水平還是垂直滾動以及如何顯示列中的項目。如果水平滾動,則Columns屬性決定顯示多少列,如表2.7.2所示。圖2.7.1是一個水平滾動兩列顯示的列表框。
在程序運行期間,該屬性是只讀的,也就是說,不能在運行時,將多列列表框變為單列列表框或將單列列表框變為多列列表框。
表2.7.2 列表框的Columns屬性
列數 屬 性
0(默認值)1到n 項目安排在一列中,且列表框豎直滾動項目安排在多個列中,先填第一列,再填第二列……列表框水平滾動並顯示指定數目的列
3.域級驗證
域級驗證是指輸入到某獨立域的數據的驗證,在域級驗證的過程中一般不考慮窗體一般其他域的內容。進行域級驗證的合適時間是:
(1)當往某域中輸入某個鍵時,此時涉及鍵盤事件(KeyDown、KeyUp和KeyPress)。
(2)當用戶企圖離開某域時,此時涉及CansesValidate屬性和Validate事件。
(3)當某域的內容發生變化時,此時涉及Change事件。
CausesValidation屬性和Validate事件通常是協同工作的。
CausesValidate屬性決定Validate事件是否發生。如果控制項的CausesValidate屬性為False,該控制項的Validate事件永遠不會發生。如果控制項的CausesValidate屬性為Tree,當焦點企圖移到(還沒有離開,也可以說離開之前)另一個CausesValidate屬性為True的控制項時,原控制項的Validate事件發生:當焦點企圖移到另一個CausesValidate屬性為False的控制項時,原控制項的Validate事件暫時不發生,什麼時候發生?直到焦點移到一個CausesValidate屬性為True的控制項上時才發生。
例如,假定有如圖2.7.2所示的程序。當焦點企圖從Textl移到Text2時,Textl的Validate事件發生,同樣當焦點企圖從Text2移到Textl時,Text2的Validate事件發生。當焦點企圖從Textl移到Text3時,TextI的Validate事件暫時沒有發生,因為Text3的CausesValidate為False,然後如果焦點企圖繼續移動到Text2時,Textl的Validate事件才發生。
圖2.7.2 CausesValidate屬性和Validate事件
CausesValidate屬性和Validate事件的這一特性常常應用在如圖2.7.3所示的程序中。當在文本框中輸入了無效數據時而又不知道如何輸入有效數據時,用戶往往選擇Help命令尋求幫助或選擇Cancel命令結束數據輸入,此時不希望執行驗證程序。因為如果執行驗證程序且發現了無效數據,則無法選擇Help或Cancel了,用戶就這樣被套住了。現在只要將文本框的CausesValidate屬性設為True,命令按鈕的CausesValidate屬性為False,驗證程序放在 Validate過程中,問題就解決了。在默認情況下,所有控制項的CausesValidation屬性都為Tree。
圖2.7.3 命令按鈕的CausesValidate屬性和Validate事件
並不是所有的控制項都有Validate事件。只有那些能用於輸入數據的控制項(如文本框、復選框、滾動條等)才有這個事件。Validate事件過程如下:
Privme Sub object_Validate(Cancel As Boolean)
…
EndSub
其中,當參數Cancel被設為Tree後,焦點將不會離開對象。
如果要將實驗七第1題改用Validate事件和CausesValidation屬性實現數據驗證,則應有如下的程序。
Sub txtMath_Validate(Cancel As Boolean)
If Val(txtMath.Text)<0 Or _
Val(txtMath.Text)>100 Then
Cancel=True
End If
End Sub
1.窗體頂部菜單欄中的菜單項與子菜單中的菜單項的區別
窗體頂部菜單欄中的菜單項與子菜單中的菜單項都是在菜單編輯器中定義的,但是它們是有區別的。
(1)窗體頂部菜單欄中的菜單項不能定義快捷鍵,而子菜單中的菜單項可以有快捷鍵。
(2)當有熱鍵字母(菜單標題中"&"後的字母)時,按Alt+熱鍵字母選擇窗體頂部菜單欄中的菜單項,按熱鍵字母選擇子菜單中的菜單項(當子菜單打開時)。子菜單沒有打開時,按熱鍵字母無法選擇其中的菜單項。
(3)盡管所有的菜單項都能響應Click事件,但是窗體頂部菜單欄中的菜單項不需要編寫事件過程。
2.在程序中對通用對話框的屬性設置不起作用
在程序中對通用對話框的屬性設置不起作用,多數情況是因為在彈出對話框後才進行屬性設置。例如,下面的程序代碼就存在這樣的問題,改正方法是將彈出對話框語句放到最後,即把CommonDialogl.Action=l放在所有屬性設置語句的後面。
CommonDialog1.Action=1
ConmaonDialog1.FileName="*.Bmp"
CommonDialogl.InitDir="C:\Windows"
CommonDialog1.Filter="Pictures(*.Bmp)|*.Bmp|All Files(*.*)|*.*"
CommonDialog1.FilterIndex=1
3.在工程中添加現有窗體時發生載入錯誤
在使用"工程"菜單中的"添加窗體"命令添加一個現存的窗體時經常發生載入錯誤,絕大多數是因為窗體名稱沖突的緣故。例如,假定當前打開了一個含有名稱為Forml的工程,如果想把屬於另一個工程的Forml窗體裝入則肯定會出錯。
[注意]
窗體名與窗體文件名的區別。在一個工程中,可以有兩個窗體文件名相同的窗體(分布在不同的文件夾中),但是絕對不能同時出現兩個窗體名相同的窗體。
4.實時菜單的創建
實時菜單是由應用程序根據需要動態創建的。在VB中,常見的實時菜單是"文件"菜單,該菜單顯示了最近所使用的工程。
創建實時菜單必須結合控制項數組,用Load語句創建菜單項,用UnLoad清除菜單項。
創建實時菜單的步驟:
(1)在菜單編輯器中建立樣本菜單項
樣本菜單項的屬性設置見表2.8.4所示。設置Index為0,表明樣本菜單項是控制項數組的一個元素,其下標為0。樣本菜單項的Name屬性是必須的,它將作為控制項數組的名稱。在下面假定數組名為NameArray。Visible可以設為True,設為False表示初始時該菜單項不可見。
表2.8.4 實時菜單樣本菜單項
屬性 Name Caption Index Visible
設置值 必需的 可以沒有 0 False
(2)在程序中用Load語句創建菜單項
例如,Load NameArray(1)創建一個新的菜單項(在控制項數組中的下標為1,然後將其 Visible屬性設置True,同時設置Caption屬性。
動態創建的菜單項繼承了除了Index之外的絕大部分屬性,所以要對Caption和Visible屬性進行設置。另外,樣本菜單項在菜單系統中的位置決定了新菜單項出現的位置。
(3)為實時菜單項編寫代碼
每個實時菜單項都是控制項數組的一個成員,具有相同的名稱,並且共享事件過程。
下面是一個實時菜單項代碼示例:
SubNameArray_Click(Index As Integer)
Select Case Index
Case 0
MsgBox("NameArmy(0)(樣本菜單項) is clicked!")
Case 1
MsgBox("NameArray(1)(第一個實購菜單項) is clicked!")
Case 2
MsgBox("NameArray(2)(第二個實時菜單項) is clicked!")
End Select
End Sub
(4)刪除實時菜單項
盡管把Visible設為False,程序運行時實時菜單項不會顯示,然而有時還是需要把實時菜單項從內存中銷毀。刪除實時菜單使用UnLoad語句。例如,LoadNameArray(1)。
有關建立實時菜單的詳細內容請參閱教程第4.3節。
5.通用對話框的CancelError屬性和Err對象
當通用對話框的CancelError屬性為True時,無論何時選擇"取消"按鈕,均產生 32755(cdlCancel)號錯誤,即將Err的Number屬性設置為32755。
Err是VB的一個系統對象,它記錄了程序運行期間所發生的錯誤。
Err對象的重要屬性有Number(默認屬性)和Description。當錯誤發生後,錯誤的生成者把錯誤號和有關錯誤的說明分別存放在Number和Description屬性中。例如,當在 CancelError屬性為True的通用對話框中選擇"取消"按鈕時,產生一個錯誤,Err對象的Number和Description屬性將被設置為32755和"選擇'取消'"。
在程序運行期間,經常會發生各種各樣的錯誤。有關錯誤處理的詳細內容請參閱教程第 9.6節。
下面是當程序產生cdlCancel錯誤時結束程序的運行。
SubForm_ClickO
CommonDialogl.CancelError=True
On Error GoTo ErrorHandler
CommonDialogl.Action=l
' 處理文件的語句
ErrorHandler:
If Err.Number=cdlCancel Then
End
Endlf
End Sub
6.與窗體有關的事件
在首次用Load語句將窗體(假定該窗體在內存中還沒有創建)調入內存之時依次發生 Initialize和Load事件。再用UnLoad將窗體從內存中卸載時依次發生QueryUnLoad和Unload事件,再使用Set窗體名=Nothing語句解除初始化時發生Terminate事件。
Initialize是在窗體創建時發生的事件。在窗體的整個生命周期中,Initialize事件只觸發一次。用戶可以將一個窗體裝入內存或從內存中刪除很多次,但窗體的建立只有一次。也就是說,在用Load語句將窗體裝入內存時會觸發Load事件,但並不一定觸發Initialize事件。
在用UnLoad語句卸載窗體後,如果沒有使用Set窗體名=Nothing解除初始化,則在下次使用Load語句時不會觸發Initialize事件,否則會引起Initialize事件。
假定有Forml和Form2兩個窗體,並且有下列事件過程:
' Forml窗體事件過程
Sub Form_Click()
Debug.Print"窗體首次裝入內存時發生的事件:"
Load Form2
Debug.Print"用Unload卸載窗體時發生的事件:"
UnloadForm2
Debug.Print "窗體第二次裝入內存時發生的事件:"
Load Form2
Debug.Print "用Unload卸載窗體時發生的事件:"
Unload Form2
Debug.Print "用Set窗體名=Nothing語句解除初始化時發生的事件:"
Set Form2=Nothing
Debug.Print "窗體第三次(解除初始化後)裝入內存時發生的事件:"
Load Form2
End Sub
'Form2窗體事件過程
Sub Form_Initialize()
Debug.Print"Initialize事件"
End Sub
Sub Form_Lond()
Debug.Pnnt"Load事件"
End Sub
Sub Form_QueryUnload(Cancel As hteger, UnloadMode As Integer)
Debug.Print"QueryUnload"
End Sub
Sub Form_Unlond(Cancel As Integer)
Debug.Print"Unload"
End Sub
Sub Form_Terminate()
Debug.Print"Terminate"
End Sub
當用戶在Form1上單擊時,在Debug窗口顯示下列信息:
窗體首次轉入內存時發生的事件:
Initialize事件
Load事件
用Unload卸載窗體時發生的事件:
Query Unload
Unload
窗體第二次裝入內存時發生的事件:
Load事件
用Unload卸載窗體時發生的事件:
QueryUnload
Unload
用Set窗體名=Nothing語句解除初始化時發生的事件:
Terminate
窗體第三次(解除初始化後)裝入內存時發生的事件:
Initialize事件
Load事件
7.MouseDown、MOUSeUp和C1ick事件發生的次序
當用戶在窗體或控制項上按下滑鼠按鈕時MouseDown事件被觸發,MouseDown事件肯定發生在MouseUp和C1ick事件之前。但是,MouseUp和Click事件發生的次序與單擊的對象有關。
當用戶在標簽、文本框或窗體上作單擊時,其順序為:
(1)MouseDown
(2)MouseUp
(3)Click
當用戶在命令按鈕上作單擊時,其順序為:
(1)MouseDown
(2)Click
(3)MouseUp
當用戶在標簽或文本框上作雙擊時,其順序為:
(1)MouseDown
(2)MOuseUp
(3)Click
(4)DblCUck
(5)MouseUp
七、文件常見錯誤和難點分析
1.文件系統的三個控制項不能產生關聯
也就是當驅動器改變時,目錄列表框不能跟著相應改變;或者當目錄列表框改變時,文件列表框不能跟著相應改變。要三個控制項產生關聯,使用下面兩個事件過程:
Private Sub Drivel_Change()
Dirl.Path=Drivel.Drive
End Sub
Private Sub Dirl_Change()
Filel.Path=Dirl.Path
End Sub
2.如何在目錄列表框表示當前選定的目錄
在程序運行時雙擊目錄列表框的某目錄項,則將該目錄項改變為當前目錄,其Diirl. Path的值作相應的改變。而當單擊選定該目錄項時,Diirl. Path的值並沒有改變。有時為了對選定的目錄項進行有關的操作,與ListBox控制項中某列表項的選定相對應,表示如下:
Dirl.List(Dirl.Listlndex)
3.當使用文件系統控制項對文件進行打開操作時,顯示"文件未找到"出錯信息。
例如,如下語句:
Open Filel.Path+Filel.File Name For Input As#1
當選定的目錄是根目錄,上述語句執行正確,而當選定的目錄為子目錄,上述語句執行時顯示"文件末找到"出錯信息。
其中:Filel.Path表示當前選定的路徑,Filel.File Name表示當前選定的文件,合起來表示文件的標識符。
當選定的文件在根目錄下(假定驅動器為C),Filel.Path的值為"C:\1",假定選定的文件名為"t1.txt",則Filel.Path+Filel.FileName的值為"C:\t1.txt"為合法的文件標識符。
當選定的文件在子目錄下(假定驅動器為C,子目錄為my),Filel.Path的值為"C:\my" Filel.Path+Filel.FileName的值為"C:\my tl.txt",子目錄與文件名之間少了一個"\"分隔符。
為了保證程序正常運行,
Open Filel.Path+Filel.FileNameForlnput As #1改為:
Dun F$
If Right(Filel.Path,1)"\" Then ' 表示選定的足根目錄
F=Filel.Path+Filel.FileName
Else ' 表示選定的是子目錄,子目錄與文件名之間加"\"
F=Filel.Path+"\"+Filel.FileName
End If
Open F For Input As # 1
4.Open語句中欲打開的名是常量也可以是字元串變數,但使用者概念不清,導致出現"文件未找到"出錯信息
如在從盤上讀入文件名為"C:\my\t1.txt",
正確的常量書寫如下:
Open "C:\my\t1.txt"For Input As#1 ' 錯誤的書寫常量兩邊少雙引號
或正確的變數書寫如下:
Dim F$
F="C:\my\t1.txt"
Open F For Input As #1 ' 錯誤的書寫變數F兩邊多了雙引號
5.文件沒有關閉又被打開,顯示"文件已打開"的出錯信息
如下語句:
Open"C:\my\t1.txt" For Input As #1
Print F
Open "C:\my\t1.txt" For Input As #1
Print "2";F
執行到第二句Open語句時顯示"文件已打開"的出錯信息。
6.如何讀出隨機文件中的所有記錄,但又不知道記錄號。
不知道記錄號而又要全部讀出記錄,則只要同順序文件的讀取相似,採用循環結構加無記錄號的Get語句即可,程序段如下:
Do While Not EOF(1)
Get #1, , j
Print j;
Loop
隨機文件讀寫時可不寫記錄號,表示讀時自動讀下一條記錄,寫時插入到當前記錄後。
❼ vb編程計算一組樣本數據的標准偏差 假設樣本數為6,聲明數組時可以直接初始化
標准偏差的計算步驟是:
步驟一、(每個樣本數據 減去樣本全部數據的平均值)。
步驟二、把步驟一所得的各個數值的平方相加。
步驟三、把步驟二的結果除以 (n - 1)(「n」指樣本數目)。
步驟四、從步驟三所得的數值之平方根就是抽樣的標准偏差。
arr=Array(2,3,5,4,6,2)'樣本數組
n=6'樣本數組數量
'求所有數據平均值
avg=0
Fori=0Ton-1
avg=avg+arr(i)
Nexti
avg=avg/n
'求各個數據減去平均值後的平方之和
s=0
Fori=0Ton-1
s=s+(arr(i)-avg)^2
Nexti
'求標准偏差
rusult=Sqr(s/(n-1))
❽ 如何用C語言產生隨機數,隨機數的加和是一確定的數
思路:
1 先獲取到加和值;
2 輸入加和值范圍內的一個隨機數;
3 用加和值減去獲取到的隨機數,這樣就得到了另外一個數;
4 循環執行,直到獲取到符合要求數量的數值為止。
以獲取10組數值為例,代碼如下:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
intmain()
{
ints;
inti,n;
srand(time(NULL));//設置隨機數種子。
scanf("%d",&s);//輸入加和值。
for(i=0;i<10;i++)//獲取10組要求的數值。
{
n=rand()%s;//獲取一個0~s-1的隨機數。
printf("%d+%d=%d ",n,s-n,s);//輸出結果。
}
return0;
}
❾ c語言編程 幫幫忙,這幾個怎麼編
這個好多啊。。。。我慢慢來回答。。。。
太晚了。主要的給你,你自己寫一下就行了。。。
1.
scanf("%2d",&a);scanf("%2d",&b);
printf("%3d*%3d=%5d\n",a,b,a*b);
2.
正五邊形的每個內角是(5-2)×180°/5=108°
連接圓心和一條邊的兩端,得到一個等腰三角形,其底角為108°/2=54°,頂角為180°-2×54°=72°
設正五邊形的邊長為a,外接圓的半徑為r,則r=a/(2cos54°)=a/(2sin36°)
下面給出sin36°的求法:
由於sin36°=sin(180°=36°)=sin144°=2sin72°cos72°
=4sin36°cos36°[2(cos36°)^2-1]
由此得到 8(cos36°)^3-4cos36°-1=0
(2cos36°+1)[4(cos36°)^2-2cos36°-1]=0
由4(cos36°)^2-2cos36°-1=0解出
cos36°=(1+√5)/4,
sin36°=√[1-(cos36°)^2]=√(10-2√5)/4.
所以r=a/(2sin36°)=a/[2√(10-2√5)/4]=2a/√(10-2√5)
=(√(50+10√5)a/10
3.
(x-x1)/(x2-x1)=(y-y1)/(y2-y1)=(z-z1)/(z2-z1)
4.
#include<stdio.h>
main()
{int a,b,i,j,k.
printf("雞兔共有幾只?")
scanf("%d",&a);
printf("共有多少只腿?");
scanf("%d",&b);
for(i=1;i<=a;i++)
{j=i;k=a-i;
j*=2;
k*=4;
if(j+k==b)
{printf("雞有%d只,兔有%d只",j,k);
i=0;
break;
}
}
if(i!=0)printf("輸入錯誤");
}
❿ C語言編程:指法練習程序
可以只是說說思路嗎?
思路還是比較簡單的 隨機讀取 用隨機數 設置文件的讀取指針
判斷錯誤 我認為一個比較簡單的實現思路是 每輸入一個字元 判斷一次
可以用一個緩存區 存放 隨機選取的字元 然後 每匹配一個後 對這個進行移出緩存區的操作
也可以用一個int 類型作指針 指示 應對比的字母的位置