青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

置頂隨筆

[置頂]資料分享聲明

       鑒于網上找資料是件痛苦的,所以我把我自己的一些電子書,以及下載的一些小程序放在了郵箱里,跟大家分享,僅大家學習交流(這些資料一般已經在網上廣為流傳,我想應該沒有觸及版權的問題吧,呵呵)。大家有需要的可以去郵箱去下,目前只放了一部分,以后會陸續添加郵箱地址和密碼如下:
賬號:percyph1@163.com
密碼:xcc123456
如果大家有c++,openGL,密碼學等等計算機方面的好資料,也可以發給我,我的郵箱是 percyph@163.com
大家也可以回帖要資料,如果有的話我會第一時間發上。
相信來我這兒的朋友都是有素質的,請不要刪除和移動郵箱里的文件,謝謝!

目前已經上傳的資料有:(以后會陸續更新)

   VC編程助手(小軟件VC++ assistant,能使編程更方便)
   C++Primer3(電子書)
   glut函數說明(電子書)
   C++技能百練(經典算法).rar 
   ROAM地形算法演示程序.rar 
   OpenGL 參考手冊
   c&c++深層探索 
   C++必知必會 
   VC6.0編程實例精解 
   高質量C++編程指南&編程新手真言&MFC類庫詳解 
   Windows程序設計 
   MFC類庫詳解.chm 
   C++ 數據結構第三版 
   C++ 數據結構第三版 
   程序員面試寶典&程序員超級開發寶典 
   c++和OpenGL函數手冊 
   Essential C++中文版.pdf 
   Effective C++(電子書) 
   C++編程思想(電子書)

3.11號上傳(kuafoo發的)
   Windows環境下32位匯編語言.chm(2.78M)
   深入淺出MFC
   深入淺出MFC第二版
  
另外最近幾個月寫的數據結構的程序也傳上去了,有興趣的朋友可以看看!

里面包括:

線性表——靜態鏈表2009.7.30
線性表——鏈表的內部類實現2008.8
線性表——鏈表的友元類實現2008.8
線性表——雙向鏈表2009.8.11
線性表——順序表2009.8.3
線性表——友元模板類2009.8

約瑟夫問題——四種解法2009.8.11(數組,鏈表,循環鏈表等)
隊列——隊列的順序表示循環隊列2009.8.11
隊列——鏈隊列2009.8.11
棧——漢諾塔2009.8.6
棧——進制轉換2009.8.6
棧——括號匹配2009.8.6
棧——模板鏈棧2009.8.3
棧——模板順序棧2009.7
棧——順序棧2009.8.6
棧——算術表達式求值2009.7.13
棧——行編輯2009.8.6
二叉樹——二叉樹的常見操作2009.9.3

2010.3.9 更新

樹的應用—仿DOS文件夾管理程序

200位大數乘法.rar

200位大數加法.rar

連連看單機程序MFC

posted @ 2009-03-06 18:32 小蟲蟲 閱讀(731) | 評論 (4)編輯 收藏

2010年10月7日

基于四叉樹LOD的3D地形實現(OpenGL)

我自己的畢業設計的1.0版本. 采用四叉樹LOD算法實現地形渲染.已經傳至共享郵箱里,希望對學3D的朋友有幫助

posted @ 2010-10-07 23:26 小蟲蟲 閱讀(1706) | 評論 (4)編輯 收藏

2009年5月14日

(轉)質數算法大全,及C程序實現優化詳解 (二) 篩選法

質數的定義

一個數,如果只有1和它本身兩個因數,這樣的數叫做質數,又稱素數。

在上文 《素數算法大全,及C程序實現優化詳解 (一) 試除法》中我們已經探討了求解素數的一類算法,并且將試除法從最初的低效版本優化的高效的V2。那么,還有沒有其它更佳算法呢?這就是下面三藏要和大家探討的內容

合數過濾篩選法

算法描述:我們知道,素數N不能被2~(N-1)間的任何數整除;反過來看,只要能被2~(N-1)間的任何數整除的N,都不是素數。所以我們可以采用一個簡單的排除法:就是對N以內的所有數,只要逐個去除值為2~(N-1)的倍數的數,剩下的就是素數。

C語言實現

// 合數過濾篩選法 Ver1 
// 參數:n 求解n以內(包括n)的素數
// 返回值:n以內素數個數
int CompositeNumFilterV1(int n)
{
 int i, j;
 // 素數數量統計
 int count = 0;
 // 分配素數標記空間,結合后文思考為何+1
 char* flag = (char*)malloc( n+1 );
 
 // 初始化素數標記
 for (i=2; i<=n; i++)
 {
  // 為什么*(p+i)要寫成flag[i]呢?可讀性更佳爾
  flag[i] = 1;
 }
 
 // 寫程序要注意排版和留空,方便閱讀,也可減少出錯幾率
 // 以2~(N-1)為因子過濾合數
 for (i=2; i < n; i++)
 {
  for (j=2; i*j <= n; j++)
  {
   // i*j是由i,j兩整數相乘而得,顯然不是素數
   flag[i*j] = 0;
  }
 }
 
 // 統計素數個數
 for (i=2; i<=n; i++)
 {
  // 其實if(flag)就其同樣作用了,但這么寫是有留言的
  // 請參閱《C語言程序設計常見錯誤剖析及解決之道》一文
  if (1 == flag[i]) count++;
 }
  
 // 因輸出費時,且和算法核心相關不大,故略
 
 // 釋放內存,別忘了傳說中的內存泄漏
 free(flag);
 
 return count;
}

