PTA-函数传参之指针、引用

6-1 总秒数转时、分、秒

作者 李祥

单位 湖北经济学院

请编写函数,将当天的总秒数转换成时间(时、分和秒数)。

函数原型

void ToHms(int *hour, int *minute, double *second, double total);

说明:hour、minute 和 second 分别为指示时、分和秒数的指针,total 为当天的总秒数。函数根据总秒数 total 计算时、分和秒数,分别保存至 hourminute 和 second 所指示的变量中。

裁判程序

#include <stdio.h> #include <math.h> void TimeOutput(int hour, int minute, double second); void ToHms(int *hour, int *minute, double *second, double total); int main() { int h, m; double s, t; scanf("%lg", &t); ToHms(&h, &m, &s, t); TimeOutput(h, m, s); return 0; } void TimeOutput(int hour, int minute, double second) { ...(略)... } /* 你提交的代码将被嵌在这里 */

输入样例
29405.5

输出样例
08:10:05.50

解答:

void ToHms(int *hour, int *minute, double *second, double total)
{
    int time = (int)total;
    *hour = time/3600;
    *minute = time%3600/60;
    *second = total-*hour*3600-*minute*60;
}

6-2 三整数排序(升序)

作者 李祥

单位 湖北经济学院

请编写函数,对三个整数按升序排序。

函数原型

void IntSortAsc3(int *x, int *y, int *z);

说明:参数 x、y 和 z 为指示三个整型变量的指针,函数值对这三个整型变量进行排序,使 x、y 和 z 所指变量的值按由小到大的顺序排列。

裁判程序

#include <stdio.h> void IntSwap(int *x, int *y); void IntSortAsc3(int *x, int *y, int *z); int main() { int a, b, c; scanf("%d%d%d", &a, &b, &c); IntSortAsc3(&a, &b, &c); printf("%d %d %d\n", a, b, c); return 0; } void IntSwap(int *x, int *y) { ...(略)... } /* 你提交的代码将被嵌在这里 */

输入样例
15 -27 36

输出样例
-27 15 36

要求:调用前面作业中的 IntSwap 函数交换两个整数的值。

 解答:

void IntSortAsc3(int *x, int *y, int *z)
{
    if(*x>*y)
    {
        IntSwap(x,y);
    }
    if(*x>*z)
    {
        IntSwap(x,z);
    }
    if(*y>*z)
    {
        IntSwap(y,z);
    }
}

6-3 使用函数找出数组中的最大值

作者 张泳

单位 浙大城市学院

本题要求实现一个找出整型数组中最大值的函数。

函数接口定义:

int FindArrayMax( int a[], int n );

其中a是用户传入的数组,n是数组a中元素的个数。函数返回数组a中的最大值。

裁判测试程序样例:

#include <stdio.h> #define MAXN 10 int FindArrayMax( int a[], int n ); int main() { int i, n; int a[MAXN]; scanf("%d", &n); for( i=0; i<n; i++ ){ scanf("%d", &a[i]); } printf("%d\n", FindArrayMax(a, n)); return 0; } /* 请在这里填写答案 */

输入样例:

4
20 78 99 -14

输出样例:

99

解答:

int FindArrayMax( int a[], int n )
{
    int max = a[0];
    for(int i=0;i<n;i++)
    {
        if(max<a[i])
        {
            max = a[i];
        }
    }
    return max;
}

6-4 指针做参数: 求解鸡兔同笼。

作者 苑丽红

单位 长春理工大学

鸡兔同笼是中国古代的数学名题之一。 大约在1500年前,《孙子算经》中就记载了这个有趣的问题。书中是这样叙述的:
今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?这四句话的意思是:
有若干只鸡兔同在一个笼子里,从上面数,有35个头,从下面数,有94只脚。问笼中各有多少只鸡和兔?
本题要求编写函数,利用指针做参数求解鸡兔同笼问题。头和脚的数目从键盘输入。

函数接口定义:

void fun ( int h,int f,int *p,int *q );

其中h和f由主函数传入,代表头和脚的数目, (假定输入数据都合理)。 函数fun可求出鸡和兔的数目,并在主函数输出。

裁判测试程序样例:

在这里给出函数被调用进行测试的例子。例如: #include <stdio.h> void fun ( int h,int f,int *p,int *q ); int main() { int h,f,x,y ; scanf("%d%d", &h, &f); fun (h ,f, &x,&y ); //x、y代表鸡和兔的数目 printf("cocks=%d,rabbits=%d", x,y); return 0; } /* 您填写的代码将嵌入这里,注意无需写主函数,只需完成fun的设计 */

输入样例:

35 94

输出样例:

cocks=23,rabbits=12

 解答:

void  fun ( int h,int f,int *p,int *q )
{
    for(int i =0;i<=h;i++)
    {
        for(int j = 0;j<=h-i;j++)
        {
            if((i+j==h)&&(2*i+4*j==f))
            {
                *p=i;
                *q=j;
            }
        }
    }
}

6-5 指针做参数: 求两数的和、积、平均值。

作者 苑丽红

单位 长春理工大学

本题求两整数的和、积、平均值。要求用原型是 void fun(int x, int y, int *p, int *q,float *s) 的函数来实现。

函数接口定义:

void fun(int x, int y, int *p, int *q,float *s) ;

其中x和y是需要计算的两个数,p、 q、s指向的变量保存计算结果。

裁判测试程序样例:

在这里给出函数被调用进行测试的例子。例如: #include <stdio.h> void fun(int x, int y, int *p, int *q, float *s) ; int main() { int x,y,sum,product; float aver; scanf("%d%d", &x, &y); fun (x ,y, &sum,&product,&aver ); printf("%d,%d,%.1f", sum,product,aver); return 0; } /* 请在这里填写答案 */

输入样例:

31 2

输出样例:

33,62,16.5

解答:

void fun(int x, int y, int *p, int *q,float *s)
{
    *p=x+y;
    *q=x*y;
    *s=(float)(x+y)/2;
}

6-6 实现两数据值的交换

作者 王宇

单位 集美大学诚毅学院

本题要求实现一个函数,该函数完成主调函数传递的数据实现值的交换。

函数接口定义:

在这里描述函数接口。例如: void swap( int *x,int *y );

在这里解释接口参数。例如:其中 x 和 y都是用户传入的参数。 当x的间访值大于y的间访值; x与y指向空间的值发生交换。

裁判测试程序样例:

在这里给出函数被调用进行测试的例子。例如: #include <stdio.h> void swap( int *x,int *y ); int main() { int a,b; scanf("%d%d",&a,&b); printf("%d %d\n",a,b); swap( &a,&b ); //如果a>b,则交换,否则不交换 printf("%d %d\n",a,b); return 0; } /* 请在这里填写答案 */

输入样例:

在这里给出一组输入。例如:

2 1

输出样例:

在这里给出相应的输出。例如:

2 1
1 2

在这里给出一组输入。例如:

1 2

输出样例:

在这里给出相应的输出。例如:

1 2
1 2

 解答:

void swap( int *x,int *y )
{
    if(*x>*y)
    {
        int temp = *y;
        *y=*x;
        *x = temp;
    }
}

6-7 引用作函数形参交换两个整数

作者 李廷元

单位 中国民用航空飞行学院

设计一个void类型的函数Swap,该函数有两个引用类型的参数,函数功能为实现两个整数交换的操作。

裁判测试程序样例:

#include <iostream> using namespace std; /* 请在这里填写答案 */ int main() { int a, b; cin >> a >> b; Swap(a, b); cout << a << " " << b << endl; return 0; }

输入样例:

3 5

输出样例:

5 3

解答:

void Swap(int &a,int &b)
{
    int temp = b;
    b=a;
    a=temp;
}

6-8 买一送一(引用传参、引用作为函数返回值)

作者 徐婉珍

单位 广东东软学院

某商店开展买一送一活动,购买两件商品时,只需支付价格较高的商品的金额。要求程序在输入两个商品的价格后,输出所应支付的金额,请根据裁判程序编写函数cut,将代码补充完整。

裁判测试程序样例:

#include <iostream> using namespace std; //请在此处添加代码 int main(){ float a,b; cin>>a>>b; cut(a,b)=0; cout<<"to pay:"<<a+b<<endl; return 0; }

输入样例:

在这里给出一组输入。例如:

239 180

输出样例:

在这里给出相应的输出。例如:

239

 解答:

float &cut(float &a,float &b)
{
    if(a>b)
    {
        return b;
    }
    else{
        return a;
    }
}

  • 26
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值