实验六 一维数组, y N' Z2 p8 Z6 V: m7 z
【目的与要求】
. q" ?7 |- F" R' Q$ i 1.掌握一维数组的定义、赋值和输入输出的方法;
7 u2 b% a# T! C6 A2 f5 J* R 2.掌握字符数组的使用;
3 g5 d6 S0 q7 O4 g& R 3.掌握与数组有关的算法(例如排序算法)。) } a8 a% p0 O' p9 O3 [
【上机内容】% g2 V7 ^ L- m q$ t0 j4 P/ B
【一般示例】" N3 l! o$ f, ~1 e. O3 t3 m
【例1】在键盘上输入N个整数,试编制程序使该数组中的数按照从大到小的次序排列。
- ]7 S. R8 x$ d# H+ H$ M 分析:C中数组长度必须是确定大小,即指定N的值。排序的方法有多种,我们取出其中两种作为参考。$ C w! y3 N! B
方法一:起泡排序
7 n, S K0 b8 J, g/ f0 z 从第一个数开始依次对相邻两数进行比较,如次序对则不做任何操作;如次序不对则使这两个数交换位置。第一遍的(N-1)次比较后,最大的数已放在最后,第二遍只需考虑(N-1)个数,以此类推直到第(N-1)遍比较后就可以完成排序。/ s% m3 L# w& C$ C+ m- c/ I
源程序如下:+ a; ? S3 D8 v8 x2 V# O
#define N 10
. n8 U# p$ s( S #include"stdio.h"# x9 z/ R2 |$ {$ B5 U" s" p# A
main()
2 G. N2 m. d ^+ h' [ {% O8 I7 I$ R% \$ o x
int a[N],i,j,temp;& }3 |# D5 K& g
printf("please input %d numbers\n",N);
- v" Y5 x8 c; l0 Q for(i=0;i scanf("%d",&a);1 B7 q* _, G- e) H1 B9 W$ K8 _7 ]6 F
for(i=0;i for(j=0;j {
& d. A5 R: s M: w: t: j if(a[j]>a[j+1])
+ g8 l' v2 T; }% o6 U {% @' N" }- Q6 h
temp=a[j];
0 W3 S- l2 O. A" Y a[j]=a[j+1];& ?* [! L1 K' H+ J7 j; `6 f
a[j+1]=temp;: T+ ?" T4 e' s S3 z( A4 C4 |0 u
}" ` m* e3 R' G' |) Y% E7 R
}+ k, A8 H: \) v' F7 M5 U0 F% k1 m
printf("the array after sort:\n");
5 m$ B& K9 J7 A. k for(i=0;i printf("]",a);
. N7 P$ i; D; Q) @" p+ N, m }
1 t. _+ v% K3 X& C! G& z; U 方法二:选择排序7 m) g D8 Z! v5 Y
首先找出值最小的数,然后把这个数与第一个数交换,这样值最小的数就放到了第一个位置;然后,在从剩下的数中找值最小的,把它和第二个数互换,使得第二小的数放在第二个位置上。以此类推,直到所有的值从小到大的顺序排列为止。
6 F4 O' M" o) Y% k/ E1 g# U #include"stdio.h"2 `- B$ m. v/ e0 `) v8 o7 o2 y
#define N 10$ Y* i; `5 D. W5 U3 \ O
main()
3 F9 X/ i- G4 f. N' Z8 X5 S {
/ v3 K o% M+ ~" f" M int a[N],i,j,r,temp;
) r1 L3 m* M& Y7 X printf("please input %d numbers\n",N);
8 e3 y6 j' S3 O3 R* k f for(i=0;i scanf("%d",&a);$ b+ B2 x( r* W# `7 v
for(i=0;i { r=i;* l) s4 b. x4 x8 P3 b
for(j=i+1;j if(a[j] r=j; p9 ]5 g( ?' d Y* b
if(r!=i)) q. l8 b6 r* b6 f% P
{# A- _; x# r1 q: r7 G
temp=a[r];
8 ^" K1 p) s/ W: A' j; S4 L a[r]=a;
0 u9 a9 X7 u% ? a=temp;, ?7 V' m, A+ e
}( u! f9 H! v8 `7 J0 O. o P% `
}* S- e0 ^3 V* v P0 X
printf("the array after sort:\n");$ C! x" a7 G3 N1 T
for(i=0;i printf("]",a);
9 Z9 J6 e7 ?" x4 } printf("\n");
7 k3 H+ P, ^; L: y' ?9 x; r3 Q& F }
* ?1 M' ]- Z0 B4 N% \ 【例2】青年歌手参加歌曲大奖赛,有10个评委对她的进行打分,试编程求这位选手的平均得分(去掉一个最高分和一个最低分)。
7 P% k2 z! E4 s4 L 分析:这道题的核心是排序。将评委所打的10个分数利用数组按增序(或降序)排列,计算数组中除第一个和最后一个分数以外的数的平均分,其中排序部分这里用选择法实现。
, [( O1 T% W; L3 t main()
0 P! G7 U+ c* Y, D" e. n E. C7 A {int i,j,min;
5 L1 }! z( j+ O- n float temp,ave=0;
2 A' l1 q; F6 v" { float a[11];$ d+ V) r& E" N( R* @# Z
printf("\n输入评委所打的分数:\n");
8 | \& K# s6 X& p0 d
& V( ^ h5 ]2 K for(i=1;i |