ImageVerifierCode 换一换
格式:DOCX , 页数:25 ,大小:76.81KB ,
资源ID:29139727      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/29139727.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第六章数组.docx)为本站会员(b****9)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

第六章数组.docx

1、第六章 数组第六章 数组前面讲的简单类型变量只含一个成员。数组是一种构造类型(称为数组元素),数组类型的变量也简称数组,它是由固定数目的同类型成员(称为数组元素)组成的构造类型变量。构造类型的最低一级成员必须是简单类型,它可以如同一个简单类型的变量一样,被赋值或出现在表达式中。C的构造类型有:数组、结构和联合。6.1 数组的说明6.1.1 数组的说明1说明区分符 数组名常量表达式=初值表,;2说明:(1)说明区分符可以是存储类型区分符(auto,extern, static)、类型区分符(int,char,float等)和类型限制符(const, volatile)之一或它们的组合,存储类型区

2、分符说明数组变量的存储类型、类型区分符说明数组元素的类型。(2)数组名是一个标识符。(3)外层 是一维数组的标志,内层 表示可选。(4)常量表达式的值必须是正整数,它是数组的长度(或大小)说明,即说明数组含有的元素数目。(5)数组元素在数组中有一定的次序关系,C中数组元素从0开始编号。(6)定义性说明时必须给出长度说明,引用性说明或参数类型说明时不需要长度,但 不能省。(7)“初值表”是可选的,它显式地说明数组的初值,引用性说明时不能说明初值。下面是一些数组说明的例子。Int x5;定义x是含有5个int元素的数组(或称x是含有5个元素的int数组),其元素依次表示为x0,x1,x2,x3,x

3、4。如果说明在函数外,则x是外部数组;如果说明在函数体内,则x为自动数组,由于没有给出初值说明,因此,如果x是外部数组,则所有元素的初值均为0,如果x是自动数组,则其元素的值不确定。Float a30;定义a是含有30个元素的float数组,其元素依次为:a0,a1,a29,共30个。Double vamaxval;Val是含有maxval个元素的double数组(maxval是已定义的符号常量)。数且说明可以和其它同类型对象在一个说明语句中说明。例如:float x,a50,b100;char c,str100,buf300;(8)静态数组说明必须给出static类型区分符,如static

4、char line200;如果说明在函数外,则为外部静态数组,如果在块内,则为局部静态数组。数组长度说明可以含有运算符的表达式形式,表达式的值必须为正整数,且不能含有变量或未定义的标识符。如: #define SIZE 100char textSIZE*2+1;而下面定义是错误的: int n; char namen;因为C语言不允许定义动态数组,编译时数组的大小必须是已知的。且其大小在程序执行过程中是固定不变的。6.1.2 数组引用数组的引用有两种形式:一是引用数组的元素,例如:int x5,则x0,x1,4是对数组x的5个元素的引用。二是引用数组名。一般数组的输入、输出、赋值和基本运算都必

5、须对数组的元素逐个进行。数组名可以用作函数调用的参数(实参),输入输出字符串,给指针变量赋值等。数组各元素之间是按顺序排列的。它们对应的存储单元一个紧接一个,每个元素在数组中的位置即元素编号称为元素的下标,每个元素用数组名和各自的下标两部分表示。称为数组元素的引用。引用形式如下:数组名 下标表达式下标表达式(简称下标)可以为任意整型表达式,包括整型常量、变量、含有运算符的整型表达式,甚至是值为整数的函数调用。下标表达式的值应在元素编号的取值范围内(在C语言中,下标不作超界检查),对于长度为n的数组,下标表达式的取值为0,1,2,n-1,C中数组的编号规定从0开始,对数组最低一级元素的引用称为下

6、标变量,其性质等同于类型简单变量。如 int x10,i; x5=3+2;i=x0+x3;例1 计算并输出全班30个学生C语言程序设计课程的平均成绩以及每个人的成绩与平均成绩之差。#include “stdio.h”#define numbers 30int main(void) int i; float xnumbers,sum,average; sum=0;printf(“input %d scores:n”,numbers);for (i=0;inumbers;i+) scanf(“%f”,&xi); sum+=xi; average=sum/numbers;printf(“averag

