當前位置:首頁 » 編程軟體 » jw編程

jw編程

發布時間: 2022-10-23 20:46:58

1. C語言編程兩個數求和

用數組做,高精度演算法。數組的每一個元素放一個位,如a[0]代表個位,a[1]代表十位,依此類推。
下面是演算法的實現:
c[0]=(a[0]+b[0])%10; //c[x]為結果,a[x],b[x]為兩個加數
overflow=(a[0]+b[0])/10; //overflow為進位的值
for(i=1;i<n;i++) //n為你兩個加數的最大位數
{
c[i]=(a[i]+b[i]+overflow)%10; //a和b的第i位相加再加上第i-1位的進位的和的個位是c第i位的值
overflow=(a[i]+b[i]+overflow)/10; //a和b的第i位相加再加上第i-1位的進位的和的十位是向高位的進位
}

當然讀數的時候要注意,由於位數太大,可以將其當成字元串讀,再按位分離。(可能還有其他辦法,不列舉)

舉個實例
987+87=?
個位相加c[0]=(a[0]+b[0])%10=(7+7)%10=4 ,進位 overflow=(a[0]+b[0])/10=1
十位相加c[1]=(a[1]+b[1]+overflow)%10= (8+8+1)%10=7 進位 overflow=(a[1]+b[1]+overflow)/10=1
百位相加c[2]=(a[2]+b[2]+overflow)%10=(9+0+1)%10=0 進位 overflow=(a[1]+b[1]+overflow)/10=1
。。。下面類推

2. 請問大家,傳遞函數裡面的jw,其中w單位是什麼是HZ,還是rad/s還有在matlab中它的單位是什麼

弧度,matlab不會識別單位,所以單位得在你編程之前提前匹配好,matlab本身不會對單位進行匹配

3. 如下運功方程matlab怎麼來編程計算,其中sgn為符號函數

