Plurk FaceBook Twitter 收進你的MyShare個人書籤 MyShare
  顯示內嵌語法

::旗標電腦文摘::最正確、最豐富的電腦知識寶藏!
2007-05-24│ NO375│訂閱電子報

本週活動:
本期主題:
最新主題:
:::最新出版:::
Windows Vista 使用手冊
施威銘主編
使用旗標Office2007/Windows Vista書籍優惠券購買,可抵用100元
 Windows 加密解碼‧毒駭攻防 (Vista、XP 全適用)
 無線網路-選購、架設、活用、疑難排解(Vista、XP 全適用)
 Linux 新天王 Ubuntu 7.04
 Windows 登錄檔嚴選密技 -Vista、XP 全適用
 無限! 影音轉檔王-打造PSP、NDSL、iPod、MP4、手機、DVD行動劇院 (Vista、XP全適用)

本期主題:運用 Excel 樞紐分析,完成公司薪資結構分析!

茲以以下之薪資資料為例,教您如何建立樞紐分析表:


進行說明建立樞紐分析表之步驟:

Step1 以滑鼠單按薪資資料之任一儲存格

Step2 切換到『插入』索引標籤(), 按『表格』群組『樞紐分析表』鈕(), 轉入『建立樞紐分析表』對話方塊
 

 

 

 

 

Step3 於上半部, 選「選取表格或範圍(S)」, 其內所顯示者恰為薪資資料之範圍(Excel 會自動判斷正確範圍, 若有不適, 仍可自行輸入或重選正確之範圍)

Step4 於下半部, 選「已經存在的工作表(E)」項, 續選按 K3 儲存格。表欲將樞紐分析表安排於目前工作表之 K3 處

 

 

 

 


若選「新工作表(N)」, 將再自動產生一新的工作表, 以顯示樞紐分析表。


Step5 按確定鈕, 續利用捲動軸, 轉到可以看見 K3 儲存格之位置, 可發現已有一空白的樞紐分析表, 且右側也有一個『樞紐分析表欄位清單』窗格


Step6 於右側『樞紐分析表欄位清單』窗格上方之『選擇要新增到報表的欄位:』處, 以拖曳之方式, 將『□ 職稱』拉到『列標籤』方塊;將『□ 部門』項拉到『欄標籤』方塊;將『□ 薪資』拉到『Σ值』方塊, 可求得初始樞紐分析表, 表內所求算之統計量, 其預設值為求算選取欄位(薪資)之加總

...........更多的內容請見《 Excel 2007 實戰手冊

本期主題:二維陣列與雙重指標之間的關係

稍早我們已經提及,陣列的名稱是一個指向陣列位址的指標常數;另外,對於指標常數而言,指標常數的位址等於指標常數的內容,有了這個概念之後,就可以很容易的解釋二維陣列與雙重指標之間的關係。我們以3×4的二維陣列num為例,說明如何利用雙重指標來表示陣列元素。

3×4的二維陣列num可以看成是由3個一維陣列所組成,每個一維陣列裡各有4個元素。也就是因為這個原因,在宣告num陣列時,編譯器會自動配置一個「指標常數」的陣列num[0]、num[1] 與num[2],讓它們分別指向每一個一維陣列,同時並把陣列名稱num指向這一個指標常數陣列,如下圖所示(為了方便解說,已將陣列的元素值與位址的假設值填入):

於上圖中,num是一個雙重指標常數,因為它指向了另一個指標。此外,num[0]~num[2] 是指標常數陣列,它們分別指向一維陣列。

