机试题1、给定程序中,函数fun的功能是根据形参i的值返回某个函数的值。当调用正确时, 程序输出:
x1=5.000000, x2=3.000000, x1*x1+x1*x2=40.000000
【知识点详解】
1. 函数调用与返回值:
在C语言中,函数是一种可重用的代码块,可以通过函数名来调用执行。在给定的试题中,`fun` 函数根据输入的整数 `i` 返回不同的函数值。`fun` 函数内部使用了条件判断语句 `if...else` 来决定调用哪个函数。当 `i` 等于1时,函数应该调用 `f1`,即 `return f1(x)`;当 `i` 不等于1时,函数应调用 `f2`,即 `return f2(x, y)`。因此,填空处应填写如下:
```c
double fun(int i, double x, double y){
if (i==1)
return f1(x); // 正确填写:f1(x)
else
return f2(x, y); // 正确填写:f2(x, y)
}
```
2. 字符串比较与结构体数组排序:
C语言中的字符串比较通常使用 `strcmp` 函数,它会比较两个字符串的字节序列,直到找到不同字符或者遇到结束符为止。在本例中,我们需要对结构体数组 `student` 按照姓名进行升序排序。`strcmp` 函数接收两个字符串参数,并返回一个整数值,表示它们的相对顺序。因此,在 `fun` 函数中,我们比较 `a[i].name` 和 `a[j].name`:
```c
void fun(struct student a[], int n){
int t; // 用于交换元素的临时变量
for (i=0; i<n; i++) // 遍历整个数组
for (j=i+1; j<n; j++) // 对相邻元素进行比较
if (strcmp(a[i].name, a[j].name) > 0) // 使用strcmp比较姓名
{
t = a[i]; // 保存当前元素
a[i] = a[j]; // 将较小的元素放到前面
a[j] = t; // 将较大的元素放到后面
}
}
```
3. 计算平均值与筛选大于平均值的数:
计算数组的平均值,需要将所有元素加起来然后除以元素的个数。大于平均值的数需要另外存储,这里可以使用另一个数组 `y`。假设原数组名为 `x`,元素个数为 `N`,则计算平均值的函数可能如下:
```c
void calc_average_and_above(double x[], double y[], int N, double *avg){
double sum = 0;
for (int k = 0; k < N; k++)
sum += x[k];
*avg = sum / N;
int count = 0;
for (int k = 0; k < N; k++)
if (x[k] > *avg)
y[count++] = x[k];
}
```
在这个例子中,`calc_average_and_above` 函数接受原数组 `x`,结果数组 `y`,数组长度 `N`,以及一个指向平均值的指针 `avg`。它首先计算平均值,然后遍历数组 `x`,将大于平均值的元素添加到 `y` 中。
总结,本题主要涉及C语言的函数调用、字符串比较、结构体数组操作以及计算平均值和筛选数据等知识点。理解这些概念对于编写C语言程序至关重要。