符號函數不是絕對可積的函數,不存在常義下的傅里葉變換。在考慮廣義函數的條件下是可求的,但不能用定義式F(jw)=∫f(t)e^{-jwt}dt來求,可以這樣求:
首先已知F{δ(t)}=1,且2δ(t)=d(sgn(t))/dt。根據頻域微分定理F{f'(t)}=jwF{f(t)},有F{2δ(t)}=jwF{sgn(t)},得到F{sgn(t)}=2/(jw)

4. 編程語言 JW

lay_ber.xml和lay_ber.swf同目錄

5. C++編程大數加法

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void main()
{
char atemp[10000],btemp[10000],b[10000],a[10000];
int c[10000],jw[10000];
int i,j,temp,anb,bnb,lena,lenb,lenmax,lenmin,lentemp;
int seta=0,setb=0,pd=0,tl=0,tll=0,is=0; //判斷兩數是否相等
scanf("%s",&atemp);
getchar();
scanf("%s",&btemp);
getchar();
lena=strlen(atemp);
lenb=strlen(btemp);
lenmax=lena>=lenb?lena:lenb;
lenmin=lenb<lena?lenb:lena;
for(i=0;i<=9999;i++)
{
jw[i]=0;
}
//都是正數或者都是負數,且位數一樣的時候
if((('-'!=atemp[0]&&'-'!=btemp[0])&&(lena==lenb))||(('-'==atemp[0]&&'-'==btemp[0])&&(lena==lenb)))
{
for(i=0,j=lenmax-1;j>=0;i++,j--)
{
a[i]=atemp[j];
b[i]=btemp[j];
}
if(('-'==atemp[0]&&'-'==btemp[0])&&(lena==lenb))
{
lenmax-=1;
printf("-");
}
pd=1;
goto loop1;
}
//都是正數或者都是負數,且位數不一樣的時候
if((('-'!=atemp[0]&&'-'!=btemp[0])&&(lena!=lenb))||(('-'==atemp[0]&&'-'==btemp[0])&&(lena!=lenb)))
{
if(lena>lenb)
{
for(i=0,j=lenmax-1;j>=0;i++,j--)
a[i]=atemp[j];
for(i=0,j=lenmin-1;j>=0;i++,j--)
b[i]=btemp[j];
}
if(lenb>lena)
{
for(i=0,j=lenmax-1;j>=0;i++,j--)
a[i]=btemp[j];
for(i=0,j=lenmin-1;j>=0;i++,j--)
b[i]=atemp[j];
}
for(i=0,j=lenmin;i<=lenmax-lenmin-1;i++,j++)
b[j]='0';
if(('-'==atemp[0]&&'-'==btemp[0])&&(lena!=lenb))
{
b[lenmin-1]='0'; //不知道為什麼會這樣
lenmax-=1;
printf("-");
}
pd=1;
goto loop1;
}
//atemp是負數,btemp是正數的時候,且長度一樣的時候
if(('-'==atemp[0]&&'-'!=btemp[0])&&1==lena-lenb)
{
for(i=0,j=lenmax-1;j>=1;i++,j--)
a[i]=atemp[j];
for(i=0,j=lenmin-1;j>=0;i++,j--)
b[i]=btemp[j];
pd=2;
goto loop2;
}
//atemp是正數,btemp是負數的時候,且長度一樣的時候
if(('-'==btemp[0]&&'-'!=atemp[0])&&1==lenb-lena)
{
for(i=0,j=lenmax-1;j>=1;i++,j--)
a[i]=btemp[j];
for(i=0,j=lenmin-1;j>=0;i++,j--)
b[i]=atemp[j];
pd=2;
goto loop2;
}
//一正一負,且atemp是負的時候
if(('-'==atemp[0]&&'-'!=btemp[0])&&(1!=lena-lenb))
{
if(lena>lenb)
{
for(i=0,j=lenmax-1;j>=1;i++,j--)
a[i]=atemp[j];
for(i=0,j=lenmin-1;j>=0;i++,j--)
b[i]=btemp[j];
for(i=0,j=lenmin;i<=lenmax-lenmin-1;i++,j++)
b[j]='0';
tl=1;
}
if(lenb>=lena)
{
for(i=0,j=lenmax-1;j>=0;i++,j--)
a[i]=btemp[j];
for(i=0,j=lenmin-1;j>=1;i++,j--)
b[i]=atemp[j];
for(i=0,j=lenmin-1;i<=lenmax-lenmin;i++,j++)
b[j]='0';
tll=1;
}
pd=2;
goto loop2;
}
//一正一負,且btemp是負的時候
if(('-'==btemp[0]&&'-'!=atemp[0])&&(1!=lenb-lena))
{
if(lena>=lenb)
{
for(i=0,j=lenmax-1;j>=0;i++,j--)
a[i]=atemp[j];
for(i=0,j=lenmin-1;j>=1;i++,j--)
b[i]=btemp[j];
for(i=0,j=lenmin-1;i<=lenmax-lenmin;i++,j++)
b[j]='0';
tll=1;
}
if(lenb>lena)
{
for(i=0,j=lenmax-1;j>=1;i++,j--)
a[i]=btemp[j];
for(i=0,j=lenmin-1;j>=0;i++,j--)
b[i]=atemp[j];
for(i=0,j=lenmin;i<=lenmax-lenmin;i++,j++)
b[j]='0';
tl=1;
}
pd=2;
goto loop2;
}
loop1: if(1==pd)
{
for(i=0;i<=lenmax-1;i++)
{
anb=((int)a[i])-48;
bnb=((int)b[i])-48;
temp=anb+bnb+jw[i];
if(10>temp)
{
c[i]=temp;
}
else
{
c[i]=temp%10;
jw[i+1]+=1;
if((i==lenmax-1)&&(0!=jw[lenmax]))
{
c[lenmax]=jw[lenmax];
lenmax+=1;
break;
}
}
}
for(i=lenmax-1;i>=0;i--)
printf("%d",c[i]);
printf("\n");
}
loop2:if(2==pd)
{
for(i=lenmax-1;i>=0;i--)
{
if(a[i]>b[i])
{
seta=1;
is=1;
break;
}
if(b[i]>a[i])
{
setb=1;
is=1;
break;
}
}
if(0==is)
{
printf("0\n");
exit(0);
}
if(1==tll)
lenmax+=1;
for(i=0;i<=lenmax-2;i++)
{
if((1==setb&&0==seta&&0==tl)||(1==seta&&0==setb&&1==tl))
{
anb=-(((int)a[i])-48);
bnb=((int)b[i])-48;
}
if((1==seta&&0==setb&&0==tl)||(1==setb&&0==seta&&1==tl))
{
anb=((int)a[i])-48;
bnb=-(((int)b[i])-48);
}
temp=anb+bnb+jw[i];
if(((-anb)==bnb)&&(0==jw[i])||(-anb<bnb))
{
c[i]=temp;
}
else
{
c[i]=temp+10;
jw[i+1]-=1;
}
}
lentemp=lenmax-2;
while(0==c[lentemp])
{
lentemp-=1;
}
if((1==seta&&0==setb&&0==tl&&1!=tll)||(1==setb&&0==seta&&(1==tl||1==tll)))
{
printf("-");
}
for(i=lentemp;i>=0;i--)
{
// if(0!=c[i])
// {
printf("%d",c[i]);
// }
}
printf("\n");
}
}

本程序全部自己寫的。
測試結果如下:

6. 編程高手來啊!!!!!急啊!!!!!

MD5的java Bean實現
MD5簡介

MD5的全稱是Message-Digest Algorithm 5,在90年代初由MIT的計算機科學實驗室和RSA Data Security Inc發明,經MD2、MD3和MD4發展而來。

Message-Digest泛指位元組串(Message)的Hash變換,就是把一個任意長度的位元組串變換成一定長的大整數。請注意我使用了「位元組串」而不是「字元串」這個詞,是因為這種變換只與位元組的值有關,與字元集或編碼方式無關。

MD5將任意長度的「位元組串」變換成一個128bit的大整數,並且它是一個不可逆的字元串變換演算法,換句話說就是,即使你看到源程序和演算法描述,也無法將一個MD5的值變換回原始的字元串,從數學原理上說,是因為原始的字元串有無窮多個,這有點象不存在反函數的數學函數。

MD5的典型應用是對一段Message(位元組串)產生fingerprint(指紋),以防止被「篡改」。舉個例子,你將一段話寫在一個叫readme.txt文件中,並對這個readme.txt產生一個MD5的值並記錄在案,然後你可以傳播這個文件給別人,別人如果修改了文件中的任何內容,你對這個文件重新計算MD5時就會發現。如果再有一個第三方的認證機構,用MD5還可以防止文件作者的「抵賴」,這就是所謂的數字簽名應用。

MD5還廣泛用於加密和解密技術上,在很多操作系統中,用戶的密碼是以MD5值(或類似的其它演算法)的方式保存的,用戶Login的時候,系統是把用戶輸入的密碼計算成MD5值,然後再去和系統中保存的MD5值進行比較,而系統並不「知道」用戶的密碼是什麼。

一些黑客破獲這種密碼的方法是一種被稱為「跑字典」的方法。有兩種方法得到字典,一種是日常搜集的用做密碼的字元串表,另一種是用排列組合方法生成的,先用MD5程序計算出這些字典項的MD5值,然後再用目標的MD5值在這個字典中檢索。

即使假設密碼的最大長度為8,同時密碼只能是字母和數字,共26+26+10=62個字元,排列組合出的字典的項數則是P(62,1)+P(62,2)….+P(62,8),那也已經是一個很天文的數字了,存儲這個字典就需要TB級的磁碟組,而且這種方法還有一個前提,就是能獲得目標賬戶的密碼MD5值的情況下才可以。

在很多電子商務和社區應用中,管理用戶的Account是一種最常用的基本功能,盡管很多Application Server提供了這些基本組件,但很多應用開發者為了管理的更大的靈活性還是喜歡採用關系資料庫來管理用戶,懶惰的做法是用戶的密碼往往使用明文或簡單的變換後直接保存在資料庫中,因此這些用戶的密碼對軟體開發者或系統管理員來說可以說毫無保密可言,本文的目的是介紹MD5的Java Bean的實現,同時給出用MD5來處理用戶的Account密碼的例子,這種方法使得管理員和程序設計者都無法看到用戶的密碼,盡管他們可以初始化它們。但重要的一點是對於用戶密碼設置習慣的保護。

有興趣的讀者可以從這里取得MD5也就是RFC 1321的文本。http://www.ietf.org/rfc/rfc1321.txt

實現策略

MD5的演算法在RFC1321中實際上已經提供了C的實現,我們其實馬上就能想到,至少有兩種用Java實現它的方法,第一種是,用Java語言重新寫整個演算法,或者再說簡單點就是把C程序改寫成Java程序。第二種是,用JNI(Java Native Interface)來實現,核心演算法仍然用這個C程序,用Java類給它包個殼。

但我個人認為,JNI應該是Java為了解決某類問題時的沒有辦法的辦法(比如與操作系統或I/O設備密切相關的應用),同時為了提供和其它語言的互操作性的一個手段。使用JNI帶來的最大問題是引入了平台的依賴性,打破了SUN所鼓吹的「一次編寫到處運行」的Java好處。因此,我決定採取第一種方法,一來和大家一起嘗試一下「一次編寫到處運行」的好處,二來檢驗一下Java 2現在對於比較密集的計算的效率問題。

實現過程

限於這篇文章的篇幅,同時也為了更多的讀者能夠真正專注於問題本身,我不想就某一種Java集成開發環境來介紹這個Java Bean的製作過程,介紹一個方法時我發現步驟和命令很清晰,我相信有任何一種Java集成環境三天以上經驗的讀者都會知道如何把這些代碼在集成環境中編譯和運行。用集成環境講述問題往往需要配很多屏幕截圖,這也是我一直對集成環境很頭疼的原因。我使用了一個普通的文本編輯器,同時使用了Sun公司標準的JDK 1.3.0 for Windows NT。

其實把C轉換成Java對於一個有一定C語言基礎的程序員並不困難,這兩個語言的基本語法幾乎完全一致.我大概花了一個小時的時間完成了代碼的轉換工作,我主要作了下面幾件事:

把必須使用的一些#define的宏定義變成Class中的final static,這樣保證在一個進程空間中的多個Instance共享這些數據
刪去了一些無用的#if define,因為我只關心MD5,這個推薦的C實現同時實現了MD2 MD3和 MD4,而且有些#if define還和C不同編譯器有關
將一些計算宏轉換成final static 成員函數。
所有的變數命名與原來C實現中保持一致,在大小寫上作一些符合Java習慣的變化,計算過程中的C函數變成了private方法(成員函數)。
關鍵變數的位長調整
定義了類和方法
需要注意的是,很多早期的C編譯器的int類型是16 bit的,MD5使用了unsigned long int,並認為它是32bit的無符號整數。而在Java中int是32 bit的,long是64 bit的。在MD5的C實現中,使用了大量的位操作。這里需要指出的一點是,盡管Java提供了位操作,由於Java沒有unsigned類型,對於右移位操作多提供了一個無符號右移:>>>,等價於C中的 >> 對於unsigned 數的處理。

因為Java不提供無符號數的運算,兩個大int數相加就會溢出得到一個負數或異常,因此我將一些關鍵變數在Java中改成了long類型(64bit)。我個人認為這比自己去重新定義一組無符號數的類同時重載那些運算符要方便,同時效率高很多並且代碼也易讀,OO(Object Oriented)的濫用反而會導致效率低下。

限於篇幅,這里不再給出原始的C代碼,有興趣對照的讀者朋友可以去看RFC 1321。MD5.java源代碼

測試

在RFC 1321中,給出了Test suite用來檢驗你的實現是否正確:

MD5 ("") =

MD5 ("a") =

MD5 ("abc") =

MD5 ("message digest") =

MD5 ("abcdefghijklmnopqrstuvwxyz") =

……

這些輸出結果的含義是指:空字元串」」的MD5值是,字元串」a」的MD5值是……
編譯並運行我們的程序:
javac –d . MD5.java
java beartool.MD5
為了將來不與別人的同名程序沖突,我在我的程序的第一行使用了package beartool;

因此編譯命令javac –d . MD5.java 命令在我們的工作目錄下自動建立了一個beartool目錄,目錄下放著編譯成功的 MD5.class

我們將得到和Test suite同樣的結果。當然還可以繼續測試你感興趣的其它MD5變換,例如:

java beartool.MD5 1234

將給出1234的MD5值。

可能是我的計算機知識是從Apple II和Z80單板機開始的,我對大寫十六進制代碼有偏好,如果您想使用小寫的Digest String只需要把byteHEX函數中的A、B、C、D、E、F改成a、b、 c、d、e、f就可以了。

MD5據稱是一種比較耗時的計算,我們的Java版MD5一閃就算出來了,沒遇到什麼障礙,而且用肉眼感覺不出來Java版的MD5比C版的慢。

為了測試它的兼容性,我把這個MD5.class文件拷貝到我的另一台Linux+IBM JDK 1.3的機器上,執行後得到同樣結果,確實是「一次編寫到處運行了」。

Java Bean簡述

現在,我們已經完成並簡單測試了這個Java Class,我們文章的標題是做一個Java Bean。

其實普通的Java Bean很簡單,並不是什麼全新的或偉大的概念,就是一個Java的Class,盡管 Sun規定了一些需要實現的方法,但並不是強制的。而EJB(Enterprise Java Bean)無非規定了一些必須實現(非常類似於響應事件)的方法,這些方法是供EJB Container使用(調用)的。

在一個Java Application或Applet里使用這個bean非常簡單,最簡單的方法是你要使用這個類的源碼工作目錄下建一個beartool目錄,把這個class文件拷貝進去,然後在你的程序中import beartool.MD5就可以了。最後打包成.jar或.war是保持這個相對的目錄關系就行了。

Java還有一個小小的好處是你並不需要摘除我們的MD5類中那個main方法,它已經是一個可以工作的Java Bean了。Java有一個非常大的優點是她允許很方便地讓多種運行形式在同一組代碼中共存,比如,你可以寫一個類,它即是一個控制台Application和GUI Application,同時又是一個Applet,同時還是一個Java Bean,這對於測試、維護和發布程序提供了極大的方便,這里的測試方法main還可以放到一個內部類中,有興趣的讀者可以參考:http://www.cn.ibm.com/developerWorks/java/jw-tips/tip106/index.shtml

這里講述了把測試和示例代碼放在一個內部靜態類的好處,是一種不錯的工程化技巧和途徑。

把Java Bean裝到JSP里

正如我們在本文開頭講述的那樣,我們對這個MD5 Bean的應用是基於一個用戶管理,這里我們假設了一個虛擬社區的用戶login過程,用戶的信息保存在資料庫的個名為users的表中。這個表有兩個欄位和我們的這個例子有關,userid :char(20)和pwdmd5 :char(32),userid是這個表的Primary Key,pwdmd5保存密碼的MD5串,MD5值是一個128bit的大整數,表示成16進制的ASCII需要32個字元。

這里給出兩個文件,login.html是用來接受用戶輸入的form,login.jsp用來模擬使用MD5 Bean的login過程。

為了使我們的測試環境簡單起見,我們在JSP中使用了JDK內置的JDBC-ODBC Bridge Driver,community是ODBC的DSN的名字,如果你使用其它的JDBC Driver,替換掉login.jsp中的
Connection con= DriverManager.getConnection("jdbc:odbc:community", "", "");
即可。

login.jsp的工作原理很簡單,通過post接收用戶輸入的UserID和Password,然後將Password變換成MD5串,然後在users表中尋找UserID和pwdmd5,因為UserID是users表的Primary Key,如果變換後的pwdmd5與表中的記錄不符,那麼SQL查詢會得到一個空的結果集。

這里需要簡單介紹的是,使用這個Bean只需要在你的JSP應用程序的WEB-INF/classes下建立一個beartool目錄,然後將MD5.class拷貝到那個目錄下就可以了。如果你使用一些集成開發環境,請參考它們的deploy工具的說明。在JSP使用一個java Bean關鍵的一句聲明是程序中的第2行:

<jsp:useBean id='oMD5' scope='request' class='beartool.MD5'/>
這是所有JSP規范要求JSP容器開發者必須提供的標准Tag。

id=實際上是指示JSP Container創建Bean的實例時用的實例變數名。在後面的<%和%>之間的Java程序中,你可以引用它。在程序中可以看到,通過 pwdmd5=oMD5.getMD5ofStr (password)引用了我們的MD5 Java Bean提供的唯一一個公共方法: getMD5ofStr。

Java Application Server執行.JSP的過程是先把它預編譯成.java(那些Tag在預編譯時會成為java語句),然後再編譯成.class。這些都是系統自動完成和維護的,那個.class也稱為Servlet。當然,如果你願意,你也可以幫助Java Application Server去干本該它乾的事情,自己直接去寫Servlet,但用Servlet去輸出HTML那簡直是回到了用C寫CGI程序的惡夢時代。

如果你的輸出是一個復雜的表格,比較方便的方法我想還是用一個你所熟悉的HTML編輯器編寫一個「模板」,然後在把JSP代碼「嵌入」進去。盡管這種JSP代碼被有些專家指責為「空心粉」,它的確有個缺點是代碼比較難管理和重復使用,但是程序設計永遠需要的就是這樣的權衡。我個人認為,對於中、小型項目,比較理想的結構是把數據表示(或不嚴格地稱作WEB界面相關)的部分用JSP寫,和界面不相關的放在Bean裡面,一般情況下是不需要直接寫Servlet的。

如果你覺得這種方法不是非常的OO(Object Oriented),你可以繼承(extends)它一把,再寫一個bean把用戶管理的功能包進去。

到底能不能兼容?

我測試了三種Java應用伺服器環境,Resin 1.2.3、Sun J2EE 1.2、IBM WebSphere 3.5,所幸的是這個Java Bean都沒有任何問題,原因其實是因為它僅僅是個計算程序,不涉及操作系統,I/O設備。其實用其它語言也能簡單地實現它的兼容性的,Java的唯一優點是,你只需提供一個形態的運行碼就可以了。請注意「形態」二字,現在很多計算結構和操作系統除了語言本身之外都定義了大量的代碼形態,很簡單的一段C語言核心代碼,轉換成不同形態要考慮很多問題,使用很多工具,同時受很多限制,有時候學習一種新的「形態」所花費的精力可能比解決問題本身還多。比如光Windows就有EXE、Service、的普通DLL、COM DLL以前還有OCX等等等等,在Unix上雖說要簡單一些,但要也要提供一個.h定義一大堆宏,還要考慮不同平台編譯器版本的位長度問題。我想這是Java對我來說的一個非常重要的魅力吧。

MD5演算法說明

一、補位
二、補數據長度
三、初始化MD5參數
四、處理位操作函數
五、主要變換過程
六、輸出結果

補位:
MD5演算法先對輸入的數據進行補位,使得數據位長度LEN對512求余的結果是448。即數據擴展至K*512+448位。即K*64+56個位元組,K為整數。
具體補位操作:補一個1,然後補0至滿足上述要求。
補數據長度:
用一個64位的數字表示數據的原始長度B,把B用兩個32位數表示。這時,數
據就被填補成長度為512位的倍數。
初始化MD5參數:
四個32位整數 (A,B,C,D) 用來計算信息摘要,初始化使用的是十六進製表
示的數字
A=0X01234567
B=0X89abcdef
C=0Xfedcba98
D=0X76543210

處理位操作函數:
X,Y,Z為32位整數。
F(X,Y,Z) = X&Y|NOT(X)&Z
G(X,Y,Z) = X&Z|Y?(Z)
H(X,Y,Z) = X xor Y xor Z
I(X,Y,Z) = Y xor (X|not(Z))

主要變換過程:
使用常數組T[1 ... 64], T[i]為32位整數用16進製表示,數據用16個32位
的整數數組M[]表示。
具體過程如下:

/* 處理數據原文 */
For i = 0 to N/16-1 do

/*每一次,把數據原文存放在16個元素的數組X中. */
For j = 0 to 15 do
Set X[j] to M[i*16+j].
end /結束對J的循環

/* Save A as AA, B as BB, C as CC, and D as DD.
*/
AA = A
BB = B
CC = C
DD = D

/* 第1輪*/
/* 以 [abcd k s i]表示如下操作
a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */

/* Do the following 16 operations. */
[ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3
22 4]
[ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 7
22 8]
[ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA
11 22 12]
[ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15]
[BCDA 15 22 16]

/* 第2輪* */
/* 以 [abcd k s i]表示如下操作
a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
/* Do the following 16 operations. */
[ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA
0 20 20]
[ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23]
[BCDA 4 20 24]
[ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA
8 20 28]
[ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA
12 20 32]

/* 第3輪*/
/* 以 [abcd k s i]表示如下操作
a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
/* Do the following 16 operations. */
[ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35]
[BCDA 14 23 36]
[ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA
10 23 40]
[ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43]
[BCDA 6 23 44]
[ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47]
[BCDA 2 23 48]

/* 第4輪*/
/* 以 [abcd k s i]表示如下操作
a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
/* Do the following 16 operations. */
[ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51]
[BCDA 5 21 52]
[ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15 55]
[BCDA 1 21 56]
[ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15 59]
[BCDA 13 21 60]
[ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15 63]
[BCDA 9 21 64]

/* 然後進行如下操作 */
A = A + AA
B = B + BB
C = C + CC
D = D + DD

end /* 結束對I的循環*/

輸出結果。

7. 如何用matlab解決百錢百雞問題

很抱歉我的電腦上沒有裝matlab,我用c++給你寫了一個,原理都是一樣的,你自己修改一下就行,這樣也可以鍛煉一下你的編程能力:

intjw,jm,jc;
for(jw=20;jw>=0;jw--)
{
for(jm=33;jm>=0;jm--)
{
for(jc=99;jc>=0;jc-=3)
{
if((jw+jm+jc==100)&&(5*jw+3*jm+jc/3==100))
cout<<jw<<' '<<jm<<' '<<jc<<endl;
}
}
}

jw代表雞翁,jm代表雞母,jc代表雞雛,運行結果是:

12 4 84

8 11 81

4 18 78

0 25 75

你可以檢驗一下,當然,代碼還可以優化,你可以只使用雙層循環。

8. 求助,一道ACM編程題。

運行的結果是TL?
表示給你敲了個,以後應該養成良好的代碼習慣,模塊化,易讀懂。
------------------------------------

#include <stdio.h>
#include <string.h>

#define clear(a) memset(a,0,sizeof(a))

char A[510],B[510],Ans[510];
int La,Lb,Lans,L;

void Swap(char &a,char &b)
{
char Temp=a;
a=b;
b=Temp;
}

int Maxx(int x,int y)
{
return x>y?x:y;
}

void Turn(int L,char List[])
{
for (int i=1;i<=L;i++)
{
List[i]=List[i]-48;
}
for (int i=1;i<=L/2;i++)
{
Swap(List[i],List[L-i+1]);
}
}

void Add(char A[],char B[],int L,char C[],int &Lc)
{
int K;
char Temp;
clear(C);
for (int i=1;i<=L;i++)//求和
{
C[i]=A[i]+B[i];
}

for (int i=1;i<=L;i++)//進位
{
K=i-1;Temp=C[i];
C[i]=0;
while (Temp>0)
{
K++;
C[K]+=Temp%10;
Temp=Temp/10;
}
}
Lc=Maxx(K,L);
}

void Back(char List[],int L)
{
for (int i=1;i<=L;i++)
{
List[i]+='0';
}
for (int i=1;i<=L/2;i++)
{
Swap(List[i],List[L-i+1]);
}
}

int main(void)
{
//freopen("Data.in","r",stdin);
//freopen("Data.out","w",stdout);
clear(A);clear(B);
while (scanf("%s %s\n",&A[1],&B[1])!=EOF)
{
La=strlen(&A[1]);
Lb=strlen(&B[1]);
Turn(La,A);//翻轉
Turn(Lb,B);//翻轉
L=Maxx(La,Lb);
Add(A,B,L,Ans,Lans);//求和
Back(Ans,Lans);
printf("%s\n",&Ans[1]);
clear(A);clear(B);clear(Ans);
}
return 0;
}

//----------分割線--------------------------------------------------------------------------
你的程序

#include <stdio.h>
#include <string.h>
int main ()
{
char change[502];
char a[502];
char b[502];
char c[502];
int i,j,t,l1,l2,s,jw;
while(scanf("%s%s",&a,&b)==2)
{
l1=strlen(a);
l2=strlen(b);
if(l1<l2)
{
t=l1;//交換寫錯了!!
l2=t;//建議以後交換寫成過程,減少代碼量,而且可以防止錯誤。
l1=l2;
}
for(i=0;i<l1;i++)
{
change[i]=a[i];//發覺這個地方錯了沒得?
b[i]=change[i];//建議以後交換寫成過程,減少代碼量,而且可以防止錯誤。
a[i]=b[i];//錯了~!!!
}
jw=0;
//這里是否要給你的i重新賦值,如果沒有,那麼i是從l1開始的,不知是否符合你的想法。
while(l2>0)//你寫這個循環的時候可能有點混亂哇~~這個加法混亂牢,自己梳理梳理下。
{
s=(a[l1-1]-48)+(b[l2-48])+jw;//這句話首先b[l2-48]我肯定你是寫錯了,貌似計算
if(s>=10) //方向有點問題哈~~ 這里
{
jw=s%10;
s-=10;
}
else
jw=0;
c[i]=s+48;
l1--;
l2--;
i++;
}
while(l1>0)// 這里有點沒看懂你啥意思。
{
c[i]=a[l1-1]+jw;
if((c[i]-48)==10)
{
jw=1;
c[i]='0';
}
else
jw=0;
l1--;
i++;
if(jw==1)
c[i++]='1';
}
for(;i>0;i--)
{
printf("%s",c[i-1]);
}
printf("\n");
memset(a,'\0',sizeof(a));
memset(b,'\0',sizeof(b));
memset(c,'\0',sizeof(c));
memset(change,'\0',sizeof(change));//memset()函數的使用可以參看我的程序,使用宏定義使用更為方便。
}
return 0;
}
//-----------------------------------------------
/*
看你問題裡面有ACM三個字於是決定幫你找錯誤,今年已然悲劇,無出線,無金。寫代碼之前要明白自己應該干
什麼,可以分為幾個步驟,每個步驟怎麼實現,不要直接一坨寫在主函數裡面。切記切記。
ACM路還長,一定要保持良好的代碼習慣和個人學習習慣,祝你取得好成績。加油@
順便問句,令你是川大的啊?知道川大軟體學院09級軟體工程的信箱號碼是多少不?不知道就算了,謝了。
*/

9. 用C語言編程求S=2+22+222+……+2222…2

計算思路很多比如:2+(2*10+2)+(2*10^2+2)。。(2*10^n+2)

但考慮數字長度不定,n可能會很大,那麼就不能用一般整型類型存儲(因為大小有限,超出就溢出了),所以採用字元串保存及按位計算。當然不能超出內存限制。

#include<stdio.h>
#include<malloc.h>
#include<string.h>
char*getNum(intlen);//獲取任意位數的22222...的數字字元串
char*Addnum(char*sum,char*num);//兩數字字元串按十進制數字相加後存儲在sum中返回
intmain(void)
{
intlen,i;
char*num=NULL,*sum=NULL;
printf("請輸入要累加的數字最高位數為:");
scanf("%d",&len);
sum=(char*)malloc(sizeof(char)*(len+1));//總和存儲最大位數+2
memset(sum,'0',len+1);
sum[len]=0;

for(i=1;i<=len;i++)
{
num=getNum(i);
sum=Addnum(sum,num);
if(i==len)
printf("%s",num);
else
printf("%s+",num);
}
printf("=%s",sum);
return0;
}
char*getNum(intlen)//獲取任意位數的22222...的數字字元串
{
inti;
char*num=(char*)malloc(sizeof(char)*(len+1));
for(i=0;i<len;i++)
num[i]='2';
num[i]=0;
returnnum;
}
char*Addnum(char*sum,char*num)//兩數字字元串按十進制數字相加後存儲在sum中返回
{
intadd,jw=0,y=0;
char*p1=sum,*p2=num;//定義2個指針,分別指向sum和num的最後一個字元地址
while(*p1++!=0);
p1--;p1--;
while(*p2++!=0);
p2--;p2--;

while(1)
{

add=*p1-'0'+*p2-'0'+jw;
jw=add/10;
y=add%10;
*p1=y+'0';
if(p2==num)
{
if(jw>0)
*(--p1)=jw+'0';
break;
}
else
{
p1--;
p2--;
}
}
returnsum;
}

10. 什麼是面向對象對象,什麼是面向過程,什麼是面向對象思想。能詳細點嗎用自己的理解來說。

面向對象思想----不看後悔!

前言:
整理這份資料的目的是為了幫助朋友們能夠更直觀的理解面向對象的編程。讓後來者能夠少走一些彎路。但其中不免有許多漏洞及錯誤,也還請前輩提出寶貴的更改意見,畢竟交流會讓我們不斷的進步。
技術是日新月異的,他不會等待你的成長。技術要拿出來於別人交流,自己學是自己主觀意識上的理解,有對有錯!交流會讓進步變得更快。我認為如果計算機 的體系結構不發生革命性的變化,我們現在所應用的程序語言也就百變不離奇蹤了!學編程學的是什麼?思想!精通一門編程語言(最好是面向對象的語言)後再去 搞其他的編程語言,你會發現過程是如此的行雲流水!為什麼?你已經把編程的思想掌握了,再去學其他的,無非是學習一種新的語法格式了。
我在這里並不是和你討論怎麼去用C++或JAVA,也不是和你討論怎麼去學他們,我要和你討論的是怎麼去理解面向對象。其中主要會涉及到「類、對象、 繼承、屬性、方法、靜態、重載、隱藏、重構、聲明、定義、初始化、賦值等」其中有許多相關技術我只會一代而過,讓你有一種到此一游的意味我就達到目的了, 而更詳細的技術內幕,就請參考其他相關書籍而深入研究吧!因為我只是在和你探討如何去更好的理解面向對象!
如何去提高效率?重復使用資源,把別人的東西拿來就用。這是很不錯的主意!而對於你來說,最大的資源就是信心以及積極性!好,打起精神來,讓我們一同到面向對象的編程中去尋幽訪勝吧!
註:文章中所有程序實例我都使用JAVA寫的,當然在C++中也就大同小異了了,不同的地方我會指出!
註:文章中的正文文字用黑色,說明文字用藍色,強調文字用橙色,批改文字用紅色!

正文:

1.基本概念:
1.1 類與對象的初探
要我說,無論是面向過程的語言也好,面向對象的語言也罷,我首先要給他講的都是類和對象!--------「這個世界是由什麼組成的?」這個問題如果 讓不同的人來回答會得到不同的答案。如果是一個化學家,他也許會告訴你「還用問嘛?這個世界是由分子、原子、離子等等的化學物質組成的」。如果是一個畫家 呢?他也許會告訴你,「這個世界是由不同的顏色所組成的」。……呵呵,眾說紛紜吧!但如果讓一個分類學家來考慮問題就有趣的多了,他會告訴你「這個世界是 由不同類型的物與事所構成的」好!作為面向對象的程序員來說,我們要站在分類學家的角度去考慮問題!是的,這個世界是由動物、植物等組成的。動物又分為單 細胞動物、多細胞動物、哺乳動物等等,哺乳動物又分為人、大象、老虎……就這樣的分下去了!
現在,站在抽象的角度,我們給「類」下個定義吧!我的意思是,站在抽象的角度,你回答我「什麼是人類?」首先讓我們來看看人類所具有的一些特徵,這個 特徵包括屬性(一些參數,數值)以及方法(一些行為,他能幹什麼!)。每個人都有身高、體重、年齡、血型等等一些屬性。人會勞動、人都會直立行走、人都會 用自己的頭腦去創造工具等等這些方法!人之所以能區別於其它類型的動物,是因為每個人都具有人這個群體的屬性與方法。「人類」只是一個抽象的概念,它僅僅 是一個概念,它是不存在的實體!但是所有具備「人類」這個群體的屬性與方法的對象都叫人!這個對象「人」是實際存在的實體!每個人都是人這個群體的一個對 象。老虎為什麼不是人?因為它不具備人這個群體的屬性與方法,老虎不會直立行走,不會使用工具等等!所以說老虎不是人!
由此可見-------類描述了一組有相同特性(屬性)和相同行為(方法)的對象。在程序中,類實際上就是數據類型!例如:整數,小數等等。整數也有 一組特性和行為。面向過程的語言與面相對象的語言的區別就在於,面向過程的語言不允許程序員自己定義數據類型,而只能使用程序中內置的數據類型!而為了模 擬真實世界,為了更好的解決問題,往往我們需要創建解決問題所必需的數據類型!面向對象編程為我們提供了解決方案。

1.2 內置數據類型與函數:
計算機程序在存儲數據時必須跟蹤3個基本屬性為:
1. 信息存儲在何處;
2. 存儲的值是多少;
3. 存儲的信息是什麼類型的;
讓我們來看看編程語言的內置數據類型都有哪些!(呵呵,這個不大好說,因為每門語言都有自己獨特的數據類型,但這畢竟是少數,比如在JAVA中有 byte類型的數據,而在C++中就沒有,希望你能舉一反三!)比如整數」int 」,浮點類型的數據」float」!字元串」String」,以及數組還有結構體等等。然而在寫程序的時候,根據需要我們會創建一個類型的變數或常量,例 如:由於我們需要創建一個整形的變數i為5,我們就可以這樣做,int i = 5;而根據需要我很有可能改變i的值,也就是從新給它賦值,比如讓它等與6,就可以在所需的地方改成i = 6;由此我們知道,在「值」上可以發生變化的量就叫變數。不會發生變化的量就叫做常量了,在C++中用count關鍵字來聲明,而在JAVA中則使用 final關鍵字來聲明。由於不同語言的聲明格式不一樣,這里就不做一一介紹了,詳細的內容清查閱相關書籍!
在這里我們主要討論一下函數,我們可以把函數想像成一個「實現某種特定功能的黑匣子」-------這個功能是由你來設定的,舉個例子來說:現在我問 你「2+3等於多少」?我相信你能很快的回答我等於5。讓我們來分析分析這句話包含什麼信息!首先我要把你的大腦想像成是一個黑匣子,我並不知道也沒有必 要知道你的大腦是如何工作的(也就是怎麼運算的),我關心的只是我傳給你的是什麼信息?你對信息做了哪些處理? 以及你返回給我的是什麼信息?需要提醒你一下的是每個方法都會返回一個信息給調用者的,除了構造函數外(稍候我會作詳細的介紹)。我現在需要把自己當作是 一名程序員,而你呢?當然就是計算機了!計算即可沒有人那麼聰明,它只會按事先約好的特定的格式運行,我想讓它具有如上所述的功能,我就要先定義這個黑匣 子!首先我要告訴這個黑匣子會有兩個整數值給你(這就是所謂的參數,是程序員需要給黑匣子的信息),然後就要定義這個黑匣子內部實現這兩個整數相加的運算 (這就是黑匣子對數據所做的加工,根據需要,你可以做任何的加工。)。最後再標注它返回給我一個同樣是整型的數值(這是黑匣子返回給程序員的信息)。一個 函數就這樣定義完了,讓我們來看看書寫格式:

int addnum(int x,int y){
return x+y;
}

具體的含義是這樣的:

int /*返回值類型*/ addnum /*方法(黑匣子)名稱*/ (int x,int y/*傳入的參數*/){
return x+y; /*內部是想方法(實現相加運算,)並用return返回給調用者結果*/
}

首先請注意上明的「return」語句!return 關鍵字的含義是向調用者返回緊跟在它後面的信息!就像上面一樣,因為我問你,你才會回答我,如果我不問你,你就不用回答我的!在計算機中也一樣,定義好這 個函數在哪裡調用呢?我只能告訴你,哪裡需要就在哪裡調用!當然,你可以根據需要去更改參數、返回值以及內部實現,具體到如何定義如何調用你只好去參考相 關的資料了!在這里我只是給你一個思想!
有時你會遇到這樣的問題,我讓你記住,我的年齡是20歲!從字面上理解,你並沒有給我返回信息!然而事實上,你確實給我返回了信息,信息的內容是「無信息,也就是無返回值類型void」。具體的程序如下:

int myAge = 0;
int a=20;
void remAge(int a){
myAge=a;
}

具體的函數說明如下:

int myAge =0; //定義並初始化我的年齡為0;
int a=20; /*定義變數a等於20*/
void /*返回值類型為無返回值類型*/ remAge /*函數名稱*/(int a /*傳入的參數*/){
myAge=a; //內部實現方法,注意,沒有return返回!!!
}

關於函數的話題還有很多很多,這里就不一一介紹了,我的目的是讓你知道函數是怎麼一會事兒!為下面的討論作鋪墊!

1.3 指針以及引用:
指針及引用是在C++中有的,JAVA中沒有。JAVA中取消了對內存的操作,隨之而來的事也取消了操作符重載的操作。不過在稍候我還是會介紹一些操 作符重載的功能等。引用主要還是用在函數參數的傳遞上。所以我在這里就不做過多的介紹了。他們很實用,有興趣的同學可以參閱C++相關書籍。
1.4 運算符及控制語句:
還是自己看看相關書籍吧,這里就不再熬述了!

2.深入探討面向對象:
2.1「類型」的內部細節:
有了上面的知識,我們現在就可以深入的挖掘類的內部實現了。所有的知識點我都會圍繞著類與對象展開,在此之前,我希望你能夠確信對以上所介紹的基本內容已完全掌握了!
是的,面向對象的編程語言最大的特色就是可以編寫自己所需的數據類型,以更好的解決問題。我想我必須要幫你搞清楚「類,對象,屬性,方法它們之間的關 系」!就像我前面所說的,人這個「類」是什麼也做不了的,因為「人類」只是一個抽象的概念,它不是實實在在的「東西」,而這個「東西」就是所謂的對象。只 有人這個「對象」才能去工作。而類呢?類是對象的描述!對象從類中產生出來!此時,對象具有類所描述的所有的屬性以及方法。-------一定要理解這句 話!!!
也許你已經有些不知所措了,沒關系!好好的回味一下,我再舉個例子!例如電視機,電視機都有工作原理圖,那麼什麼叫電視機呢?只要它能夠實現工作原理圖的 所有功能的物體,我們都叫它電視機。你想想是不是這么一回事兒?可是,電視機原理圖是不能工作的,也就是這個原理圖不能收看節目,只有電視機這個「實體 ——即所謂的對象」才能收看節目,也就是說,從類生成出對象之後才算得上是真正的有意義!才能開始工作。此時,電視機擁有電視原理圖所描述的所有的屬性及 方法!明白了吧,呵呵!
我先前介紹過,類是屬性與方法的集合。而這些屬性與方法可以被聲明為私有的(private),公共的(public)或是受保護(protected)的,他們描述了對類成員的訪問控制。下面我分別做一下介紹:
1. 公共的(public):把變數聲明為公共類型的之後,那麼就可以通過對象來直接訪問,一切都是暴露無遺的!也就是說,你的信用卡密碼別人也能夠直接得到。
2. 私有的(private):如果把變數聲明為私有的情況就好多了,想要得到我的信用卡密碼,對象必須要調用專用的方法才能夠得到。
3. 受保護的(protected):介紹繼承時再討論。
4. 默認控制訪問符(friendly)://JAVA中有而C++中沒有。
為了實現數據的封裝,提高數據的安全性,我們一般會把類的屬性聲明為私有的,而把類的方法聲明為公共的。這樣,對象能夠直接調用類中定義的所有方法,當對 象想要修改或得到自己的屬性的時候就必須要調用以定義好的專用的方法才能夠實現。你想想,你會把你的信用卡密碼公布出來嘛?呵呵!所以,我們提倡的是: 「對象調方法,方法改屬性」;
2.2通過實例看內存分配:
說了這么多,讓我們來看一個實例吧!比如:現在我們要編寫某家公司員工管理系統,你認為最合適的數據類型是什麼?我認為是員工個人!但是在面向過程的 語言中,這樣做是不允許的,因為它只能使用語言中的內部數據類型!而員工不在這個內部數據類型之內!也許有人會說可以用C語言中的struct,好注意! 畢竟它是類的基礎!如果你以前是一名面C或B的程序員,請你忘掉這些,讓我們一起看看如何用類來實現這一切吧!
某家公司的員工是人類的一個特殊群體,它除了具備人類的所有特性與方法外,它還有額外的特性與方法,比如她有她的工資、信用卡密碼、作息時間等等,這 些特性以及工作內容,工作量等等這些方法。而在計算機中我們該如何定義這個類呢?下面我將寫出它的格式,讓你看看在計算機中它是張什麼樣子的!

/*在此我需要再次聲明的是,我用的是JAVA格式,在語法格式上它與C++大不相同!許多細節以及內部操作都有諸多區別,而在思想上確實大同小異的*/
//employee.java
public class employee{
private String name; //員工姓名
private int age; //員工年齡
private char sex; //員工性別
private float emolument; //員工薪水
private boolean lunch; //員工午餐
//……等等
public void heater(){ //這個方法是用來加工員工的午餐
lunch = true;
}
public void setName(String a){ //這個方法是修改員工的姓名
name= a;
}
public String getName(){ //這個方法是得到員工的姓名
return name;
}
//……等等
}

這樣我們就定義完了我們所需要的數據類型。現在,讓我們來看看它能夠干什麼以及怎麼工作!
我想要做的是,工作室里有一個光桿司令叫「jingwei」,我修改它的名字後對對它進行輸出,看看我是怎麼做的吧!
注意:請仔細觀察對象是如何調用方法的,它使用了「.」操作符!事實上是這樣的,對象調用公共的屬性或方法時就會使用「.」操作符。
然而在C++中,如果定義一個同類型的指針,該指針調用此對象的方法時,就會使用「->」操作符。更詳細的內容清參閱相關書籍了!

//workstation.java
import java.awt.Graphics;
import java.applet.Applet;
public class workstation extends Applet{
private employee jingwei ; //對象的聲明,此時並不分配內存!
public void init(){
jingwei = new employee(); /*此時創建對象會調用構造函數,稍候介紹*/
jingwei.setName(「jw」); //設置我的名字
}
public void paint(Graphics g){
g.drawString("my age is "+jingwei.getName(),10,10);//顯示我的年齡
}
}

輸出結果是:

my name is jw

這串字元串是在輸出窗口的x坐標軸為10 px , y坐標軸為10 px的位置。
我現在要做的是,把上面的程序做個大解剖,讓你能夠看清楚它到底是怎麼一回事兒!(我可不時帶你去看裡面的匯編,呵呵,那個我也不會:)

首先還是來看看我們自定義的數據類型employee,在應用的時候它和int類型的數據沒什麼兩樣,一樣的需要創建變數(對象),只不過前者是咱自 己定義的,而後這是它內置的。Employee這個類中有許多屬性,也有許多方法。而此時,我們不能直接用我們所創建出來的對象調用它的屬性進行修改。因 為它是private受保護類型的!我要想修改我的姓名我就要用對象調用setName()這個方法,而我想得到我的姓名就要調用getName()這個 方法。我們完全是按照航線來行走的,這個航線就是「對象調方法,方法改屬性」
好的,我真的相信你已經明白了這是怎麼一回事兒了!呵呵!仰起航帆,繼續前行!
現在讓我們一起來看看workstation這個類。這是個主類,和C++中的main()函數的味道差不多。其中,在JAVA中,一個文件只允許有而且必須有一個主類,這個主類用public來聲明!他就跟C++中必須要有一個main()函數是一樣的。
讓我們來看看這個類中的第一條語句!private employee jingwei ;這條語句的作用是聲明一個employee的對象jingwei(在C++中就不用聲明了)。我想要和你說的是「聲明」與「定義」之間的區別。聲明只是 告訴計算機將要有這樣的一個變數(對象),在內存中它並不為這個變數(對象)分配內存!而只有在定義的時候才會給這個變數(對象)分配內存。(需要說明一 下的是init()方法是完成初始化操作的,在此處定義對象,為對象分配內存。start()方法用來啟動瀏覽器的主線程,paint()方法來顯示 Apple的界面。這些是Applet程序所需的,至於Application程序就不需要了,當然了,C++中也不需要他們。關於他們的詳細內容清參閱 相關書籍)
緊接著就開始定一個對象了,對jingwei這個對象進行操作才會有實際的意義。千萬不要有這種想法:「試圖對類進行操作!」就像前面我說的,電視機 原理不能看電視一樣!這是毫無意義的!看這條語句jingwei = new employee();它的意思就是定義一個employee類型的對象jingwei。此時,我想告訴你的是:「jingwei這個對想擁有了些什 么」。它擁有了類所描述的所有的屬性及方法。下面我一一給你列出來:

/*所有的employee對象都擁有這些屬性。每創建一個對象就會從新分配一塊內存來存放相應對象的這些屬性。我的意思是每個對象都有自己「獨特」的一份*/
private String name; //員工姓名
private int age; //員工年齡
private char sex; //員工性別
private float emolument; //員工薪水
private boolean lunch; //員工午餐
/*所有的employee對象都擁有這些方法。但在內存中只有一份*/
public void heater(){ //這個方法是用來加工員工的午餐
lunch = true;
}
public void setName(String a){ //這個方法是修改員工的姓名
name= a;
}
public String getName(){ //這個方法是得到員工的姓名
return name;
}
/*但是,實際上在創建jingwei這個對象時計算機只給這個對象的所有的屬性分配了內存,而並沒有給方法分配內存。方法只有一個,是屬於所有的對象的,所以無論創建了多少個對象,計算機只會為一個方法分配一塊內存。*/
我想我還是舉個例子吧,不然你非暈倒不可。呵呵!
看我這條語句「private boolean lunch;」公司不管午餐,每個員工都需要帶飯。我們現在這樣想,公司的空間是所有的內存容量,你的辦公桌就是計算機中的內存中的一部分(每個員工都有 一份,是在創建對象時分配的)。你把午飯帶到了公司,放在了你的辦公桌上。「午飯」占據了你的辦公桌的一角(佔了你自己「對象」的一塊內存容量)。這份午 飯只屬於你自己,同樣別人的也只屬於她自己!所以每個員工(對象)都需要一快空間(內存)來存放自己的午餐(屬性)。在計算機中也是這樣的,每創建一個對 象,就會在內存中從新分配一塊內存來放「午餐——lunch」這個屬性(對象所擁有的所有的屬性)。
計算機只會為對象的屬性分配內存。因為每個對象的都不一樣!就像你往公司帶的午飯和我往公司帶的午飯不一樣是一個道理!但方法就不同了。早晨帶的飯中 午就涼了,你需要用微波爐來加熱。微波爐可不用你帶,公司就有(只佔公司的一塊空間),它放在了午餐桌上。你想想,微波爐屬於誰的?它屬於所有員工的!因 為每個員工都可以用它。而不必每個員工都帶一份。由此可見,每個員工(對象)都有一份午飯(屬性),但所有的員工(對象)只一個微波爐(方法)。所有的員 工(對象)都可以通過這個微波爐(方法)來改變自己午餐(屬性)的冷熱狀態。殊途同歸!在計算機中也就是這樣,方法只有一份,供所有的對象使用!而屬性是 每個對象一份,因為每個對象的都不一樣。別和我說你還不明白,不然我會撞牆的,呵呵:)

