文件名称:
从零开始学C语言(四).pdf.pdf
开发工具:
文件大小: 7mb
下载次数: 0
上传时间: 2019-09-13
详细说明:从零开始学C语言(四).pdfpdf,从零开始学C语言(四).pdf第10章数组133
10.23一维数组的引用
数组必须先定义后引用,在定义了数组变量后,我们就可以引用其中的每个元素了。一维
数组的引用格式如下:
数组名[下标表达式]
数组元素实际上是一种带下标的变量,简称下标变量。它与简单变量(不带下标的变量)
在使用上并无不同。在C语言中,不允许一次引用整个数组,只能逐个引用每个数组元素。同
时,由于每个数组元素的作用相当于一个同类型的简单变量。所以,对基本数据类型的变量所
能进行的各种运算也都适合于同类型的数组元素。
请比较:
int m, n,p, aji
a[2]=5
n=2*m
a[1]=a[2]*3;
scanf(“a”,&p); scanf(“暑d”,&a[4]);
它们之间的效果是一样的,都是一个变量。
上例中,我们使用数组时采用了具体的值。我们强调,在定义中不允许使用变量动态定义
数组,但是我们在实际应用中,更常用的引用数组的形式是用变量进行引用的。如:ail。这里
要将定义和引用区分开来。
在引用数组元素时,常用的形式是:al[il
若i=0,a[i>a[0
若
>a1
引用数组所有的元素称为遍历,遍历数组是通过循环来改变下标进行的。例如:
读入:for(i=0;i<5;计+) scant("%d",&ai])
输出:for(i=4>=0;-) printf("%3d",a[i])
在程序设计中,我们是无法知道分配给数组的具体地址的,C语言中不允许使用正整数作
为数组或变量的地址。若在程序中需要数组首地址或数组元素的地址,则只能用下列方式来表
示地址:
数组元素的地址
数组名[i〕或数组名+
数组首地址
数组名或数组名[0]
例如
int x[5]:
*定义一个整型数组x,含有5个数组元素*
X
*表示数组的首地址*
x[0]
*表示数组的首地址*
&x[i]
′*表示数组元素x[i]地址即第i+1元素的地址*/
X+1
/*表示数组元素x[i]地址即第i+1元素的地址*/
【实例10-3】数组元素的引用。例如:输入/输出数组中的元素。
#include
void main()
int a[10], sum=0,ii
for(i=0;i<10;i++
/*循环输入数组元素的值*
scanf("d”,&a[i]);
fr(1=0;i<10;i++)
/*循环取出数组中每个元素的值并求和*
sum=sum+a[lI
printf("Sum=&a\n", sun)
/*输出最终结果*
运行程序,输入:
12345678910
输出结果:
Sum=55
【实例10-4】分析下面的程序,体会数组元素的引用。
Include
void main()
inta[8]=1,0,1,0,1,0,1,0},i;/*定义一个整型数组元素a,和一个整型变量i*/
for(i=2:i<8;i++)
a[i]+=a[i-1]+a[i-2]
/*利用数组元素进行运算+/
for(i=0;i<8;i++)
printf("gd ",a[il):
/*将数组中的元素输出*/
printf("\n")
程序的运行结果为:
1022571320
从上例中,我们可以看到数组元素可以像一般的变量一样,进行各种运算
“a[i]+=a[i-1]+a[i-2]”将运算的结果再赋值给数组元素。
10.24一维数组的程序举例
【实例105】输入10个整数存入一维数组,按逆序重新存放后再输出。
#include
void main(
第10章数组135
int a[101, x, i:
for(i=0:i<10:i++)
scant(·岩d",&a[i]);
/*输入数组元素的值*
for(i=0;i<5;主++)
/*将数组元素逆序+
x=alil
[i】=a[9-i];
a[9-i]=x
for(i=0;i<10;i++)
printf(“告d",a[i]);
/*输出数组元素*/
}
printf " \n "
程序分析:
(1)定义一个整型数组长度为10,使用for语句向数组输出元素。
(2)将一维数组中的元素按逆序重新存放,即将第一个元素和最后一个元素调换一下位置,
第二个和倒数第二个调换位置,依此类推,如图10-3所示。
1与10调换位置
2与9调换位置
678
3与8调换位置
4与7调换位置
5与6调换位置
图10-3位置调换
变量i从0到4,表示数组中的第一个到第五个数组元素,与之对应的要进行调换的数组元
素位置为(9-i),将两个位置上的元素进行调换。
xealil
a[i]=a[9-i];
a[9-i]=x;
(3)然后将逆序后的数组元素进行输出
【实例106】用选择法对10个整数排序(从小到大)。
选择法思路如下:
设有10个元素a[]-a[10],将a[与a2}-a10比较,若a[1比a[2]-a[10]都小,则不进行交
换。若a[2]}~a[10中有一个以上比a[小,则将其中最小的一个与a1交换,此时a1中存放了
10个最小的数。依此类推,共进行9轮比较,就按照由小到大的顺序存放了。
井inc1ude< stdio.h
void main()
int i,, min, temp, a[11]
printf ("enter data: \n"Ii+4
for(i=1;i<=10;i++/*输入数据*/
printf("a[gd]=",i)i
scanf("id", &a[i]):
printf("\n"):
printf(the orginal numbers: \n")
for(i=1:i<=10;i++
/*输出未排列数据*
printf("85d",a[i])i
136m从零开始学C语冒
==-=========
printf("\n");
for(主=1;i<=9;i++)
/*选择法排序*
nln=l
for(=i+1;j<=10;j++)
if (a[min]>a[3])
min=)
temp=a[]:
a[i]=a[minl
a [min]=tempi
printf("\n”);
for(=1;i<=10;i+)
/*输出排序结果*
printf ("s5d",a[i]):
printf("\n");
运行程序
enter data
a[1]=5
a[2]=3
a[3]=2
a[4]=9
a[5]=8
a[6]=10
a[7]=1
a[8]=23
a[9]=7
a【10]=5
the orginal number:
32981012375
123557891023
【实例107】对10个数进行排序(从小到大)。
为加深对数字排序的理解,我们用两种方法来解答:冒泡法、遍历法。
1.用冒泡法对数据进行排序
冒泡发的基本思路:将相邻两个数比较,将小的调到前面。
具体为:(1)第一次从第一个数开始相互比较直到最后一个数,则小的数已经上浮,而最
大数已经下沉到底;(2)第二次从第一个数开始相互比较直到倒数第二个数,则小的数又上浮,
而第二大的数已经下沉到倒数第二位……依次进行,所有数就可按顺序排列好。例如图104所
示的数组。
988888
2
895555
8
444
4522
559444
44822
2
00
444922
22280
0005
222290
00008
00000
图10-4冒泡法
第10章数组137
程序分析:
(1)对6个数排序,则每次做两两比较的对数为:5,4,3,2,1。
(2)比较趟数为5趟。
(3)参加比较的个数为:6,5,4,3,2。
#⊥nc1ude< stdio.h
void main()
int a[10],1,3,ti
printf("Input 10 numbers: \n")
for(i=0:1<10;1++)
/*输入排序数*
(
scanf("暑d",&a[1]
printf("\n");
for(=0:1<9;1++)
/*控制比较趟数*/
for(i=0;i<9-;i++)
/*控制比较对数*
if(a[i]>a[i+1])
t=a[1];
a[i]=a[i+1]
a[i+1]=t
}
printf(" The sorted number \n")i
fr(主=0;i<10;i++)
/输出已排序的数*/
printf("sd"r a[il) i
运行程序,结果如下:
Input 10 numbers:
912-557621202369-100
The sorted numbers:
100-512923576269120
在上述比较中可以发现,不管数字的排列比较是否已经完成,都会按照正常的循环语句进
行排序。直至循环语句完成。我们可以通过设置一个标记来简化程序的运行过程。例如:
#include
v。 id main()
int j, n, change, a[10],ti
for付=0;<10:3++)
scanf("d",&a[j)
change=l i
while( n>0 & change==1)
change=0;
for (i=0 i ja[j+11)
138从零开始学c语會
t=alil
a[j]=a[3+lli
a[j+1]=t;
change=l
n--:
}
在程序中,我们设置了一个标记 change,在每次for循环语句之前先赋值0,在每次for循
环中需要交换数字,即整个循环没有排列完毕时,赋值为1。当 change=0时,说明所有顺序已
经交换完毕,此时可以直接跳出循环,整体上减少了程序的运行时间
运行产生的结果和上述未设置 change标记的情况一样,在此不再赘述。
2.用遍历法对数据进行排序
遍历法排序的思路:第一次从第一个开始找出最小的一个585444
作为第一个元素,第二次从第二个开始找出第二小的元素……458955
依次进行,得出排序结果,如图105所示。
程序编写如下:
图10-5遍历法
排 include< stdio.h>
void main()
inta[10],1,j,t;
printf("Input 10 numbers: \n")i
for(i=0;i<10;i++)
/*输入排序数*
scanf("8d”,&a[i]
printf("\n):
for(j=0;j<9;j++)
/*控制比较趟数+
for(i=j+1;i<10;i++
*控制比较对数*
if(a[j]a[il
t=a[jl:
a[j]=a[i]:
a[il=t
printf("The sorted number \n")
for(i=0:i<10;i++)
/*输出已排序的数*
printf(sd a[i]):
排序是C语言中比较重要的一类题目,需要我们仔细思考和掌握。此程序是对10个数进行
排序,在平常的应用中,我们可以更改此程序。
for(j=0:<9;j++
/*控制比较趟数*/
【
for(i=j+1;i<10;i++)
/*控制比较对数*
第10章数组139
if(a[j]a[i1
j
t=a[j]:
a[j]=a[i];
a【i]=t
}
可以更改为:
for(3=0 ; ja[1])
t=a[j];
a[j]=a[i];
ali=ti
n代表所要排列的数字数目。当有n个数时,则要进行n1次比较,在第j趟比较中,要进
行n次比较。
【实例108】用筛选法求100以内的素数。
所谓筛选,指的是在一张纸上写上1到100的全部整数,然后逐个判断它们是否为素数,
找出一个非素数,就把它挖掉,最后剩下的就是素数,如图10-6所示。
1234567891011121314151617181920212223
具体做法是:
(1)先将1挖掉。
初始化数组
a[1]=0
(2)用2去除它后面的各个数,把能被2整除的数挖掉,也就
i:2-sqr(100)
是把2的倍数挖掉。
J1+1-100
(3)用3去除它后面的各个数,把3的倍数挖掉。
a[=0且a=
(4)用4、5、…各数去除这些数以后的各个数。这个过程一
ajl%ai]=0
直进行到在除数后面的数全部被挖掉为止。
a]=0
例如:
本题要求100以内的素数,故一直进行到97为止。但事实上,
for(i=l;<=100;i++)
a[]0
可以简化除数的范围。除数的范围只要是1~sqrt(m)即可。对本题而
言,只要到10即可。
打印a[i
因此上面的算法可以表示为:
图10-6求素数流程图
(1)挖去1。
(2)用下一个未被挖去的p去除p后面的各数,把p的倍数挖掉
(3)检查p是否小于(int)sqr(m),如果是,返回2。
(4)继续执行,否则就结束。
(5)剩下的数字都为素数。
#includesstdio. h>
include
(系统自动生成,下载前可以参看下载内容)
下载文件列表
相关说明
- 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
- 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度。
- 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.