在上文給出的main函數中以不同參數調用CompositeNumFilterV1函數,得到執行結果如下:

[100000]以內素數個數:9592, 計算用時:15毫秒
[1000000]以內素數個數:78498, 計算用時:125毫秒
[5000000]以內素數個數:348513, 計算用時:2578毫秒
[10000000]以內素數個數:664579, 計算用時:6281毫秒

注:因程序是非獨占性運行的,所以時間不是完全精確的,但基本能反映實情

顯然,比上文中的試除法要快,而且誰都可以看到上例是一個未經優化的粗陋版本,好多地方是三藏故意采用比較低效做法,為了與后文的優化版比較,凸顯優化之重要,也為了初學者記住別采用類似低效做法,下面我們開始優化之旅

優化分析

上面CompositeNumFilterV1函數存在的問題有:

  1. 在外層循環,需要一直執行到n-1嗎?不要,因為n/2~n-1間的數顯然不能整出n
  2. 在內層循環中重復使用i*j顯然是低效的,考慮到計算機中加減運算速度比乘除快,可以考慮變乘法為加法
  3. 在循環修改flag過程中,其實有很多數會被重復計算若干次,比如6=2*3=3*2,會被重復置0,類似操作很多,所以我們得設法避免或減少flag重復置0

據上述分析,我們可將程序優化如下:

// 合數過濾篩選法 Ver2 
// 參數:n 求解n以內(包括n)的素數
// 返回值:n以內素數個數
int CompositeNumFilterV2(int n)
{
 int i, j;
 // 素數數量統計
 int count = 0;
 // 分配素數標記空間,明白+1原因了吧,因為浪費了一個flag[0]
 char* flag = (char*)malloc( n+1 );
 
 // 初始化素數標記,要高效點咯
 flag[2] = 1;
 // 注意是i<n不是上例中的i<=n了,理由自思
 for (i=3; i<n; i++)
 {
  flag[i++] = 1;
  // 偶數自然不是素數,直接置0好了
  flag[i] = 0;
 }
 // n為奇數
 if (n%2 != 0)
 {
  flag[n] = 1;
 }
 
 // 從3開始filter,因為2的倍數早在初始化時代就干掉了
 // 到n/2止的理由還要說嗎
 for (i=3; i <= n/2; i++)
 {
  // i是合數,請歇著吧,因為您的工作早有您的質因子代勞了
  if (0 == flag[i]) continue;
  
  // 從i的2倍開始過濾,變乘法為加法 
  for (j=i+i; j <= n; j+=i)
  {
   flag[j] = 0;
  }
 }
 
 // 統計素數個數
 for (i=2; i<=n; i++)
 {
  if (flag[i]) count++;
 }
  
 // 因輸出費時,且和算法核心相關不大,故略
 
 // 釋放內存,別忘了傳說中的內存泄漏
 free(flag);
 
 return count;
}

再來調用CompositeNumFilterV2得到執行結果:

[100000]以內素數個數:9592, 計算用時:n太小,時間精度不夠
[1000000]以內素數個數:78498, 計算用時:31毫秒
[5000000]以內素數個數:348513, 計算用時:453毫秒
[10000000]以內素數個數:664579, 計算用時:1062毫秒
[100000000]以內素數個數:5761455, 計算用時:12973毫秒

哇哇,比昨天的試除發快了好多倍,可見算法的威力,值得好好學習,別說學算法沒用咯。

上例著那個計算一億以內的素數只要約13秒,應該算不錯了,今天是否可以休息了呢?No,我們要追求極限!

int CompositeNumFilterV3(int n)
{
 int i, j;
 // 素數數量統計
 int count = 0;
 // 分配素數標記空間,明白+1原因了吧,因為浪費了一個flag[0]
 char* flag = (char*)malloc( n+1 );
 // 干嘛用的,請仔細研究下文
 int mpLen = 2*3*5*7*11*13;
 char magicPattern[mpLen];
 // 奇怪的代碼,why,思考無法代勞,想!
 for (i=0; i<mpLen; i++)
 {
  magicPattern[i++] = 1;
  magicPattern[i++] = 0;
  magicPattern[i++] = 0;
  magicPattern[i++] = 0;
  magicPattern[i++] = 1;
  magicPattern[i] = 0;
 }
 for (i=4; i<=mpLen; i+=5)
  magicPattern[i] = 0;
 for (i=6; i<=mpLen; i+=7)
  magicPattern[i] = 0;
 for (i=10; i<=mpLen; i+=11)
  magicPattern[i] = 0;
 for (i=12; i<=mpLen; i+=13)
  magicPattern[i] = 0;
 
 // 新的初始化方法,將2,3,5,7,11,13的倍數全干掉
 // 而且采用memcpy以mpLen長的magicPattern來批量處理
 int remainder = n%mpLen;
 char* p = flag+1;
 char* pstop = p+n-remainder;
 while (p < pstop)
 {
  memcpy(p, magicPattern, mpLen);
  p += mpLen;
 }
 if (remainder > 0)
 {
  memcpy(p, magicPattern, remainder);
 }
 flag[2] = 1;
 flag[3] = 1;
 flag[5] = 1;
 flag[7] = 1;
 flag[11] = 1;
 flag[13] = 1;
 
 // 從17開始filter,因為2,3,5,7,11,13的倍數早被kill了
 // 到n/13止的,哈哈,少了好多吧
 int stop = n/13;
 for (i=17; i <= stop; i++)
 {
  // i是合數,請歇著吧,因為您的工作早有您的質因子代勞了
  if (0 == flag[i]) continue;
  
  // 從i的17倍開始過濾
  int step = i*2;
  for (j=i*17; j <= n; j+=step)
  {
   flag[j] = 0;
  }
 }
 
 // 統計素數個數
 for (i=2; i<=n; i++)
 {
  if (flag[i]) count++;
 }
  
 // 因輸出費時,且和算法核心相關不大,故略
 
 // 釋放內存,別忘了傳說中的內存泄漏
 free(flag);
 
 return count;
}

