东华18复试真题

第四题编程题:
题目如下:
请编写函数fun,其功能是:计算并输出给定数组(长度为9)中每相邻两个元素之平均值的平方根之和(求平方根的函数为sqrt)。

例如,
给定数组中的9个元素依次为12.0、34.0、4.0、23.0、34.0、45.0、18.0、3.0、11.0,
输出应为:s=35.951014。

注意:部分源程序存在文件prog1.c中。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

prog1.c源码如下:

 #include <stdio.h>
#include <math.h>
double fun(double  x[])
{  int i;
   double sum=0.0;
   for(i=0;i<9;i++){
   	   if(i+1<9)//防止数组越界 
   	   sum+=sqrt((x[i]+x[i+1])/2);
   }
   return sum;
   
}
NONO()
{/* 本函数用于辅助判卷,不要修改。但请不要尝试自己生成用于判卷的结果文件,投机取巧将得0分 */
  FILE *rf, *wf ; int i, j ; double s, a[9] ;
  rf = fopen("bc1.in", "r") ;
  wf = fopen("p1.out", "w") ;
  for(i = 0 ; i < 5 ; i++) {
    for(j = 0 ; j < 9 ; j++) fscanf(rf, "%lf", &a[j]) ;
    s = fun(a) ;
    fprintf(wf, "%lf\n", s) ;
  }
  fclose(rf) ; fclose(wf) ;
}

main()
{ double  s,a[9]={12.0,34.0,4.0,23.0,34.0,45.0,18.0,3.0,11.0};
  int  i;
  printf("\nThe original data is :\n");
  for(i=0;i<9;i++)printf("%6.1f",a[i]);  printf("\n\n");
  s=fun(a);
  printf("s=%f\n\n",s);
  NONO();
}

小结:今天没有考虑到数组越界问题(考场上肯定挂了)

第五题编程题
题目如下:
请编写一个函数fun,它的功能是:数组num已从小到大排序(数组元素个数为n),现给定一个数m,要求返回最接近但不大于m的元素的位置(元素位置从0开始)。

程序运行后,
如果输入的数组元素为3, 5, 8, 12, 18, 20:

如果m为8,则返回2
如果m为7,则返回1
如果m为1,则返回-1
注意:部分源程序存贮在文件prog2.c中。

要求:请衡量时间复杂度和空间复杂度,尽量设计高效算法。请在prog2.c最前面的 注释部分介绍自己的算法并分析时间复杂度。 请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

/*
请在此描述你的算法,并分析时间复杂度
*/

#include<stdio.h>

int  fun(int  num[], int  n,int m)
{

}

NONO()
{/* 本函数用于辅助判卷,不要修改。但请不要尝试自己生成用于判卷的结果文件,投机取巧将得0分 */
    FILE *rf,*wf ;
    int a[100], i, j, p, m,n ;
    rf = fopen("bc2.in", "r") ;
    wf = fopen("p2.out", "w") ;
    for(i = 0 ; i < 6 ; i++)
    {
        fscanf(rf, "%d", &n) ;
        for(j = 0 ; j < n ; j++) fscanf(rf, "%d", &a[j]) ;
        fscanf(rf,"%d", &m);
        p = fun(a, n, m);
        fprintf(wf, "%d\n", p) ;
    }
    fclose(rf) ;
    fclose(wf) ;
}

int main ()
{
    int m,n , a[100];
    int i, subscript;
	printf("请输入元素个数:");
    scanf ( "%d", &n );
	printf("请按升序输入各元素(以空格分隔):");
    for ( i=0; i < n; i++ )
    {
        scanf ( "%d", &a[i] );
    }
	printf("请输入m:");
	scanf("%d", &m);
    subscript = fun(a, n, m);
    printf("The location is: %d\n", subscript);
    NONO();
    return 0;
}

补全后的代码如下:

/*
若最小值都比m大 直接返回-1
否则 通过一个for循环遍历 当遇见比m大的值退出循环 (要不然依次比较) 最后可以求得下标
时间复杂度 o(n) 
*/

#include<stdio.h>

int  fun(int  num[], int  n,int m)//n为个数  不超过m 
{	if(num[0]>m)
	return -1;
	int i;
	for(i=0;i<n;i++){
		if(num[i]>m)
			break;
	}
	return --i;
}

NONO()
{/* 本函数用于辅助判卷,不要修改。但请不要尝试自己生成用于判卷的结果文件,投机取巧将得0分 */
    FILE *rf,*wf ;
    int a[100], i, j, p, m,n ;
    rf = fopen("bc2.in", "r") ;
    wf = fopen("p2.out", "w") ;
    for(i = 0 ; i < 6 ; i++)
    {
        fscanf(rf, "%d", &n) ;
        for(j = 0 ; j < n ; j++) fscanf(rf, "%d", &a[j]) ;
        fscanf(rf,"%d", &m);
        p = fun(a, n, m);
        fprintf(wf, "%d\n", p) ;
    }
    fclose(rf) ;
    fclose(wf) ;
}

int main ()
{m
    int i, subscript;
	printf("请输入元素个数:");
    scanf ( "%d", &n );
	printf("请按升序输入各元素(以空格分隔):");
    for ( i=0; i < n; i++ )
    {
        scanf ( "%d", &a[i] );
    }
	printf("请输入m:");
	scanf("%d", &m);
    subscript = fun(a, n, m);
    printf("The location is: %d\n", subscript);
    NONO();
    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值