问题6_1
函数
f
u
n
fun
fun 的功能是:把形参
a
a
a 所指数组中最小值放在元素
a
[
0
]
a[0]
a[0] 中,接着把
a
a
a 所指数组中最大值放在元素
a
[
1
]
a[1]
a[1] 中;再把
a
a
a 所指数组中次小值放在元素
a
[
2
]
a[2]
a[2] 中,把
a
a
a 所指数组中次大值放在元素
a
[
3
]
a[3]
a[3] ,以此类推。
例如,若形参
a
a
a 所指数组中的数据最初排列为
:
9
,
1
,
4
,
2
,
3
,
6
,
5
,
8
,
7
:9, 1, 4, 2, 3, 6, 5, 8, 7
:9,1,4,2,3,6,5,8,7 ,则按规则移动后,数据排列为
:
1
,
9
,
2
,
8
,
3
,
7
,
4
,
6
,
5
:1, 9, 2, 8, 3, 7, 4, 6, 5
:1,9,2,8,3,7,4,6,5 。形参
n
n
n 中存放
a
a
a 所指数组中数据的个数。
规定
f
u
n
fun
fun 函数中的
m
a
x
max
max 存放当前所找的最大值,
p
x
px
px 存放当前所找最大值的下标。
**思路:**求最大值和最小值,一般都是先假设一个元素最大或最小,然后通过
i
f
if
if 条件语句将该元素和其它元素进行比较操作来完成。
代码6_1
#include<stdio.h>
#define N 9
void fun(int a[], int n){
int i, j, max, min, px, pn, t;
for(i=0; i<n-1; i+=2){
max = min = a[i];
px = pn = i;
for(j=i+1; j<n; j++){
if(max<a[j]){
max = a[j];
px = j;
}
if(min>a[j]){
min = a[j];
pn = j;
}
}
if(pn!=i){
t = a[i];
a[i] = min;
a[pn] = t;
if(px==i)
px = pn;
}
if(px!=i+1){
t = a[i+1];
a[i+1] = max;
a[px] = t;
}
}
}
void main(void){
int b[N] = {9, 1, 4, 2, 3, 6, 5, 8, 7}, i;
printf("\n The orignal data:\n");
for(i=0; i<N; i++){
printf("%4d", b[i]);
}
printf("\n");
fun(b, N);
printf("\n The data after moving:\n");
for(i=0; i<N; i++){
printf("%4d", b[i]);
}
printf("\n");
}
结果6_1
问题6_2
函数
f
u
n
fun
fun的功能是:用递归算法计算斐波那契数列中第
n
n
n 项的值。 从第
1
1
1 项起,斐波那契数列为
:
1
,
1
,
2
,
3
,
5
,
8
,
13
,
21
,
⋅
⋅
⋅
:1, 1, 2, 3, 5, 8, 13, 21, ···
:1,1,2,3,5,8,13,21,⋅⋅⋅
例如,若给
n
=
5
n=5
n=5,则该项的斐波那契数值为
13
13
13。
代码6_2
#include<stdio.h>
long fun(int g){
switch(g){
case 0: return 0;
case 1:
case 2: return 1;
}
return (fun(g-1) + fun(g-2));
}
void main(){
long fib;
int n;
printf("Input n:");
scanf("%d", &n);
printf("n = %d\n", n);
fib = fun(n);
printf("fib = %d\n\n", fib);
}
结果6_2
问题6_3
某学生的记录由学号、
8
8
8 门成绩和平均分组成,学号和
8
8
8 门成绩已在主函数中给出,请编写函数
f
u
n
fun
fun ,其功能是:求出该学生的平均分,并放入记录的
a
v
e
ave
ave 成员中。
例如,学生的成绩是
:
85.5
,
76
,
69.5
,
85
,
91
,
72
,
64.5
,
87.5
:85.5, 76, 69.5,85, 91, 72, 64.5, 87.5
:85.5,76,69.5,85,91,72,64.5,87.5,则他的平均分应该为
78.875
78.875
78.875。
代码6_3
#include<stdio.h>
#define N 8
typedef struct{
char num[10];
double s[N];
double ave;
}STREC;
void fun(STREC* a){
int i;
a->ave = 0.0;
for(i=0; i<N; i++){
a->ave = a->ave + a->s[i];
}
a->ave = a->ave/N;
}
void main(void){
STREC s = {"GA005 ", 85.5, 76, 69.5, 85, 91, 72, 64.5, 87.5};
int i;
fun(&s);
printf("The %s's student data:\n", s.num);
for(i=0; i<N; i++){
printf("%4.lf\n", s.s[i]);
}
printf("\nave = %7.3f\n", s.ave);
}
注 : : :定义了一个指针类型的形参 S T R E C ∗ a STREC *a STREC∗a ,此时,引用成员的方式可以使用指向运算符,即 a − > a v e a->ave a−>ave 和 a − > s [ i ] a->s[i] a−>s[i], 也可以使用 ( ∗ a ) . a v e (*a).ave (∗a).ave 和 ( ∗ a ) . s [ i ] (*a).s[i] (∗a).s[i] 。