【PTA-C语言】编程练习5 - 函数与指针

文章介绍了编程练习中的多个技术点,包括函数编写(求和、一元二次方程根、均方差)、递归调用(Fibonacci数列)、字符串加密和日期处理(万年历)。作者提供了详细的函数接口和示例代码,旨在提升编程技能和理解基础算法。
摘要由CSDN通过智能技术生成

6-1 求实数和的函数(分数 10)

作者 吕淑琴
单位 武汉理工大学

本题要求实现一个函数,求给定的N个实数的和。

函数接口定义:

float sum (float data[], int N );

其中给定实数存放在数组 data[]中,正整数N是数组元素个数。该函数须返回N个 data[]元素的和。

裁判测试程序样例:

#include <stdio.h>
#define MAXN 10
float sum ( float  data[], int N );
int main ()
{
   int  n, i;
   float data[MAXN];
   scanf("%d", &n);
    for ( i=0; i<n; i++ )
        scanf("%f", &data[i]);
    printf("%.2f\n", sum( data, n));
    return 0;
}

/* 请在这里填写答案 */

输入样例:

3
12.3 45.6 -67.8

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

-9.90

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

参考代码

float sum(float  data[], int N)
{
    float sum = 0;
    for (int i = 0; i < N; i++)
        sum += data[i];
    return sum;
}

6-2 求解一元二次方程实根的函数(分数 10)

作者 李民
单位 武汉理工大学

要求计算一元二次方程ax2+bx+c=0(a≠0)的根。
主函数中给出3个浮点系数a、b、c,调用函数rootOfEquation()求解方程的实根。方程的根通过指针类型的参数x1、x2传回主函数,其中x1是值较大的根,x2是值较小的根。

  1. 若方程有两个相等的实根,函数返回1;
  2. 若方程有两个不等的实根,函数返回2;
  3. 若方程无实根,函数返回0。

函数接口定义:

int rootOfEquation(double a, double b, double c, double *x1, double *x2);

裁判测试程序样例:

#include<stdio.h>
#include<math.h>
int rootOfEquation(double a, double b, double c, double *x1, double *x2);
int main()
{    double a,b,c;
     double x1,x2;
     scanf("%lf %lf %lf",&a,&b,&c);
     int flag;
     flag=rootOfEquation(a,b,c,&x1,&x2);
     if(flag==0)
         printf("方程无实根");
     else if(flag==1)
          printf("方程有两个相等的实根 x1=x2=%.2f", x1);
     else
         printf("方程有两个不等的实根 x1=%.2f,x2=%.2f", x1, x2);
     return 0;
}

/* 请在这里填写答案 */

输入样例:

1 3 2

输出样例:

方程有两个不等的实根 x1=-1.00,x2=-2.00

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

参考代码

int rootOfEquation(double a, double b, double c, double *x1, double *x2)
{
    double z=b*b-4*a*c;
    if(z<0) return 0;
    else if(z==0){
        *x1 = -b/(2*a);
        return 1;
    }
    else if(z>0) {
        *x1=(-b+sqrt(z))/(2*a);;
        *x2=(-b-sqrt(z))/(2*a);
        return 2;
    }
}

6-3 求集合数据的均方差(分数 10)

作者 孙骏
单位 武汉理工大学

本题希望输入 n (0<n<=100)个整数,求n个整数的均方差。若将 n个数的平均值记为 Avg,则均方差计算公式为:

https://images.ptausercontent.com/670949f9-0c21-4e07-b4ec-5718d3806f42.png

函数接口定义:

double Avg ( int N, int  data[] );
double StdDev( int N, int  data[] );

函数Avg计算并返回数组的平均值;函数StdDev计算并返回n个数据的均方差。
其中 N 和 data 都是用户传入的参数。 N 是要计算的数据个数; data 是传入的数组。

裁判测试程序样例:
在这里给出函数被调用进行测试的例子。例如:

#include <stdio.h>

double Avg ( int N, int  data[] );
double StdDev( int N, int  data[] );

int main()
{

  int N ,i, data[100];

  scanf("%d", &N);
    for(i=0;i<N;i++)
          scanf("%d",&data[i]);
  printf("Average = %.4f\n", Avg(N, data));
  printf("Standard Deviation = %.4f",StdDev(N,data));

  return 0;

}

/* 请在这里填写答案 */

输入样例:

10
6 3 7 1 4 8 2 9 11 5

输出样例:

Average = 5.6000
Standard Deviation = 3.0397

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

参考代码

double Avg ( int N, int data[])
{
    double sum=0;
    for(int i=0; i<N; i++)
        sum += data[i];
    return sum/N;
}

double StdDev( int N, int data[])
{
    double sum=0.0, avg=Avg(N, data);
    for(int i=0; i<N; i++)
        sum += (data[i]-avg)*(data[i]-avg);
    return sqrt(sum/N);
}

6-4 计算Fibonacci数列每一项时所需的递归调用次数(分数 10)

作者 李宁x
单位 武汉理工大学

计算并打印Fibonacci数列每一项时所需的递归调用次数,数列第一项从1开始。
要求:
1)定义表示调用次数的全局变量count;
2)定义用递归方法求Fibonacci数列的Fib()函数。

函数接口定义:

long Fib(int a);

a为大于0的正整数。

裁判测试程序样例:

#include <stdio.h>
long Fib(int a);

/* 你的代码将被嵌在这里 */

int main()
{
    int n, i, x;
    printf("Input n:");
    scanf("%d", &n);
    for (i=1; i<=n; i++)
    {
        count = 0;       //计算下一项Fibonacci数列时将计数器count清零 
        x = Fib(i);
        printf("Fib(%d)=%d, count=%d\n", i, x, count);
    }
    return 0;
}

