嚴宇
摘要:函數(shù)的定義與調(diào)用是C語言初學(xué)者的一個難點,用已知的數(shù)學(xué)知識去輔助理解未知的C語言函數(shù)知識,可以加速對新知識自定義C語言函數(shù)的學(xué)習(xí)過程,新知識可以反過來提升老知識的泛化能力。運用C語言編寫了實現(xiàn)數(shù)學(xué)功能的三個函數(shù),由易到難,從簡單到復(fù)雜地定義和調(diào)用函數(shù),取得較好的學(xué)習(xí)效果。
關(guān)鍵詞: C語言; 函數(shù)定義;函數(shù)調(diào)用; 遷移學(xué)習(xí)法
中圖分類號:TP311? ? ? 文獻標識碼:A
文章編號:1009-3044(2021)33-0063-02
開放科學(xué)(資源服務(wù))標識碼(OSID):
Design and Realization of Math Menu Based on C Language Application of case-when in MySQL
YAN Yu
(Henan Normal University, Xinxiang 453007 China)
Abstract: Function definition and call is a difficult point for beginners of C language. Using known mathematical knowledge to assist in understanding unknown C language function knowledge can accelerate the learning process of customizing C language function with new knowledge, and the new knowledge can in turn improve the generalization ability of the old knowledge. Using C language to write three functions to realize the mathematical function, from easy to difficult, from simple to complex to define and call the function, get better learning effect.
Key words:C language; function definition;function call; transfer learning method
1 問題提出
C語言是多數(shù)專業(yè)的大一新生必學(xué)的一門專業(yè)基礎(chǔ)課,學(xué)習(xí)目的是掌握程序設(shè)計的基本方法,會用計算機解決本專業(yè)的實際問題。C 語言是函數(shù)的語言,自定義函數(shù)的定義與調(diào)用是C語言初學(xué)者的一個重難點,很多初學(xué)者學(xué)習(xí)函數(shù)時非常吃力,不能靈活應(yīng)用函數(shù)進行程序設(shè)計。
為了突破C語言函數(shù)學(xué)習(xí)這一難點,培養(yǎng)正確定義函數(shù)和調(diào)用函數(shù)解決實際問題的能力,筆者采用了遷移學(xué)習(xí)法,用已知的數(shù)學(xué)知識去輔助理解未知的C語言函數(shù)知識,可以加速對新知識自定義C語言函數(shù)的學(xué)習(xí)過程,新知識可以反過來提升老知識的泛化能力。解除了學(xué)習(xí)C語言函數(shù)的疑惑,取得較好的學(xué)習(xí)效果。
2 實現(xiàn)方案
實踐表明,初學(xué)者不能正確運用函數(shù)解決實際問題的原因主要有兩個,一方面是不能合理地確定參數(shù)的個數(shù)和類型,即正確定義函數(shù);另一方面是不能適當(dāng)?shù)剡x取實參,正確調(diào)用函數(shù)。為了破解這些學(xué)習(xí)難點,以及對函數(shù)的定義和調(diào)用做到舉一反三的考慮,也為了方便日常的數(shù)學(xué)計算,運用C語言編寫了實現(xiàn)數(shù)學(xué)功能的三個函數(shù),并且以菜單的形式進行展現(xiàn)和調(diào)用。
2.1 菜單設(shè)計
先確定一個主菜單,運用多路選擇的switch語句設(shè)計,將其分為求組合數(shù),求階乘,求斐波那契數(shù)列三個部分,用戶可根據(jù)所需情況選擇相應(yīng)的函數(shù)計算,而后分析各個函數(shù)執(zhí)行的功能,分別定義相應(yīng)函數(shù),編寫各種語句以實現(xiàn)函數(shù)功能,最后在主函數(shù)上實現(xiàn)函數(shù)調(diào)用,用于日常數(shù)學(xué)的快速運算,增加用戶的辦事效率和準確性。
2.2 菜單簡介
為了方便用戶快速熟悉并使用程序進行數(shù)學(xué)計算,主菜單有詳細的文字介紹,用戶打開程序會直接彈出能進行的三項數(shù)學(xué)運算,以阿拉伯?dāng)?shù)字加以區(qū)分,最下方的有可選擇項,用戶根據(jù)所需選擇對應(yīng)的阿拉伯?dāng)?shù)字,程序會跳轉(zhuǎn)至具體子菜單,用戶根據(jù)提示輸入具體數(shù)字參與運算。主菜單與子菜單的存在將使用戶操作更加便捷易懂,增加用戶體驗感。
3 具體實現(xiàn)
3.1 主菜單的設(shè)計和實現(xiàn)
為了增強界面的整齊性和美觀性,主菜單在功能介紹的前后分別用符號分隔開,整體使用漢語解釋說明以方便用戶操作,主菜單的程序代碼和運行結(jié)果如下。
main()
{int n,num,k;
printf("\t\t\t? 歡迎來到數(shù)學(xué)王國 \n\n");
printf("-----------------------------------------------------\n");
printf("可進行的數(shù)學(xué)運算有:\n");
printf("\t\t\t 1.計算組合數(shù):\n\n");
printf("\t\t\t 2,求斐波那契數(shù)列:\n\n");
printf("\t\t\t 3.計算n的階乘:\n\n");
printf("-----------------------------------------------------\n");
printf("請選擇,輸入數(shù)字n:");
scanf("%d",&n);
printf("請輸入?yún)⑴c運算數(shù)num,k:");
scanf("%d%d",&num,&k);
switch(n)
{case 1:Zuheshu(num,k);
break;
case 2:Fib(num,k);
break;
case 3:printf("n的階乘為%ld:\n",F(xiàn)act(num));
break;}}
3.2 階乘函數(shù)的設(shè)計與實現(xiàn)
求正整數(shù)n的階乘這個問題,需要知道正整數(shù)n的值 ,才能求解出來n這個正整數(shù)的階乘的值 。所以,定義階乘函數(shù)時,依據(jù)實際需求,確定該函數(shù)的形式參數(shù)有而且只有一個整數(shù)n,又因為n的階乘的值仍然是整數(shù) ,但是數(shù)值較大,因此函數(shù)的返回值類型需要定義為長整型。確定了函數(shù)返回值的類型、形式參數(shù)的個數(shù)與 類型,再遵循見名知義的原則確定函數(shù)的名稱,就可以定義函數(shù)首部為:
unsigned long Fact(unsigned int n)
常用來求階乘的方法有五種:用for循環(huán)求階乘、用while語句求n的階乘、用do-while語句求n的階乘、用靜態(tài)變量求n的階乘、用迭代法計算無符號整型變量n的階乘,文章采用第五種方法求階乘。
unsigned long Fact(unsigned int n)
{unsigned int i;
unsigned long combnum=1;
for(i=2;i<=n;i++)
combnum*=i;
return combnum;}
3.3 組合數(shù)函數(shù)的設(shè)計與實現(xiàn)
函數(shù)定義是函數(shù)應(yīng)用中較為關(guān)鍵的一步,因為所有的用戶自定義函數(shù)均要“先定義,后使用”。定義的目的是通知編譯系統(tǒng)函數(shù)返回值的類型、函數(shù)的名字、函數(shù)的參數(shù)個數(shù)與類型以及函數(shù)實現(xiàn)什么功能。定義函數(shù)的目的是重復(fù)使用,因此只有在程序中調(diào)用函數(shù)才能實現(xiàn)函數(shù)的功能。C語言程序從 main函數(shù)開始執(zhí)行,自定義函數(shù)的執(zhí)行通過被別的函數(shù)調(diào)用來實現(xiàn)。
組合數(shù)的計算問題實質(zhì)是多個階乘的乘除,因此組合函數(shù)需要調(diào)用階乘函數(shù),這就需要正確進行函數(shù)調(diào)用。函數(shù)調(diào)用的一般形式是:函數(shù)名(實際參數(shù)列表)。函數(shù)調(diào)用的方式按出現(xiàn)的位置有函數(shù)語句和函數(shù)表達式兩種。調(diào)用函數(shù)時使用的函數(shù)名要和定義函數(shù)時的完全一致,并且實參的個數(shù)和類型要和形參的一一對應(yīng)。計算組合數(shù)時需要用到階乘函數(shù)的返回值,這種情況下,調(diào)用函數(shù)需要以表達式的成分出現(xiàn),為此,組合函數(shù)的實現(xiàn)代碼如下。
int Zuheshu(int num,int k)
{unsigned long p;
p=Fact(num)/(Fact(k)*Fact(num-k));
printf("p=%lu\n",p);
return 0;}
3.4 斐波那契數(shù)列函數(shù)的設(shè)計與實現(xiàn)
主菜單中用戶輸入數(shù)字2后,將進行斐波那契數(shù)列的計算,這里設(shè)置循環(huán)會將所求項及之前所有項對應(yīng)的斐波那契數(shù)一一顯示出來,設(shè)定好基線情況和一般情況,隨后用遞歸法求得各項斐波那契數(shù)。為了方便第一項主菜單設(shè)置輸入兩個數(shù)字,第二項只需一個有效數(shù)字,在主菜單的設(shè)置中,前一個數(shù)字代表項數(shù),因此第一位填入所需斐波那契項數(shù),第二個數(shù)字一般填1。
//函數(shù)功能:求斐波那契數(shù)列
int Fib(int k)
{int i,x;
for(i=1;i<=k;i++)
{x=Fi(i);? //調(diào)用遞歸函數(shù)Fi()計算數(shù)列第n項
printf("Fib(%d)=%d\n",i,x);}
return 0;}
//函數(shù)功能:用遞歸法計算數(shù)列中的第n項
long Fi(int n)
{if(n==0) return 0;? //基線情況
else if(n==1) return 1;? //基線情況
else return(Fi(n-1)+Fi(n-2)); } //一般情況
運行結(jié)果如圖2。
4 結(jié)論
編寫一個C語言程序解決一個實際問題,初學(xué)者往往將程序所有語句寫在main 主函數(shù) 中,這樣不利于閱讀和調(diào)試。恰當(dāng)?shù)乩煤瘮?shù)將復(fù)雜問題分解為若干個相對簡單的子問題,每個子問題完成一項具體任務(wù),由一個函數(shù)實現(xiàn),如果已有解決子問題的函數(shù)代碼,就可以直接調(diào)用函數(shù)解決復(fù)雜問題。這樣的程序可讀性強,調(diào)試方便,也有利于提高程序代碼的利用率,實現(xiàn)模塊化?!昂瘮?shù)”能夠簡化程序 ,化難為易。學(xué)習(xí)過程中,注重培養(yǎng)使用“函數(shù)”的習(xí)慣,正確定義和調(diào)用函數(shù)。
參考文獻:
[1] 楊泉.C語言程序設(shè)計中函數(shù)參數(shù)傳遞的研究[J].福建電腦,2020,36(12):108-109.
[2] 楊新宇,蘭全祥.C語言中遞歸的分析及應(yīng)用[J].電腦知識與技術(shù),2020,16(22):237-238,243.
[3] 張曉雯,祁薇.任務(wù)驅(qū)動的C語言函數(shù)課堂教學(xué)設(shè)計[J].電腦知識與技術(shù),2018,14(30):129-131.
[4] 黃敏.淺析程序設(shè)計與數(shù)學(xué)的關(guān)系——C語言程序設(shè)計為例[J].重慶工貿(mào)職業(yè)技術(shù)學(xué)院學(xué)報,2007(3):37-38.
[5] 陶予祺,王卓瑜,郭雨.基于C語言的數(shù)學(xué)競賽成績管理系統(tǒng)設(shè)計[J].信息與電腦,2017(2):144-146.
【通聯(lián)編輯:唐一東】