pta模拟题C语言函数题(6-1 弹球距离、6-2 多项式求值、6-3 求自定类型元素序列的中位数、6-4 统计个位数字、6-5 折半查找、6-6 计算最长的字符串长度、6-7 空心的数字金字塔)

6-1 弹球距离

设有一个球从高度为h米的地方落下,碰到地面后又弹到高度为原来p倍的位置,然后又落下,再弹起,再落下…。请编写函数求初始高度为h的球下落后到基本停下来(高度小于给定阈值TOL)时在空中所经过的路程总和。

函数接口定义:

double dist( double h, double p );

其中h是球的初始高度,p是球弹起高度与弹起前落下高度的比值;函数dist要返回球下落后到基本停下来时在空中所经过的路程总和。注意:当弹起的高度小于裁判程序定义的常数TOL时,弹起的距离不计算在内。

裁判测试程序样例:

#include <stdio.h> #define TOL 1E-3 double dist( double h, double p ); int main() { double h, p, d; scanf("%lf %lf", &h, &p); d = dist(h, p); printf("%.6f\n", d); return 0; } /* 你的代码将被嵌在这里 */

输入样例:

1.0 0.4

输出样例:

2.331149
square=2.666667
cube=4.000000
sin=1.416147
double dist(double h,double p)
{
    double s = 0;
    while(1)
    {
        s=s+h;
        if(h*p>=TOL)
        {
            s=s+h*p;
            h=h*p;
        }
        else 
            break;
    }
    return s;
}

 

6-2 多项式求值

本题要求实现一个函数,计算阶数为n,系数为a[0] ... a[n]的多项式f(x)=∑i=0n​(a[i]×xi) 在x点的值。

函数接口定义:

double f( int n, double a[], double x );

其中n是多项式的阶数,a[]中存储系数,x是给定点。函数须返回多项式f(x)的值。

裁判测试程序样例:

#include <stdio.h> #define MAXN 10 double f( int n, double a[], double x ); int main() { int n, i; double a[MAXN], x; scanf("%d %lf", &n, &x); for ( i=0; i<=n; i++ ) scanf("%lf", &a[i]); printf("%.1f\n", f(n, a, x)); return 0; } /* 你的代码将被嵌在这里 */

输入样例:

2 1.1
1 2.5 -38.7

输出样例:

-43.1
2.331149
double f(int n ,double a[],double x){
    double  sum = 0;
    for(int i = 0;i<=n ;++i){
        sum += a[i] * pow(x,i); 
    }
    return sum;
}

6-3 求自定类型元素序列的中位数

本题要求实现一个函数,求N个集合元素A[]的中位数,即序列中第⌊(N+1)/2⌋大的元素。其中集合元素的类型为自定义的ElementType

函数接口定义:

ElementType Median( ElementType A[], int N );

其中给定集合元素存放在数组A[]中,正整数N是数组元素个数。该函数须返回NA[]元素的中位数,其值也必须是ElementType类型。

裁判测试程序样例:

#include <stdio.h> #define MAXN 10 typedef float ElementType; ElementType Median( ElementType A[], int N ); int main () { ElementType A[MAXN]; int N, i; scanf("%d", &N); for ( i=0; i<N; i++ ) scanf("%f", &A[i]); printf("%.2f\n", Median(A, N)); return 0; } /* 你的代码将被嵌在这里 */
 

输入样例:

3
12.3 34 -5

输出样例:

12.30
ElementType Median( ElementType A[], int N )
{
   int gap;
    for(gap=N/2;gap>0;gap/=2)
    {
        for(int i = gap;i<N;i++)
        {
            ElementType t = A[i];
            int j ;
            for(j=i-gap;j>=0&&t<A[j];j-=gap)
            {
                A[j+gap]=A[j];
            }
            A[j+gap]=t;
        }
    }
    return A[N/2];
}

 

6-4 统计个位数字

本题要求实现一个函数,可统计任一整数中某个位数出现的次数。例如-21252中,2出现了3次,则该函数应该返回3。

函数接口定义:

int Count_Digit ( const int N, const int D );

其中ND都是用户传入的参数。N的值不超过int的范围;D是[0, 9]区间内的个位数。函数须返回ND出现的次数。

裁判测试程序样例:

#include <stdio.h> int Count_Digit ( const int N, const int D ); int main() { int N, D; scanf("%d %d", &N, &D); printf("%d\n", Count_Digit(N, D)); return 0; } /* 你的代码将被嵌在这里 */

输入样例:

-21252 2

输出样例:

3
int Count_Digit ( const int N, const int D )
{
     int i, j, b = 0;
    i = N;
    if (i < 0)
        i = -i;
    do
    {
        j = i % 10;
        if (j == D)
            b++;
        i /= 10;
    } 
    while (i > 0);
    return b;
}

6-5 折半查找

给一个严格递增数列,函数int Search_Bin(SSTable T, KeyType k)用来二分地查找k在数列中的位置。

函数接口定义:

int Search_Bin(SSTable T, KeyType k)

其中T是有序表,k是查找的值。

裁判测试程序样例:

#include <iostream> using namespace std; #define MAXSIZE 50 typedef int KeyType; typedef struct { KeyType key; } ElemType; typedef struct { ElemType *R; int length; } SSTable; void Create(SSTable &T) { int i; T.R=new ElemType[MAXSIZE+1]; cin>>T.length; for(i=1;i<=T.length;i++) cin>>T.R[i].key; } int Search_Bin(SSTable T, KeyType k); int main () { SSTable T; KeyType k; Create(T); cin>>k; int pos=Search_Bin(T,k); if(pos==0) cout<<"NOT FOUND"<<endl; else cout<<pos<<endl; return 0; } /* 请在这里填写答案 */

###输入格式:

第一行输入一个整数n,表示有序表的元素个数,接下来一行n个数字,依次为表内元素值。 然后输入一个要查找的值。

###输出格式:

输出这个值在表内的位置,如果没有找到,输出"NOT FOUND"。

输入样例:

5
1 3 5 7 9
7

输出样例:

4

输入样例:

5
1 3 5 7 9
10

输出样例:

NOT FOUND
 int Search_Bin(SSTable ST,KeyType key)
 {
     int low = 1;
     int high = ST.length;
     while(low <= high)
     {
         int mid = (low + high)/2;
         if(key == ST.R[mid].key)
         {
             return mid;
         }else if(key < ST.R[mid].key)
         {
            high = mid - 1;
         }
         else
         {
            low = mid + 1;
         }
    }
     return 0;
  } 

6-6 计算最长的字符串长度

本题要求实现一个函数,用于计算有n个元素的指针数组s中最长的字符串的长度。

函数接口定义:

int max_len( char *s[], int n );

其中n个字符串存储在s[]中,函数max_len应返回其中最长字符串的长度。

裁判测试程序样例:

#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAXN 10 #define MAXS 20 int max_len( char *s[], int n ); int main() { int i, n; char *string[MAXN] = {NULL}; scanf("%d", &n); for(i = 0; i < n; i++) { string[i] = (char *)malloc(sizeof(char)*MAXS); scanf("%s", string[i]); } printf("%d\n", max_len(string, n)); return 0; } /* 你的代码将被嵌在这里 */

输入样例:

4
blue
yellow
red
green

输出样例:

6
int max_len( char *s[], int n )
{
    int max = strlen(s[0]);
    int j = 0;
    for(j = 0;j<n;++j)
    {
        if(max <strlen(s[j]))
            max = strlen(s[j]);
    }
    return max;
}

6-7 空心的数字金字塔

本题要求实现一个函数,输出n行空心的数字金字塔。

函数接口定义:

void hollowPyramid( int n );

其中n是用户传入的参数,为[1, 9]的正整数。要求函数按照如样例所示的格式打印出n行空心的数字金字塔,请注意,最后一行的第一个数字前没有空格。

裁判测试程序样例:

#include <stdio.h> void hollowPyramid ( int n ); int main() { int n; scanf("%d", &n); hollowPyramid ( n ); return 0; } /* 你的代码将被嵌在这里 */

输入样例:

5

输出样例:

    1
   2 2
  3   3
 4     4
555555555
void hollowPyramid( int n )
{
    int i,j,k,f;
    for(i=1;i<n;i++)
    {
        for(k=1;k<=n-i;k++)
            printf(" ");
            printf("%d",i);
        if(i==1)
            printf("\n");
        if(i!=1)
        {
            for(j=1;j<(i-1)*2;j++)
            printf(" ");
            printf("%d\n",i);
        }
    }
    for(i=1;i<2*n;i++)
        printf("%d",n);
}