输入样例:

3

输出样例:

Fib(1)=1, count=1
Fib(2)=1, count=1
Fib(3)=2, count=3

代码长度限制
20 KB
时间限制
1000 ms
内存限制
100 MB

参考代码

int count=0;
long Fib(int a)
{
    count++;
    if(a<3)
        return 1;
    else 
        return Fib(a-1)+Fib(a-2);
}

6-5 字符串加密(分数 10)

作者 吕淑琴
单位 武汉理工大学

本题要求实现一个函数,能对一行字符串(字符串的长度<80)加密。
加密函数采用的加密算法:如果不是英文字母,就不加密,原样显示;否则就将字母加上一个偏移值5实现加密。注意大小写英文字母分别构成一个封闭环,如字符‘w’,加密后为字符‘b’。

函数接口定义:

void cryptograp(char ch[],int n);

其中给定一行英文字符串存放在数组ch[]中,n是这行字符串的实际长度。

裁判测试程序样例:

#include<stdio.h>
#include<string.h>
void cryptograp(char ch[],int n);    //加密函数
    
int main()
{
    int count = 0;
    char text[80] = {'\0'};            //存放明文字符串
   
    gets(text);
    count = strlen(text);
    cryptograp(text,count);
    printf("加密后的密文是:\n%s\n", text);
    return 0;
}

/* 请在这里填写答案 */

输入样例:

Hello World!

输出样例:

加密后的密文是:
Mjqqt Btwqi!

代码长度限制
99 KB
时间限制
400 ms
内存限制
64 MB

参考代码

void cryptograp(char ch[],int n)
{
    for(int i=0; i<n; i++) {
        if(ch[i]>='a' && ch[i]<='u')
            ch[i] += 5;
        else if(ch[i] >='v' && ch[i]<='z')
            ch[i] -= 21;
        if(ch[i]>='A' && ch[i]<='U')
            ch[i] += 5;
        else if(ch[i]>='V' && ch[i]<='Z')
            ch[i] -= 21;
    }
}

6-6 万年历显示函数(分数 15)

作者 吕淑琴
单位 武汉理工大学

设计一个万年历,当用户输入年份和月份时,显示这个月的日历表。程序重点是这个月的第一天是星期几和这个月有几天,有了这两个值,只需通过排列,就可以显示这个日历。程序要求用户输入的年份是从1900年开始,已知1900年1月1日是星期一。
日历中每个具体的日期占5个字符宽度,右对齐,上下的分隔线分别是由35个’*’ 连字符构成,表示星期的字符是三个字符,加两个空格分隔。

函数接口定义:

void ShowDate(int y, int m);

其中,参数y是给定年,参数m是给定月,函数功能是根据给定的年月,显示该月日历。

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>
int IsLeapYear(int y);   /*判断是否闰年,细节不表*/
int GetDaysofMonth(int y, int m); /*确定某个月的天数,细节不表*/
int GetTotalDays(int y, int m); /*计算从1900年1月开始到给定年月间的天数,不包含给定月的天数,细节不表*/
int GetFirstDayInTable(int y, int m); /*计算给定年月的第一天在日历表中的位置,返回值为0对应Sun位置,返回值为6对应Sta位置,细节不表*/
void ShowDate(int y, int m); /*显示日历*/

int main()
{
    int y,m;
    
    scanf("%d%d",&y,&m);   
    ShowDate(y,m);
    return 0;
}

/* 请在这里填写答案 */

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

1949  10

输出样例:

***********************************
  Sun  Mon  Tue  Wen Thur  Fri  Sta
                                  1
    2    3    4    5    6    7    8
    9   10   11   12   13   14   15
   16   17   18   19   20   21   22
   23   24   25   26   27   28   29
   30   31
***********************************

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

参考代码

void ShowDate(int y, int m)
{
    int i, flag=0, index=0;
    int n = GetFirstDayInTable(y,m);
    int x = GetDaysofMonth(y,m);
    printf("***********************************\n");
    printf("  Sun  Mon  Tue  Wen Thur  Fri  Sta\n");
    for(i=0; i<5*n; i++)
        printf(" ");
    for(i=1; i<=x; i++) {
        if(n+i==8 && flag==0) {
            flag=1;
            index=0;
            printf("\n");
        }
        printf("%5d", i);
        if(flag && ++index%7==0)
            printf("\n");
    }
    printf("\n***********************************");
}
  • 28
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在这个实验中,有三个源程序被引用。第一个源程序是用指针变量实现数的比较,输入两个整数,并使其从大到小输出。\[1\]第二个源程序是用指针法输入12个数,然后按每行4个数输出。\[2\]第三个源程序是用函数实现数的交换,输入两个整数,并使其从大到小输出。\[3\] 在第一个源程序中,通过指针变量p1和p2来比较两个整数的大小,并使用指针变量p来交换两个整数的值。最后输出a和b的值以及最大值和最小值。\[1\] 在第二个源程序中,使用指针变量p来遍历数组a,并按每行4个数的格式输出数组中的元素。\[2\] 在第三个源程序中,使用函数as来实现两个整数的交换。通过指针变量p1和p2来传递两个整数的地址,并在函数内部交换它们的值。最后输出a和b的值以及最大值和最小值。\[3\] 这些实验都是为了练习和理解C语言指针的使用。通过这些实验,可以加深对指针的理解,并掌握指针在程序中的应用。 #### 引用[.reference_title] - *1* *2* *3* [C语言实验十一 指针(一)](https://blog.csdn.net/qq_64314976/article/details/126123133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

谛凌

本人水平有限,感谢您支持与指正

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

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

打赏作者

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

抵扣说明:

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

余额充值