第四题编程题:
题目如下:
请编写函数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;
}