嚴宇


摘要:函數的定義與調用是C語言初學者的一個難點,用已知的數學知識去輔助理解未知的C語言函數知識,可以加速對新知識自定義C語言函數的學習過程,新知識可以反過來提升老知識的泛化能力。運用C語言編寫了實現數學功能的三個函數,由易到難,從簡單到復雜地定義和調用函數,取得較好的學習效果。
關鍵詞: C語言; 函數定義;函數調用; 遷移學習法
中圖分類號:TP311? ? ? 文獻標識碼:A
文章編號:1009-3044(2021)33-0063-02
開放科學(資源服務)標識碼(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語言是多數專業的大一新生必學的一門專業基礎課,學習目的是掌握程序設計的基本方法,會用計算機解決本專業的實際問題。C 語言是函數的語言,自定義函數的定義與調用是C語言初學者的一個重難點,很多初學者學習函數時非常吃力,不能靈活應用函數進行程序設計。
為了突破C語言函數學習這一難點,培養正確定義函數和調用函數解決實際問題的能力,筆者采用了遷移學習法,用已知的數學知識去輔助理解未知的C語言函數知識,可以加速對新知識自定義C語言函數的學習過程,新知識可以反過來提升老知識的泛化能力。解除了學習C語言函數的疑惑,取得較好的學習效果。
2 實現方案
實踐表明,初學者不能正確運用函數解決實際問題的原因主要有兩個,一方面是不能合理地確定參數的個數和類型,即正確定義函數;另一方面是不能適當地選取實參,正確調用函數。為了破解這些學習難點,以及對函數的定義和調用做到舉一反三的考慮,也為了方便日常的數學計算,運用C語言編寫了實現數學功能的三個函數,并且以菜單的形式進行展現和調用。
2.1 菜單設計
先確定一個主菜單,運用多路選擇的switch語句設計,將其分為求組合數,求階乘,求斐波那契數列三個部分,用戶可根據所需情況選擇相應的函數計算,而后分析各個函數執行的功能,分別定義相應函數,編寫各種語句以實現函數功能,最后在主函數上實現函數調用,用于日常數學的快速運算,增加用戶的辦事效率和準確性。
2.2 菜單簡介
為了方便用戶快速熟悉并使用程序進行數學計算,主菜單有詳細的文字介紹,用戶打開程序會直接彈出能進行的三項數學運算,以阿拉伯數字加以區分,最下方的有可選擇項,用戶根據所需選擇對應的阿拉伯數字,程序會跳轉至具體子菜單,用戶根據提示輸入具體數字參與運算。主菜單與子菜單的存在將使用戶操作更加便捷易懂,增加用戶體驗感。
3 具體實現
3.1 主菜單的設計和實現
為了增強界面的整齊性和美觀性,主菜單在功能介紹的前后分別用符號分隔開,整體使用漢語解釋說明以方便用戶操作,主菜單的程序代碼和運行結果如下。
main()
{int n,num,k;
printf("\t\t\t? 歡迎來到數學王國 \n\n");
printf("-----------------------------------------------------\n");
printf("可進行的數學運算有:\n");
printf("\t\t\t 1.計算組合數:\n\n");
printf("\t\t\t 2,求斐波那契數列:\n\n");
printf("\t\t\t 3.計算n的階乘:\n\n");
printf("-----------------------------------------------------\n");
printf("請選擇,輸入數字n:");
scanf("%d",&n);
printf("請輸入參與運算數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",Fact(num));
break;}}
3.2 階乘函數的設計與實現
求正整數n的階乘這個問題,需要知道正整數n的值 ,才能求解出來n這個正整數的階乘的值 。所以,定義階乘函數時,依據實際需求,確定該函數的形式參數有而且只有一個整數n,又因為n的階乘的值仍然是整數 ,但是數值較大,因此函數的返回值類型需要定義為長整型。確定了函數返回值的類型、形式參數的個數與 類型,再遵循見名知義的原則確定函數的名稱,就可以定義函數首部為:
unsigned long Fact(unsigned int n)
常用來求階乘的方法有五種:用for循環求階乘、用while語句求n的階乘、用do-while語句求n的階乘、用靜態變量求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 組合數函數的設計與實現
函數定義是函數應用中較為關鍵的一步,因為所有的用戶自定義函數均要“先定義,后使用”。定義的目的是通知編譯系統函數返回值的類型、函數的名字、函數的參數個數與類型以及函數實現什么功能。定義函數的目的是重復使用,因此只有在程序中調用函數才能實現函數的功能。C語言程序從 main函數開始執行,自定義函數的執行通過被別的函數調用來實現。
組合數的計算問題實質是多個階乘的乘除,因此組合函數需要調用階乘函數,這就需要正確進行函數調用。函數調用的一般形式是:函數名(實際參數列表)。函數調用的方式按出現的位置有函數語句和函數表達式兩種。調用函數時使用的函數名要和定義函數時的完全一致,并且實參的個數和類型要和形參的一一對應。計算組合數時需要用到階乘函數的返回值,這種情況下,調用函數需要以表達式的成分出現,為此,組合函數的實現代碼如下。
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 斐波那契數列函數的設計與實現
主菜單中用戶輸入數字2后,將進行斐波那契數列的計算,這里設置循環會將所求項及之前所有項對應的斐波那契數一一顯示出來,設定好基線情況和一般情況,隨后用遞歸法求得各項斐波那契數。為了方便第一項主菜單設置輸入兩個數字,第二項只需一個有效數字,在主菜單的設置中,前一個數字代表項數,因此第一位填入所需斐波那契項數,第二個數字一般填1。
//函數功能:求斐波那契數列
int Fib(int k)
{int i,x;
for(i=1;i<=k;i++)
{x=Fi(i);? //調用遞歸函數Fi()計算數列第n項
printf("Fib(%d)=%d\n",i,x);}
return 0;}
//函數功能:用遞歸法計算數列中的第n項
long Fi(int n)
{if(n==0) return 0;? //基線情況
else if(n==1) return 1;? //基線情況
else return(Fi(n-1)+Fi(n-2)); } //一般情況
運行結果如圖2。
4 結論
編寫一個C語言程序解決一個實際問題,初學者往往將程序所有語句寫在main 主函數 中,這樣不利于閱讀和調試。恰當地利用函數將復雜問題分解為若干個相對簡單的子問題,每個子問題完成一項具體任務,由一個函數實現,如果已有解決子問題的函數代碼,就可以直接調用函數解決復雜問題。這樣的程序可讀性強,調試方便,也有利于提高程序代碼的利用率,實現模塊化。“函數”能夠簡化程序 ,化難為易。學習過程中,注重培養使用“函數”的習慣,正確定義和調用函數。
參考文獻:
[1] 楊泉.C語言程序設計中函數參數傳遞的研究[J].福建電腦,2020,36(12):108-109.
[2] 楊新宇,蘭全祥.C語言中遞歸的分析及應用[J].電腦知識與技術,2020,16(22):237-238,243.
[3] 張曉雯,祁薇.任務驅動的C語言函數課堂教學設計[J].電腦知識與技術,2018,14(30):129-131.
[4] 黃敏.淺析程序設計與數學的關系——C語言程序設計為例[J].重慶工貿職業技術學院學報,2007(3):37-38.
[5] 陶予祺,王卓瑜,郭雨.基于C語言的數學競賽成績管理系統設計[J].信息與電腦,2017(2):144-146.
【通聯編輯:唐一東】