【例5.4】找出一组整数中的最大数。
程序内容如下:
1 #include<stdio.h>
2 int main()
3 {
4 int n,i,x[100],max;
5 printf("n=");
6 scanf("%d",&n);
7 for(i=1;i<=n;i++)
8 {
9 printf("No.%d:",i);
10 scanf("%d",&x[i]);
11 }
12 max=x[1];
13 for(i=2;i<=n;i++)
14 if(max<x[i])
15 max=x[i];
16 printf("max=%d\n",max);
17 return 0;
18 }
程序结果如图5.4所示:
图5.4 例5.4程序结果图
【例题中关键问题说明】
用变量n表示数据个数,用一维数组x[i](i=1,2,…,n)表示这一组数,用max表示最大数。传统流程图如图5.5所示。
程序中,在输入数据时应尽可能地多给出一些提示。根据本例程序,请读者考虑下列问题的程序设计:
(1)找出一组整数中的最大数及其位置。
(2)找出一组整数中的最大数、最小数及其位置。
图5.5 例5.4的传统流程图
【例5.5】采用“冒泡法”对10个整数按由小到大的顺序排序。
程序内容如下:
1 #include<stdio.h>
2 #define N 10
3 int main()
4 {
5 int a[N+1],i,j,t;
6 for(i=1;i<=N;i++)
7 {
8 printf("No.%d:",i);
9 scanf("%d",&a[i]);
10 }
11 for(i=1;i<=N-1;i++)
12 for(j=1;j<=N-i;j++)
13 if(a[j]>a[j+1])
14 {
15 t=a[j];a[j]=a[j+1];a[j+1]=t;
16 }
17 for(i=1;i<=N;i++)
18 printf("%d",a[i]);
19 return 0;
20 }
程序结果如图5.6所示:
图5.6 例5.5程序结果图(www.xing528.com)
【例题中关键问题说明】
(1)用数组a[i](i=0,1,…,9)表示这10个数,i、j、t作中间变量。
(2)排序过程:①比较第一个数与第二个数,若a[0]>a[1],则交换;然后比较第二个数与第三个数;以此类推,直至第n-1个数和第n个数比较完成为止——第一趟冒泡排序,结果最大的数被安置在最后一个元素位置上。②对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在第n-1个元素位置上。③重复上述过程,共经过n-1趟冒泡排序后,排序结束。
【例5.6】采用“选择法”对10个整数按由小到大的顺序排序。
程序内容如下:
1 #define N 10
2 #include<stdio.h>
3 int main()
4 {
5 int a[N+1],i,j,min,l;
6 for(i=1;i<=N;i++)
7 {
8 printf("No.%d:",i);
9 scanf("%d",&a[i]);
10 }
11 for(i=1;i<=N-1;i++)
12 {
13 min=a[i];l=i;
14 for(j=i+1;j<=N;j++)
15 if(min>a[j])
16 {
17 min=a[j];
18 l=j;
19 }
20 a[l]=a[i];
21 a[i]=min;
22 }
23 for(i=1;i<=N;i++)
24 printf("No.%d:%d\n",i,a[i]);
25 return 0;
26 }
程序结果如图5.7所示:
图5.7 例5.6程序结果图
【例题中关键问题说明】
(1)排序过程:①从第1个数开始到第10个数找出最小数min,然后与第1个数交换;②从第2个数开始到第10个数找出最小数min,然后与第2个数交换;以此类推,直到从第9个数开始到第10个数找出最小数min,然后与第9个数交换;共查找(10-1)次最小数并交换,排序结束。
(2)程序中第二个for循环语句是一个双重循环结构,它是该程序的核心,该程序段较难理解,请仔细阅读。
另外,程序中的
for(j=i+1;j<=N;j++)
if(min>a[j])
{
min=a[j];
l=j;
}
可改为:
for(j=i+1;j<=N;j++)
min>a[j]?min=a[l=j]:1;
这里用条件表达式代替了语句,请仔细分析、思考。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。