7、e=%.2fn”,average);for (i=0;inumbers;i+0 printf(“x%d-average=%.2fn”,i,xi-average);return 0;输出:intpu 30 scores:输入:88 79 61 50 58 average=71.80x0-average=16.20x1-average=.数组可以作为函数的参数来传递,形参说明为数组,对应的实参是数组的名字。C语言中数组的名字不是一个变量,而是数开头元素的地址,即a0的地址(称为数组的首地址),它是在编译时确定的一个地址常量,例如数组名a和&a0代表同一个地址值。因此参数传递时传递给被调用函数形参的

8、值是实参的首地址,而不是对实参数组元素的复制,通过形参引用的数组元素不是实参数组元素的副本,而是实参数组元素本身。所以被调用函数中对数组元素的任何修改,都是直接修改实参数组元素本身。例2 输入n个整数,将它们按从小到大的次序排列,然后输出。分析:排序的方法很多,本例采用冒泡法排序,从第0个元素开始。数组 a0 a1 a2 a3 a4数组的初始值 82 31 65 9 47第一轮比较结束 31 65 9 47 82第二轮比较结束 31 9 47 65 82第三轮比较结束 9 31 47 65 82第四轮比较结束 9 31 47 65 82两两比较,将较大的元素移到后一个位置,经一轮比较后最大元素

9、被移到最后一个元素的位置,称为冒泡,下一轮从第0个元素开始对余下的n-1个元素重复上述过程。Void sort(int v,int n); int i,j, temp; for (i=1;in-1;i+) for (j=0;jvj+1) temp=vj; vj=vj+1; vj+1=temp; #include “stdio.h”#define N 5int main(void) int aN,i; printf(“intpu %d numbers:n”,N); for (i=0;in;i+) scanf(“%d”,&ai); sort(a,N); for (i=0;in;i+) printf

10、(“%8d”,ai);return 0;6.1.3 数组的初始化数组定义时可以通过在说明符中指出初值表来初始化。(1)初值表用括起来,每个初值用逗号隔开。在ANSI C中,外部数级、静态数组和自动数组均可初始化。如:float x5=1,2,1,2,1; /*x0,x1,x2,x3,x4分别初始化为1,2,1,2,1。(2)如果数组长度与初值个数相同,则在数组说明符中可以不指出数组长度。或者说不指出数组长度,则其长度由初值个数决定。上例等价于:float x=1,2,1,2,1;(3)初值个数可以小于数组元素的个数(部分初始化),剩余的值为0,如:float x5=1,2,1;初值1,2,1依

11、次赋给x开头的三个元素。X0,x1,x2。未指出初值的其余元素x3,x4被初始化为相应类型的缺少值(对于外部数组和静态数组,本例为x3为0.0;x4为0.0)或初值不确定(对于自动数组),例如:static float x5=2,2,2元素x0,x1,x2值为2,x3,x4值为0.0。注意标准C规定,当初值个数小于数组元素个数时,初值必须是最前面的连续元素的初值。上例可以写成static float x5=2,2,2;但不能写成static float x5=,2,2,2;(4)如果初值个数大于定义时指定的数组长度,则为语法错误,例如:int score4=60,60,43,45,56,57,

12、67为非法。6.1.4 数组的运算我们讨论的数组的运算指数组的输入、输出、赋值和以数组元素为操作数的基本运算等操作。数组的赋值、输入和输出一般要逐个元素进行,对数组元素所允许的操作与同类类型的变量相同。对数组的所有元素进行操作一般用循环结构来完成。例如:int x3;用赋值运算给x的元素赋值:x0=10;x1=20;x2=30;等价于:for (i=0;i3;i+) xi=(i+1)*10; 或:for (i=0;i3;i+) scanf(“%d”,&xi);输出时就为:for (i=0;i3;i+) printf(“x%d=%4d”,i,xi);例3:二分查找函数分析:在元素按递增排列的一个

13、有序数组中,查找一个为给定值x的元素的位置(用下标表示)。如果x在数组中返回x在数组中的下标,否则返回1。Int binsearch(int x, int r,int n) int top=0,bottom=n-1;mid; while(top=bottom) mid=(top+bottom)/2; if (xvmid) top=mid+1; else return (mid); return 1;例4:Shell排序函数分析:将n个数放在一维数且中,开始时,被分成两段,把数组后一段的每个元素和前一段相隔n/2的元素进行比较,如果后者小于前者,则交换两个元素的值;然后将比较间隔逐次减小一半,当

14、比较间隔减小到时,整个算法结束,排序完成。Void shellsort(int r,int n) int gap,i,j,temp; for (gap=n/2;gap0;gap/=2) for(i=gap;i=0&vjvj+gap;j-=gap) temp=vj; vj=vj+gap; vj+gap=temp; . 字符数组. 字符数组的说明和引用类型为char的一维数组称为字符数组,说明形式同一般数组,如: char buf100;定义buf是含有个元素的一个字符数组(buf的每个元素是一个字符)。语言没有字符串类型,字符数组可以作为字符串变量看待。对于一个长度为n的字符数组,它可以存储长度

15、不超过n-1的任何一个字符串,多出的一个元素是为了在字符串的末尾存入一个空字符0(值为)作为字符串的结束标志,存放在字符数组中的实际字符个数称为字符串的实际长度。0不是字符吕的组成部分,所以定义数组时,所指出的数组长度必须比实际字符串可能的最大长度大。对于程序中出现的任何字符串常,编译程序自动在其存储的末尾添一个0作为结束标志。用户在自己的程序中对字符串须作同样的处理,这样做的好处是()处理字符串进可以不指出串的实际长度,因为字符串实际长度是变化的,通常不知道一个实际的字符串含有多少个字符,通过扫描字符串发现0以确定其长度;()为了与编译程序保持一致。例如:用printf的%s格式输出一个字符

16、串(字符数组作为参数)时必须以0结束。字符数组的引用、赋值和其它运算与普通数组相同,必须逐个元素进行。不同的是它可以通过字符数组名由函数scanf和printf用%s输入和输出整个字符串,而不必用循环语句对其元素逐个输入或输出。如:scanf(“%s”,buf); /*长度不超过个字符*/printf(“%sn”,buf);注意:由于数组名本身已是数组的首地址,所以scanf参数中的buf前面不能再加取地址运算符&,scanf用%s格式输入一字符串时自动在末尾加0;printf用%s格式输出一个字符串时要求字符串必须具有0结束标志。. 字符数组的初始化字符数组显式初始化有两种等价的形式:1一种

17、形式与一般的一维数组显式初始化的形式相同,即逐个元素指出其初值,例如:char buf100=h,e,l,l,o,n,0;buf的初值是字符串”hellon”。注意用这种形式指定初值时必须在最后一个初值之后明确写上0。2初始化的另一种形式是用字符串常量用为初值,如:char buf100=”hellon”;(1) 这种初始化方式,编译程序自动在末尾加上0;(2) 若不作长度说明:如 char buf=”hellon”;则buf的长度为。注意:若将说明写成char buf=”hellon”;则是错误的,此时认为buf是一个字符型变量。如果buf说明为char buf100 ,则下列用法也是错误的

18、: buf=”hellon”; /* 数组名不是左值*/ buf =”hellon”; buf100=”hellon”;. 字符串处理函数语言中字符数组是应用最普遍的数组类型,它用于表示长度可变的字符串,因而字符数组可以称为字符串变量,本节讨论字符数组的应用,以字符串为参数的函数(字符串处理)的编写方法。例输入若干行文本,输出其中最长的那一行。#include “stdio.h”#define MAXLINE 100int getline(char , int);void copy(char , char );int main() int len; /*当前长长度*/ int max; /*最

19、大行长度*/ char lineMAXLINE;char longestMAXLINE;max=0;printf(“input line end of ctrl+zn”);while (len=getline(line, MAXLINE)0)0 if (lenmax) max=len;非00 copy(line,longest); if (max0) 非0 printf(“longest line is”%s”,length=%dn”,longest,max); return 0;int getline(char s ,int line) int c,i; i=0; While(-line0

20、&(c=getchar()!=EOF&c!=n) si+=c; if (c=n) si+=0; return (i); void copy(char from , char to ) int i=0; while(toi=fromi)!=0) i+; 输出:input line end of ctrl+e:输入:struct int node int data; struct int node *next; ;输出:longest line is “struct int node *next”,length=22 例定义一个函数从一个字符串中删去指定值的所有字符。Void squeeze(ch

21、ar s , int c) int i=0;j=0; for (; si!=0,i+) if (si!=c) sj+=si); si=0;例定义将两个字符串连接成一个字符串的函数,即编写函数strcat。 Void strcat(char s ,char t ) int i=0,j=0; while (si!=0) i+; While(si=tj)!=0) i+; j+; 例将一个整数转换成对应的数字串。 #include “stdio.h” #include “string.h” #define INTLEN 6void itoa(int n, char s ) int i,sign; vo

