A. 正則表達式原理
首先先講解下正則表達式的基礎知識:
1.字元串的組成
對於字元串」123「而言,包括三個字元四個位置。如下圖所示:
2.佔有字元和零寬度
正則表達式匹配過程中,如果子表達式匹配到東西,而並非是一個位置,並最終保存到匹配的結果當中。這樣的就稱為佔有字元,而只匹配一個位置,或者是匹配的內容並不保存到匹配結果中,這種就稱作零寬度,後續會講到的零寬度斷言等。佔有字元是互斥的,零寬度是非互斥的。也就是一個字元,同一時間只能由一個子表達式匹配,而一個位置,卻可以同時由多個零寬度的子表達式匹配。
3.控制權和傳動
正則表達式由左到右依次進行匹配,通常情況下是由一個表達式取得控制權,從字元串的的某個位置進行匹配,一個子表達式開始嘗試匹配的位置,是從前一子表達匹配成功的結束位置開始的(例如:(表達式一)(表達式二)意思就是表達式一匹配完成後才能匹配表達式二,而匹配表達式二的位置是從表達式一的位置匹配結束後的位置開始)。如果表達式一是零寬度,那表達式一匹配完成後,表達式二匹配的位置還是原來表達式以匹配的位置。也就是說它匹配開始和結束的位置是同一個。
舉一個簡單的例子進行說明:正則表達式:123
源數據:123
講解:首先正則表達式是從最左側開始進行匹配,也就是位置0處進行匹配,首先得到控制權的是正則表達式中的「1」,而不是源數據中的「1」,匹配源數據中的「1」,匹配成功,將源數據的「1」進行保存到匹配的結果當中,這就表明它佔有了一個字元,接下來就將控制權傳給正則表達式中的「2」,匹配的位置變成了位置1,匹配源數據中的「2」,匹配成功,將控制權又傳動給了正則表達式的「3」,這時候匹配的位置變成了位置2,這時候就會將源數據中的「3」進行匹配。又有正則表達式「3」進行傳動控制權,發現已經到了正則表達式的末尾,正則表達式結束。
B. 高分求遺傳演算法程序
遺傳演算法作為一種快速有效的尋優演算法,在工業控制、經濟決策和交通規劃等居多領域得到廣泛應用。其特點就是其不同於傳統的搜索尋優方式而是模擬自然界生物進化過程,通過基因的變異交叉重組使整體得到進化,不斷的進化最終得到最優的組群,即最優解。
下面是一個具體實例,是小可在別人程序的基礎上改寫優化而成。這里首先要建立數學模型,即問題的數學公式描述,數學建模是一門對數學能力有相當要求的課程,一個人的數學能力往往決定其從事工作的層次。下面的程序是求多項式y=x^6-10x^5-26x^4+344x^3+193x^2-1846x-1680在區間[-8,8]的最小值,誤差不超過0.001。對於這個復雜的多項式,可先用matlab繪制函數的大概曲線,確認函數的最小值大概處於[-8,8]之間,再用本程序求出精確解。
程序已在Dev-c++下運行通過,結果正確。
如有什麼疑問,給我消息。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define SUM 20 /* 總共的染色體數量 */
#define MAXloop 1200 /* 最大循環次數 */
#define error 0.01 /* 若兩次最優值之差小於此數則認為結果沒有改變 */
#define crossp 0.7 /* 交叉概率 */
#define mp 0.04 /* 變異概率 */
struct gen /* 定義染色體結構 */
{
int info;
double suitability;
};
struct gen gen_group[SUM];/* 定義一個含有20個染色體的組 */
struct gen gen_new[SUM];
struct gen gen_result; /* 記錄最優的染色體 */
int result_unchange_time; /* 記錄在error前提下最優值未改變的循環次數 */
struct log /* 形成鏈表,記錄每次循環所產生的最優的適應度 */
{
double suitability;
struct log *next;
}llog,*head,*end;
int log_num; /* 鏈表長度 */
void initiate(); /*初始化函數*/
void evaluation(int flag); /*適應度評估和排序函數*/
void cross(); /*交叉函數*/
void selection(); /*選擇函數*/
int record(); /*記錄每次最優解和判斷循環是否終止*/
void mutation(); /*變異函數*/
void showresult(int); /*顯示結果*/
int randsign(double p); /*按概率p產生0,1隨機數,p表示產生值1的概率*/
int randbit(int i,int j);/*產生i,j間的隨機整數*/
int randnum(); /*隨機產生14個位(基因)組成的染色體*/
int convertionD2B(double x); /*編碼*/
double convertionB2D(int x); /*解碼*/
int createmask(int a); /*交叉操作*/
int main()
{
int i,flag;
flag=0;
initiate();
evaluation( 0 );
for( i = 0 ; i < MAXloop ; i++ )
{
cross();
evaluation( 1 );
selection();
if( record() == 1 )
{
flag = 1;
break;
}
mutation();
}
showresult( flag );
system("pause");
return 0
}
void initiate()
{
int i , stime;
long ltime;
ltime=time(NULL);
stime=(unsigned)ltime/2;
srand(stime);
for( i = 0 ; i < SUM ; i++ )
{
gen_group[i].info = randnum();
}
gen_result.suitability=1000;
result_unchange_time=0;
head=end=(struct log *)malloc(sizeof(llog));
if(head==NULL)
{
printf("\n內存不夠!\n");
exit(0);
}
end->next = NULL;
log_num = 1;
}
void evaluation(int flag)
{
int i,j,k;
struct gen *genp;
int gentinfo;
double gentsuitability;
double x;
if( flag == 0 )
genp = gen_group;
else genp = gen_new;
for(i = 0 ; i < SUM ; i++)/* 計算各染色體對應的表達式值 */
{
x = convertionB2D( genp[i].info );
genp[i].suitability = x*(x*(x*(x*(x*(x-10)-26)+344)+193)-1846)-1680;
}
for(i = 0 ; i < SUM - 1 ; i++)/* 按表達式的值進行排序 */
{ k=i;
for(j = i + 1 ; j < SUM ; j++)
if( genp[i].suitability > genp[j].suitability ) k=j;
if( k!=i )
{
gentinfo = genp[i].info;
genp[i].info = genp[k].info;
genp[k].info = gentinfo;
gentsuitability = genp[i].suitability;
genp[i].suitability = genp[k].suitability;
genp[k].suitability = gentsuitability;
}
}
}
void cross()
{
int i , j , k ;
int mask1 , mask2;
int a[SUM];
for(i = 0 ; i < SUM ; i++) a[i] = 0;
k = 0;
for(i = 0 ; i < SUM ; i++)
{
if( a[i] == 0)
{
for( ; ; )/* 隨機找到一組未進行過交叉的染色體與a[i]交叉 */
{
j = randbit(i + 1 , SUM - 1);
if( a[j] == 0) break;
}
if(randsign(crossp) == 1)
{
mask1 = createmask(randbit(0 , 14-1));
mask2 = ~mask1;
gen_new[k].info = (gen_group[i].info) & mask1 + (gen_group[j].info) & mask2;
gen_new[k+1].info=(gen_group[i].info) & mask2 + (gen_group[j].info) & mask1;
k = k + 2;
}
else
{
gen_new[k].info=gen_group[i].info;
gen_new[k+1].info=gen_group[j].info;
k=k+2;
}
a[i] = a[j] = 1;
}
}
}
void selection()
{
int i , j , k;
j = 0;
i = SUM/2-1;
if(gen_group[i].suitability < gen_new[i].suitability)
{
for(j = 1 ; j < SUM / 2 ; j++)
{
if(gen_group[i+j].suitability > gen_new[i-j].suitability)
break;
}
}
else
if(gen_group[i].suitability>gen_new[i].suitability)
{
for(j=-1;j>-SUM/2;j--)
{
if(gen_group[i+j].suitability<=gen_new[i-j].suitability)
break;
}
}
for(k=j;k<SUM/2+1;k++)
{
gen_group[i+k].info = gen_new[i-k].info;
gen_group[i+k].suitability = gen_new[i-k].suitability;
}
}
int record()
{
double x;
struct log *r;
r=(struct log *)malloc(sizeof(llog));
if(r==NULL)
{
printf("\n內存不夠!\n");
exit(0);
}
r->next = NULL;
end->suitability = gen_group[0].suitability;
end->next = r;
end = r;
log_num++;
x = gen_result.suitability - gen_group[0].suitability;
if(x < 0)x = -x;
if(x < error)
{
result_unchange_time++;
if(result_unchange_time >= 20)return 1;
}
else
{
gen_result.info = gen_group[0].info;
gen_result.suitability = gen_group[0].suitability;
result_unchange_time=0;
}
return 0;
}
void mutation()
{
int i , j , k, m;
double x;
double gmp;
int gentinfo;
double gentsuitability;
gmp = 1 - pow(1 - mp , 11);/* 在基因變異概率為mp時整條染色體的變異概率 */
for(i = 0 ; i < SUM ; i++)
{
if(randsign(gmp) == 1)
{
j = randbit(0 , 14);
m = 1 << j;
gen_group[i].info = gen_group[i].info^m;
x = convertionB2D(gen_group[i].info);
gen_group[i].suitability = x*(x*(x*(x*(x*(x-10)-26)+344)+193)-1846)-1680;
}
}
for(i = 0 ; i < SUM - 1 ; i++)
{ k=i;
for(j = i + 1 ; j < SUM ; j++)
if(gen_group[i].suitability > gen_group[j].suitability) k=j;
if(k!=i)
{
gentinfo = gen_group[i].info;
gen_group[i].info = gen_group[k].info;
gen_group[k].info = gentinfo;
gentsuitability = gen_group[i].suitability;
gen_group[i].suitability = gen_group[k].suitability;
gen_group[k].suitability = gentsuitability;
}
}
}
void showresult(int flag)/* 顯示搜索結果並釋放內存 */
{
int i , j;
struct log *logprint,*logfree;
FILE *logf;
if(flag == 0)
printf("已到最大搜索次數,搜索失敗!");
else
{
printf("當取值%f時表達式達到最小值為%f\n",convertionB2D(gen_result.info),gen_result.suitability);
printf("收斂過程記錄於文件log.txt");
if((logf = fopen("log.txt" , "w+")) == NULL)
{
printf("Cannot create/open file");
exit(1);
}
logprint=head;
for(i = 0 ; i < log_num ; i = i + 5)/* 對收斂過程進行顯示 */
{
for(j = 0 ; (j < 5) & ((i + j) < log_num-1) ; j++)
{
fprintf(logf , "%20f" , logprint->suitability);
logprint=logprint->next;
}
fprintf(logf,"\n\n");
}
}
for(i = 0 ; i< log_num ; i++)/* 釋放內存 */
{
logfree=head;
head=head->next;
free(logfree);
}
fclose(logf);
getch();
}
int randsign(double p)/* 按概率p返回1 */
{
if(rand() > (p * 32768))
return 0;
else return 1;
}
int randbit(int i, int j)/* 產生在i與j之間的一個隨機數 */
{
int a , l;
l = j - i + 1;
a = i + rand() * l / 32768;
return a;
}
int randnum()
{
int x;
x = rand() / 2;
return x;
}
double convertionB2D(int x)
{
double y;
y = x;
y = (y - 8192) / 1000;
return y;
}
int convertionD2B(double x)
{
int g;
g = (x * 1000) + 8192;
return g;
}
int createmask(int a)
{
int mask;
mask=(1 << a) - 1;
return mask;
}
C. 基因表達式序列排序
基因表達式的順式作用元件包括以下成分:
啟動子 結構基因 RNA聚合酶 轉錄因子
用傳統基因表達式編程(GEP)適應度機制挖掘函數關系容易受到雜訊干擾,導致結果失真 為此做了如下探索:①借鑒生物具有的「趨利避害」天性,提出了GEP的「弱適應模型」,以實現在含雜訊的數據集上挖掘函數關系;②提出新概念「帶內集」、「帶外集」並用於劃分訓練數據集;③設計了在弱適應模型下基於相對誤差計算適應度的演算法RE FA ;④用詳盡的實驗驗證了REFA的有效性,當測量數據的雜訊率為3 33%時,與傳統方法相比,REFA方法的成功率提高了3倍,產生結果的平均相對誤差從7 899%降低到2 32 0 %
D. 求基因表達式演算法C語言或C++的源程序代碼
基因表達式的順式作用元件包括以下成分:
啟動子 結構基因 RNA聚合酶 轉錄因子
用傳統基因表達式編程(GEP)適應度機制挖掘函數關系容易受到雜訊干擾,導致結果失真 為此做了如下探索:①借鑒生物具有的「趨利避害」天性,提出了GEP的「弱適應模型」,以實現在含雜訊的數據集上挖掘函數關系;②提出新概念「帶內集」、「帶外集」並用於劃分訓練數據集;③設計了在弱適應模型下基於相對誤差計算適應度的演算法RE FA ;④用詳盡的實驗驗證了REFA的有效性,當測量數據的雜訊率為3 33%時,與傳統方法相比,REFA方法的成功率提高了3倍,產生結果的平均相對誤差從7 899%降低到2 32 0 %
E. 如何才能學好編程演算法呢
難學。其實,按照我們現在的教學大綱和教學要求,只要同學們掌握一些方法,克服心理上畏難、不輕言放棄,是完全可以學好的。
《C程序設計》的內容很豐富,按照我們現在的教學大綱,教學的主要內容是基礎知識、四種結構的的程序設計、函數與數組的應用和一些簡單的演算法。在學習時,同學們應該把主要精力放在這些部分,通過實踐(練習和上機調試等熟練掌握。當然,在初學C語言時,可能會遇到有些問題理解不透,或者表達方式與以往數學學習中不同(如運算符等),這就要求不氣餒,不明白的地方多問多想,鼓足勇氣進行學習,待學完後面的章節知識,前面的問題也就迎刃而解了,這一方面我感覺是我們同學最欠缺,大多學不好的就是因為一開始遇到困難就放棄,曾經和好多同學談他的問題,回答是聽不懂、不想聽、放棄這樣三個過程,我反問,這節課你聽過課嗎?回答又是沒有,根本就沒聽過課,怎麼說自己聽不懂呢?相應的根本就沒學習,又談何學的好?
學習C語言始終要記住「曙光在前頭」和「千金難買回頭看」,「千金難買回頭看」是學習知識的重要方法,就是說,學習後面的知識,不要忘了回頭弄清遺留下的問題和加深理解前面的知識,這是我們學生最不易做到的,然而卻又是最重要的。比如:在C語言中最典型的是關於結構化程序設計構思,不管是那種教材,一開始就強調這種方法,這時也許你不能充分體會,但是學到函數時,再回頭來仔細體會,溫故知新,理解它就沒有那麼難了。學習C語言就是要經過幾個反復,才能前後貫穿,積累應該掌握的C知識。
那麼,我們如何學好《C程序設計》呢?
一.學好C語言的運算符和運算順序
這是學好《C程序設計》的基礎,C語言的運算非常靈活,功能十分豐富,運算種類遠多於其它程序設計語言。在表達式方面較其它程序語言更為簡潔,如自加、自減、逗號運算和三目運算使表達式更為簡單,但初學者往往會覺的這種表達式難讀,關鍵原因就是對運算符和運算順序理解不透不全。當多種不同運算組成一個運算表達式,即一個運算式中出現多種運算符時,運算的優先順序和結合規則顯得十分重要。在學習中,只要我們對此合理進行分類,找出它們與我們在數學中所學到運算之間的不同點之後,記住這些運算也就不困難了,有些運算符在理解後更會牢記心中,將來用起來得心應手,而有些可暫時放棄不記,等用到時再記不遲。
先要明確運算符按優先順序不同分類,《C程序設計》運算符可分為15種優先順序,從高到低,優先順序為1 ~ 15,除第2、3級和第14級為從右至左結合外,其它都是從左至右結合,它決定同級運算符的運算順序。下面我們通過幾個例子來說明:
(1) 5*8/4%10 這個表達式中出現3種運算符,是同級運算符,運算順序按從左至右結合,因此先計算5 *8=40,然後被4除,結果為10,最後是%(求余數)運算,所以表達式的最終結果為10%10 = 0;
(2)a = 3;b = 5;c =++ a* b ;d =a + +* b;
對於c=++a*b來說,按表中所列順序,+ +先執行,*後執行,所以+ + a執行後,a的值為4,由於+ +為前置運算,所以a的值4參與運算,C的值計算式為4*5=20而不是3*5=15了;而對於d=a++*b來說,由於a + +為後置運算,所以a值為4參與運算,使得d的值仍為20,而a參與運算後其值加1,值為5。 這個例子執行後,a的值為5,b的值為5,c的值為20,d的值也是20;
(3)(a = 3,b = 5,b+ = a,c = b* 5)
例子中的「,」是逗號結合運算,上式稱為逗號表達式,自左向右結合,最後一個表達式的結果值就是逗號表達式的結果,所以上面的逗號表達式結果為40,a的值為3,b的值為8,c的值為40。
(4)a=5;b=6;c=a>b?a:b;
例中的a>b?a:b是一個三目運算,它的功能是先做關系運算a>b部分,若結果為真,則取問號後a的值,否則取冒號後b的值,因此c的值應該為6,這個運算可以用來代替if…else…語句的簡單應用。
二.學好C語言的四種程序結構
(1)順序結構
順序結構的程序設計是最簡單的,只要按照解決問題的順序寫出相應的語句就行,它的執行順序是自上而下,依次執行。
例如;a = 3,b = 5,現交換a,b的值,這個問題就好象交換兩個杯子水,這當然要用到第三個杯子,假如第三個杯子是c,那麼正確的程序為: c = a; a = b; b = c; 執行結果是a = 5,b = c = 3如果改變其順序,寫成:a = b; c = a; b = c; 則執行結果就變成a = b = c = 5,不能達到預期的目的,初學者最容易犯這種錯誤。 順序結構可以獨立使用構成一個簡單的完整程序,常見的輸入、計算,輸出三步曲的程序就是順序結構,例如計算圓的面積,其程序的語句順序就是輸入圓的半徑r,計算s = 3.14159*r*r,輸出圓的面積s。不過大多數情況下順序結構都是作為程序的一部分,與其它結構一起構成一個復雜的程序,例如分支結構中的復合語句、循環結構中的循環體等。
(2) 分支結構
順序結構的程序雖然能解決計算、輸出等問題,但不能做判斷再選擇。對於要先做判斷再選擇的問題就要使用分支結構。分支結構的執行是依據一定的條件選擇執行路徑,而不是嚴格按照語句出現的物理順序。分支結構的程序設計方法的關鍵在於構造合適的分支條件和分析程序流程,根據不同的程序流程選擇適當的分支語句。分支結構適合於帶有邏輯或關系比較等條件判斷的計算,設計這類程序時往往都要先繪制其程序流程圖,然後根據程序流程寫出源程序,這樣做把程序設計分析與語言分開,使得問題簡單化,易於理解。程序流程圖是根據解題分析所繪制的程序執行流程圖。
學習分支結構不要被分支嵌套所迷惑,只要正確繪制出流程圖,弄清各分支所要執行的功能,嵌套結構也就不難了。嵌套只不過是分支中又包括分支語句而已,不是新知識,只要對雙分支的理解清楚,分支嵌套是不難的。下面我介紹幾種基本的分支結構。
①if(條件)
{
分支體
}
這種分支結構中的分支體可以是一條語句,此時「」可以省略,也可以是多條語句即復合語句。它有兩條分支路徑可選,一是當條件為真,執行分支體,否則跳過分支體,這時分支體就不會執行。如:要計算x的絕對值,根據絕對值定義,我們知道,當x>=0時,其絕對值不變,而x<0時其絕對值是為x的反號,因此程序段為:if(x<0) x=-x;
②if(條件)
else
這是典型的分支結構,如果條件成立,執行分支1,否則執行分支2,分支1和分支2都可以是1條或若干條語句構成。如:求ax^2+bx+c=0的根
分析:因為當b^2-4ac>=0時,方程有兩個實根,否則(b^2-4ac<0)有兩個共軛復根。其程序段如下:
d=b*b-4*a*c;
if(d>=0)
{x1=(-b+sqrt(d))/2a;
x1=(-b-sqrt(d))/2a;
printf(「x1=%8.4f,x2=%8.4f\n」,x1,x2);
}
else
{r=-b/(2*a);
i =sqrt(-d)/(2*a);
printf(「x1=%8.4f+%8.4fi\n」r, i);
printf(「x2=%8.4f-%8.4fi\n」r,i)
}
③嵌套分支語句:其語句格式為:
if(條件1) ;
else if(條件2)
else if(條件3)
……
else if(條件n)
else
嵌套分支語句雖可解決多個入口和出口的問題,但超過3重嵌套後,語句結構變得非常復雜,對於程序的閱讀和理解都極為不便,建議嵌套在3重以內,超過3重可以用下面的語句。
④switch開關語句:該語句也是多分支選擇語句,到底執行哪一塊,取決於開關設置,也就是表達式的值與常量表達式相匹配的那一路,它不同if…else 語句,它的所有分支都是並列的,程序執行時,由第一分支開始查找,如果相匹配,執行其後的塊,接著執行第2分支,第3分支……的塊,直到遇到break語句;如果不匹配,查找下一個分支是否匹配。這個語句在應用時要特別注意開關條件的合理設置以及break語句的合理應用。
(3)循環結構:
循環結構可以減少源程序重復書寫的工作量,用來描述重復執行某段演算法的問題,這是程序設計中最能發揮計算機特長的程序結構,C語言中提供四種循環,即goto循環、while循環、do –while循環和for循環。四種循環可以用來處理同一問題,一般情況下它們可以互相代替換,但一般不提倡用goto循環,因為強制改變程序的順序經常會給程序的運行帶來不可預料的錯誤,在學習中我們主要學習while、do…while、for三種循環。常用的三種循環結構學習的重點在於弄清它們相同與不同之處,以便在不同場合下使用,這就要清楚三種循環的格式和執行順序,將每種循環的流程圖理解透徹後就會明白如何替換使用,如把while循環的例題,用for語句重新編寫一個程序,這樣能更好地理解它們的作用。特別要注意在循環體內應包含趨於結束的語句(即循環變數值的改變),否則就可能成了一個死循環,這是初學者的一個常見錯誤。
在學完這三個循環後,應明確它們的異同點:用while和do…while循環時,循環變數的初始化的操作應在循環體之前,而for循環一般在語句1中進行的;while 循環和for循環都是先判斷表達式,後執行循環體,而do…while循環是先執行循環體後判斷表達式,也就是說do…while的循環體最少被執行一次,而while 循環和for就可能一次都不執行。另外還要注意的是這三種循環都可以用break語句跳出循環,用continue語句結束本次循環,而goto語句與if構成的循環,是不能用break和 continue語句進行控制的。
順序結構、分支結構和循環結構並不彼此孤立的,在循環中可以有分支、順序結構,分支中也可以有循環、順序結構,其實不管哪種結構,我們均可廣義的把它們看成一個語句。在實際編程過程中常將這三種結構相互結合以實現各種演算法,設計出相應程序,但是要編程的問題較大,編寫出的程序就往往很長、結構重復多,造成可讀性差,難以理解,解決這個問題的方法是將C程序設計成模塊化結構。
(4)模塊化程序結構
C語言的模塊化程序結構用函數來實現,即將復雜的C程序分為若干模塊,每個模塊都編寫成一個C函數,然後通過主函數調用函數及函數調用函數來實現一大型問題的C程序編寫,因此常說:C程序=主函數+子函數。 因些,對函數的定義、調用、值的返回等中要尤其注重理解和應用,並通過上機調試加以鞏固。
三.掌握一些簡單的演算法
編程其實一大部分工作就是分析問題,找到解決問題的方法,再以相應的編程語言寫出代碼。這就要求掌握演算法,根據我們的《C程序設計》教學大綱中,只要求我們掌握一些簡單的演算法,在掌握這些基本演算法後,要完成對問題的分析就容易了。如兩個數的交換、三個數的比較、選擇法排序和冒泡法排序,這就要求我們要清楚這些演算法的內在含義,其中選擇法排序和冒泡法排序稍難,但只要明白排序的具體過程,對代碼的理解就不難了。如用選擇法對10個不同整數排序(從小到大),選擇法排序思路:設有10個元素a[1]~a[10],將a[1]與a[2]~a[10]比較,若a[1]比a[2]~a[10]都小,則不進行交換,即無任何操作;若a[2]~a[10] 中有一個比a[1]小,則將其中最大的一個(假設為a)與a[1]交換,此時a[1]中存放了10個中最小的數。第二輪將a[2]與a[3]~a[10]比較,將剩下9個數中的最小者a與a[2]交換,此時a[2] 中存放的10個數中第2小的數;依此類推,共進行9輪比較,a[1]到a[10]就已按從小到大的順序存放。即每一輪都找出剩下數中的最小一個,代碼如下:
for(i=1;i<=9;i++)
for(j=i+1;j<=10;j++)
if(a>a[j]
{temp=a;
a=a[j];
a[j]=temp;
}
結語:當我們把握好上述幾方面後,只要同學們能克服畏難、厭學、上課能專心聽講,做好練習與上機調試,其實C語言並不難學。
參考資料:;f=15;t=000968
F. 計算機科學技術前沿選講的圖書目錄
第一部分 計算機硬體
第1講 電子計算機發明准備
1.1 機械計算機
1.2 電子計算機發明的理論准備
背景材料
參考文獻
第2講 電子計算機發展簡史
2.1 國外電子計算機發展簡史
2.2 中國電子計算機發展簡史
背景材料
參考文獻
第3講 計算機發展趨勢
3.1 計算機小型化
3.2 計算機網路化
3.3 計算機多樣化
背景材料
參考文獻
第4講 「巨磁電阻」效應與硬碟
4.1 「巨磁電阻」效應概述
4.2 2007年諾貝爾物理學獎
4.3 硬碟介質存儲原理
4.4 大硬碟中的應用
4.5 研究歷史與熱點
4.6 量子化磁碟
背景材料
參考文獻
第5講 光碟與有機光存儲材料
5.1 光碟與有機光存儲材料簡介
5.2 光碟的種類
5.3 光碟讀寫機理
5.4 光存儲的發展歷史
5.5 光存儲技術的發展趨勢
5.6 我國光存儲的發展
背景材料
參考文獻
第6講 集成電路、晶元及其發展歷史
6.1 集成電路與晶元
6.2 CPU的結構
6.3 集成電路發展歷史
6.4 我國集成電路發展史
背景材料
參考文獻
第7講 晶元設計與製造
7.1 SoC
7.2 CMOS
7.3 晶元的封裝技術
7.4 國內晶元設計製造的研究現狀
背景材料
參考文獻
第8講 超級計算機
8.1 超級計算機概述
8.2 超級計算機的結構
8.3 頂級超級計算機
8.4 國外大/巨型機的發展
8.5 國內大/巨型機的發展
背景材料
參考文獻
第9講 量子計算機
9.1 量子計算機概述
9.2 量子計算機原理
9.3 量子計算機發展現狀與趨勢
9.4 量子技術的應用
9.5 國內量子計算機發展
背景材料
參考文獻
第10講 納米器件
10.1 納米器件概述
10.2 納米器件的技術原理
10.3 納米器件的現狀與發展
10.4 納米器件的典型應用
10.5 納米器件的展望
10.6 國內納米器件的研究
背景材料
參考文獻
第11講 機器人
11.1 機器人簡介
11.2 機器人的發展階段
11.3 機器人分類
11.4 各國的機器人發展
11.5 中國的機器人發展
11.6 現代機器人發展
背景材料
參考文獻
第二部分 計算機軟體
第12講 CMM與敏捷軟體設計
12.1 軟體危機與軟體工程方法學
12.2 軟體過程管理與CMM
12.3 敏捷軟體設計
12.4 我國的敏捷開發
背景材料
參考文獻
第13講 軟體產品線與網構軟體
13.1 軟體產品線的歷史
13.2 軟體產品線的結構與框架
13.3 國內網構軟體研究
背景材料
參考文獻
第14講 可信計算
14.1 可信計算的事故
14.2 可信計算的重要概念
14.3 可信計算的發展歷程
14.4 國外可信計算的研究進展
14.5 我國的可信計算
背景材料
參考文獻
第15講 演化計算與軟體基因編程
15.1 演化計算
15.2 遺傳演算法
15.3 遺傳程序設計
15.4 基因表達式程序設計
15.5 軟體基因編程方式
背景材料
參考文獻
第16講 軟體進化論
16.1 軟體進化論研究
16.2 軟體的大小進化
16.3 軟體生態系統
16.4 軟體分子與細胞
16.5 軟體器官與軟體腦
背景材料
參考文獻
第17講 4GL與軟體開發工具酶
17.1 4GL
17.2 生物酶與開發工具
背景材料
……
第18講 知見與智換體
第三部分 網路與安全
第19講 光通信與其他應用
第20講 全球衛星通信
第21講 超高速網路
第22講 網路生態與青少年上網
第23講 網格計算
第24講 人工免疫與計算機病毒
第25講 信息對抗
第四部分 生物與智能
第26講 分子機器
第27講 生物晶元
第28講 生物信息學
第29講 生物計算機
第30講 人工生命
第31講 人工智慧
第32講 人機介面與一體化
第33講 「合成人」計劃
第五部分 計算機應用
第34講 計算可視化與虛擬現實
第35講 核磁共振成像與CT
第36講 電子成像技術
第37講 普適計算
第38講 虛擬儀器與數字製造
第39講 數字地球與數字城市
第40講 智能交通
全書思考題
……
G. 單片機原理及應用求數組中最大元素時常採用「打擂台」演算法,其編程原理是什麼
電機原理及其他的應用,它的除數的它的最大顏色,我們市場還是可以用打擂台的演算法了,並且他的編程原理我覺得能夠給大家帶來一種更好的是。
H. 遺傳演算法原理與應用實例的目錄
第1章 緒論
1.1 從生物進化到遺傳演算法
1.2 遺傳演算法的描述
1.3 表示方案的實例
1.3.1 工程設計的最優化
1.3.2 人工蟻問題
1.4 遺傳演算法的特點
1.5 遺傳演算法的發展簡史
1.6 遺傳演算法的研究內容及前景
1.7 遺傳演算法的應用
第2章 遺傳演算法的基本原理
2.1 復雜系統的適應過程
2.1.1 復雜系統的適應性
2.1.2 適應過程的數學模型
2.2 遺傳演算法的基本描述
2.2.1 整體優化問題
2.2.2 遺傳演算法的基本流程
2.2.3 遺傳編碼
2.2.4 適應函數(評價函數)
2.2.5 遺傳運算元
2.2.6 群體設定
2.2.7 初始化群體
2.2.8 終止循環的條件
2.2.9 標准遺傳演算法的流程
2.2.10 控制參數和選擇
2.2.11 遺傳演算法的性能評估
2.3 遺傳演算法的模式理論
2.3.1 模式與模式空間
2.3.2 模式生存模型
2.3.3 雙臂賭機分析
2.3.4 基因模塊假設
2.3.5 模式處理與隱含並行性
2.3.6 模式處理與遺傳運算元的性能
2.4 遺傳演算法與其他搜索技術的比較
2.4.1 啟發式隨機搜索技術的基本功能
2.4.2 局域搜索技術
2.4.3 模擬退火演算法
2.4.4 遺傳演算法搜索
2.4.5 啟發式搜索技術比較
2.5 遺傳演算法計算實例
2.5.1 單調連續函數
2.5.2 One-Max函數
2.5.3 皇家大道問題
2.6 遺傳演算法雜交率與變異率關系的研究
2.6.1 研究方法簡述
2.6.2 算例
2.6.3 應用
2.6.4 結論
第3章 遺傳演算法數學機理分析
3.1 遺傳演算法的基本定理
3.2 隱含並行性
3.3 Walsh模式變換
3.3.1 Walsh函數
3.3.2 用Walsh函數表示模式平均適應度
3.3.3 Walsh系數與異位顯性(epistasis)
3.4 非均勻Walsh模式變換
3.5 最小欺騙問題
3.6 遺傳演算法欺騙問題的分析與設計
……
第4章 解連續優化問題的遺傳演算法
第5章 分布式遺傳演算法研究
第6章 遺傳演算法的實現技術
第7章 遺傳演算法應用實例
參考文獻
I. 遺傳演算法原理與應用實例的介紹
《遺傳演算法原理與應用實例》主要結合應用實例系統討論、介紹遺傳演算法原理及其應用,主要內容包括:遺傳演算法的基本原理和數學機理、解決連續問題優化的遺傳演算法和分布式遺傳演算法、遺傳演算法的實現技術、遺傳演算法應用實例,並給出了兩個典型的遺傳演算法源程序。《遺傳演算法原理與應用實例》在詳細介紹遺傳演算法理論與方法的同時,還給_出了基於遺傳演算法的費托合成反應動力學模型參數優化的詳細設計應用。