2022秋 C理论A_ 编程练习5 - 函数与指针

6-1 求实数和的函数

本题要求实现一个函数,求给定的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

代码段:

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

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

要求计算一元二次方程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

代码段:

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

6-3 求集合数据的均方差

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

函数接口定义:

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

 代码段:

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

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

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

计算并打印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

 代码段:

int count;
long Fib(int a)
{
    int f1,f2,f;
    if(a==1||a==2)
    {
        count++;
        return 1;
    }
    else
    {
        count++;
        return Fib(a-1)+Fib(a-2);
    }
}

 6-5 字符串加密

本题要求实现一个函数,能对一行字符串(字符串的长度<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!

 代码段:

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

 6-6 万年历显示函数

设计一个万年历,当用户输入年份和月份时,显示这个月的日历表。程序重点是这个月的第一天是星期几和这个月有几天,有了这两个值,只需通过排列,就可以显示这个日历。程序要求用户输入的年份是从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  The  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
***********************************

代码段: 

void ShowDate(int y, int m)
{
    int i;
    printf("***********************************\n");
    printf("  Sun  Mon  Tue  Wen  The  Fri  Sta\n");
    int count=GetFirstDayInTable(y,m);
    if(count!=7) 
    {
    	for(i=1;i<=count;i++)
    		printf("     ");
	}
	else count=0;
    for(i=1;i<=GetDaysofMonth(y,m);i++)
    {
        printf("%5d",i);
        count++;
        if(count==7)
        {
            printf("\n");
            count=0;
        }
    }
    if(count!=0)
    	printf("\n");
    printf("***********************************\n");
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值