下面簡單的範例可用來驗證在二維陣列num中,陣列名稱num是一個雙重指標常數,它指向了另一個指標num[0],同時也驗證了num[0]~num[2] 是指標常數陣列,它們分別指向一維陣列:

 
01 /* prog1, 印出陣列的位址 */
02 #include <stdio.h>
03 #include <stdlib.h>
04 int main(void)
05 {
06 int num[3][4]; /* 宣告3×4的二維陣列num */
07
08 printf("num=%p\n",num); /* 印出雙重指標num的值 */
09 printf("&num=%p\n",&num); /* 印出雙重指標num的位址 */
10 printf("*num=%p\n",*num); /* 印出雙重指標num所指向之指標的值 */

11
12 printf("num[0]=%p\n",num[0]); /* 印出指標常數num[0]的值 */
13 printf("num[1]=%p\n",num[1]); /* 印出指標常數num[1]的值 */
14 printf("num[2]=%p\n",num[2]); /* 印出指標常數num[2]的值 */

15
16 printf("&num[0]=%p\n",&num[0]); /* 印出指標常數num[0]的位址 */
17 printf("&num[1]=%p\n",&num[1]); /* 印出指標常數num[1]的位址 */
18 printf("&num[2]=%p\n",&num[2]); /* 印出指標常數num[2]的位址 */
19
20 system("pause");
21 return 0;
22 }


程式解說

於本例中,第6行宣告了3×4的整數陣列num,8~10行印出了雙重指標常數num的值與位址,以及它所指向之指標的值。讀者可以參考圖2,就可以了解為什麼這三者的值都是0022FF38了(下圖的位址均省略了變數位址的前4個數字):

程式12~14行印出了指標常數num[0]~num[2] 的值,16~18行印出了指標常數num[0]~num[2] 的位址,從程式碼的輸出中,讀者也可以驗證指標常數的值就等於它的位址。

二維陣列的指標表示方式

因為編譯器知道二維陣列裡,每一列有多少行,有了這個資訊之後,編譯器就很容易進行指標的加法了。於圖1中,陣列名稱num是雙重指標常數,它指向指標常數陣列的起始位址,所以num的值為1000。值得一提的是,這個值不但是指標常數陣列第一個元素的位址,同時也是3×4的二維陣列num裡第一列第一個元素的位址。

在C語言裡,把雙重指標常數num的值加1,就相當於把num的指向移到指標常數陣列的下一個元素,也就是num[1],因此num+1相當於第二列的位址。因為num是一個3列4行的二維陣列,且整數佔了4個位元組,因此每一列佔了4*4=16個位元組,所以num+1的值會等於1000+4*4=1016。

相同的,num+2代表了第三列的位址,因此num+2的值會等於num[2] 的值。因為第三列第一個元素與第一列第一個元素相距8個元素,所以num+2的值會等於1000+8*4=1032,您可以從下圖的位址來驗證這些計算:

現在您已經知道要如何取得二維陣列裡,每一列的位址了。那麼,要如何取得每一列裡特定的元素呢?以陣列的第2列為例,num+1指向了指標常數num[1],因此如果在(num+1) 之前加上一個星號(*),即可取得 (num+1) 所指向之位址的內容,因此 *(num+1) 實際上取得的是指標常數陣列num[1] 的內容,即1016,如下圖所示:

也許您已經注意到,num+1與 *(num+1) 的值同為1016,為何C語言要用不同的表示方式來表示相同的值呢?事實上,它們之間的不同是在於尺度(scale)上的不同。num+1是指向指標常數num[1] 的指標,如果把num+1的值再加1,則會使得它指向下一個指標常數num[2],因此會指向1032這個位址。所以把num+1的值再加1,事實上是把num+1的值再加上4*4=16個位元組,變成1032。

然而,*(num+1) 則是代表了第二列第一個元素的位址,如果把 *(num+1) 的值再加1,則代表了第二列第二個元素的位址(1020),因此把 *(num+1) 的值再加1,事實上是把位址加上了4*1=4個位元組,如下圖所示:

由上面的討論可知,*(num+1) 則代表了第二列,第一行的位址,而 *(num+2)+1則代表了第三列,第二行的位址,由此可推測得,要取出陣列裡,第m+1列,第n+1行的內容時,可用下列的語法:

*(*(num+m)+n); /* 取出陣列num裡,第m+1列,第n+1行的值 */

也就是說,如果想用指標來表示陣列元素num[m][n],可以把它寫成 *(*(num+m)+n),如下面的語法:

 

*(*(num+m)+n); /* 用指標表示陣列元素num[m][n] */

 

 

...........更多的內容請見《 C 語言教學手冊 第4版


好書能增進知識、提高學習效率‧ 卓越的品質是旗標的信念與堅持
Copyright c 2007 Flag Publishing Co.,Ltd. All Rights Reserved 本電子報內容未經授權請勿轉載