前言:想要寫出一篇令人眼前一亮的文章嗎?我們特意為您整理了5篇c語言函數(shù)范文,相信會(huì)為您的寫作帶來幫助,發(fā)現(xiàn)更多的寫作思路和靈感。
關(guān)鍵詞:函數(shù)指針,指針函數(shù),地址
1.引言
一個(gè)程序由兩部分組成:代碼部分和數(shù)據(jù)部分。當(dāng)在程序中定義變量時(shí),編譯系統(tǒng)就會(huì)為變量分配相應(yīng)的存儲(chǔ)單元,由此就形成了地址的概念。數(shù)據(jù)在內(nèi)存中是存放在某一地址上的,代碼同樣也是存儲(chǔ)在內(nèi)存中的某一地址上,因此指針即可向內(nèi)存中存儲(chǔ)的數(shù)據(jù)也可以指向程序中的代碼,這就是函數(shù)指針。而指針函數(shù)則是指返回值是一個(gè)指針的函數(shù)。
2.函數(shù)指針
可以用指針變量指向整型變量、字符串、數(shù)組,也可以指向一個(gè)函數(shù)。在C語言中規(guī)定,一個(gè)函數(shù)總是占用一段連續(xù)的內(nèi)存區(qū),而函數(shù)名就是該函數(shù)所占內(nèi)存區(qū)的首地址。我們可以把函數(shù)的這個(gè)首地址(或稱入口地址)賦給一個(gè)指針變量,使該指針變量指向該函數(shù)。然后通過指針變量就可以找到并調(diào)用這個(gè)函數(shù)。論文參考網(wǎng)。我們把這種指向函數(shù)的指針變量稱為“函數(shù)指針變量”。
函數(shù)指針變量定義的一般形式為:
類型說明符(*函數(shù)指針變量名)(形式參數(shù)表);
例如: int(*pf)( );
表示pf是一個(gè)指向函數(shù)入口地址的指針變量,該函數(shù)的返回值(函數(shù)值)是整型。
下面通過例子來說明用函數(shù)指針形式實(shí)現(xiàn)對(duì)函數(shù)調(diào)用的方法。在我們沒有學(xué)習(xí)指針變量之前,我們調(diào)用函數(shù)時(shí)是通過函數(shù)名來完成的。
2.1用函數(shù)名實(shí)現(xiàn)函數(shù)的調(diào)用
源程序代碼如下:
#include<stdio.h>
int max(inta,int b)
{if(a>b)return a;
elsereturn b;}
void main()
{ int max(inta,int b);
int a,b,c;
printf('inputtwo numbers:');
scanf('%d,%d',&a,&b);
c=max(a,b);/*用函數(shù)名調(diào)用*/
printf('max=%d ',c);
}
程序運(yùn)行結(jié)果如下:
2.2用函數(shù)指針來實(shí)現(xiàn)函數(shù)的調(diào)用
源程序代碼:
int max(inta,int b)
{if(a>b) returna;
else return b;}
void main()
{ int max(inta,int b);
int (*pmax)(int ,int ); /*定義了一個(gè)指向整型函數(shù)的指針*/
int a,b,c;
pmax=max;/*使函數(shù)指針指向該函數(shù)的入中地址*/
printf('inputtwo numbers:');
scanf('%d,%d',&a,&b);
c=(*pmax)(a,b);/*通過指針調(diào)用max函數(shù)*/
printf('max=%d ',c);}
程序運(yùn)行結(jié)果如下:
實(shí)例說明:
(1) 本實(shí)例中“int (*pmax)( int ,int );”用來定義pmax是一個(gè)指向函數(shù)的指針,該函數(shù)有兩個(gè)整型參數(shù),函數(shù)值為整型。
(2) 賦值語句“pmax=max;”的作用是將函數(shù)max的入口
地賦給指針變量pmax(函數(shù)名代表該函數(shù)的入口地址)。
這時(shí),pmax就是指向函數(shù)max的指針變量,此時(shí)pmax
和max都指向函數(shù)的開頭,見右圖。調(diào)用*pmax就是調(diào)
用max。
(3) 請(qǐng)注意:pmax是指向函數(shù)的指針變量,它只能指向函數(shù)
的入口處而不能指向函數(shù)中間的某一條指令處,因此不能
用 *(pmax+1)來表示函數(shù)的下一條指令。
(4) 在main函數(shù)中有一個(gè)賦值語句:
c=(*pmax)(a,b);與實(shí)例2.1中c=max(a,b);等價(jià)。這就是用指
針形式實(shí)現(xiàn)函數(shù)的調(diào)用。以上用兩種方法實(shí)現(xiàn)函數(shù)的調(diào)用,結(jié)果是一樣的。論文參考網(wǎng)。
2.3使用函數(shù)指針
問題:編寫程序,根據(jù)用戶的選擇分別調(diào)用sin 、cos、 tan函數(shù)計(jì)算一個(gè)角度的三角函數(shù)值。角度值從鍵盤輸入。
源程序代碼如下:
#include<stdio.h>
#include<math.h>
main()
{double(*p[3])(double)={sin,cos,tan};
intchoice,angle;
printf('Pleaseinput angle=?');
scanf('%d',&angle);
printf('Pleaseinput choice(0-sin,1-cos,2-tan)=?');
scanf('%d',&choice);
printf('%lf ',(*p[choice])(angle*3.14159/180));
}
實(shí)例說明:
(1)在本實(shí)例中“double (*p[3])(double)={sin,cos,tan};”定義了一個(gè)具有3個(gè)元素的函數(shù)指針數(shù)組p,其中3個(gè)元素分別指向數(shù)學(xué)函數(shù)sin、cos、tan。
(2)當(dāng)程序運(yùn)行時(shí)給angle賦值30,給choice賦值0。則:
程序中“priintf('%lf ',(*p[choice])(angle*3.14159/180));”
轉(zhuǎn)換為:
“printf('%lf ',(*p[0])(30*3.14159/180));”(與“printf('%lf ',sin(30*3.14159/180));”等價(jià))。
程序運(yùn)行結(jié)果如下:
3. 指針函數(shù)
一個(gè)函數(shù)可以返回一個(gè)整型值、字符值、實(shí)型值等,也可以返回指針型的數(shù)據(jù),即地址。指針函數(shù)則是指返回值是一個(gè)指針的函數(shù)。在C語言中允許一個(gè)函數(shù)的返回值是一個(gè)指針(即地址),這種返回指針值的函數(shù)稱為指針函數(shù)。論文參考網(wǎng)。
定義指針型函數(shù)的一般形式為:
類型說明符 *函數(shù)名(形參表)
{
…… /*函數(shù)體*/
}
如: int *pf(int x,int y)
{
...... /*函數(shù)體*/
}
pf是函數(shù)名,調(diào)用它以后能得到一個(gè)指向整型數(shù)據(jù)的指針(地址)。x、y是函數(shù)pf的形參,為整型。請(qǐng)注意在*pf 兩側(cè)沒有括號(hào),在pf的兩側(cè)分別為*運(yùn)算符和()運(yùn)算符。而()優(yōu)先級(jí)高于*,因此pf先與()結(jié)合。顯然這是一個(gè)函數(shù)形式。這個(gè)函數(shù)前面有一個(gè)*,表示此函數(shù)是指針型函數(shù)(函數(shù)值是指針)。最前面的int表示返回的指針指向整型變量。對(duì)C的這種定義形式,用時(shí)要十分小心。
例:有若干個(gè)學(xué)生的成績(jī)(每個(gè)學(xué)生有4門課程),要求在用戶輸入學(xué)生序號(hào)后,能輸出該學(xué)生的全部成績(jī)。
源程序代碼如下:
#include<stdio.h>
void main()
{floatscore[][4]={{60,70,80,90},{56,89,67,88},{34,78,90,66}};
float*search(float(*pointer)[4],int n);
float *p;
int i,m;
printf('inputthe number of student:');
scanf('%d',&m);
printf('Thescores of No.%d are: ',m);
p=search(score,m);
for(i=0;i<4;i++)
printf('%5.2f ',*(p+i));
printf(' ');
}
float*search(float(*pointer)[4],int n)
{float*pt;
pt=*(pointer+n);
return(pt);
}
程序運(yùn)行結(jié)果如下:
4.結(jié)束語
特別注意的是函數(shù)指針和指針函數(shù)這兩者在寫法和意義上的區(qū)別。如int(*p)()和int *p()是兩個(gè)完全不同的量。int(*p)()是一個(gè)變量說明,說明p 是一個(gè)指向函數(shù)入口的指針變量,該函數(shù)的返回值是整型量,(*p)的兩邊的括號(hào)不能少。int *p() 則不是變量說明而是函數(shù)說明,說明p是一個(gè)指針型函數(shù),其返回值是一個(gè)指向整型量的指針,*p兩邊沒有括號(hào)。作為函數(shù)說明, 在括號(hào)內(nèi)最好寫入形式參數(shù),這樣便于與變量說明區(qū)別。 對(duì)于指針函數(shù)定義,int *p()只是函數(shù)頭部分,一般還應(yīng)該有函數(shù)體部分,這樣才能構(gòu)成一個(gè)完整的函數(shù)結(jié)構(gòu)。
參考文獻(xiàn):
[1] 陳強(qiáng).C語言核心開發(fā)技術(shù)從入門到精通[M].北京:電子工業(yè)出版社,2009.
[2] 匡松.C語言程序設(shè)計(jì)[M] .北京:中國鐵道出版社,2008.
[3] 李俊杰.C語言復(fù)習(xí)指南與題解[M] .北京:清華大學(xué)出版社,2003.
[4] 譚浩強(qiáng).C程序設(shè)計(jì)[M] .北京:清華大學(xué)出版社,2005.
關(guān)鍵詞:C語言;函數(shù)說明;返回值
函數(shù)的一般形式是:type-specifier function_name(parameter list)parameter declarations{body of the function}類型說明符定義了函數(shù)中return語句返回值的類型,該返回值可以是任何有效類型。如果沒有類型說明符出現(xiàn),函數(shù)返回一個(gè)整型值。參數(shù)表是一個(gè)用逗號(hào)分隔的變量表,當(dāng)函數(shù)被調(diào)用時(shí)這些變量接收調(diào)用參數(shù)的值。一個(gè)函數(shù)可以沒有參數(shù),這時(shí)函數(shù)表是空的。但即使沒有參數(shù),括號(hào)仍然是必須要有的。參數(shù)說明段定義了其中參數(shù)的類型。當(dāng)一個(gè)函數(shù)沒有明確說明類型時(shí),C語言的編譯程序自動(dòng)將整型(int)作為這個(gè)函數(shù)的缺省類型,缺省類型適用于很大一部分函數(shù)。當(dāng)有必要返回其它類型數(shù)據(jù)時(shí),需要分兩步處理:首先,必須給函數(shù)以明確的類型說明符;其次,函數(shù)類型的說明必須處于對(duì)它的首次調(diào)用之前。只有這樣,C編譯程序才能為返回非整型的值的函數(shù)生成正確代碼。
一、函數(shù)的類型說明可將函數(shù)說明為返回任何一種合法的C語言數(shù)據(jù)類型
類型說明符告訴編譯程序它返回什么類型的數(shù)據(jù)。這個(gè)信息對(duì)于程序能否正確運(yùn)行關(guān)系極大,因?yàn)椴煌臄?shù)據(jù)有不同的長度和內(nèi)部表示。返回非整型數(shù)據(jù)的函數(shù)被使用之前,必須把它的類型向程序的其余部分說明。若不這樣做,C語言的編譯程序就認(rèn)為函數(shù)是返回整型數(shù)據(jù)的函數(shù),調(diào)用點(diǎn)又在函數(shù)類型說明之前,編譯程序就會(huì)對(duì)調(diào)用生成錯(cuò)誤代碼。為了防止上述問題的出現(xiàn),必須使用一個(gè)特別的說明語句,通知編譯程序這個(gè)函數(shù)返回什么值。下例示出了這種方法。
第一個(gè)函數(shù)的類型說明sum()函數(shù)返回浮點(diǎn)類型的數(shù)據(jù)。這個(gè)說明使編譯程序能夠?qū)um()的調(diào)用產(chǎn)生正確代碼。函數(shù)類型說明語句的一般形式是:type_specifier function_name(;)即使函數(shù)使用形參,也不要將其寫入說明句。若未使用類型說明語句,函數(shù)返回的數(shù)據(jù)類型可能與調(diào)用者所要求的不一致,其結(jié)果是難以預(yù)料的。如果兩者同處于一個(gè)文件中,編譯程序可以發(fā)現(xiàn)該錯(cuò)誤并停止編譯。如果不在同一個(gè)文件中,編譯程序無法發(fā)現(xiàn)這種錯(cuò)誤。類型檢查僅在編譯中進(jìn)行,鏈接和運(yùn)行時(shí)均不檢查。因此,必須十分細(xì)心以確保絕不發(fā)生上述錯(cuò)誤。當(dāng)被說明為整型的函數(shù)返回字符時(shí),這個(gè)字符值被轉(zhuǎn)換為整數(shù)。因?yàn)镃語言以不加說明的方式進(jìn)行字符型與整型之間的數(shù)據(jù)轉(zhuǎn)換,因而多數(shù)情況下,返回字符值的函數(shù)并不是說明為返回字符值,而是由函數(shù)的這種字符型向整型的缺省類型轉(zhuǎn)換隱含實(shí)現(xiàn)的。
二、返回語句
返回語句return有兩個(gè)重要用途。第一,它使得內(nèi)含它的那個(gè)函數(shù)立即退出,也就是使程序返回到調(diào)用語句處繼續(xù)進(jìn)行。第二,它可以用來回送一個(gè)數(shù)值。本章將說明這兩個(gè)用途。
(一)從函數(shù)返回函數(shù)可以用兩種方法停止運(yùn)行并返回到調(diào)用程序
第一種是在執(zhí)行完函數(shù)的最后一個(gè)語句之后,從概念上講,是遇到了函數(shù)的結(jié)束符“}”(當(dāng)然這個(gè)花括號(hào)實(shí)際上并不會(huì)出現(xiàn)在目標(biāo)碼中,但我們可以這樣理解)。例如,下面的函數(shù)在屏幕上顯示一個(gè)字符串。
一旦字串顯示完畢,函數(shù)就沒事可做了,這時(shí)它返回到被調(diào)用處。在實(shí)際情況中,沒有多少函數(shù)是以這種缺省方式終止運(yùn)行的。因?yàn)橛袝r(shí)必須送回一個(gè)值,大多數(shù)函數(shù)用return語句終止運(yùn)行,有時(shí)在函數(shù)中設(shè)立了多個(gè)終止點(diǎn)以簡(jiǎn)化函數(shù)、提高效率。切記,一個(gè)函數(shù)可以有多個(gè)返回語句。如下所示,函數(shù)在s1、s2相等時(shí)返回1,不相等時(shí)返回-1。
(二)返回值所有的函數(shù)
關(guān)鍵詞:傳遞方式;數(shù)據(jù)類型;值傳遞;指針;數(shù)組
中圖分類號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2012)07-1688-02
The Discussion on Function Parameters Passing in the C Language Teaching
DONG Xin-zheng
(Department of Computer Science and Technology, Zhuhai College of Jilin University, Zhuhai 519041, China)
Abstract:The function parameter-passing modes are usually divided into“value passing”and“address passing”in some textbooks, which brings some difficulty for the beginners to understand. This paper makes a clear distinction between parameter-passing mode and data type, which are two basic concepts related with function parameter passing; analyzes three cases: general data type as function parameters, pointer data type as function parameters and array name as function parameters; gets the summary that“pass-by-value”is the only function parameter-passing mode in C language, the difficulty about data type is to distinct between the pointer data type and non-pointer data type.
Key words:parameter-passing mode; data type; pass-by-value; pointer; array
1概述
函數(shù)是C語言程序的基本構(gòu)成模塊,通過使用函數(shù),不僅可以省去重復(fù)代碼的編寫,還可以使程序更加模塊化,從而有利于程序的閱讀、修改和完善。對(duì)于C語言的初學(xué)者來說,準(zhǔn)確理解函數(shù)參數(shù)的傳遞方式是難點(diǎn)之一。一些C語言程序設(shè)計(jì)教材[1][2]中把函數(shù)間的參數(shù)傳遞分為“數(shù)值傳遞”和“地址傳遞”兩種方式,這種分類很容易使初學(xué)者混淆概念,更不能抓住參數(shù)傳遞的本質(zhì)。
2傳遞方式和數(shù)據(jù)類型
“值傳遞”[3]是函數(shù)參數(shù)的唯一傳遞方式。函數(shù)的參數(shù)分為實(shí)際參數(shù)(簡(jiǎn)稱實(shí)參)和形式參數(shù)(簡(jiǎn)稱形參),在定義函數(shù)時(shí)使用的參數(shù)叫形參,在調(diào)用函數(shù)時(shí)使用的參數(shù)叫實(shí)參。實(shí)參可以是常量、變量或表達(dá)式,但要求它們有確定的值。實(shí)參與形參的結(jié)合只有一種方式,即“值傳遞”,把實(shí)參的值賦給形參變量?!爸祩鬟f”具有單向性,只能把實(shí)參傳給形參,而不能由形參回傳給實(shí)參。
不同數(shù)據(jù)類型的函數(shù)參數(shù)對(duì)主調(diào)函數(shù)中變量的作用有所不同。函數(shù)參數(shù)可取的數(shù)據(jù)類型為基本類型、構(gòu)造類型、指針類型或空類型,如圖1[3]所示??疹愋捅硎驹摵瘮?shù)為無參函數(shù),在此不作介紹。其余數(shù)據(jù)類型又可分為三類:普通類型,包括基本類型、結(jié)構(gòu)體類型和共用體類型;指針類型;數(shù)組類型。函數(shù)參數(shù)為普通類型時(shí),對(duì)函數(shù)的調(diào)用不用影響到主調(diào)函數(shù)中變量的值;函數(shù)參數(shù)為指針類型或數(shù)組類型時(shí),對(duì)函數(shù)的調(diào)用可以修改主調(diào)函數(shù)中有關(guān)變量的值。
圖1
3普通類型變量作為函數(shù)參數(shù)
普通變量作為函數(shù)參數(shù)時(shí),對(duì)形參的修改不會(huì)影響到實(shí)參。如下例所示,通過“值傳遞”,形參x保存了實(shí)參a的值,形參y保存了實(shí)參b的值,因?yàn)樾螀⒑蛯?shí)參是相互獨(dú)立的不同變量,所以在swap函數(shù)中對(duì)形參x和y進(jìn)行的交換不會(huì)反映到實(shí)參a和b中。
#include
void swap(int x, int y)
{
int temp;
temp=x; x=y; y=temp;
}
void main()
{
int a, b;
scanf("%d%d", &a, &b);
swap(a, b);
printf("%d %d\n", a, b);
}
輸入:1 2
輸出:1 2
4指針作為函數(shù)參數(shù)
變量的指針就是變量的地址,存放變量地址的變量叫指針變量,定義指針變量的一般形式為:
基類型*指針變量名;
通過指針變量訪問其所指向的變量的方式稱為間接訪問方式。如下例所示。
int age;
a=10; //直接訪問方式
int* p=&a;
*p=11; //間接訪問方式
指針類型作為函數(shù)參數(shù)時(shí),參數(shù)傳遞方式仍然是“值傳遞”,即把實(shí)參的值傳遞給形參。不同的是參數(shù)為指針變量,可以通過形參的間接訪問方式來讀取或修改主調(diào)函數(shù)中有關(guān)變量的值。
如下例所示,通過“值傳遞”,形參x保存了變量a的地址,形參y保存了變量b的地址,即x指向變量a,y指向變量b,在swap函數(shù)中通過間接訪問方式交換了變量a和b的值。
#include
void swap(int* x, int* y)
{
int temp;
temp=*x; *x=*y; *y=temp;
}
void main()
{
int a, b;
scanf("%d%d", &a, &b);
swap(&a, &b);
printf("%d %d\n", a, b);
}
輸入:1 2
輸出:2 1
5數(shù)組名作為函數(shù)參數(shù)
數(shù)組元素和數(shù)組名也可以作為函數(shù)參數(shù),數(shù)組元素作為函數(shù)參數(shù)與普通變量用法相同,數(shù)組名作為函數(shù)參數(shù)與指針變量相同。
用數(shù)組名作函數(shù)形參時(shí),指定數(shù)組大小是不起任何作用的。因?yàn)镃語言編譯對(duì)形參數(shù)組大小不做檢查,只是將實(shí)參數(shù)組的首地址傳遞給形參數(shù)組。實(shí)參數(shù)組名即是實(shí)參數(shù)組的首地址,相當(dāng)于指針常量;形參數(shù)組名相當(dāng)于指針變量。實(shí)際上,C編譯都是將形參數(shù)組名作為指針變量來處理的[3]。所以,數(shù)組名作為函數(shù)參數(shù)可以按指針作為函數(shù)參數(shù)來理解。
如下例所示,數(shù)組名array代表數(shù)組array的首地址,通過“值傳遞”,形參數(shù)組名a,也可以理解為形參指針變量a,保存了數(shù)組array的首地址,因此,在swap函數(shù)中對(duì)形參數(shù)組a的操作即是對(duì)實(shí)參數(shù)組array的操作。
#include
void swap(int a[])
{
int temp;
temp=a[0]; a[0]=a[1]; a[1]=temp;
}
void main()
{
int array[2];
scanf("%d%d", &array[0], &array[1]);
swap(array);
printf("%d %d\n", array[0], array[1]);
}
輸入:1 2
輸出:2 1
6結(jié)論
綜上所述,C語言函數(shù)參數(shù)問題主要涉及兩個(gè)概念:傳遞方式和數(shù)據(jù)類型。實(shí)參與形參的傳遞方式只有一種,即“值傳遞”。參數(shù)的數(shù)據(jù)類型可以為普通類型、指針類型和數(shù)組類型,數(shù)組類型實(shí)際上是按指針類型來處理的,所以,主要是指針類型與非指針類型的區(qū)別。對(duì)初學(xué)者來說,問題的難點(diǎn)在于數(shù)據(jù)類型的不同而非傳遞方式,即指針類型變量與非指針類型變量的區(qū)別。
參考文獻(xiàn):
[1]田祥宏.C語言程序設(shè)計(jì)[M].西安:西安電子科技大學(xué)出版社,2007.
關(guān)鍵詞:C語言 函數(shù) 參數(shù)傳遞
中圖分類號(hào):TP312 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1674-098X(2014)11(a)-0135-02
“C語言程序設(shè)計(jì)”課程是信息類專業(yè)的一門非常重要的基礎(chǔ)課程,這門課程的主要目的就是讓學(xué)生以C語言為例了解高級(jí)程序設(shè)計(jì)語言的結(jié)構(gòu),掌握程序設(shè)計(jì)的基本思想,具備初步的分析問題和用計(jì)算機(jī)解決問題的能力。函數(shù)是C語言程序設(shè)計(jì)課程的重點(diǎn)和難點(diǎn),它體現(xiàn)了模塊化程序設(shè)計(jì)的思想,將一個(gè)復(fù)雜的問題分解成一個(gè)個(gè)小而簡(jiǎn)單的問題,通過解決一個(gè)個(gè)小問題進(jìn)而實(shí)現(xiàn)大的復(fù)雜問題的求解。在函數(shù)的教學(xué)中,經(jīng)常會(huì)有教師不好教學(xué)生學(xué)不懂的現(xiàn)象,學(xué)生學(xué)完函數(shù)后,基本概念和結(jié)構(gòu)語法都清楚,但是針對(duì)具體的問題就無從下手,教學(xué)效果一直不是太好。筆者在多年C語言教學(xué)的實(shí)踐基礎(chǔ)上,結(jié)合我校學(xué)生的具體情況,對(duì)函數(shù)部分的內(nèi)容組織和教學(xué)方法做了一些探討。
1 教學(xué)內(nèi)容和安排
函數(shù)部分一般按以下內(nèi)容進(jìn)行教學(xué)。
(1)函數(shù)的作用和分類:標(biāo)準(zhǔn)庫函數(shù)和自定義函數(shù)。
(2)函數(shù)定義的基本格式:無參函數(shù)、有參函數(shù)和空函數(shù)。
(3)函數(shù)的參數(shù)傳遞:值傳遞和地址傳遞。
(4)函數(shù)的返回值:無返回值、一個(gè)返回值和多個(gè)返回值。
(5)函數(shù)的調(diào)用:作為單獨(dú)語句、作為表達(dá)式和作為函數(shù)參數(shù)。
(6)函數(shù)的遞歸調(diào)用和嵌套調(diào)用。
(7)函數(shù)的聲明:聲明的位置、格式和省略情況。
(8)變量的作用域:全局變量和局部變量。
(9)變量的存儲(chǔ)類型及生存期:自動(dòng)變量、靜態(tài)變量、外部變量和寄存器變量。
可以看出,函數(shù)部分的內(nèi)容非常多,而且會(huì)有許多新的概念突然介入,有相當(dāng)一部分教材,以譚浩強(qiáng)教授的《C程序設(shè)計(jì)》(第四版)為代表,將函數(shù)作為單獨(dú)一章放在選擇控制結(jié)構(gòu)和數(shù)組之后,把函數(shù)相關(guān)的上述所有內(nèi)容都放在這一章中介紹,然后在后續(xù)的指針、結(jié)構(gòu)體和文件等章節(jié)中又幾乎沒有函數(shù)的蹤影,程序的主體仍然放到main()函數(shù)中去講解,筆者認(rèn)為這樣的內(nèi)容編排結(jié)構(gòu)不利于學(xué)生對(duì)函數(shù)的把握,它會(huì)導(dǎo)致函數(shù)和其他內(nèi)容脫節(jié),給學(xué)生造成這是專門的一章,不學(xué)或?qū)W不好對(duì)其它內(nèi)容不會(huì)產(chǎn)生多大影響的印象,結(jié)果到課程結(jié)束時(shí)仍然對(duì)函數(shù)知之甚少,平時(shí)也幾乎沒用函數(shù)來編寫過程序,導(dǎo)致到了學(xué)期末學(xué)生在編程時(shí)仍然習(xí)慣把所有程序都放到一個(gè)main()函數(shù)中去編寫,很少有模塊化程序設(shè)計(jì)的思想,為以后編寫復(fù)雜程序或者參加團(tuán)隊(duì)合作埋下了隱患。
該文作者在講授函數(shù)這一部分時(shí),參考了哈爾濱工業(yè)大學(xué)蘇小紅教授的高教版《C語言程序設(shè)計(jì)》(第二版)的內(nèi)容編排,把函數(shù)提到了數(shù)組之前介紹,而且從函數(shù)這一章開始,后面幾乎所有的程序都是按模塊化思想將程序分成一個(gè)個(gè)小函數(shù),再通過main()函數(shù)調(diào)用這些函數(shù)來實(shí)現(xiàn)主體功能,并且在后續(xù)內(nèi)容的講解中,不斷強(qiáng)化學(xué)生對(duì)函數(shù)的把握,強(qiáng)化學(xué)生模塊化程序設(shè)計(jì)的思想,學(xué)生在學(xué)習(xí)的過程當(dāng)中,不斷地復(fù)習(xí)鞏固著函數(shù)的知識(shí),不斷地感受著模塊化程序設(shè)計(jì)的思想,也逐漸養(yǎng)成了用函數(shù)設(shè)計(jì)程序的習(xí)慣,實(shí)踐表明,到學(xué)期末的時(shí)候,大多數(shù)學(xué)生都可以寫一些簡(jiǎn)單的函數(shù)并通過main()函數(shù)調(diào)用來進(jìn)行程序設(shè)計(jì)。
2 函數(shù)的設(shè)計(jì)思想和設(shè)計(jì)方法
在進(jìn)行程序設(shè)計(jì)時(shí),很多學(xué)生感到困惑、難以理解和掌握的是什么時(shí)候需要設(shè)計(jì)函數(shù)和該設(shè)計(jì)什么樣的函數(shù),形參和返回值該如何設(shè)置。對(duì)這個(gè)問題,筆者認(rèn)為在講解的時(shí)候要著重把握幾點(diǎn)。
首先,在確定什么時(shí)候該設(shè)計(jì)函數(shù)時(shí),需要先對(duì)整個(gè)程序的過程有個(gè)把握,確定程序的主體功能,這樣,對(duì)需不需要設(shè)計(jì)函數(shù)及對(duì)哪些部分可以設(shè)計(jì)函數(shù)就有了較為明確的答案。例如:從鍵盤上輸入一個(gè)整數(shù)n(n>1且n<10),輸出1!+2!+3!+...+n!的值。
對(duì)程序進(jìn)行分析后,可以得出程序主體可以分成兩個(gè)步驟:
輸入一個(gè)整數(shù)n;
輸出1!+2!+3!+...+n!的值。
在第2) 步驟中,由于重復(fù)用到了求階乘的功能,所以如果把求階乘這部分設(shè)計(jì)成一個(gè)函數(shù),將會(huì)對(duì)第2) 步的編程起到簡(jiǎn)化的作用。這樣,經(jīng)過初步分析,可以確定需要設(shè)計(jì)一個(gè)函數(shù),此函數(shù)的功能是對(duì)給定的一個(gè)整數(shù)m,求出其階乘。
函數(shù)的功能確定后,接著就可以著手設(shè)計(jì)函數(shù)了。具體到函數(shù)設(shè)計(jì)時(shí),很多學(xué)生的疑惑是怎么設(shè)計(jì)函數(shù)的參數(shù)和返回值,在這里,筆者建議學(xué)生采用“黑匣子”的方法設(shè)計(jì)函數(shù),即不需要管函數(shù)的內(nèi)部結(jié)構(gòu),把它看做一個(gè)“黑匣子”,只從外部的功能要求來確定函數(shù)應(yīng)該具備什么樣的功能,進(jìn)而確定主函數(shù)在調(diào)用該函數(shù)時(shí)需要傳遞給它什么參數(shù),它在返回主調(diào)函數(shù)時(shí)又需不需要返回值或需要返回幾個(gè)值。在上個(gè)例子中,函數(shù)的功能確定是求階乘,在主函數(shù)調(diào)用它時(shí)需要告訴它對(duì)誰求階乘,即傳遞給該函數(shù)階乘的階數(shù)m,函數(shù)調(diào)用結(jié)束后,需要m的階乘返回主調(diào)函數(shù),即只需要返回一個(gè)值,如圖1所示。
由此,我們得出此函數(shù)的相關(guān)內(nèi)容:
函數(shù)功能:求出整數(shù)m的階乘m!
函數(shù)入口參數(shù):一個(gè)形參,整形變量m表示階乘的階數(shù)
函數(shù)返回值:一個(gè)返回值,返回m!的值
這段信息可以作為注釋放在函數(shù)的開頭以便讓其他程序員有足夠的信息了解如何使用該函數(shù)。然后根據(jù)C語言中函數(shù)的定義格式可以寫出求階乘函數(shù)定義:int fact(int m);考慮到m!的范圍,我們可以將其修改定義為:long fact(int m);
至此,函數(shù)的第一個(gè)難點(diǎn)就解決了。
3 函數(shù)的參數(shù)傳遞
在函數(shù)需要有多個(gè)返回值時(shí),僅僅一個(gè)return就很難滿足要求了,這里就需要利用指針或全局變量將函數(shù)中的多個(gè)值傳遞到主調(diào)函數(shù)中,這屬于函數(shù)的參數(shù)傳遞問題。函數(shù)的參數(shù)傳遞是函數(shù)部分的又一個(gè)難點(diǎn),可以分為值傳遞和地址傳遞,因?yàn)檫€關(guān)系到指針的應(yīng)用,學(xué)生一時(shí)間很難理解和掌握。鑒于這一點(diǎn),筆者采用形象類比法結(jié)合內(nèi)存空間講解了值傳遞和地址傳遞的區(qū)別。
函數(shù)在被調(diào)用時(shí)新開辟了一段內(nèi)存空間,所有形參和函數(shù)內(nèi)部變量都在這個(gè)內(nèi)存空間中被訪問或修改,一旦返回主調(diào)函數(shù)這段內(nèi)存空間也就被釋放掉,形參的值不會(huì)傳遞給實(shí)參,影響到主調(diào)函數(shù)。即在進(jìn)行值傳遞時(shí)相當(dāng)于有一個(gè)復(fù)制操作,即將實(shí)參的值賦給函數(shù)空間的形參,這是一個(gè)單向傳遞,因此,對(duì)形參的改變不會(huì)影響到實(shí)參。而地址傳遞的實(shí)質(zhì)是將主調(diào)函數(shù)中的某個(gè)或多個(gè)地址放到被調(diào)函數(shù)中進(jìn)行訪問,此操作間接訪問到了主調(diào)函數(shù)中的變量,因而影響到了主調(diào)函數(shù)中的變量值。
上述講法需要學(xué)生建立內(nèi)存空間的概念,要對(duì)程序的存儲(chǔ)空間有所認(rèn)識(shí),相當(dāng)一部分同學(xué)表示難以理解。筆者結(jié)合大一學(xué)生都學(xué)過計(jì)算機(jī)引論的實(shí)際情況,將值傳遞比喻為將計(jì)算機(jī)中的某一文件file1.doc拷貝給別人,別人拷走后可以隨便修改這個(gè)文件的內(nèi)容,這些修改都不會(huì)影響到原來的文件file1.doc。當(dāng)傳遞的是地址的時(shí)候,即使用指針變量作函數(shù)參數(shù)時(shí),相當(dāng)于把機(jī)器密碼、要修改的文件路徑及文件名(如d:\project\file1.doc)告訴了別人,別人在修改時(shí)直接針對(duì)file1.doc,進(jìn)行修改后,file1.doc的內(nèi)容肯定也會(huì)發(fā)生改變,這就是地址傳遞。經(jīng)過這樣形象的比喻后,學(xué)生多表示容易理解,在寫程序時(shí)會(huì)有意識(shí)地考慮需要進(jìn)行的是值傳遞還是地址傳遞,形參該設(shè)置成普通變量還是指針變量,教學(xué)效果有所改善。
4 結(jié)語
實(shí)踐證明,在筆者進(jìn)行的函數(shù)教學(xué)中,相當(dāng)一部分同學(xué)對(duì)函數(shù)有了形象的認(rèn)識(shí),更深地理解了模塊化程序設(shè)計(jì)的思想,取得了良好的學(xué)習(xí)效果。學(xué)無止境,教亦無止境。除了以上幾點(diǎn),只函數(shù)部分就還有很多可以繼續(xù)深入挖掘的東西,比如從函數(shù)有無參數(shù)方面,函數(shù)有無返回值或是否有多個(gè)返回值方面,變量的存儲(chǔ)類型和生存期方面等等,這些都值得我們教師不斷地研究不斷地探討。但歸根結(jié)底,如何讓學(xué)生容易掌握要點(diǎn),如何讓學(xué)生發(fā)自內(nèi)心地喜歡學(xué)習(xí)、愛上學(xué)習(xí)并善于主動(dòng)學(xué)習(xí),筆者認(rèn)為才是教師的最終目的。
參考文獻(xiàn)
[1] 蘇小紅.C語言程序設(shè)計(jì)[M].2版.高等教育出版社,2013.
[2] 譚浩強(qiáng).C程序設(shè)計(jì)[M].4版.清華大學(xué)出版社,2011.
【關(guān)鍵詞】ICT專業(yè) 學(xué)術(shù)漢語 教學(xué)模式
【基金項(xiàng)目】本文的研究受到重慶郵電大學(xué)社會(huì)科學(xué)基金項(xiàng)目支持(K2015-08)和國際化教育教學(xué)研究項(xiàng)目支持(GJJY15-2-07)。
【中圖分類號(hào)】G64 【文獻(xiàn)標(biāo)識(shí)碼】A 【文章編號(hào)】2095-3089(2016)35-0015-02
一、前言
隨著我國“一帶一路”戰(zhàn)略的實(shí)施和“留學(xué)中國計(jì)劃”的開展,來華留學(xué)生規(guī)模不斷擴(kuò)大,留學(xué)生結(jié)構(gòu)和層次也開始發(fā)生變化[1][2]。目前,重慶郵電大學(xué)有來自50多個(gè)國家和地區(qū)的長期留學(xué)生400多人在校學(xué)習(xí),其中研究生比例超過50%。隨著高水平漢語留學(xué)者的出現(xiàn),越來越多的留學(xué)生選擇以漢語作為學(xué)術(shù)研究的工具,部分留學(xué)生已在我校開始攻讀博士學(xué)位,這給傳統(tǒng)對(duì)外漢語教學(xué)帶來了新的機(jī)遇和挑戰(zhàn)。
學(xué)術(shù)漢語是借鑒ESP(English for Special Purpose,專門用途英語)理論創(chuàng)造的一個(gè)術(shù)語,其目的是為專業(yè)學(xué)習(xí)服務(wù)[2][3]。目前,進(jìn)入專業(yè)學(xué)習(xí)的重慶郵電大學(xué)留學(xué)生漢語水平一般要求在HSK4級(jí)以上,這一漢語水平的學(xué)生在進(jìn)入到ICT專業(yè)課堂學(xué)習(xí)的時(shí)候,面對(duì)大量的通信編碼、信令、存儲(chǔ)器等ICT領(lǐng)域的專業(yè)詞匯時(shí)仍存在大量無法理解的現(xiàn)象。造成這些問題的主要原因包括:(1)缺少具有針對(duì)性的學(xué)術(shù)漢語教材學(xué)習(xí)。(2)專業(yè)術(shù)語理解障礙,對(duì)專業(yè)術(shù)語的掌握和理解上綴蹺零。(3)不熟悉ICT專業(yè)學(xué)術(shù)漢語文獻(xiàn)寫作規(guī)則,缺少專業(yè)漢語教師與學(xué)術(shù)導(dǎo)師的聯(lián)合指導(dǎo)。(4)缺乏ICT學(xué)術(shù)論文文體知識(shí)、論文思維,沒有經(jīng)過系統(tǒng)、科學(xué)的科研能力培養(yǎng)。
二、留學(xué)生教育教學(xué)模式探索
形成重視學(xué)術(shù)漢語教學(xué)的意識(shí)和氛圍。在意識(shí)上重視學(xué)術(shù)漢語教學(xué),突出本、碩、博階段專業(yè)素養(yǎng)的培養(yǎng)和訓(xùn)練,區(qū)分留學(xué)生學(xué)歷教育和短期漢語進(jìn)修學(xué)習(xí),圍繞計(jì)算機(jī)、通信領(lǐng)域的漢語學(xué)術(shù)論文面向留學(xué)生舉辦“讀論文、做實(shí)驗(yàn)”的科技競(jìng)賽活動(dòng)。
設(shè)置相應(yīng)的課程并加強(qiáng)相關(guān)課程研究。制定分階段的學(xué)術(shù)漢語課程,從一般漢語教學(xué)的高級(jí)漢語階段開始,延伸到本碩博學(xué)歷教育階段,幫助留學(xué)生順利銜接到專業(yè)學(xué)習(xí)和研究。通過學(xué)習(xí)一些基本的專業(yè)詞匯,掌握基本的句法結(jié)構(gòu),為學(xué)歷生以及從事科學(xué)研究的漢語學(xué)習(xí)者進(jìn)入專業(yè)學(xué)習(xí)、研究階段打下語言基礎(chǔ)。
探索留學(xué)生學(xué)術(shù)漢語導(dǎo)師聯(lián)合制。在留學(xué)生進(jìn)入漢語學(xué)習(xí)高級(jí)階段初期、即將進(jìn)入專業(yè)學(xué)習(xí)的前期,建立留學(xué)生學(xué)術(shù)漢語導(dǎo)師聯(lián)合制,由對(duì)外漢語教師配合留學(xué)生的指導(dǎo)教師共同培養(yǎng)學(xué)生準(zhǔn)確運(yùn)用漢語進(jìn)行科學(xué)研究的能力。傳授用漢語進(jìn)行學(xué)術(shù)寫作的學(xué)術(shù)規(guī)范知識(shí),訓(xùn)練用漢語進(jìn)行學(xué)術(shù)研究的方法,包括搜集資料的方法、開展實(shí)驗(yàn)的方法、撰寫論文的方法,逐步培養(yǎng)漢語學(xué)術(shù)思維和科研意識(shí)。
三、留學(xué)生教育教學(xué)實(shí)踐
為進(jìn)入專業(yè)學(xué)習(xí)的留學(xué)生開設(shè)過渡性學(xué)術(shù)漢語課程和學(xué)術(shù)能力培養(yǎng)課程。在過渡性課程上,通過講授計(jì)算機(jī)導(dǎo)論、通信原理等專業(yè)課程的基本詞匯、句法,為學(xué)生補(bǔ)充專業(yè)學(xué)習(xí)的基礎(chǔ)知識(shí),使其掌握如何運(yùn)用漢語學(xué)習(xí)專業(yè)課程的技能。在學(xué)術(shù)能力培養(yǎng)課程上,講授用漢語進(jìn)行ICT學(xué)術(shù)寫作的學(xué)術(shù)規(guī)范知識(shí)、學(xué)術(shù)研究方法。培養(yǎng)留學(xué)生掌握通過軟件學(xué)報(bào)、計(jì)算機(jī)研究與發(fā)展、電子學(xué)報(bào)等中文學(xué)術(shù)期刊和知網(wǎng)等學(xué)術(shù)工具進(jìn)行資料搜集的方法。培養(yǎng)留學(xué)生掌握提出問題、分析問題、解決問題逐層推進(jìn)的科技寫作方法。
傳統(tǒng)的教材式的對(duì)外漢語教學(xué)方法因教材出版周期較長,不能及時(shí)反應(yīng)學(xué)術(shù)漢語的進(jìn)展;另一方面,以慕課為主的網(wǎng)絡(luò)教學(xué)資源良莠不齊,詞法、句法使用隨意,術(shù)語準(zhǔn)確性差,不適合直接引入校園作為知識(shí)進(jìn)行傳授。在課程資源建設(shè)上,我校結(jié)合學(xué)校辦學(xué)特色、專業(yè)特長和留學(xué)生專業(yè)分布特點(diǎn),由對(duì)外漢語教師、ICT專業(yè)教師等組成了專門的課程資源建設(shè)團(tuán)隊(duì),借助互聯(lián)網(wǎng)手段及時(shí)獲取最新的、權(quán)威的學(xué)術(shù)成果。通過篩選、匯編、整理等環(huán)節(jié),嚴(yán)格遵循學(xué)術(shù)文章中的專業(yè)詞匯、術(shù)語和寫作特點(diǎn),以詞匯銜接、語法銜接作為切入點(diǎn),按照計(jì)算機(jī)、通信專業(yè)設(shè)置分類,結(jié)合學(xué)術(shù)漢語教學(xué)特點(diǎn),對(duì)資源進(jìn)行認(rèn)定、注解,并最終形成教學(xué)講義供學(xué)生使用。
四、結(jié)語
在來華留學(xué)生漢語水平不斷提高、學(xué)歷需求不斷提升、專業(yè)技能學(xué)習(xí)目的不斷明確的情況下,留學(xué)生運(yùn)用漢語開展科學(xué)研究時(shí)亟需學(xué)術(shù)專業(yè)教師的指導(dǎo)。本文以重慶郵電大學(xué)ICT專業(yè)留學(xué)生為例,探討了我校在學(xué)術(shù)漢語教育教學(xué)方面的現(xiàn)狀和創(chuàng)新,希望借此吸引更多的學(xué)術(shù)專業(yè)教師關(guān)注留學(xué)生學(xué)術(shù)漢語的指導(dǎo)與教學(xué)。
參考文獻(xiàn):
[1]單韻鳴.專門用途漢語教材的編寫問題――以《科技漢語閱讀教程》系列教材為例[J].暨南大學(xué)華文學(xué)院學(xué)報(bào),2008,(2).
[2]高增霞,劉福英.論學(xué)術(shù)漢語在對(duì)外漢語教學(xué)中的重要性,云南師范大學(xué)學(xué)報(bào)(對(duì)外漢語教學(xué)與研究版),2016,14(2).
[3]張明月,科技漢語的文體研究及其在科技漢語教材編寫中的應(yīng)用.南京師范大學(xué),碩士論文.
作者簡(jiǎn)介: