第6周函数题集

一. PTA测试题

PTA:5.1小结测试题

第一版:

#include <stdio.h>
#include <math.h>
int main(){
   
	double pi,e;
	scanf("%lf",&e);
	
	double funpi(double a);
	pi=funpi(e);
	printf("pi = %f",pi);
	
	return 0;
}
double funpi(double a){
   
	double m=1.0,n=0.0,b=1.0;
	double flag=1.0;
	do{
   
		b=b+2.0;
		flag=-flag;
		n=flag*1.0/b;
		m=m+n;
	}while(fabs(n)>=a);
	    m=m+n;
	    m=m*4;
	    return m;
}

运行结果:
在这里插入图片描述
看出来错哪里了吗?
dowhile循环结束后就不应该加m=m+n;了,在循环内已经加过了。如果是用while循环才用加。(当时有点背题了,不带脑子了)
感觉现在做题还是慢得不行啊,一是自己的脑子不够集中,二是思考的时候思路不连贯,太零散。
正确版

#include <stdio.h>
#include <math.h>
int main(){
   
	double pi,e;
	scanf("%lf",&e);
	
	double funpi(double a);
	pi=funpi(e);
	printf("pi = %f",pi);
	
	return 0;
}
double funpi(double a){
   
	double m=1.0,n=0.0,b=1.0;
	double flag=1.0;
	do{
   
		b=b+2.0;
		flag=-flag;
		n=flag*1.0/b;
		m=m+n;
	}while(fabs(n)>=a);
	    m=m*4;
	    return m;
}

在这里插入图片描述
PTA:5.3小结测试题
R1-2 全局变量只能定义在程序的最前面,即第一个函数的前面。( )错
错因总结
忘了吧,全局变量定义在函数外即可,定义在程序头,程序尾,或程序中间。

R2-1
下列程序的输出结果是( D )。正确答案:C

    # include <stdio.h>
    int f(int n)
    {
         static int k, s;

        n--;
        for(k=n; k>0; k--)
        s += k;
        return s;
    }
    int main(void)
    {
         int k;

        k=f(3);
        printf("(%d,%d)", k, f(k));

        return 0;
    }

A.(6,6) B.(6,12) C.(3,6) D.(3,3)
错因总结:我是先算出了f(3)=3,认为既然k=3后,f(k)应该也是等于3。然而此时的f(3)已经不等于3了,因为k的值已经是3,而k又为静态常量。所以此时的f(3)应当等于6.
2-2
函数f定义如下,执行语句“sum=f(5)+f(3);”后,sum的值应为( B )。正确答案:C

int f(int m)
{
     static int i=0;
   int s=0;

   for(;i<=m;i++)
     s+=i;

   return s;
}

A.16 B.21 C.15 D.8
错因分析:
算完f(5)后,i=5,算f(3),i=5>3, f(3)都进不了循环。
PTA函数最终测试题
选择题:
R2-1
下列程序的输出结果是(D)。

fun(int a, int b, int c)
{
      c = a * b;  }
int main(void)
{
   
      int c;

      fun(2, 3, c);
      printf(%d\n”, c);

      return 0;
}

(1分)

A.0 B.1 C.6 D.无法确定

题目解析:函数只能传数值,不能传变量。主函数中的函数c与定义中的函数c不相通,不能用名字相同的变量c传递。这题的printf c的值应该是int c之后随便塞进来的。

R2-4
在C语言程序中,若对函数类型未加显式说明,则函数的隐含类型为(C)。记住啊
A.void B.double C.int D.char

R2-5
以下不正确的说法是(D )。C,形参只能是变量
A.形参应与对应的实参类型一致

B.实参可以是任何类型

C.形参可以是常量、变量或表达式

D.实参可以是常量、变量或表达式

填空题:
R5-1
输出 80 到 120之间的满足给定条件的所有整数。条件为构成该整数的每位数字都相同,要求定义和调用函数is(n)判断整数n的每位数字是否都相同,若相同则返回1,否则返回0。请将函数补充完整。 运行示例: 88 99 111