再看CompositeNumFilterV3執行結果:

[1000000]以內素數個數:78498, 計算用時:15毫秒
[5000000]以內素數個數:348513, 計算用時:203毫秒
[10000000]以內素數個數:664579, 計算用時:515毫秒
[100000000]以內素數個數:5761455, 計算用時:6421毫秒

再次優化后速度提升了又一倍左右,三藏不禁有點滿足了,睡覺也!

posted @ 2009-05-14 15:48 小蟲蟲 閱讀(1050) | 評論 (0)編輯 收藏

(轉)素數算法大全,及C程序實現優化詳解 (一) 試除法

轉自:http://www.doforfun.net/article/20090504/543.htm
經常有初學者詢問求解N內所有素數(質數)的問題,對此,網上的解答也很多,但很多要么不夠專業,要么只有程序沒有算法解析,所以三藏大廈對此問題做個小結,探討一下求解素數的常見算法,同時給出相應的C語言程序及其解析。為了方便初學者理解,本文將從易到難闡述不同算法,高手可以直接看后面的高效算法

質數的定義

一個數,如果只有1和它本身兩個因數,這樣的數叫做質數,又稱素數。 

試除判斷法

算法描述:從上述定義可知,素數不能被1和它本身之外的數整除,所以,判斷一個數x是否素數只要看它是否能被2~sqrt(x)間的數整除即可;而求N內所有素數則是循環重復上述過程。

C語言實現

#include <time.h>
#include <malloc.h>
#define N 100000
// 簡單試除判斷法 Ver1
int SimpleDivisionV1(int n)
{
 int i,j;
 // 素數數量統計
 int count = 0;
 // 分配存放結果的空間
 int* primes = (int*)malloc( sizeof(int)*n );
 
 // 2是素數誰都知道,不算了
 primes[count++] = 2;
 // 循環計算3~n間的數
 for (i=3; i<=n; i++)
 {
  // 為什么是sqrt(i),思考一下
  for (j=2; j<=sqrt(i); j++)
  {
   // i被j整除,顯然不是素數了
   if (i%j == 0) break;
  }
  // i不能被2~sqrt(i)間的數整除,素數也
  if (j > sqrt(i))
  {
   primes[count++] = i;
  }
 }
 
 // 因輸出費時,且和算法核心相關不大,故略
 
 // 釋放內存,別忘了傳說中的內存泄漏
 free(primes);
 
 return count;
}

void main()
{
 int count;
 clock_t start, end;
 // time函數不夠精確,用clock湊合一下吧
 start = clock();
 count = SimpleDivisionV1(N);
 
 end = clock();
 printf("[%d]以內素數個數:%d, 計算用時:%d毫秒\n", N, count, end-start);
 getch(); 
}

計算結果:
[100000]以內素數個數:9592, 計算用時:468毫秒
[1000000]以內素數個數:78498, 計算用時:10859毫秒
[5000000]以內素數個數:348513, 計算用時:103560毫秒

噢噢,算算十萬還行,百萬就10秒多了,而且時間增長很快,這不行,得優化一下!

優化分析

仔細研究一下SimpleDivisionV1我們可以發現以下幾個問題:

  1. 在循環條件中重復調用sqrt(i)顯然是比較浪費時間的
  2. 判斷素數,真的需要拿2~sqrt(i)間的所有整數去除嗎?我們知道,合數都可以分解成若干質數,所以只要2~sqrt(i)間的質數不能整除i即可

根據上面兩點,我們可將SimpleDivisionV1升級為SimpleDivisionV2,如下

 // 簡單試除判斷法 Ver2 
int SimpleDivisionV2(int n)
{
 int i, j, k, stop;
 // 素數數量統計
 int count = 0;
 // 分配存放結果的空間
 int* primes = (int*)malloc( sizeof(int)*n );
 
 // 2是素數誰都知道,不算了
 primes[count++] = 2;
 stop = count;
 // 循環計算3~n間的數
 for (i=3; i<=n; i++)
 {
  k = sqrt(i);
  // 在循環條件中重復調用sqrt是低效做法,故引入k
  while (primes[stop] <= k && stop < count)
   stop++;
  // stop干什么用,思考一下
  for (j=0; j<stop; j++)
  {
   if (i%primes[j] == 0) break;
  }
  // i不能被2~sqrt(i)間的素數整除,自然也不能被其他數整除,素數也
  if (j == stop)
  {
   primes[count++] = i;
  }
 }
 
 // 因輸出費時,且和算法核心相關不大,故略
 
 // 釋放內存,別忘了傳說中的內存泄漏
 free(primes);
 
 return count;
}

