基于C语言的数学菜单的设计与实现
2021-12-17严宇
严宇
摘要:函数的定义与调用是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.
【通联编辑:唐一东】