C语言编程:matlab编写函数文件一个计算此函数的递归函数。帮忙给出运算结果,谢谢

51CTO旗下网站
1.7.3 C++递归函数
《数据结构、算法与应用:C++语言描述(原书第2版)》第1章C++回顾,本章我们将讨论C++语言的一些特性。因为本章不是C++入门,所以没有介绍诸如赋值语句、if语句和循环语句(如for和while)等基本结构。本节为大家介绍C++递归函数。
作者:王立柱/刘志红 译来源:机械工业出版社| 13:01
1.7.3 C++递归函数
使用C++可以编写递归函数。正确的递归函数必须包含基础部分。每一次递归调用,其参数值都比上一次的参数值要小,从而重复调用递归函数使参数值达到基础部分的值。
例1-1[阶乘] 程序1-29是一个C++递归函数,它利用公式(1-1)来计算阶乘n!。基础部分是n&1。考虑factorial(2)的计算过程。为了计算在else语句中的表达式2*factorial(1),将factorial(2)的计算挂起,然后调用factorial(1)。当factorial(2)的计算被挂起时,程序状态(即局部变量和传值形参的值、与引用形参绑定的值、代码执行位置等)被保留在递归栈中。当factorial(1)的计算结束时,程序状态恢复。factorial(1)的返回值是1。接下来继续计算factorial(2),即计算2*1。
程序1-29 计算n!的递归函数
int&factorial(int&n) &{//&计算n! &&&&if&(n&=&1)&return&1; &&&&else&return&n&*&factorial(n&-&1); &}&
在计算factorial(3)时,遇到else语句,factorial(3)的计算被挂起,先计算出factorial(2)。我们已经知道factorial(2)的计算过程,其结果为2。当factorial(2)返回时,factorial(3)的计算继续,计算的是3*2。
因为程序1-29与公式(1-1)相似,所以它们的正确性是等价的。
例1-2 模板函数sum(程序1-30)对数组元素a[0]至a[n-1](简记为a[0:n-1])求和。当n=0时,函数返回值是0。
程序1-30 累加数组元素a[0:n-1]
template&T&T&sum(T&a[],&int&n) &{//&返回数值数组元素a[0:n-1]的和 &&&&T&theSum&=&0; &&&&for&(int&i&=&0;&i&&;&i++) &&&&&&&theSum&+=&a[i]; &&&&return&theS &}&
程序1-31是对数组元素a[0:n-1]求和的递归函数。当n等于0时,和为0;当n大于0时,n个元素的和是前n-1个元素的和加上最后一个元素。
程序1-31 累加数组元素a[0:n-1]的递归代码
template&T&T&rSum(T&a[],&int&n) &{//&返回数组元素a[0:n-1]的和 &&&&if&(n&&0) &&&&&&&return&rSum(a,&n-1)&+&a[n-1]; &&&&return&0; &}&
例1-3[排列] 我们常常要从n个不同元素的所有排列中确定一个最佳的排列。例如,a、b和c的排列有abc、acb、bac、bca、cba和cab。n个元素的排列个数是n!。
为输出n个元素的所有排列,编写非递归的C++函数比较困难,但是编写递归函数就不那么困难了。设E={e1,&,en}是n个元素的集合,求E的元素的所有排列。令Ei表示从E中去除第i个元素ei以后的集合,令perm(X)表示集合X的元素所组成的所有排列,令ei.perm(X)表示在perm(X)中的每个排列加上前缀ei之后的排列表。例如,E={a,b,c},E1={b,c},perm(E1)=(bc,cb),e1.perm(E1)=(abc,acb)。
当n=1时,是递归基础部分。这时的集合E只有一个元素e,因此只有一个排列:perm(E)=(e)。当n&1时,perm(E)是一个表:e1.perm(E1),e2.perm(E2),e3.perm(E3),&,en.perm(En)。这个定义是用n个集合perm(X)来定义集合perm(E),其中每个X包含n-1个元素,它成为递归步骤。既有基础部分,又有递归部分,这是一个完整的递归定义。
根据上述递归定义,当n=3且E=(a,b,c)时,有perm(E)=a.perm({b,c}),b.perm({a,c}),c.perm({b,a})。同样,perm({b,c})=b.perm({c}),c.perm({b})。因此,a.perm({b,c})=ab.perm({c}),ac.perm({b})=ab.c,ac.b=(abc,acb)。同理,b.perm({a,c})=ba.perm({c}),bc.perm({a})=ba.c,bc.a=(bac,bca)且c.perm({b, a })=cb.perm({a}),ca.perm({b})= cb.a,ca.b= (cba,cab)。因此perm(E)=(abc,acb,bac,bca,cba,cab)。
注意,a.perm({b,c})实际上是两个排列:abc和acb,其中a是它们的前缀,perm({b,c})是它们的后缀。同样,ac.perm({b})表示前缀为ac、后缀为perm({b})的排列。
程序1-32把上述perm(E)的递归定义转变成一个C++函数。这个函数输出的排列具有如下特征:其前缀为list[0:k-1],后缀为list[k:m]。调用permutations(list,0,n-1),输出list[0:n-1]的所有n!个排列。在这个调用中,k=0,m=n-1。这时输出的排列是前缀为空、后缀为list[0:n-1]的排列。当k=m时,仅有一个后缀list[m],这时输出的仅是一个排列list[0:m]。当k&m时,执行else语句。令E表示list[k:m]的所有元素,Ei表示从E中去除元素ei=list[i]之后的集合。for循环的第一个swap把ek和ei交换,即list[k] = ei,list[i] = ek。然后调用permutations计算ei.perm(Ei)。第二个swap把list[k:m]恢复到第一个swap调用之前的状态。
程序1-32 使用递归函数生成排列
template&T&void&permutations(T&list[],&int&k,&int&m) &{//&生成list[k:m]的所有排列 &&&&if&(k&==&m)&{//&list[k:m]&仅有一个排列,输出它 &&&&&&&copy(list,&list+m+1, &&&&&&&&&&&&&&&&&&ostream_iterator(cout,&&&)); &&&&&&&cout&&; &&&&&&&&&&&&&&&&} &&&&else&&//&list[k:m]有多于一个的排列,递归地生成这些排列 &&&&&&&&&&for&(int&i&=&k;&i&=&m;&i++) &&&&&&&&&&{ &&&&&&&&&&&&&swap(list[k],&list[i]); &&&&&&&&&&&&&permutations(list,&k+1,&m); &&&&&&&&&&&&&swap(list[k],&list[i]); &&&&&&&&&&} &}&
图1-3显示了程序1-32的处理过程,其中k=0,m=2,list[0:2]=[a,b,c]。图1-3显示的是每一次调用permutations之后以及第二次调用swap之后的list[0:2]的布局。无阴影部分表示list[0:k-1],阴影部分表示list[k:m]。数组外的数字是布局的编号。在执行permutations(list,0,2)的过程中,图的每一条边都经过两次:一次是在for循环中调用函数permutations,另一次是从函数permutations返回。
从布局1开始。for循环的第一个swap调用(swap(list[0],lint[0]))对数组没有改变;布局2是在for循环中调用permutations之后(permutations(lint,1,2))的数组状态。从布局2走到布局3(swap(list[1],list[1]),permutations(list,2,2)),即排列abc被输出,因为k=m。输出布局3之后返回,然后执行for循环的第二个swap语句,结果是回到布局2。从布局2走到布局4,排列acb被输出。然后往上返回直到又可以继续。我们回到布局2,然后回到布局1。从布局1我们走到布局5和布局6。整个过程经历的布局顺序是1,2,3,2,4,2,1,5,6,5,7,5,1,8,9,8,10,8,1。
19.编写非递归程序计算n!。测试你的代码。
20.1)编写递归函数计算斐波那契数(Fibonacci)Fn。测试你的代码。
2)证明对于1)中编写的代码,当计算Fn且n&2时,Fi的计算多于一次。
3)编写非递归函数计算斐波那契数(Fibonacci)Fn。对每一个斐波那契数,你的代码应该只计算一次。测试你的代码。
21.考察在下面的公式(1-4)中定义的函数f,其中n是非负整数。
1)使用公式(1-4)手算f?(5)和f?(7)。
2)确定函数的基础部分和递归部分。证明重复应用递归部分可以把等式右侧的f表达式转为基础部分。
3)编写一个C++递归函数计算f?(n)。测试你的代码。
4)使用2)的证明编写C++非递归函数计算f?(n),不能使用循环。测试你的代码。
22.[阿克曼函数(Ackermann&s Function)] 公式(1-5)定义的是阿克曼函数。其中,i和j是大于等于1的整数。
1)使用公式(1-5)手算A(1,2)、A(2,1)和A(2,2)。
2)确定函数定义中的基础部分和递归部分。
3)编写C++递归函数计算A(i,?j)。测试你的代码。
23.[最大公约数(Greatest Common Divisor, GCD)] 当两个非负整数x和y都是0的时候,它们的最大公约数是0。当两者至少有一个不是0的时候,它们的最大公约数是可以除尽二者的最大整数。因此,gcd(0,0)=0,gcd(10,0)=gcd(0,10)=10,而gcd(20,30)=10。求最大公约数的欧几里得算法(Euclid&s Algorithm)是一个递归算法,据说出现在公元前375年,或许是最早的递归算法实例。它的定义由下面的公式(1-6)给出
在公式(1-6)中,mod是模数运算子(modulo operator),它相当于C++的求余操作符%。x mod y是x/y的余数。
1)用公式(1-6)手工计算gcd(20,30)和gcd(112,42)。
2)确定函数定义的基础部分和递归部分。证明反复应用递归部分可以把公式右侧的gcd表达式转变为基础部分的表达式。
3)编写一个C++递归函数计算gcd(x,?y)。测试你的代码。
24.编写一个递归模板函数,确定元素x是否属于数组a[0:n-1]。
25.[子集生成方法(Subset Generation)] 编写一个C++递归函数,输出n个元素的所有子集。例如,三元素集{a,b,c}的子集是{}(空集),{a},{b},{c},{a,b},{a,c},{b,c},{a,b,c}。这些子集用0/1组成的代码序列来表示分别是000,100,010,001,110,101,011,111(0表示相应的元素不在子集中,1表示相应的元素在子集中)。因此,你的程序输出长度为n的0/1序列即可。
26.[格雷码(Gray Code)] 两个代码之间的海明距离(Hamming distance)是对应位不等的数量。例如,100和010的海明距离是2。一个(二进制)格雷码是一个代码序列,其中任意相邻的两个代码之间的海明距离是1。练习25的三位代码序列不是格雷码。而三位代码序列000, 100, 110, 010, 011, 111, 101, 001是格雷码。这个代码序列也有一个特性,第一个代码和最后一个代码只有一位二进制数不同,即海明距离是1。在代码序列的一些应用中,从一个代码到下一个代码的代价取决于它们的海明距离。因此我们希望这个代码序列是格雷码。格雷码可以用代码变化的位置序列简洁地表示。对上面的三位格雷码序列,这个位置序列是1, 2, 1, 3, 1, 2, 1。令g(n)是一个n元素的格雷码的位置变化序列。公式(1-7)是g(n)的递归定义。
1)使用公式(1-6)手算g(4)。
2)确定函数定义的基础部分和递归部分。证明反复应用递归部分可以把公式右侧的g表达式转变为基础部分的表达式。
3)编写一个C++递归函数计算g(n)。测试你的代码。
喜欢的朋友可以添加我们的微信账号:
51CTO读书频道二维码
51CTO读书频道活动讨论群:
【责任编辑: TEL:(010)】&&&&&&
大家都在看猜你喜欢
热点热点头条头条热点
24H热文一周话题本月最赞
讲师:95669人学习过
讲师:41363人学习过
讲师:170745人学习过
精选博文论坛热帖下载排行
本书是关于Acegi、CAS的权威教程,是Java/Java EE安全性开发者的必备参考书。无论是Java EE安全性编程模型的背景和基础知识,还是Acegi、CA...
订阅51CTO邮刊请帮我看一下我的这个C语言程序哪里错了/* 编写计算m的n次方的递归函数,并写出主函数进行测试*/_百度知道
请帮我看一下我的这个C语言程序哪里错了/* 编写计算m的n次方的递归函数,并写出主函数进行测试*/
#include &stdio.h&
#include &stdlib.h&
/* 编写计算m的n次方的递归函数,并写出主函数进行测试*/
int factor(int n ,int m)
answer=factor(n-1,m)*m;
我有更好的答案
&int&factor(int&n&,int&m)&{&&int&&&if(n==0)//&----------------&&return&1;&&else&&&{answer=factor(n-1,m)*m;&&return&&&&}&}int&main(int&argc,&char&*argv[])&{&int&factor(int&n,int&m);&int&n,m;&scanf(&%d%d&,&n,&m);&printf(&%d&,factor(n,m));&&return&0;}
采纳率:65%
来自团队:
计算m的n次方用得着递归么?用乘法循环n次不就行了么?递归效率低、耗内存,不建议用!
为您推荐:
其他类似问题
递归函数的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。C语言编程:用函数递归法求Fibonacci数列的前n项,谁能帮我?
C语言编程:用函数递归法求Fibonacci数列的前n项,谁能帮我?
09-08-13 &
#include &stdio.h& #define COL 10 //一行输出10个 long scan() { //输入求fibonacci函数的第N项
printf(&Input the N = &); scanf(&%d&,&n);
} long fibonacci(int n) { //fibonacci函数的递归函数 if (0==n||1==n) { //fibonacci函数递归的出口 return 1; } else { return fibonacci(n-1)+fibonacci(n-2); //反复递归自身函数直到碰到出口处再返回就能计算出第n项的值 } } int main(void) { int i,n; n = scan(); printf(&Fibonacci数列的前%d项\n&, n); for (i=0; i&n;) //输出fibonacci函数前n项每项的值 { printf(&%-10ld&,fibonacci(i++)); //调用递归函数并且打印出返回值 if(i%COL==0) { //若对COL取余等于0就换行,也就是控制每行输出多少个, //而COL=10就是每行输出10个 printf(&\n&); } } printf(&\n&); return 0; }
2回答者: wubenhua2008 - 试用期 一级  
请登录后再发表评论!关于一个C语言计算器的逻辑分析与高级功能实现_橄榄树之白华_新浪博客
关于一个C语言计算器的逻辑分析与高级功能实现
本题中已知的参考源代码只能实现加减乘除的基本运算,然而想要快速实现增加高级算术运算函数的添加在大致观察函数形式后是可以做到的,这会在后面提到。但是透彻的理解该程序的逻辑还是最根本的方法。
首先需要大致了解主函数结构,不复杂:先初始化存放表达式的缓冲字符数组,屏幕打印一些欢迎信息后使用for制作了一个无尽循环(功能是使计算器可在进行一次计算后进行下一次运算,直至用户主动退出为止)。在一次运算循环过程中,将用户输入的字符串一次写入到缓冲字符数组内直至换行符为止,并将数组中最后一个字符的后一位写为结束符;此时调用eatspaces函数对字符串进行格式化,去除可能输入的空格,根据格式化后的数组是否无有效内容来选择是结束程序还是调用expr函数来计算并输出结果。
此外,被调用的函数还有double term(char * str, int
*pindex)用来计算多项式中一项的值,double number(char * str, int
*pindex)用来识别多项式某一项中单独的一个数,以及char * extract(char *
str,int * index)遇到括号则优先处理括号内的表达式。首先介绍如何快速分析解决该问题。
高级运算功能的快速实现
注意到总体上的调用关系是expr→term→number→extract,其对应的优先级也从低到高:加减→乘除→算术因子→→(括号内的)算术因子,。这里extract(对应括号内的)算术因子,与前者之间并不是完全的从属关系,是因为extract函数涉及对主计算函数expr的调用,是递归结构。所以从快速做题的角度来看要加入高级函数结构中应该加一环:加减→乘除→算术函数→算术因子→→(括号内的)算术因子。所以定位至number函数中判断数字起始点的isdigit函数前加入对新定义的mfunc函数的调用。当然需要一个判断条件用islower或isupper函数判断是否可能是函数名,可能是则转入mfunc函数进行判断及选择。
在mfunc函数中同样需要初始化缓冲字符串数组buffer[MAX]与存储初始工作位置至bufindex,没有使用指针所以只是个局部变量与前面的buffer不冲突;初始化fname以存储函数名,一行存储一个函数名;接着初始化行数i、列数j、匹配字符数k以及满足条件时的行数t;将接下来用islower函数判断取出的字符串与数组的每行进行逐位比较(首先转化所有大写字母为小写),完全匹配则将该函数的当前行数存储至变量t。根据t值在switch语句中选择调用对应的算术函数计算并返回至number函数即可。
值得一提的是,在调用算术函数时,是对函数后的一个算术因子进行计算,所以需要递归调用number函数。同时其形式为mathfunction(number(str,pindex));是单目运算,此时当前工作位置pindex已经移到mathfunction函数后的第一个算术因子处,想要进行双目运算的话则需要重新取前面的number,比较繁琐,比较简洁的方法是在term函数计算乘除之前同样用if判断是否需要进行双目运算如乘方取余等,双目分别是value和number(str,index),根据对应法则计算即可。这也保证了双目运算函数的优先级仍然是在乘除运算之前的。这样就基本上实现了功能的添加。
前后计算器的逻辑分析
虽然前面介绍了如何快速解决问题,但是我们有理由相信,算法的逻辑永远是我们应该关注的核心点。严谨分析其逻辑过程也有助于我们深化对程序乃至C语言的理解。文章开头已经分析过主函数的结构,接下来按函数来分别分析每个函数的原理。(附上的思维导图是按照执行的顺序来制作的,建议用来辅助理解函数间关系。)
一、eatspace函数
在主函数调用eatspace函数时传入的参数是含有空格的字符串,这里首先初始化会用到的移动字符所需的用于确定地址的增量i、j;下一步通过while和if语句实现通过指针对buffer的操作(while判断条件已经包含了自增与赋值操作)。如果遇到字符则不改变,遇到空格则用后面的字符替换空格。这就实现了“吃空格的功能”,即对输入字符串的格式化。如果用户输入的只有回车或者空格,那么操作后的buffer[0]为结束符,返回主函数时下一行的if(!buffer[0])成立,主函数直接返回0,程序结束。
二、expr函数
本函数是用来负责处理表达式的计算主函数,在这里初始化的value和index将被后面的所有函数通过指针来进行处理,这也实现了跨函数的操作。首先调用term函数得到第一项的值,在使用一个无尽循环进行项与项之间的叠加。在该循环中,如果到了字符串尾部则返回已计算出的值,如果是加(或减)则与后一项的值相加(或相减)成为新的Value,是其它的以外情况则报错。
三、term函数
Term函数:用于计算多项表达式中的单项。首先通过调用number函数获取这一项中第一个数的值,然后根据数字后的运算符进行双目函数运算及乘除。最后返回value的值。请注意,我在原版的基础上加了乘方、取余函数,以及:
if(islower(*(str+(*pindex)))||isupper((*(str+(*pindex)))))
&&&&&&&value*=mfunc(str,pindex);
这是为了保证输入如3sin(X)这样的表述形式等价于3*sin(X)。
这就是term函数的思路,不复杂。在知道了各函数间的逻辑关系的前提下,当你抛开复杂的符号去分析函数的时候,你会发现expr→term→number→mfunc→extract的结构原理都是统一的,此时按照自己的想法添加功能甚至是改造原有功能就变得很简单。
四,number函数
同上,在取数字的时候判断是否有括号,有的话调用extract函数取出括号内的内容。值得注意的是,此处递归调用了主运算函数expr()计算括号内子表达式的值。若非括号而的确是数字,则根据位数及是否有小数点将这个以字符串形式存储的数转化为双精度浮点型值,并返回。此时我们得到了真正可以用于计算的数,而不是用户输入的字符。
在判断时,于括号的检查之后、小数点检查之前我加入高级算术运算函数的函数名检查,如果匹配则调用增加的mfunc函数计算函数值。
当然,理解结构之后,细节上算法的处理也是得仔细琢磨的。接下来以extract函数和mfunc函数为例来阐述。
五、extract函数
1.&&&&&初始化函数内缓冲字符串存放数组。
2.&&&&&初始化一个指针,指向用于返回的子表达式的首字符地址,置空。
3.&&&&&初始化整形变量numl存储发现的左括号数。
4.&&&&&初始化bufindex变量记录被调用时传入的表达式在内存中的地址(首地址)。
5.&&&&&执行循环:
(1).&将传入的字符串在当前检查到的位置处存放的内容存储在缓冲区的第个区域,其中是当前检查到的地址与首地址的差;
(2).&根据缓冲区当前最后一个字符进行选择:
(2.1)如果是右括号:
&&&&&&&&&&&&&&
(2.1.1)如果此时记录到的左括号只有一个,那么:
&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&将最后的右括号替换成结束符;
&&&&&&&&&&&&&&&&&&&&&&将检查地址向后移一位;
&&&&&&&&&&&&&&&&&&&&&&动态分配与最小表达式字符数相同的字节的空间并将空间的首地址返回给字符型的pstr指针;
&&&&&&&&&&&&&&&&&&&&&&如果pstr中由于某些原因为存入有效地址,那么:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&报错,直接退出整个程序;
&&&&&&&&&&&&&&&&&&&&&&将buffer中存储的字符串复制到为其分配的pstr指向的内存空间中;(此时buffer中已经存储了全部的子表达式)
&&&&&&&&&&&&&&&&&&&&&&返回pstr;(使得number函数中psubstring也指向该地址)
&&&&&&&&&&&&&&&&&&&&&&&&&&&
(2.1.2)如果此时记录到的左括号不止一个,那么:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&减少一个需要匹配的左括号;
&&&&&&&&&&&&&&&&&&&&&结束是右括号的case;
&&&&&&&&&&&&&&&&&&&&
(2.2)如果是左括号,那么:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&增加待解决的左括号数;
&&&&&&&&&&&&&&&&&&&&&结束时左括号的case;
&&&&&&&整个do循环的条件是while(*(str+
(*pindex)++) !=
'\0'),条件中已经实现了每检查一个字符,则移动至下一位置进行检查。直到结束符为止。
&&&&&&&而如果到结束符为止extract函数仍旧没能匹配所有括号并返回最小括号内的子表达式的话,则报错,终止程序;
以上是extract函数找出最小子表达式的过程。值得强调的是,在所有的函数中,都存在着逐个识别字符串中的字符并将有意义的几个字符转化为可计算的量的过程。简单来说,逐个检查+字符串转化的过程是贯穿整个程序的,这就是前面提到的各函数间的统一性。所以,“逐个”就表现在所有函数中的++(*pindex),而字符串的转化过程才是这些函数的真正功能区别所在。
也就是说,接下来我们自己设计的mfunc函数也应该遵循这样的原则。于是:
六、mfunc函数
在高级算术运算函数中:
同样地,初始化缓冲区;
定义一个多行五列的字符型二位数组fname来存放各函数名;(我试过用一维数组,例如fname[3]={‘sin’,’cos’,’tan’},但是事实是每个位置由于字符串压栈的顺序存储的都是函数名中最后一个字母,故只能使用二维数组);
使用局部变量bufindex存储起始检查位置;
定义i、j控制行列,k存储字符匹配数目,t转储匹配成功时的行数(也就是函数序号);
While循环控制对字母的读取直到数字或括号等其它字符
&&&&&&&&&&&&&&在循环内,转换大写为小写(格式化,允许用户输入大写字母);
&&&&&&&并将传入的表达式存至缓冲区
&&&&&&&&&&&&&&当前检查到的字符位置后移,继续循环检查;
退出while循环后,此时已经经过++(*pindex)处理,(*pindex)-bufindex对应函数最后一个字母存储地址的后一位,设为结束符;
进入for循环检查函数名的匹配:
&&&&&&&&&&&&&&此时buffer这个字符型数组中存储的是函数名称,那么如果每换一列都有buffer[j]==
fname[i][j],则说明函数名匹配;
&&&&&&&&&&&&&这时候k存储的字符匹配数目加一;
&&&&&&&&&&&&&等到k==3即三个字母都匹配时,可以确定输入的函数了,将行数(也就是函数序号)转储至t并结束循环;
&&&&&&&&&&&&&当然如果某行函数名只匹配一个字母,例如asin,acos,atan的首字母就相同,为了不互相干扰,在一行循环过后,匹配数目要归零;
现在开始根据t的值调用math.h库中对应的函数:(在此处我一开始试图直接用switch(buffer),但是switch()结构中条件表达式的类型必须是整数,故能作用在int和比int范围下的数字型数据类型:int,short,char,byte。&long和String类型是不行的。所以才使用了前面使用二维数组检查匹配的方法)
&&&&&&&&&&&&&此处根据行数调用对应函数即可;
&&&&&&&&&&&&&默认出现其他情况时(如没有函数匹配)报语法错误并退出程序;
另外,前面提到过,在进行算术函数运算时,此时当前工作位置pindex已经移到mathfunction函数后的第一个算术因子处,想要进行双目运算的话则需要重新取前面的number,比较繁琐。但是对于即任意底数的对数函数来说:1.它是一个双目运算;2.math.h头文件中也没有现成的函数可用,该头文件中的log函数其实对应数学运算中的ln函数,即a为自然
e。那么当用户输入log(a,b)的时候只能用换底公式处理。3.对该双目函数的输入格式控制也比较麻烦。4.函数名为字符串,不像乘方、取余那样可以用单个字符代替并可置于term函数中。这样就不得不另辟方法了。
我是这样解决的:
在mfunc函数中遇到对于log的选择时调用mlog函数,该函数的特别作用就是进行格式输入控制,当且仅当用户输入格式为log(doublea,
double b)时再能用换底公式计算出该值。
当然,当前的程序中可使用的函数有连乘、乘方、取余、三角函数、反三角函数、梯度函数、对数函数、向上(下)取整函数、绝对值、开方。不过还不是很全,之后我会继续完善。
到这里,整篇文章关于逻辑的分析就结束了。说到底,想要彻底理解这样一个看似简单的计算器,最重要的还是逻辑、逻辑、逻辑。
附件:逻辑思维导图​
思维导图
​​
博客等级:
博客积分:0
博客访问:302
关注人气:0
荣誉徽章:C语言编写一个求n阶乘的函数,在主函数中输入n,调用函数求n阶乘。。谢谢_百度知道
C语言编写一个求n阶乘的函数,在主函数中输入n,调用函数求n阶乘。。谢谢
我有更好的答案
#include&stdio.h&int Fun(int n){
int result = 0;
result = Fun(n-1)*n; }int main(){
int n = 0,
printf(&pls input your num:&);
scanf(&%d&, &n);
result = Fun(n);
printf(&n's factorial is %d\n&, result);}
采纳率:34%
int jc(int x) { return x==1?1:jc(x-1)*x; }
可以编一个完整的么?我直接运行试一下。。。新手,不好意思,,,,谢谢
int jc(int x) { return x==1?1:jc(x-1)*x; } #include &stdio.h&int main() {puts(&输入一个数&);scanf(&%d&, &x);printf(&它的阶乘是%d\n&, jc(x));return 0;}
我是学生。。。jc,我们还没有学,不过,你的很好。。。呵呵。。。谢谢
没学过函数吗……#include &stdio.h&int main() {int r = 1,puts(&输入一个数&);scanf(&%d&, &x);while(x&0) r*= x--;printf(&它的阶乘是%d\n&, r);return 0;}
本回答被提问者采纳
//因C语言数据类型限制,不能做大数的阶乘运算//n的值超过22结果会不准确#include &stdio.h&double jc( int n ){
double rs=1 ;
for( i=1;i&=n;i++ )
rs *=}int main(){
printf(&input n:&);
scanf(&%d& , &n );
printf(&%d!=%.0lf\n& , n, jc(n) );
return 0;}
#include&stdio.h&fun(int n){int i,sum=0,t=1;for(i=1;i&=n;i++){t*=i;sum+=t;}printf("the result is : %d\n",sum);return 0;}main(){printf("please input a number:\n");scanf("%d",&n);fun(n);}
fun,我们还没有学过。谢谢啊。。。真心感谢!!
你不是要调用函数吗?fun只是取的名字,你可以随便取。不一定是这个
其他1条回答
为您推荐:
其他类似问题
您可能关注的内容
阶乘的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。}

我要回帖

更多关于 用函数编程计算两整数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信