然后將main中調用的函數替換為SimpleDivisionV2,在看一下執行結果:

[100000]以內素數個數:9592, 計算用時:46毫秒
[1000000]以內素數個數:78498, 計算用時:546毫秒
[5000000]以內素數個數:348513, 計算用時:3515毫秒
[10000000]以內素數個數:664579, 計算用時:8000毫秒

很開心的看到,經過優化,速度提高了幾十倍,尤其是時間增長曲線的坡度變小了,N值越大,V2函數比V1的效率就越高

對于試除判斷這種質數算法來說,三藏認為SimpleDivisionV2基本已經接近極限,不大可能有量級上的突破了,有興趣的朋友可以自己進一步優化。初學者除了參看上述例子外,可以嘗試做各種修改及細節優化,也可以將除法變乘法,多加練習是學習編程的好方法。

雖然,上例中V2已經比V1快了很多了,但隨著N的增大,耗時還是不少,那么我們還有更好的方法嗎?

posted @ 2009-05-14 15:46 小蟲蟲 閱讀(2514) | 評論 (1)編輯 收藏

2009年4月1日

(轉)gluPerspective和gluLookAt的關系

轉自: http://hi.baidu.com/sunguangran/blog/item/ded90ced94779dd2b31cb11c.html

終于搞明白gluPerspective和gluLookAt的關系了

函數原型
gluLookAt(GLdoble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble centerz,GLdouble upx,GLdouble upy,GLdouble upz);

gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear,GLdouble zFar)

一個一個來,首先得設置gluPerspective,來看看它的參數都表示什么意思
fovy,這個最難理解,我的理解是,眼睛睜開的角度,即,視角的大小,如果設置為0,相當你閉上眼睛了,所以什么也看不到,如果為180,那么可以認為你的視界很廣闊,
aspect,這個好理解,就是實際窗口的縱橫比,即x/y
zNear,這個呢,表示你近處,的裁面,
zFar表示遠處的裁面,

如果還沒有理解就繼續看,
我們知道,遠處的東西看起來要小一些,近處的東西看起來會大一些,這就是透視原理
如下圖所示



假設那兩條線表示公路,理論上講,它們的兩條邊是平行的,
但現實情況中,它們在遠方(可以無限遠)總要相交于一點,
實際線段AB的長度=CD的長度,只是在此例中使用了透視角,故會有如上的效果,是不是很接近現實的情況?

結合我們剛才這兩個函數
zNear,眼睛距離近處的距離,假設為10米遠,請不要設置為負值,OpenGl就傻了,不知道怎么算了,
zFar表示遠處的裁面,假設為1000米遠,
就是這兩個參數的意義了,

再解釋下那個"眼睛睜開的角度"是什么意思,
首先假設我們現在距離物體有50個單位距離遠的位置,
在眼睛睜開角度設置為45時,請看大屏幕:


我們可以看到,在遠處一個球,,很好玩哈,
現在我們將眼睛再張開點看,將"眼睛睜開的角度"設置為178
(180度表示平角,那時候我們將什么也看不到,眼睛睜太大了,眼大無神)


我們只看到一個點,,,,,,,,,,,,,,,,,,,,,,,,,,,
因為我們看的范圍太大了,這個球本身大小沒有改變,但是它在我們的"視界"內太小了,


反之,我們將眼睛閉小些,改為1度看看會出現什么情況呢?


在我們距離該物體3000距離遠,"眼睛睜開的角度"為1時,我們似乎走進了這個球內,這個是不是類似于相機的焦距?

當我們將"透視角"設置為0時,我們相當于閉上雙眼,這個世界清靜了,

我們什么也看不到,,,,,,,,,



現在來看gluLookAt(GLdoble eyex,GLdouble eyey,GLdouble eyez,GLdouble centerx,GLdouble centery,GLdouble centerz,GLdouble upx,GLdouble upy,GLdouble upz);

它共接受三對坐標,
分別為eye,center,up
故名思義,eye表示我們眼睛在"世界坐標系"中的位置,
center表示眼睛"看"的那個點的坐標,
最后那個up坐標表示觀察者本身的方向,如果將觀察點比喻成我們的眼睛,那么這個up則表示我們是正立還是倒立異或某一個角度在看,所看的影像大不相同,故此時需要指明我們現在正立,那么X,Z軸為0,Y軸為正即可,通常將其設置為1,只要表示一個向上的向量(方向)即可
球是畫在世界坐標系的原點上的,即O(0,0,0)坐標上,我們的眼睛位于觀察點A(0,0,100),Z軸向屏幕里看去的方向為負,屏幕外我們的位置,Z軸為正值,其實很好理解,即我們距離原點的距離,設置100,將觀察到如下圖所示的影像

如果我們向前或向后移動,則相應的圖像會變大或變小,這里其實就是運用了透視原理,近處的物體大,遠處的物體小,實際物體的大小是不變的,

同理改變center坐標(眼睛看去的那個點,可簡單理解為視線的終點)也會影響球的大小,同樣可以認為是改變了物體與觀察點的距離所致,