22、id reverse(char );if (sign=n)0); if (sign0) si+=-; si=0; reverse(s);int main(void) int n; char sINTLEN; printf(“intput a integer:”); scanf(“%d”,&n); itoa(n,s); printf(“string:%sn”,s); return 0;void reverse(char s ) int c,i,j; for(i=0,j=strlen(s)-1;i=0;i-) if (si!= & si!=t & si!=n) break;si+=0;return

23、 i;例定义将十六进制数字转换成整数的函数,假定字符串中不含任何非法字符。函数返回值是转换结果。 Int htoi(char s ) int i,n; n=0; for (i=0;si!=0;i+) if si=0 & si=a & si=A & si=F n=n*16+ si-A+10; return n;例。定义比较两个字符串的函数,若相等,则返回值,否则返回值。Int strcmp(char s , char t ) int i=-1; while(+i, si=ti& si!=0); return (si=0 & ti=0?1:0);. 多维数组一维数组由具有一个下标的元素组成,它表示

24、一个线性的数据队列,为了表示具有两个下标的元素组成的二维数据队列,如距阵或需要两个以上的下标的元素,则使用多维数组,维即元素的下标具有的下标个数,称为数组的维数。. 多维数组的说明、引用和存储结构n维数组说明的一般形式为:存储类型区分符 类型区分符 数组名常量表达式常量表达式常量表达式n初值表数组名是一个标识符,常量表达式到常量表达式n分别说明数组第1到第n维的长度,如:float a32;定义a是一个二维数组,它表示一个行列的矩阵,数组元素(即矩阵元素)都是float类型,每个元素由行下标(第一维)和列下标(第二维)唯一确定,a的元素表示为:aij(i=0,1,2; j=0,1)。a的逻辑结