2.3深入探討函數:

2.3.1構造函數、默認構造函數、 預設構造函數

對於上面的實例,它已經能完成絕大部分工作了,但它還是不完善的,還有許許多多的細節等到我們去完善!也許有的同學已經注意到了,當我創建完 「jingwei」這個對象時,這個對象的所有的屬性都是空的,也就是說:這個對象的姓名是未定的、年齡是未定的、性別是未定的、薪水是未定的、午餐也是 未定的。而我們想把這些屬性都添加上去,就還要用對象調用相應的方法,去一個個修改!天啊,這簡直是太麻煩了!有沒有什麼好方法能夠在我們創建對象的同時 就完成了對屬性賦值的操作呢?哦不,應該說是對屬性的初始化呢?當然沒問題了,這就需要所謂的構造函數!
構造函數是類中最特殊的函數,它與析構函數的功能正好相反!
從特徵上來說:1.它是編程語言中唯一沒有返回值類型的函數。
2.它的名稱與類的名稱必須要完全相同。
3.它必須被聲明為公共(public)的類型
4,可以對構造函數進行重載。
5.它在創建對象是自動被調用。
從功能上來說:1.它是對類中的屬性進行初始化。
其實,對於上面的程序來說我們沒有自己定義構造函數。但是,在這種情況下,系統會自動為我們定義一個「默認構造函數」。他會把數值變數自動賦值為0, 把布爾行變數賦值為false等等(但在C++中,默認構造函數不初始化其成員)。如果程序員定義了構造函數,那麼系統就不會再為你的程序添加一個缺默認 造函數了。(在這里,我們提倡的是自己定義構造函數,而不是用系統的默認構造函數)
還是看個實例吧!這樣比較清楚一些!

//employee.java

public class employee{

private String name; //員工姓名

private int age; //員工年齡

private char sex; //員工性別

private float emolument; //員工薪水

private boolean lunch; //員工午餐

//……等等

public employee(){ //這個就是「默認」構造函數

name = 「jw」; //設置員工姓名

age = 20; //設置員工年齡

sex = 「M」; //設置員工性別

emolument = 100; //設置員工薪水

lunch = false; //設置員工午餐

}

public void heater(){ //這個方法是用來加工員工的午餐

lunch = true;

}

//……等等

};

這樣,在我們創建「jingwei」這個對象的同時,它的所有的屬性也被初始化了!顯然,這大大的提高了工作效率,但是,它還是不符合要求。想想看, 如果我們現在創建這個類型的第二個對象的時候會發生什麼事情?告訴你,除了對象的「名」(這個名稱不在是對象屬性中的名稱,而是對象本身的名稱)不一樣 外,其所有的「屬性值」都一樣!比如:現在我們創建第二個對象flashmagic,然而我會發現這個對象的所有的屬性和jingwei這個對象的所有的 屬性完全相同。而我們只能在用對象的方法去改變著寫屬性了!很顯然,這種方法不大好!我們需要一種方法在創建對象的時候為對象的屬性賦予「我們想要的 值」。
相信你也看到了,默認構造函數就顯得無能為力了。我們需要的是帶參數的構造函數,在創建對象時,我們把參數傳給構造函數,這樣就能完成了上述的功能!口說無憑,還是來看個實例吧:

//employee.java

public class employee{

private String name; //員工姓名

private int age; //員工年齡

private char sex; //員工性別

private float emolument; //員工薪水

private boolean lunch; //員工午餐

//……等等

public employee(String n,int a,char s,float e,boolean l){ //看這個構造函數

name = n; //設置員工姓名

age = a; //設置員工年齡

sex = s; //設置員工性別

emolument = e; //設置員工薪水

lunch =l; //設置員工午餐

}

public void heater(){ //這個方法是用來加工員工的午餐

lunch = true;

}

//……等等

};

這樣一來,在創建對象的同時我們就可以給他賦予我們想要的值,很顯然,這可就方便多了。哦,對了!還沒有告訴你怎麼創建呢!哈哈,往前翻幾頁你會看到這句話:
jingwei = new employee();這是創建一個對象,而我們把它改成
jingwei = new employee("jingwei",20,'M',100,false);這樣一來,所有的工作都完成了,呵呵!(在創建對象的同時賦予了我們想要的「初值」)

2.3.2重載構造函數:
我還是先把概念給你吧,讓你有個認識,隨後我們在進行論述。
在JAVA中:
1. 函數重載是一個類中聲明了多個同名的方法,但有不同的參數個數和參數類型。
2. 函數重構是指在子類中聲明與父類同名的方法,從而覆蓋了父類的方法。重構解決了子類與父類的差異問題。(在討論到繼承時我會詳細說明)
在C++中:
1. 數重載的概念一樣。
2. 重構的概念可就不一樣了,C++中功能更為龐大的虛函數。更詳細內容這里就不錯過多介紹了!
其實關於重載的概念你並不陌生,在編程中相信你也接觸過。呵呵!讓我們來舉個操作符重載的例子你就會明白了,(JAVA中不支持這個功能)我們定義三個整數變數:

int i1=2, i2=3,i3=0;
i3 = i1 + i2;

此時i3=5;加號實現了兩個數相加的運算功能。然而我們現在要定義三個字元串變數:

String str1=」jing」, str2=」wei」,str3=」」;
str3 = str1 + str2;

此時str3 = 「jingwei」;加號實現了兩個字元串相加的運算功能。同樣是加號,既可以把兩個整型的變數加在一起,也可以把兩個字元串類型的變數加在一起。同一個 操作符實現了不同的功能------這就是所謂的操作符重載(嘿嘿,我說你一定見過吧:)!不就好像是漢語中的一詞多意一樣!我需要說明一下的是,C++ 中的操作符重載可沒有這么簡單。比如,我們可以對兩個自定義類型的對象進行相加的運算,進行賦值的運算。這樣書寫簡潔明了,而且非常實用。當然,關於操作 符重載的話題太多了,有興趣再看看書吧!
我們把操作符的話題在轉到函數上來,我們一直強調的是「對象調方法」------對象其實調的是方法的「名稱」。而我們現在要對方法進想重載,也就是 定義多個相同名稱的函數,這樣計算機在調用的時候不會混淆嘛?我想應該不會的,呵呵,因為僅僅是函數名稱相同,而我們在調用函數時會把參數傳遞給他的。既 是沒有參數也是一種參數傳遞參數的信息(信息為無參數)!然而由於參數類型、參數數量、返回值類型不同我們就可以對相同名稱的函數進行區分

熱點內容
sql存儲過程命令 發布:2025-05-16 13:17:54 瀏覽:145
用紙做解壓小玩具西瓜 發布:2025-05-16 13:04:09 瀏覽:935
區域網xp無法訪問win7 發布:2025-05-16 13:03:58 瀏覽:942
油卡如何修改密碼 發布:2025-05-16 13:00:35 瀏覽:901
安卓手機如何拼照片 發布:2025-05-16 12:58:23 瀏覽:374
深入淺出python 發布:2025-05-16 12:56:52 瀏覽:655
國二c語言vc2010怎麼編譯運行 發布:2025-05-16 12:53:49 瀏覽:424
華為熱點哪裡看密碼 發布:2025-05-16 12:53:44 瀏覽:515
新手如何用java寫安卓app 發布:2025-05-16 12:53:07 瀏覽:402
虛榮掛腳本 發布:2025-05-16 12:50:44 瀏覽:480