最后那個up坐標表示觀察者本身的方向,如果將觀察點比喻成我們的眼睛,那么這個up則表示我們是正立還是倒立異或某一個角度在看,所看的影像大不相同,故此時需要指明我們現在正立,那么X,Z軸為0,Y軸為正即可,通常將其設置為1,只要表示一個向上的向量(方向)即可,我們指定0.1f或0.00001f異或1000.0f,效果是一樣的,只要能表示方向即可,




以上理解了之后,來做一個測試
透視圖不變,最遠處仍為3000,近處為0.1

gluPerspective                            // 設置透視圖
        (45,                            // 透視角設置為 45 度,在Y方向上以角度為單位的視野
        (GLfloat)x/(GLfloat)y,    // 窗口的寬與高比
        0.1f,                                // 視野透視深度:近點1.0f
        3000.0f                            // 視野透視深度:始點0.1f遠點1000.0f
        );


將我們的觀察點置于A(0,10,0),
將觀察位置(視線終點)坐標置于(0,0,0)
然后在原點開始繪圖,畫一個V字形,并將Z軸的值從-1000遞增加到+1000,增量為10,
代碼如下

    glColor3f(0.5f, 0.7f, 1.0f);

    glBegin(GL_LINES);
        for(int i=-1000;i<=1000;i+=10)
        {
            glVertex3f(0,0,i);
            glVertex3f(10,10,i);

            glVertex3f(0,0,i);
            glVertex3f(-10,10,i);
        }
    glEnd();

F5運行效果如下圖


上圖證實了我們的推測











//---------------------------------------------
    //生成網絡
    glColor3f(0.5f, 0.7f, 1.0f);
    int x=(int)(40*2);
   
    glBegin(GL_LINES);
            for(int i=-x;i<=x;i+=4)
            {
                glVertex3i(-x,0,i);
                glVertex3i(x,0,i);

                glVertex3i(i,0,x);
                glVertex3i(i,0,-x);
            }
    glEnd();

//生成球體
    GLUquadricObj * pObj;
    pObj = gluNewQuadric();
    gluQuadricDrawStyle(pObj,GLU_LINE);
    gluQuadricNormals(pObj,GLU_SMOOTH);

=============================================================
以下是個小總結:
1、模視矩陣(ModelView Matrix)的作用是將模型從局部坐標系變換到世界坐標系,并最終變換到視點坐標系中。它由模型變換矩陣和視點變換矩陣組成。
2、gluLookAt影響的是視點矩陣,它顯式的標明了視點坐標系與世界坐標系的關系,即視點被安置在世界坐標系的哪個位置,視線的方向朝向何處。
3、gluPerspective用于規定視景體范圍,與模視矩陣無關,它影響的是投影矩陣和規一化矩陣。投影矩陣的作用是使模型產生近大遠小的效果,規一化矩陣是將模型的z值規一化到0~1之間。
4、在編程的時候,需要glMatrixMode來指定矩陣堆棧的類型,然后對該矩陣進行修改。
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   的作用是初始化模視矩陣,將坐標原點重新設置在世界坐標系的原點。之后的glTranslate、glScale、glRotate都會改變模視矩陣中的模型變換矩陣。而glLookAt則設置視點變換矩陣。它們共同作用,使得模型能在世界坐標系中正確安放,并能從合適的角度去觀察。

posted @ 2009-04-01 11:03 小蟲蟲 閱讀(3841) | 評論 (0)編輯 收藏

2009年3月31日

關于初始化列表的初始化順序

      一個Vector模板類,開始的時候是這樣寫的:
template <class T>
class Vector
{
public:
    Vector(unsigned n=8):_size(n),_data(new T[_size]){}
   //.........
protected:
    T*       _data;
    unsigned _size;
};
結果一運行,機子就慢了,打開任務管理器,占內存超大。后來想起來初始化列表是按照成員變量的聲明順序初始化的,所以在構造函數里_data數組先被初始化,這時_size沒被初始化,即_size還是個隨機值,估計隨機的很大,呵呵,比方說_size為1234567,于是就申請了1234567的內存。。。。
于是修改如下就OK了:
template <class T>
class Vector
{
public:
    Vector(unsigned n=8):_size(n),_data(new T[_size]){}
   //.........
protected:
    unsigned _size;//先聲明_size,先初始化它
    T*       _data;
};

posted @ 2009-03-31 10:33 小蟲蟲 閱讀(698) | 評論 (2)編輯 收藏

碰到命名空間的問題

       昨天寫個類,碰到個問題,我這里用簡單的例子說明,比方說寫個學生類,性別用枚舉來表示,然后有個獲得性別的函數GetGender(),返回值類型為Gender。
class Student
{
enum Gender{MALE,FEMALE};
//...
Gender GetGender();
};
函數的實現如下
Gender Student::GetGender
{//...
}
結果出錯。感覺挺莫名其妙的,呵呵。后來一琢磨,改成了
Student::Gender Student::GetGender
{//...
}
成功!!!!這個寫法有意思.^_^    

posted @ 2009-03-31 10:25 小蟲蟲 閱讀(361) | 評論 (0)編輯 收藏

2009年3月6日

資料分享聲明

       鑒于網上找資料是件痛苦的,所以我把我自己的一些電子書,以及下載的一些小程序放在了郵箱里,跟大家分享,僅大家學習交流(這些資料一般已經在網上廣為流傳,我想應該沒有觸及版權的問題吧,呵呵)。大家有需要的可以去郵箱去下,目前只放了一部分,以后會陸續添加郵箱地址和密碼如下:
賬號:percyph1@163.com
密碼:xcc123456
如果大家有c++,openGL,密碼學等等計算機方面的好資料,也可以發給我,我的郵箱是 percyph@163.com
大家也可以回帖要資料,如果有的話我會第一時間發上。
相信來我這兒的朋友都是有素質的,請不要刪除和移動郵箱里的文件,謝謝!

目前已經上傳的資料有:(以后會陸續更新)

   VC編程助手(小軟件VC++ assistant,能使編程更方便)
   C++Primer3(電子書)
   glut函數說明(電子書)
   C++技能百練(經典算法).rar 
   ROAM地形算法演示程序.rar 
   OpenGL 參考手冊
   c&c++深層探索 
   C++必知必會 
   VC6.0編程實例精解 
   高質量C++編程指南&編程新手真言&MFC類庫詳解 
   Windows程序設計 
   MFC類庫詳解.chm 
   C++ 數據結構第三版 
   C++ 數據結構第三版 
   程序員面試寶典&程序員超級開發寶典 
   c++和OpenGL函數手冊 
   Essential C++中文版.pdf 
   Effective C++(電子書) 
   C++編程思想(電子書)

3.11號上傳(kuafoo發的)
   Windows環境下32位匯編語言.chm(2.78M)
   深入淺出MFC
   深入淺出MFC第二版
  
另外最近幾個月寫的數據結構的程序也傳上去了,有興趣的朋友可以看看!

里面包括:

線性表——靜態鏈表2009.7.30
線性表——鏈表的內部類實現2008.8
線性表——鏈表的友元類實現2008.8
線性表——雙向鏈表2009.8.11
線性表——順序表2009.8.3
線性表——友元模板類2009.8

約瑟夫問題——四種解法2009.8.11(數組,鏈表,循環鏈表等)
隊列——隊列的順序表示循環隊列2009.8.11
隊列——鏈隊列2009.8.11
棧——漢諾塔2009.8.6
棧——進制轉換2009.8.6
棧——括號匹配2009.8.6
棧——模板鏈棧2009.8.3
棧——模板順序棧2009.7
棧——順序棧2009.8.6
棧——算術表達式求值2009.7.13
棧——行編輯2009.8.6
二叉樹——二叉樹的常見操作2009.9.3

2010.3.9 更新

樹的應用—仿DOS文件夾管理程序

200位大數乘法.rar

200位大數加法.rar

連連看單機程序MFC

posted @ 2009-03-06 18:32 小蟲蟲 閱讀(731) | 評論 (4)編輯 收藏

struct和typedef struct

分三塊來講述:
1 首先:
      在C中定義一個結構體類型要用typedef:
        typedef struct Student
        {
            int a;
        }Stu;
于是在聲明變量的時候就可:Stu stu1;
如果沒有typedef就必須用struct Student stu1;來聲明
這里的Stu實際上就是struct Student的別名。
另外這里也可以不寫Student(于是也不能struct Student stu1;了)
        typedef struct
        {
            int a;
        }Stu;
但在c++里很簡單,直接
        struct Student
        {
           int a;
        };
于是就定義了結構體類型Student,聲明變量時直接Student stu2;
===========================================
2其次:
在c++中如果用typedef的話,又會造成區別:
       struct   Student  
       {  
          int   a;  
       }stu1;//stu1是一個變量  
       typedef   struct   Student2  
       {  
          int   a;  
        }stu2;//stu2是一個結構體類型  
使用時可以直接訪問stu1.a
但是stu2則必須先   stu2 s2;
然后               s2.a=10;
===========================================
3 掌握上面兩條就可以了,不過最后我們探討個沒多大關系的問題
如果在c程序中我們寫:
       typedef struct  
       {
           int num;
           int age;
       }aaa,bbb,ccc;
這算什么呢?
我個人觀察編譯器(VC6)的理解,這相當于
       typedef struct  
       {
           int num;
           int age;
       }aaa;
       typedef aaa bbb;
       typedef aaa ccc;
也就是說aaa,bbb,ccc三者都是結構體類型。聲明變量時用任何一個都可以,在c++中也是如此。但是你要注意的是這個在c++中如果寫掉了typedef關鍵字,那么aaa,bbb,ccc將是截然不同的三個對象。

posted @ 2009-03-06 14:20 小蟲蟲 閱讀(28520) | 評論 (20)編輯 收藏

2009年3月3日

(轉)glut函數詳解(13)--視頻大小調整API

*再次聲明"glut"函數詳解系列轉自:阿杰--江南暖冬
int glutVideoResizeGet(GLenum param);
返回glut視頻大小調整的信息.
參數:
param:
  GLUT_VIDEO_RESIZE_POSSIBLE:如果底層支持視頻大小調整,則返回非0值,否則返回0.如果返回0,則其他視頻大小調整函數的調用將不起作用.
  GLUT_VIDEO_RESIZE_IN_USE
  GLUT_VIDEO_RESIZE_X_DELTA
  GLUT_VIDEO_RESIZE_Y_DELTA
  GLUT_VIDEO_RESIZE_WIDTH_DELTA
  GLUT_VIDEO_RESIZE_HEIGHT_DELTA
  GLUT_VIDEO_RESIZE_X
  GLUT_VIDEO_RESIZE_Y
  GLUT_VIDEO_RESIZE_WIDTH
  GLUT_VIDEO_RESIZE_HEIGHT
 
后面幾個常量值在網上沒有搜到解釋.

//*******************************************************************************************
void glutSetupVideoResizing(void);
 
void glutStopVideoResizing(void);
 
void glutVideoResize(int x, int y, int width, int height);
 
void glutVideoPan(int x, int y, int width, int height);

我把glut的頭文件中的所有函數都整理了一遍,只可惜 video resize sub-API中的幾個函數網上都沒有具體的介紹,本菜鳥也無能為力,幸好這些函數都不是常用的,我想一般用不著.除了和視頻有關的API,前面幾個帖子的內容已經基本把glut的所有函數都過了一遍,本專題也就算是完成了,以后如果找到相關資料,會把這里的補上,也希望達人能夠指點一二.

posted @ 2009-03-03 15:41 小蟲蟲 閱讀(902) | 評論 (0)編輯 收藏

(轉)glut函數詳解(12)--游戲模式API

所謂游戲模式其實就是一種全屏模式,這里可以對該模式下的屏幕顯示方式進行簡單設置.詳見下面具體解釋.
 
//*******************************************************************************************
void glutGameModeString(const char *string);
通過一個字符串對game mode(游戲模式,也即全屏模式)進行設置,即對屏幕進行設置.
參數:
string:一個指向字符串的指針,字符串的內容即是對屏幕的設置.字符串的格式如下所示:
  "W*H"
  "W*H:Bpp"
  "W*H@Rr"
  "W*H:Bpp@Rr"
  "@Rr"
  ":Bpp"
  "Bpp:@Rr"
(注:W:屏幕寬度,以像素單位;H:屏幕高度,以像素為單位;Bpp:每個像素的內存大小(位數);Rr:屏幕的刷新率.)
例子:
1.如果我們只關心屏幕大小(800*600)而不關心每個像素的內存占用和刷新頻率,可以寫成:
    glutGameModeString("800*600");
2.如果只想把每個像素的內存占用設置成32位,可以寫成:
    glutGameModeString(":32");
3.如果只想把刷新率設置成75赫茲,可以寫成:
    glutGameModeString("@75");
4.如果前三種情況都考慮,可以寫成:
    glutGameModeString("800*600:32@75");
其他情況按照上面給出的字符串格式寫出即可.
注:
  1.這個函數只是對硬件的請求,如果設置不合法,則將被忽略.
  2.這個函數并不返回錯誤值,如果要獲得錯誤信息,則要用glutGameModeGet()函數.

//*******************************************************************************************
int glutEnterGameMode(void);

進入相應的game mode,即讓glutGameModeString()的設置生效.

//*******************************************************************************************
void glutLeaveGameMode(void);

離開glutGameModeString()設置的game mode.

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

int glutGameModeGet(GLenum mode);

檢測設置的模式是否有效

參數:
mode:
  GLUT_GAME_MODE_ACTIVE:如果程序運行在game mode,則返回非0值,如果運行在窗口模式,則返回0.
  GLUT_GAME_MODE_POSSIBLE:判斷glutAameModeString()的設置是否有效,如果有效則返回非0值,否則返回0.但是glut手冊中有一個警告,即使這個設置是有效的,也不能保證屏幕設置可以一定成功生效.
  GLUT_GAME_MODE_WIDTH:返回屏幕的寬度.
  GLUT_GAME_MODE_HEIGHT:返回屏幕的高度.
  GLUT_GAME_MODE_PIXEL_DEPTH:返回當前模式下每個像素所占用的內存空間(位數).
  GLUT_GAME_MODE_REFRESH_RATE:返回實際的刷新率(單位赫茲).
  GLUT_GAME_MODE_DISPLAY_CHANGED:正如前面所說,不能保證屏幕顯示模式一定根據設置發生改變,這個常量可以用來測試是否真的進入了game mode(先前是窗口模式下的情況下),如果先前已經是game mode,則可以用來測試設置是否發生改變.返回非0值表示進入了game mode或設置已經發生改變,否則返回0.

posted @ 2009-03-03 15:38 小蟲蟲 閱讀(1092) | 評論 (0)編輯 收藏

僅列出標題  下一頁
<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

導航

統計

常用鏈接

留言簿(5)

隨筆分類