25、构表示为:二维数组在内存的物理存储结构是按行存储的,即:a00, a01, a10, a11, a20, a21类似地可以推广到n维数组,以三维数组为例:int b324;定义b是一个行列,每列含有个int元素的三维数组,b的元素表示为:第三维3 bijk (i=0,1,2; j=0,1; k=0,1,2,3);2b的逻辑结构:元素b1131物理存储结构:0b000第0行,第0列元素,4个0b0011b0022b003第0行,第1列元素,4个第二维10b010第一维b011b012b013第2行,第1列元素,4个b210b211b212b213C语言中,数组元素各维下标是用 分开表示的。如bi

26、jk,而不能写成bi,j,k,编译程序处理多维数组的方法与一维数组相同,即n维数组处理为以n-1维数组为元素的一维数组。如:float a32;两维数组a处理为以a0,a1,a2为元素的一维数组,每个元素ai(i=0,1,2)以是具有个元素的float数组。a0是第一个数组的首地址,同&a00;a1等价于&a10;a2等价于&a20;aij是最低一维元素,通常称为数组的元素,等同一个float变量。. 多维数组的初始化多维数组的显式初始化与一维数组的不同之处在于初值表示的形式上不同。以二维数组为例:定义一个表示下列矩阵的数组,初始化为: int a33=1,4,5,2,5,8,3,6,9;等价于:int a3=1,4,5,2,5,8,3,6,9;也等价于:int a33=1,4,5,2,5,8,3,6,9; /*以

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1