摘 要:本文討論了在計算機專業(yè)的課程教學過程中如何與其他課程相聯(lián)系,從而既能激發(fā)學生學習后續(xù)計算機課程的興趣,又能將相對孤立的計算機專業(yè)知識結合起來,達到較好的教學效果。
關鍵詞:C++語言;計算機組成原理;編譯原理;操作系統(tǒng)
中圖分類號:G642 文獻標識碼:B
1 引言
目前,大部分高校的計算機教育中各門計算機專業(yè)課程的教學是相互孤立的,學生在學完每門課程后,對每門課的內(nèi)容非常了解,卻不能將所學過的計算機課程聯(lián)系起來,因此對計算機的整體工作過程始終都沒有一個完整的認識。
本文以講述“C++語言程序設計”這門課時如何與“計算機組成原理”、“編譯原理”以及“操作系統(tǒng)”等課程相聯(lián)系為例。其中“計算機組成原理”的開課時間在“C++語言程序設計”之前,“編譯原理”和“操作系統(tǒng)”的開課時間在“C++語言程序設計”之后。
2 與“計算機組成原理”的聯(lián)系
如例1所示,在講述“C++語言程序設計”的文件流時,就可以聯(lián)系到“計算機組成原理”中的浮點數(shù)表示。
例1:#include
using namespace std;
void main( )
{ int i=10;
double j=233.4;
char a[] =\"adffffdf\";
ofstream fout( \"test.txt\", ios::binary );
if ( fout )
{fout.write((char *)(i),sizeof(i));
fout.write((char *)(j),sizeof(j));
fout.write(a,sizeof(a));
}
上述程序的功能是創(chuàng)建一個文件test.txt,并向該文件中以二進制的形式寫入一個整型數(shù)10,一個浮點數(shù)233.4和一個字符串。運行這個程序后,在visual c++中打開這個文件,看到如下的結果。
000000 0A 00 00 00 CD CC CC CCCC 2C 6D 40 61 64 66 66
000010 66 66 64 66 00
其中000000和000010表示的是地址,因為CPU采用的是小端方式存儲數(shù)據(jù),即低字節(jié)對應低地址,所以前面的4個字節(jié)0A 00 00 00正確地讀法是00 00 00 0A,表示整型數(shù)10;中間的八個字節(jié)CD CC CC CCCC 2C 6D 40正確地讀法是 40 6D 2C CC CC CC CC CD,表示的是浮點數(shù)233.4;后面的8個字節(jié)61 64 66 66 66 66 64 66為寫入的字符串\"adffffdf\"的每個字符的ASCII碼值;最后的00是字符串的結束標志。
如何得知十六進制數(shù)40 6D 2C CC CC CC CC CD就是程序中寫入的233.4呢?我們可以利用在計算機組成原理中學過的浮點數(shù)表示法來進行驗證。
計算機組成原理中曾經(jīng)講過64位的浮點數(shù)的格式如圖1所示,
其中,S占1位,表示尾數(shù)的符號位,0表示正數(shù),1表示負數(shù)。
E占11位,表示階碼,用移碼表示,表示范圍為-210~210-1 之間,其中全0表示-210,全1表示210-1 。
M占52位,表示尾數(shù)小數(shù)點后的數(shù)據(jù)。
先來分析一下尾數(shù)的符號S和階碼E,即前12位40 6,將其化解成12位的二進制數(shù)0100 0000 0110。
其中,S是最高位的值,為0,即這個浮點數(shù)是一個正數(shù)。
E占用剩余的11位,為100 0000 0110,計算出其對應的十進制數(shù)為7,即階碼為7。
M占用后面的52位即D 2C CC CC CC CC CD。根據(jù)計算機組成原理中的定義,真正的尾數(shù)為1.D 2C CC CC CC CC CD,將其劃為二進制形式為1.1101 0010 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1101
階碼為7,因此真正的數(shù)據(jù)應該是將小數(shù)點右移7,移位后的數(shù)據(jù)為
11101 001.0 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1101
其中整數(shù)部分11101 001化為十進制數(shù)為233,小數(shù)部分0.0 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1101化為十進制數(shù)約等于0.4,加在一起等于233.4。從而驗證出文件中寫入的40 6D 2C CC CC CC CC CD表示的正是程序中寫入的浮點數(shù)233.4。
經(jīng)過這樣的演示,可以使學生理解計算機專業(yè)的硬件和軟件課程之間不是相互孤立的,它們之間都有著緊密地聯(lián)系,從而激發(fā)學生學習各門計算機課程的興趣,并促使學生主動復習先前學過的課程,進而取得較好的教學效果。
3 與“編譯原理”的聯(lián)系
在講述“C++語言程序設計”的指針和引用的區(qū)別的時候,也可以提到“編譯原理”中的詞法分析。
指針是內(nèi)容為目標存儲單元地址的存儲單元,而引用變量就是存儲單元。引用在定義時必須初始化且不可重新賦值,指針在定義時可不初始化,在使用時才初始化,并且可修改。
通常的書里會給出如圖2所示的例子,并給出相應的程序段如例2。
例2:int num = 9;
int *p= num;
int ref = num;
程序段中首先定義一個變量num,然后定義一個指針p指向num 變量,最后定義num的一個引用ref。其中p占有一個內(nèi)存空間,里面存放的是num的地址,而ref不占內(nèi)存空間,只是num的一個別名。
在下面的程序例3中我們可以這樣修改指針,
例3:int data = 10;
p = data;
程序運行的結果如圖3所示。
此時p占有的內(nèi)存空間中存放的內(nèi)容變成data的地址。
但是我們不能通過下面的語句修改ref為變量data的引用:
ref = data;
這樣的解釋使得很多學生只是處于似懂非懂的狀態(tài),不能真正的明白。此時,我們可以引出“編譯原理”中的一些簡單知識對它進行解釋。這樣的解釋也讓學生更容易理解當引用、變量、指針都作為形參的區(qū)別。
C++編譯器編譯c++源程序時,首先為被編譯的源程序中的所有變量建立一張變量表。假設程序中變量的定義如下所示:
int num = 9;
int *p= num;
int ref = num;
int data = 10;
p = data;
num =data;
則其對應的變量表如表1所示。
變量表中包含源程序中所有的變量名和編譯程序根據(jù)變量定義的位置和大小而設置的邏輯地址。假設各邏輯地址的分配情況如表1所示。
在編譯階段,當編譯器編譯int num = 9這條語句時,會在表1中添加變量名num,并分配一個邏輯地址0000h。并在相應的地址單元中填入9,如圖4所示。
當編譯int *p =num這條語句時,編譯器會在表1中再添加變量名p,并分配給他一個邏輯地址0004h,并將num的地址為0000h拷貝到地址為0004h的單元中去,如圖4所示。
當編譯int ref =num這條語句時,編譯器會在表1中添加變量名ref,同時將num的邏輯地址0000h拷入到ref的邏輯地址項中。從這兒,我們可以看出ref和num對應了同一個地址單元0000h,因此在程序中修改num的值和修改ref的值其實都是修改地址單元0000h中的數(shù)據(jù)。
當編譯int data = 10;這條語句時,編譯器會在表1中添加變量名data,并分配一個邏輯地址0008h。并在相應的地址單元中填入10,如圖4所示。
在編譯后產(chǎn)生的目標機器代碼中凡是遇到變量名的地方全部用其相應的邏輯地址代替。因此,在編譯后的目標機器碼中不存在任何變量、引用或指針名,只有邏輯地址。
在程序運行階段,系統(tǒng)會將目標代碼裝入到內(nèi)存,并根據(jù)計算機組成原理中講過的法則,將其轉(zhuǎn)換為物理地址。假設其轉(zhuǎn)后的物理地址和邏輯地址的對應關系如表2所示。
當程序和數(shù)據(jù)被裝入內(nèi)存并準備開始運行的時候,其數(shù)據(jù)在內(nèi)存的初始分配情況如圖5所示
當執(zhí)行num=data 這條語句時,系統(tǒng)會將棧中地址為8004h單元中的數(shù)值10拷貝到棧中地址為8000h中,即9變成了10。運行后的結果如圖6所示。
因為程序裝入內(nèi)存后,指針本身在內(nèi)存中占有空間,而引用不占用空間,所以在C++程序中允許對指針進行修改,而不能對引用進行修改。
因為程序裝入內(nèi)存后,指針本身在內(nèi)存中占有空間,而引用不占用空間,所以在C++程序中允許對指針進行修改,而不能對引用進行修改。
經(jīng)過這樣的解釋,可以讓學生對c++語言如何在計算機上運行有一個簡單初淺的印象,也能夠激發(fā)他學習后續(xù)課程“編譯原理”的興趣。
4 與“操作系統(tǒng)”的聯(lián)系
同樣在講述“C++語言程序設計”的文件流時,也可以聯(lián)系到“操作系統(tǒng)”這門課的文件管理。如例1所示,在C++語言中,當我們想向一個文件中寫入數(shù)據(jù)時,需要先創(chuàng)建輸出文件流ofstream的對象fout,通過fout對象創(chuàng)建或打開一個現(xiàn)有的文件test.txt,然后再利用ofstream的成員函數(shù)write(),將所需要寫入的數(shù)據(jù)通過內(nèi)存變量寫入文件中。程序非常簡單,但其實文件的操作沒有那么簡單,甚至是非常復雜的。在計算機組成原理中曾經(jīng)講過硬盤,而文件就是存放在硬盤上的。當打開一個文件時,就需要從硬盤上相應的磁盤磁道扇區(qū)中找到相應的文件。但是用戶無論是通過資源管理器打開或創(chuàng)建相應目錄下的文件,還是通過在程序中打開或創(chuàng)建相應目錄下的文件,都是非常的簡單,這是因為很多底層的工作都已經(jīng)由操作系統(tǒng)中的文件管理系統(tǒng)為我們做好。
經(jīng)過這樣一些簡單的提醒,可以讓學生對應用程序和操作系統(tǒng)之間的聯(lián)系有一個感性的認識。
5 結論
在“C++語言程序設計”的教學過程中,完全可以與其他的相關計算機課程結合起來講。這樣既可以激發(fā)學生學習后續(xù)計算機課程的興趣,又使學生能夠?qū)⒃?jīng)所學過的孤立的計算機專業(yè)知識結合起來,從而對計算機的工作過程有一個整體的認識。在很多的計算機專業(yè)課程的教學過程中,都可以與其他相關的課程結合起來講。
參考文獻:
[1] 陳維新. C++面向?qū)ο蟪绦蛟O計教程[M]. 北京:清華大學出版社,2004.
Elementary introduction of connecting with other computer courses in c++ teach
YU Jing-hua, XIAO Tie-jun, MA Xue-wen
(School of Computer and Telecommunication Engineer, Jiangsu University, zhenjiang ,212013 )
Abstract:To achieve good teaching effect, teacher can inspire the student’s interest of subsequence computer courses and make them to combine the previous courses by connecting to other relative computer course in the process of teaching. This paper picks out the example of c++ programming teaching to describe how it did.
keyword:c++ programming,computer organization,compile principle,operating system