隨筆檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            最新亚洲激情| 国产精品观看| 亚洲国产专区校园欧美| 欧美gay视频激情| 另类图片国产| 亚洲精品一区中文| 夜夜爽夜夜爽精品视频| 国产精品ⅴa在线观看h| 久久国产99| 久久综合色婷婷| 99精品视频免费观看视频| 亚洲精品无人区| 国产麻豆精品theporn| 久久久久久亚洲精品杨幂换脸 | 欧美成人第一页| 亚洲丶国产丶欧美一区二区三区| 久久在精品线影院精品国产| 亚洲精品三级| 亚洲欧美中文日韩v在线观看| 国产性色一区二区| 欧美国产在线观看| 国产精品盗摄一区二区三区| 久久蜜桃资源一区二区老牛| 欧美精品高清视频| 久久精品免费| 欧美激情在线免费观看| 久久成人18免费网站| 老牛国产精品一区的观看方式| 一区二区免费在线播放| 欧美中文在线免费| 亚洲午夜一区二区| 久久久久99精品国产片| 亚洲剧情一区二区| 欧美一区二区视频免费观看| 99视频超级精品| 久久国产乱子精品免费女| 在线视频精品| 另类春色校园亚洲| 久久久欧美精品sm网站| 欧美三日本三级三级在线播放| 免费高清在线一区| 国产欧美日韩一区二区三区在线| 亚洲欧洲精品一区二区三区| 狠狠久久综合婷婷不卡| 亚洲一区二区三区中文字幕在线| 亚洲精品久久久久中文字幕欢迎你| 亚洲欧美一区二区视频| 中文在线资源观看网站视频免费不卡| 久久久久久91香蕉国产| 欧美在线黄色| 国产精品任我爽爆在线播放| 欧美黄色小视频| 亚洲国产精品久久91精品| 欧美在线视频观看| 欧美一区二区三区喷汁尤物| 欧美性久久久| 一区二区国产精品| 久久―日本道色综合久久| 亚洲欧美日韩天堂| 欧美日韩一区二区三区免费看| 亚洲黄色小视频| 亚洲国产三级| 美女精品一区| 欧美成人午夜激情| 亚洲国产日韩在线一区模特| 久久久亚洲午夜电影| 久久三级视频| 黑人巨大精品欧美一区二区| 久久av在线| 奶水喷射视频一区| 亚洲国产欧美一区二区三区同亚洲| 久久成年人视频| 久久亚洲精品一区二区| 影音先锋亚洲电影| 免费观看久久久4p| 亚洲精品久久久久久久久| 夜夜嗨av色一区二区不卡| 欧美日本精品在线| 99这里有精品| 亚洲欧美日韩成人高清在线一区| 国产精品免费在线 | 午夜视频在线观看一区二区三区| 欧美精品一区二区三区在线播放 | 亚洲视频综合| 欧美日本国产在线| 亚洲美女网站| 亚洲欧美日韩中文播放| 国产午夜精品久久| 美女视频黄免费的久久| 亚洲免费高清| 久久久精品2019中文字幕神马| 激情欧美丁香| 欧美日韩国产精品一区| 亚洲女同精品视频| 免费成人av在线看| 亚洲视频视频在线| 国产在线国偷精品产拍免费yy| 久久精品视频在线| 亚洲精品日韩精品| 久久久久这里只有精品| 亚洲精品日韩在线观看| 国产精品久久波多野结衣| 久久久在线视频| 一级成人国产| 女人天堂亚洲aⅴ在线观看| 一区二区欧美精品| 国产一区视频观看| 欧美视频二区36p| 久久久久久欧美| 亚洲欧美不卡| 亚洲全部视频| 欧美成人首页| 久久精品一区蜜桃臀影院| 日韩视频在线一区二区三区| 国产日韩欧美一区二区| 欧美久久久久中文字幕| 久久米奇亚洲| 亚洲自拍偷拍福利| 亚洲伦理一区| 欧美成人亚洲| 欧美主播一区二区三区| 夜夜嗨av色综合久久久综合网| 精品91在线| 国产一区二区三区最好精华液| 欧美日韩a区| 欧美金8天国| 牛夜精品久久久久久久99黑人 | 日韩五码在线| 亚洲激情国产| 亚洲成人在线网| 欧美日韩国产一区二区| 久久久久久久综合色一本| 亚洲欧美日韩一区在线| 亚洲一级特黄| 亚洲视频在线观看三级| 91久久精品日日躁夜夜躁国产| 欧美96在线丨欧| 美日韩精品免费| 久久亚洲综合网| 噜噜噜噜噜久久久久久91| 久久婷婷av| 裸体一区二区| 毛片一区二区三区| 麻豆久久久9性大片| 老牛国产精品一区的观看方式| 久久精品国产亚洲精品| 久久福利视频导航| 久久综合给合久久狠狠狠97色69| 久久久91精品国产| 另类专区欧美制服同性| 欧美亚洲视频一区二区| 91久久精品www人人做人人爽 | 久久久久久久久岛国免费| 久久国内精品视频| 玖玖精品视频| 欧美精品福利| 国产精品久在线观看| 国产欧美日韩另类视频免费观看| 国产视频在线观看一区二区三区| 国产亚洲精品美女| 在线成人欧美| 艳妇臀荡乳欲伦亚洲一区| 亚洲欧美国产精品va在线观看 | 亚洲欧美一区二区在线观看| 欧美一激情一区二区三区| 久久久综合网站| 欧美激情一区二区三区不卡| 亚洲经典自拍| 一区二区激情小说| 久久成人一区| 欧美激情一区二区三区高清视频 | 久久久久成人精品| 欧美国产大片| 国产精品女人久久久久久| 狠狠色伊人亚洲综合网站色| 亚洲久久一区| 久久精品国产2020观看福利| 欧美本精品男人aⅴ天堂| 日韩一级免费| 久久婷婷亚洲| 欧美日韩一区二区免费在线观看| 国产啪精品视频| 亚洲精品午夜| 久久精品官网| 日韩一级黄色片| 免费成人毛片| 国产视频在线观看一区| 一区二区av| 亚洲第一主播视频| 午夜精品久久久久久久 | 亚洲视频在线免费观看| 午夜在线视频观看日韩17c| 男男成人高潮片免费网站| 亚洲摸下面视频| 欧美日韩调教| 亚洲国产欧美一区二区三区同亚洲| 性欧美激情精品| 夜夜嗨av色综合久久久综合网| 久久综合电影| 激情六月婷婷久久|