6-8 用二分法解方程

设曲线方程f(x)=0在区间[a,b]上连续,如果f(a)f(b)<0,则方程在区间内至少存在一个根r,使得f(r)=0. 现在要求用二分法编写一个求解各类一元方程方程在给定区间解的通用函数,调用该函数来求下列三个方程在区间[a,b]上的解.

(1) x2−5=0

(2) x3−5=0

(3) sinx=0

要求:编写的函数要能判断在给定区间上是否有解,如果有解按照二分法进行求解,如果无解函数返回一个实数值-32768作为无解的标志。

函数接口定义:

double bisection(double (*f)(),double a,double b)

其中 参数f是一个指向函数的指针变量。参数 a 和b是解区间的两个端点,函数的返回值为方程在区间上的解。

裁判测试程序样例:

#include <stdio.h> #include <math.h> double quadratic(double x) /*一个一元二次函数f*/ { return x*x-5; } double cubic(double x) /*一个一元三次函数f*/ { return x*x*x-5; } /* 你编写的二分法解方程的函数放在这里 */ int main() { double x; double a,b; scanf("%lf%lf",&a,&b); //输入解区间左右端点的值 x=bisection(quadratic,a,b); //解一元二次方程 printf("%.3f\n",x); x=bisection(cubic,a,b); //解一元三次方程 printf("%.3f\n",x); x=bisection(sin,a,b); //求解方程sinx=0 printf("%.3f\n",x); return 0; }

输入样例1:

以下输入的两个数是区间[a,b]的端点

1.0 4.0

输出样例1:

2.236
1.710
3.142

输入样例2:

以下输入的两个数是区间[a,b]的端点

4.0 6.0

输出样例2:

-32768.000
-32768.000
-32768.000
double bisection(double (*f)(),double a,double b)
{
    if(f(a)*f(b)>0) 
    {
        return -32768;
    }
    double m;
    while(b>a)
    {
        m=(a+b)/2;
        if(fabs(f(m))<1e-15)
        {
            return m;
        }
        if(f(m)*f(a)>0) 
        {
            a=m;
        }
        else 
        {
            b=m;
        }
    }
}

 

6-9 求一元函数定积分

一元函数f(x)在区间[a,b]上定积分∫ab​f(x)dx的几何意义是被积函数与横坐标轴以及直线x=a和直线x=b围成的曲边形的面积。依据几何意义求定积分的方法是将这个区域按x轴方向等分成若干个细小的条状区域,每个小区域近似于一个梯形(如图所示),计算出所有小梯形面积之和就可计算出区域面积的近似值。区间划分的越细求得的结果越精确。

ch6-8.png

现在要求用梯形法编写一个求一元定积分的函数,调用该函数求解以下三个函数在给定区间的定积分。
(1) y=x2
(2) y=x3
(3) y=sinx

函数接口定义:

double integration(double (*p)(),double a,double b,int n);

其中 a 和 b 是积分区间的端点,n是对积分区间的等分数量。 p 是一个指向函数的指针。

裁判测试程序样例:

#include <stdio.h> #include <stdlib.h> #include <math.h> double square(double x) { return x*x; } double cube(double x) { return x*x*x; } /*你编写的积分函数嵌入在这里*/ int main() { /*求平方函数在区间[0,2]上的定积分*/ printf("square=%f\n",integration(square,0,2,10000)); /*求立方函数在区间[0,2]上的定积分*/ printf("cube=%f\n",integration(cube,0,2,10000)); /*求正弦函数在区间[0,2]上的定积分*/ printf("sin=%f\n",integration(sin,0,2,10000)); return 0; }

输入样例:

0 2 100000

输出样例:

square=2.666667
cube=4.000000
sin=1.416147
double integration(double (*p)(), double a, double b, int n) 
{
    double h = (b - a) / n;
    double sum = 0.5 * ((*p)(a) + (*p)(b));
    for (int i = 1; i < n; i++) 
    {
        sum += (*p)(a + i * h);
    }
    return sum * h;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不懂c语言的小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值