两个表达式分别用两个递归函数来实现。
创新互联建站于2013年创立,是专业互联网技术服务公司,拥有项目网站设计、成都网站建设网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元罗江做网站,已为上家服务,为罗江各地企业和个人服务,联系电话:18982081108
所以,题目中两个表达式的描述,就是告诉你不同情况下的函数返回值。
之后根据题意,主函数通过函数指针调用,函数指针就是指向函数的指针。把两个函数分别赋值给指针,再通过指针调用函数。
下面是代码:
#include stdio.h
int fn1(int n);
int fn2(int n);
int main()
{
int k=3,n=-1,(*p)(int n);
while(n0)
printf("请输入n的值(大于等于0):"),scanf("%d",n);
while(k!=1 k!=2)
printf("请选择表达式(输入1或者2):"),scanf("%d",k);
switch(k)
{
case 1:p=fn1;break;
case 2:p=fn2;break;
}
printf("通过表示式%d计算得第N项值为:%d\n",k,p(n));
return 0;
}
int fn1(int n)
{
if(n==0) return 1;
if(n==1) return 2;
return 2*fn1(n-1)+fn1(n-2);
}
int fn2(int n)
{
if(n==0) return 0;
if(n==1) return 1;
return fn2(n-1)+2*fn2(n-2);
}
第一题:
那个是ASCII编码的结果
你输入的是char类型的数据,输出的是数字类型,这里面存在一个字符到数字的转换的过程,所对应的是ASCII码的字符编码数字
首先,在你的scanf函数中,双引号区域中是没有空格的,而你输入的可是带空格的abc(a b c),这里面就有了一个需要注意的地方:
在你输入信息时候,一定要严格遵守scanf函数中的双引号区域中的格式.
别忘了,空格也算一个字符!
经过"a b c"的信息输入的过程后,计算机读到的信息是:a、空格、b。
根据ASCII编码的定义:
a=97
空格=32
b=98
故输出的结果是:97,32,98
第二题:
本题与第一题相似,都是使用字符和ASCII编码之间的切换
回车(换行符)的ASCII编码是10
使用scanf函数输入字符数据时,由于是字符类型,那么输入数据之后的空格也将被当做字符数据输入,下一次读取时,数据完的回车字符就会被读入,自动读取,而那个乱码就是回车字符的表示。
如果你只想输入一个字符,可以使用:getch函数,使用方法:c=getch();
首先,这两段代码的作用是一样的。都是令int型指针pa指向int型变量a。
唯一的区别是代码一将a的地址赋给pa是在pa定义时进行的,称为初始化pa。而代码二是使用赋值语句完成的这一相同操作。
wela和dula在两段代码里,都有类似的不同:先0后P0赋值再1,或者是先1后P0赋值再0,这样的差别对应的就是输出波形的时序不同。如果碰到对时序要求高的,会导致异常结果。
到底是什么意思呢?
像这样吗?
struct
SLIST
a,b,c,*p;
a.data='a';
b.data='b';
c.data='c';
p=a;
a.next=b;
b.next=c;
c.next='\0';
if(p==‘\0’)//这样应该是0而不是O
printf(“Linklist
is
null!\n”);/*链表为空(只有头结点)*/
else
/*链表非空*/
{
printf(“head”);
do
{printf(“-%d”,p-data);/*输出当前结点数据域中的值*/
p=p-next; /*p指向下一个结点*/
}
while(p!=‘\0’); /*未到链表尾,继续循环*/
printf(“-end\n”);
这个函数的主要功能是求给定的参数num是否是一个素数。
那么什么是一个素数呢,就是只能被他本身和1整除的数,因此我们就有了一个思路,用所有小于num并且大于2的数去除num,如果结果是整数那么这个数就不是素数,而在这段代码里面用了%也就是求模,也就是求余数的运算方式,然后判断是否为0来判断这个数是否是素数,本质上和用除法求商是否为整数是一致的。
最后这段代码实际上效率还是不够高,实际上我们不需要用所有大于2小于num的数来除num,而只需要用大于2小于根号num的数来除以num就可以了,原因自然是如果他能够被一个大于根号num的数除尽,那么必然会得到一个小于根号num的商,而这个数在之前已经计算过了,所以重复计算了。