C语言第6章数组课件_第1页
C语言第6章数组课件_第2页
C语言第6章数组课件_第3页
C语言第6章数组课件_第4页
C语言第6章数组课件_第5页
已阅读5页,还剩50页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2011年1月第6章

组C

语言程序设计第6章

数组2023/9/22本章重点介绍

:一维数组二维数组字符数组与字符串2第6章

数组2023/9/22一个人N门课的成绩怎样存储和处理?一个班N门课的成绩怎样存储和处理?......这些数据的特点:具有相同的数据类型。为了方便地使用这些数据,C语言提供了一种构造数据类型:数组。例如:存储学生成绩用实型数组

score[5]其中:score是数组名。该数组可以存放5个成绩,分别用下标变量表示:

score[0],score[1],…score[4]。下标变量也称为数组元素。36.1

一维数组例如:

int

a[10];float

score[5];“数据类型”:“数组名”:是数组元素的数据类型。遵循C语言标识符规则。“常量表达式”:表示数组中有多少个元素,即数组

的长度。它可以是整型常量、整型常量表达式或符号常量。6.1.1一维数组的定义2023/10/2数据类型 数组名[常量表达式];4以下数组定义是正确的:#define

N

10……float score1[N],

score2[N];int

num[10+N];char

c[26];以下数组定义是不正确的:int

array(10);int n;

float

score[n];2023/10/2double b['a'..

'd'];char str[

];6.1.1

一维数组的定义(续)

5数组在内存的存放数组下标从0开始。数组名代表数组的首

地址,即score的值与score[0]

的地址值相同。score[0]score[1]score[2]score[3]score[4]91.534.567.572.084.0一维数组的数组元素

低地址在内存里按顺序存放。高地址score数组2023/10/266.1.2

数组元素的引用2023/10/2格式:例如:输入学生成绩for(i=0;i<5;i++)scanf("%f",&score[i]);例如:fib[n]=fib[n-1]+fib[n-2];下标表达式的值必须是整型表达式。数组名[下标表达式]76.1.2

数组元素的引用(续)说明:①下标从0开始(下界为0),数组的最大下标(上界)是数组长度减1。例如:inta[10];scanf

("%d",&a[10]); /*下标越界*/C编译系统不做越界检查,如果引用的数组元素超出数组范围会破坏其他变量的值。2023/10/286.1.2

数组元素的引用(续)②

[]是下标运算符,2023/10/2引用数组元素时,根据数组的首地址和下标数,计算出该元素的实际地址,取出该地址的内容进行操作。如引用score[2]:计算2000+2*4=2008取出2008的内容2000H2004H2008H200CH218CHscore[0]score[1]score[2]score[3]score[4]91.534.567.572.084.096.1.3

一维数组的初始化初始化:在定义数组时给数组元素赋初值。1.在定义数组时,对全部数组元素赋初值例如:inta[5]={0,1,2,3,4};此时可以省略数组长度,例如:int

a[

]={0,1,2,3,4};2.在定义数组时,对部分数组元素赋初值例如:int

a[5]={1,2,3};系统为其余元素赋0

。3.当初值的个数多于数组元素的个数时,编译出错例如:int

a[5]={0,1,2,3,4,5};102023/10/26.1.4

一维数组应用举例2023/10/2【例】将10个人的成绩输入计算机后按逆序显示。#define

N

10main(

){

int

i;float

score[N];for

(i=0;

i<N;

i++)scanf("%f",&score[i]);for(i=N-1;

i>=0;

i--)printf("%6.1f",score[i]);}运行情况如下:67

74

89

92

34

67

83

95

73

78

78.0

73.0

95.0

83.0

67.0

34.0

92.0

89.0

74.0

67.011【例】输入5个整数,找出最大数和最小数所

在位置,并把二者对调,然后输出。2023/10/2思路:求最大/小值采用打擂台的方法。定义一维数组a存放被比较的数。定义变量max:最大值,min:最小值,

k:最大值下标,j:最小值下标。各数依次与擂主进行比较,若a[i]>max

则:max=a[i];k=i;否则判断:若a[i]<min

则:min=a[i];j=i;当所有的数都比较完之后,将a[j]=max;[k]=min;输出a数组。12main(

){

int

a[5],max,min,i,j,k;for(i=0;

i<5;

i++)scanf("%d",&a[i]);程序运行情况如下:5

7

2

3

1

51237}min=a[0];

max=a[0];j=k=0;for

(i=1;

i<5;

i++)if

(a[i]<min)

{min=a[i]; j=i;

}else if

(a[i]>max)

{

max=a[i];

k=i

;

}a[j]=max;

a[k]=min;for

(i=0;

i<5;

i++)printf("%5d",a[i]);printf("\n");2023/10/213【例】冒泡法排序(从小到大)。以6个数:3、7、5、6、8、0为例。第一趟排序情况如下:3

75

6

8

0第一次

3和7比较,不交换3

7

5

6

8

0第二次

7和5比较,交换3

5

7

6

8

0第三次

7和6比较,交换3

5

6

7

8

0第四次

7和8比较,不交换3

5

6

7

8

0第五次

8和0比较,交换3

5

6

7

0

82023/10/2在第一趟排序中,6个数比较了5次,把6个数中

的最大数8排在最后。14冒泡法排序

(续)第二趟排序情况如下:3

56

7

0

8第一次

3和5比较,不交换

3

5

67

0

8第二次

5和6比较,不交换

3

56

70

8第三次

6和7比较,不交换

3

5

67

08第四次

7和0比较,交换

3

5

6

0

7

8在第二趟排序中,最大数8不用参加比较,其余的5个数比

较了4次,把其中的最大数7排在最后,排出7

8。以此类推:第三趟比较3次,排出

6

7

8第四趟比较2次,排出

5

6

7

8第五趟比较1次,排出

3

5

6

7

8最后还剩下1个数0,不需再比较,得到排序结果:0

3

5

6

7

82023/10/215冒泡法排序

(续)从上述过程可以看到:n个数要比较n-1趟,而

在第j趟比较中,要进行n-j次两两比较。for

(i=0;

i<N;

i++)输入a[i]for

(j=1;j<N;

j++)for

(i=0;i<N-j;i++)a[i]>a[i+1]TFa[i]与a[i+1]交换输出a[0]~a[N-1]冒泡法排序162023/10/2#define

N

6main(

){

int

a[N];程序运行情况如下:inti,j,t;for

(i=0;

i<N;

i++)3

7

5

6

8

0

0

3

5

6

7

8}scanf("%d",&a[i]);for

(j=1;

j<=N-1;

j++)

/*控制比较的趟数

*/for

(i=0;i<N-j;

i++)

/*两两比较的次数

*/if

(a[i]>a[i+1]){

t=a[i];a[i]=a[i+1];a[i+1]=t;

}printf("The

sorted

numbers:

\n");……2023/10/217以6个数:3、7、5、6、8、0为例。思路:第一趟:将第一个数依次和后面的数比较,如

果后面的某数小于第一个数,则两个数交换,比较结束后,第一个数则是最小的数。第二趟:将第二个数依次和后面的数比较,如果后面的某数小于第二个数,则两个数交换,比较

结束后,第二个数则是次小的数;……

。2023/10/2【例】选择法排序(从小到大)。18#define

N

5main(

)2023/10/2/*确定基准位置

*/{

int

a[N];inti,j,k,t;for

(i=0;

i<N;

i++)scanf("%d",&a[i]);printf("\n");for

(i=0;i<N-1;

i++){

k=i;for(j=i+1;

j<N;

j++)if

(a[j]<a[k])

k=j;t=a[i];

a[i]=a[k];a[k]=t;}printf("The

sorted

numbers:

\n");…}程序运行情况如下:96

78

65

86

40

The

sorted

numbers:40

65

78

86

96196.2

二维数组多维数组的空间想象一维数组:一列长表或一个向量三维数组:三维空间的一个方阵多维数组:多维空间的一个数据列阵2023/10/2206.2

二维数组数据类型 数组名[常量表达式1][常量表达式2];例如:

float

x[2][3];6.2.1二维数组的定义2023/10/2

X[0][0]X[0][1]X[0][2]X[1][0]X[1][1]X[1][2]int

a[3,4],b(3,4),c[

][

],d(3)(4);21x[0][0]x[0][1]x[0][2]x[1][0]x[1][1]x[1][2]2000H2004H2008H200cH2010H2014H地址

数组元素二维数组元素在内存中的排列顺序:按行存放2023/10/222二维数组可看作是一种特殊的一维数组2023/10/2例如,可以把x数组看作是包含二个元素的一维数组,每个元素又是一个含有三个元素一维数组。x[0]----x[0][0],x[0][1],x[0][2]x[0]是数组名,是元素x[0][0]的地址

x[1]----x[1][0],x[1][1],x[1][2]x[1]是数组名,是元素x[1][0]的地址236.2.2

二维数组元素的引用例:int

a[3][4];a[0][0]=3;a[0][1]=a[0][0]+10;a[3][4]=3; /*

下标越界*/a[1,2]=1;

/*

应写成a[1][2]=1;*/数组名[行下标表达式][列下标表达式]数组元素的表示形式:2023/10/2246.2.3

二维数组的初始化2023/10/2初始化后结果:123456按行赋初值例:int

a[2][3]={{1,2,

3},{4,

5,6}};按数组元素在内存中排列的顺序对各元素赋初值

例:int

a[2][3]={1,

2,

3,

4,

5,6};给部分元素赋初值例:int

a[2][3]={{1},{4}};初始化后结果:100400256.2.3

二维数组的初始化(续)4.数组初始化时,行长度可省,列长度不能省

例如:int

a[][3]={1,2,3,4,5,6,7};int

b[][4]={{1},{4,5}};初始化结果:a结果:a[0]:123a[1]:456a[2]:7002023/10/2b

结果:b[0]:

1

0

0

0b[1]:

4

5

0

026下面对二维数组的定义都是错误的:2023/10/26.2.3

二维数组的初始化(续)

float

x[3][

]={1.0,

2.0,

3.0,

4.0,

5.0,6.0};int

a[

][

],

b[

][2],

c[3][

];

int

m[2][4]={1,

2,3,

4,5,

6,7,

8,9};/*

编译出错,初值个数多于数组元素的个数*/276.2.4

二维数组应用举例2023/10/2【例】给一个4行3列的二维数组输入/出数据。main(

){

int

a[4][3],i,j,k;

for

(i=0;

i<4;

i++)for

(j=0;

j<3;j++)scanf("%d",&a[i][j]);for

(i=0;

i<4;

i++){

printf("\n");for

(j=0;

j<3;j++)printf("%d\t

",a[i][j]);}printf("\n");}程序运行情况如下:1

2

3

4

5

6

7

8

9

10

11

12

1

2

3456789101112286.2.4

二维数组应用举例(续)【例】有一个N×M矩阵,编程序求出其中绝对值最大的那个元素的值及其所在的行、列位置。max=|a[0][0]|,row=0,colum=0for

(i=0;

i<N;

i++)for

(j=0;

j<M;

j++)|a[i][j]|>maxFTmax=|a[i][j]|row=icolum=j输出绝对值最大的元素及行列下标292023/10/2#include

"math.h"#define

N

42023/10/2#define

M

5main(

){

int

i,j,row,colum,max,a[N][M];…

…/*输入数据*/max=a[0][0];

row=colum=0;for

(i=0;

i<N;

i++)for

(j=0;

j<M;

j++)if

(abs(a[i][j])>max){

max=abs(a[i][j]);row=i;colum=j;}…

…/*输出数据*/}程序运行情况如下:34

56

12

67

23

12

67

43

98

54

65

45

66

16

24

37

83

25

64

19

max=98,row=1,colum=3306.3

字符数组与字符串China\06.3.1

基本概念字符数组:可以存放若干个字符,也可以存放字符串。字符串:字符串的末尾必须有’\0’字符,它的ASCII码值为0。China是字符串不是字符串2023/10/2316.3.2

字符数组的定义2023/10/2例如:char

s[10];s数组是一维字符数组,它可以存放10个字符或

一个长度不大于9的字符串。再例如:char

a[3][5];a数组是一个二维的字符数组,可以存放15个字

符或3个长度不大于4的字符串。注意:字符串只能存放在字符数组中。326.3.3

字符数组的初始化China1.用字符常量赋初值例如:char

c[5]={'C','h',

'i',

'n',

'a'

};再例如:char

c[6]={'C','h',

'i',

'n',

'a'

,

'\0'};China

\0是字符串不是字符串2023/10/2336.3.3

字符数组的初始化(续)再例如:char

a[3][10]={"basic","pascal","c"};astring\0\02.用字符串常量赋初值

例如:char

str[10]=

{"a

string"};或char

str[10]=

"a

string";basic\0\0\0\0\0pascal\0\0\0\0c\\\\\\\\\是字符串吗?2023/10/2346.3.3

字符数组的初始化(续)2023/10/23.初始化时长度的省略例如:char

s1[

]=

"Good

morning!";Gs1[0o]odmorning!\0s1[13]例如:char

s2[

]={

's',

't',

'r',

'i',

'n','g'};例如:char

s3[7]={

's',

't',

'r',

'i',

'n',

'g'};stringstring\0思考:哪个数组存放的是字符串?356.3.4

字符数组的引用2023/10/2【例】对字符数组c1赋'0'~'9',对字符数组c2赋'A'~'Z',然后输出c1和c2数组中的数据。1.对字符数组元素的引用可以为数组元素赋值,也可以输入/输出元素的值。36程序如下:2023/10/2main(

){

charc1[10],c2[26]; int

i;for

(i=0;

i<10;

i++)c1[i]=i+48;for

(i=0;

i<26;

i++)c2[i]=i+'A';for

(i=0;

i<10;

i++)printf("%c

",c1[i]);printf("\n");for

(i=0;

i<26;

i++)printf("%c

",c2[i]);printf("\n");}372.对字符数组的整体引用C是数组首地址输出时遇'\0'

为止2023/10/2⑴

输出字符串例如:char

c[

]="China";printf("%s",c);输出结果为:China再例如:char

c[]="pascal\0basic";printf("%s",c);输出结果为:pascal382.对字符数组的整体引用(续)⑵

输入字符串例如:char

c[10];scanf("%s",c);输入:beijing

beijing\0再例如:char

str1[10],

str2[10],

str3[10];scanf(

"%s%s%s",

str1,

str2,

str3);输入:输入:paspasccaall basbasicic cc

三个字符串用空格隔开,分别赋三个字符串用空格隔开,分别赋给给ststrr11、、ststrr22、、ststrr33三个数组。三个数组。注意:不可以为数组整体赋值,例如:因为c是数组首地址,是常量!char

c[10];

c="beijing"

;注意:“%s”遇空格、Tab和回车结束输入。2023/10/2396.3.5

字符串处理函数2023/10/2说明:①

程序中如果调用下面介绍的8个字符串处理函数,

在程序的开始应该写:#include

"stdio.h"

#include

"string.h"预处理命令,否则在VC++6.0中编译会出现警告

信息。②

在字符串处理函数中,凡是用数组名或字符串首

地址作参数的地方,都可以用指针变量作参数。指针变量的概念在第8章介绍。401.字符串输出函数puts(

)2023/10/2调用格式:puts(str)功能:输出一个字符串,输出后自动换行。说明:str可以是字符数组名或字符串常量。例如:char

str1[

]=

"China";char

str2[

]=

"Beijing";puts(str1);puts(str2);输出结果:ChinaBeijing412.字符串输入函数gets(

)2023/10/2调用格式:gets(str)功能:从键盘读入一个字符串存入str数组中,并且得到一个函数值,该函数值是str数组的首地址。程序运行情况如下:

How

are

you?

Fine

thank

you.

How

are

you?Fine

thank

you.说明:str是数组名。例如:main(

){

charc1[20],c2[20];gets(c1);

gets(c2);puts(c1);

puts(c2);}423.字符串连接函数

strcat(

)beijingandshan

g

h

a

i

\0必须

足够大2023/10/2输出结果:beijing

andshanghai调用格式:strcat(str1,str2)功能:把str2中的字符串连接到str1字符串的后面,结果放在str1数组中,函数值是str1的值。例如:char

str1[21]="beijing

and

";char

str2[

]="shanghai";printf("%s",strcat(str1,str2));434.字符串复制函数

strcpy(

)Beijing\0s1必须足够大2023/10/2思考:这样赋值s1="Beijing"

;或

s1=s2;可以吗?为什么?s1的结果调用格式:strcpy(str1,str2)功能:将str2中的字符串复制到str1数组中。例如:char

s1[10],s2[

]=

"Beijing";strcpy(s1,s2);或:strcpy(s1,"Beijing");445.字符串比较函数

strcmp(

)调用格式:strcmp(str1,str2)abcde\0str1abcde\0str2abc\0abcde\0abcd\0Abcde\0str1str2str1str2strcmp(str1,str2)==02023/10/2strcmp(str1,str2)>0strcmp(str1,str2)<045例如:比较两个字符串的大小。2023/10/2main(

){

char

s1[

]=

"aBC",s2[

]=

"abc";if

(strcmp(s1,s2)==0)printf("s1=s2");else

if

(strcmp(s1,s2)>0)printf("s1>s2");else

printf("s1<s2");}程序输出结果:s1<s2思考:若有语句if

(s1=

=s2)printf("s1=s2");比较的是什么?466.求字符串长度函数

strlen(

)2023/10/2调用格式:strlen(str)功能:测试字符串长度。函数值就是str中字符的

个数。思考:字符串"China"和str数组在内存中各占几个字节?输出结果:5例如:char

str[10]=

"China";printf("%d",strlen(str));或printf("%d",strlen("China"));476.3.6字符数组应用举例2023/10/2【例】从标准输入设备上输入一个字符串,分别统计其中每个数字、空格、字母及其他字符出现的次数。思路:用gets()函数读字符串,然后判断每一个字符是否是数字、空格、大小写字母或其他字符,用循环实现。注意:此题要求分别统计每个数字出现的次数,而不是统计数字出现的总次数。用一个一维整型数组存放每个数字出现的次数。48……{

char

s[80];

inti,sp=0,oth=0,lett=0; intdig[10]={0};gets(s);for

(i=0;

s[i]!='\0';

i++)iiff

(s[(s[ii]]>='>='00''&&s[&&s[ii]]<='<='99'')) ddiig[s[g[s[ii]-]-

''00''

]]++++;;elelssee

iiff

(s[(s[ii]]=='=='

'')) spsp++++;;elelssee

iiff

(s[(s[ii]]>='>='AA''&&s[&&s[ii]]<='Z'<='Z'||s[||s[ii]]>='>='aa''&&s[&&s[ii]]<='z'<='z'

))leletttt++++;;else

oth++;程序运行情况如下:China

1949.10.1~2004.10.1

0:4个

1:5个

2:2个

3:0个

4:1个

5:0个

6:0个

7:0个

8:0个9:2个space:1

letter:5

other:5else

oth++;for

(i=0;

i<10;

i++)printf("%d:%d个

",i,dig[i]);printf("\nspace:%d

letter:%dother:%d\n",sp,lett,oth);}492023/10/26.3.6字符数组应用举例(续)2023/10/2Illegalmonth.\0January\0…Decenmber\0【例】输入某月份的整数值1~12,输出该月份的英文名称。思路:将12个英文月份以字符串的形式存放到

month[13][15]中,一行存放一个字符串。50main(

){char

month[

][15]={"Illegal

month.","January", "February",

"March",

"April","May",

"June",

"July",

"August","September",

"October","Novenber","Decenmber"};int

m;printf("\nInput

month:");scanf("%d",&m);printf("%d:%s\n",

m,(m<1||m>12)?month[0]:month[m]);}程序运行情况如下:

Input

month:10

10:October2023/10/2516.3.6字符数组应用举例(续)2023/10/2【例】将N个国家名按字母顺序

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论