在#include <stdio.h>
int main(void)
{
      
    int i;    
    int is(int n); 

    for(i = 80; i <= 120; i++)
        if(  is(i)  )
            printf("%d ", i);
    printf("\n");

    return 0;
}
int is(int n)
{
      
    int old, digit;

    old = n % 10;
    do{
   
        digit = n % 10;
        if( digit!=old//填空)   return 0;
           old=digit;//填空
           n = n / 10;
    }while(n != 0);
    
   return 1; //填空  
}

做题情况分析
是的,我居然第一,第二个空都没有填出来。
因为脑子里想的是 digit==old,但是这又和后面的return 0;不相搭配。想到了 digit!=old,但是第一个 old = n % 10,digit = n % 10得出来得都是最后一位数,又觉得这样写没意义。
结果分析:
看来答案后发觉第一轮循环是真的没用,但是后面的数值交换后就有用了。懂了,本题的设计思想就是第一轮走空(可以走空不能走错噢,循环体给后面的几轮数值用。

R5-2
输入一个整数,将它逆序输出。要求定义并调用函数reverse(long number),它的功能是返回number的逆序数。例如reverse(12345)的返回值是54321。请将函数补充完整。运行示例如下:

-123 (输入整数-123)

-321 (逆序后输出-321)
自己填的第一版:

long reverse(long number)
{
    
    int flag;

    
int res
 ;
    flag = number < 0 ? -1 : 1;
    if( flag==-1// )  number = - number;
    while(number != 0){
   
        res = number%10;//这里错了 答案:res = number%10+res;
        number /= 10;//
    }
    return flag*res;
}

这题是一整个数一起输出,不是单位输出的。

二.PTA习题集

7-29 二分法求多项式单根
给我重做
在这里插入图片描述
写题过程:
第一版:完全没有考虑两端是根

#include <stdio.h>
double a1,a2,a3,a0;//定义全局变量,差点把这4个数当函数写,发现这种函数写不出来
double f(double x);

int main(){
   
	double a,b,mid;
	scanf("%lf %lf %lf %lf",&a1,&a2,&a3,&a0);
	scanf("%lf %lf",&a,&b);
 
   if(f(a)*f(b)<0){
   
   	mid=(a+b)/2;
   	while(f(mid)!=0){
   //据题目意思,f(mid)为0时,mid为根
   	    if(f(mid)*f(b)<0){
   
   	   	    a=mid;
		}
        else if(f(mid)*f(a)<0){
   
   	     	b=mid;
		}
   		mid=(a+b)/2;

   }
   printf("%.2f",mid);
   	
   }
   
   
   return 0;
	
}
double f(double x){
   
	double result;
	result=a1*x*x*x+a2*x*x+a3*x+a0;
	return result;
}

在这里插入图片描述
第二版:

#include <stdio.h>
double a1,a2,a3,a0;
double f(double x);

int main(){
   
	double a,b,mid;
	scanf("%lf %lf %lf %lf",&a1,&a2,&a3,&a0);
	scanf("%lf %lf",&a,&b);
 
   if(f(a)*f(b)<=0){
   
   	mid=(a+b)/2;
     if (f(a) == 0) //判断两端根部分 
        {
     
            printf("%.2f",&a);  
            return 0;  
        }  
        if (f(b) == 0)  
        {
     
            printf("%.2f", b);  
            return 0;  
        }  
   	while(f(mid)!=0){
   
   		
   	    if(f(mid)*f(b)<0){
   
   	   	    a=mid;
		}
        else if(f(mid)*f(a)<0){
   
   	     	b=mid;
		}
   		mid=(a+b)/2;

   }
   printf("%.2f",mid);
   	
   }
   
   
   return 0;
	
}
double f(double x){
   
	double result;
	result=a1*x*x*x+a2*x*x+a3*x+a0;
	return result;
}

在这里插入图片描述
第三版:能通过测试的版本

#include <stdio.h>
double a1,a2,a3,a0;
double f(double x);

int main(){
   
	double a,b,mid;
	scanf("%lf %lf %lf %lf",&a1,&a2,&a3,&a0);
	scanf("%lf %lf",&a,&b);
 
   if(f(a)*f(b)<=0){
   
   	mid=(a+b)/2;
     if (f(a
  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值