【目的與要求】
1.掌握一維數組的定義、賦值和輸入輸出的方法;
2.掌握字符數組的使用;
3.掌握與數組有關的算法(例如排序算法)。
【上機內容】
【一般示例】
【例1】在鍵盤上輸入N個整數,試編制程序使該數組中的數按照從大到小的次序排列。
分析:C中數組長度必須是確定大小,即指定N的值。排序的方法有多種,我們取出其中兩種作為參考。
方法一:起泡排序
從第一個數開始依次對相鄰兩數進行比較,如次序對則不做任何操作;如次序不對則使這兩個數交換位置。第一遍的(N-1)次比較后,最大的數已放在最后,第二遍只需考慮(N-1)個數,以此類推直到第(N-1)遍比較后就可以完成排序。
源程序如下:
#define N 10
#include”stdio.h”
main()
{
int a[N],i,j,temp;
printf(“please input %d numbersn”,N);
for(i=0;i<N;i++)
scanf(“%d”,&a[i]);
for(i=0;i<N-1;i++)
for(j=0;j<N-1-i;j++)
{
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
printf(“the array after sort:n”);
for(i=0;i<N;i++)
printf(“%5d”,a[i]);
}
方法二:選擇排序
首先找出值最小的數,然后把這個數與第一個數交換,這樣值最小的數就放到了第一個位置;然后,在從剩下的數中找值最小的,把它和第二個數互換,使得第二小的數放在第二個位置上。以此類推,直到所有的值從小到大的順序排列為止。
#include”stdio.h”
#define N 10
main()
{
int a[N],i,j,r,temp;
printf(“please input %d numbersn”,N);
for(i=0;i<N;i++)
scanf(“%d”,&a[i]);
for(i=0;i<N-1;i++)
{ r=i;
for(j=i+1;j<N;j++)
if(a[j]<a[r])
r=j;
if(r!=i)
{
temp=a[r];
a[r]=a[i];
a[i]=temp;
}
}
printf(“the array after sort:n”);
for(i=0;i<N;i++)
printf(“%5d”,a[i]);
printf(“n”);
}
【例2】青年歌手參加歌曲大獎賽,有10個評委對她的進行打分,試編程求這位選手的平均得分(去掉一個最高分和一個最低分)。
分析:這道題的核心是排序。將評委所打的10個分數利用數組按增序(或降序)排列,計算數組中除第一個和最后一個分數以外的數的平均分,其中排序部分這里用選擇法實現(xiàn)。
main()
{int i,j,min;
float temp,ave=0;
float a[11];
printf(“n輸入評委所打的分數:n”);
for(i=1;i<=10;i++)
scanf(“%f”,&a[i]);
for(i=1;i<=9;i++)
{min=i;
for(j=i+1;j<=10;j++)
if(a[min]>a[j])
min=j;
temp=a[i];
a[i]=a[min];
a[min]=temp;
}
for(i=2;i<=9;i++) /*注意i值的變化范圍*/
ave=ave+a[i];
printf(“選手所得最后分數:%6.1f”,ave/8);
printf(“n”);
}
【例3】輸入一串字符,計算其中空格的個數。
#include <stdio.h>
main( )
{char c[30];
int i,sum=0;
gets(c);
for(i=0;i<strlen(c);i++)
if(c[i]==’ ‘)
sum=sum+1;
printf(“空格數為:%d n”,sum);
}
【作業(yè)】
1. 已有一個已排好序的數組,今輸入一個數,要求按原來排序的規(guī)律將它插入數組中。
2. 將一個數組中的值按逆序重新存放。例如,原來順序為8,6,5,4,1。要求改為1,4,5,6,8。
3. 有15個數按由小到大順序存放在一個數組中,輸入一個數,要求用折半查找法找出該數是數組中第幾個元素的值。如果該數不在數組中,則打印出“無此數”。
4. 編一程序,將兩個字符串連接起來,不要用strcat函數。