【例子7.18】按照大小顺序将整数插入经过排序的数组中。
要按大小将数量插入排序数组中,必须首先确定排序是从大到小。 按照从大到小的顺序排序,可以逐一比较要插入的数量和数组中的各数量,如果找到小于最初插入数量的要素I,该要素的前面就是插入位置。 然后,从数组的最后一个元素到该元素,一次移动一个单元格。 最后将插入数赋予要素I即可。 如果插入的数量小于所有元素的值,则会将其插入到最后一个位置。
main () )
{
int i,j,p,q,s,n,a [ 11 ]={ 127,3,6,28,54,68,87,105,162,18 };
for(I=0; i10; I )
{ p=i; q=a[i];
for(j=I1; j10; j )
if(q
if(p!=i )
{
s=a[i];
a[i]=a[p];
a[p]=s;
}
printf('%d ',a[i] );
}
打印(ninput number : (n ) );
scanf('%d ',n );
for(I=0; i10; I )
if(na(I ) ) ) ) ) ) )。
{for(s=9; s=i; s--; a[s1]=a[s];
黑; }
a[i]=n;
for(I=0; i=10; I )
printf('%d ',a[i] );
打印((n );
}
本程序首先按照从大到小的顺序对数组a中的10个进行排序,并输出排序结果。 输入要插入的下一个整数n。 再用一个for语句逐个比较n和数组要素,如果发现有na[i],用一个内循环将I以下的各要素的值逐个向后移动。 后退移动应该从后向前,从a[9]到a[i]。 向后移动,摆脱外部循环。 将插入点设为I,将n赋予a[i]即可。 如果所有元素都大于插入的数量,则不会进行后续移动。 此时,i=10,结果,将n给定为a[10]。 最后一个循环输出插入数后数组的每个元素值。
程序运行时,输入数为47。 从结果可以看出,47插入在54和28之间。
【例7.19】在二维排列a中选择各行最大的要素进行一维排列b。
a=(3168765
4 32 11 108
10 25 12 37 )
b=(8710837 ) )。
正题的编程思路是,在数组a的各行中寻找最大的要素,找到后将其值赋予数组b的相应要素即可。 步骤如下。
main () )
{
inta [ ] [4]={ 3,16,87,65,4,32,11,108,10,25,12,27 };
int b[3],I,j,l;
for(I=0; i=2; I )
{ l=a[i][0];
for(j=1; j=3; j )
if(a ) I ) j ) l=a ) I ) ) j;
b[i]=l; }
printf((Narraya:(n ) );
for(I=0; i=2; I )
{for(j=0; j=3; j )
printf ()、a ) I )、j );
打印((n ); }
打印(narrayb : (n ) );
for(I=0; i=2; I )
printf ()、b(I );
打印((n );
}
程序中的第一个for语句嵌套了for语句,构成了双重循环。 外侧循环逐行控制处理,将各行的第0列的要素赋予l。 进入内循环后,将l与后面各列的元素进行比较,将大于l的给予l。 当内部循环结束时,l是该行的最大元素,然后将l的值赋予b[i]。 当所有外环完成时,数组b中已经加载了a中每行的最大值。 以下两个for语句分别输出数组a和数组b。
【例7.20】按字母顺序输入并输出5个国家的名称。
正题的编程思路如下。 五个国家名称必须用一个二维字符数组处理。 但是,在c语言中规定了可以将一个二维数组作为多个一维数组来处理。 因此,这个问题还可以用5个一维数组来处理,每个一维数组都是国名字符串。 用字符串比较函数比较各一维数组的大小,重新排列后输出结果即可。 编程如下。
main () )
{
char st[20],cs[5][20];
int i,j,p;
打印计数名称: (n );
for(I=0; i5; I )
gets(cs[I];
打印((n );
for(I=0; i5; I )
{ p=i; strcpy(ST,cs[i] );
for(j=I1; j5; j )
if(strcmp(cs[j],st )0) ) p=j; strcpy(ST,cs[j] ); }
if(p!=i )
{
strcpy(ST,cs[i] );
strcpy(cs[I],cs[p];
strcpy(cs[p],st );
}
puts(cs[I]; }printf((n );
}
在本程序的第一个for语句中,用gets函数输入5个国家名称字符串。 在上述的c语言中,可以将一个二维排列作为多个一维排列来处理,但在本程序中,表示cs[5][20]是二维文字排列,5个一维排列cs[0]、cs[1]、cs[2]、cs[2] 因此,在gets函数中使用cs[i]是合法的。 在第二个for语句中嵌套了另一个for语句,构成了双重循环。 这个双重循环完成按字母顺序排序的工作。 在外层循环中将字符数组cs[i]中的国名字符串复制到数组st中,将下标I赋予p。 进入内层循环后,比较st和cs[i]以后的各字符串,如果有比st小的,将该字符串复制到st,并将其下标赋予p。 内部循环完成后,如果p不等于I,将出现小于cs[i]的字符串,因此将交换cs[i]和st的内容。 这样就确定了数组cs的第I个元素的排序值。 然后,输出字符串。 所有外环完成后,所有排序和输出都将完成。