第六章 数组.docx
- 文档编号:28997204
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:26
- 大小:230.68KB
第六章 数组.docx
《第六章 数组.docx》由会员分享,可在线阅读,更多相关《第六章 数组.docx(26页珍藏版)》请在冰豆网上搜索。
第六章数组
第六章数组
数组:
是有序数据的集合。
(两种特征:
1有序2数据类型相同)。
数组中的每一个元素都属于同一个数据类型,用一个统一的数组名和下标来唯一地确定数组中的元素。
§6.1一维数组的定义和引用
一.一维数组的定义
数组类型说明符数组名[常量表达式];
如:
inta[10];
说明:
1.数组名命名规则与变量名相同。
2.数组名后面应使用方括号,不能使用圆括号。
3.常量表达式表示数组元素的个数(数组的大小),而下标从0开始。
4.C语言不允许对数组的大小作动态定义。
如下定义数组是不行的:
intn;
scanf(“%d”,&n);
inta[n];
二.一维数组元素的引用
数组必须先定义,然后使用,而且只能逐个引用数组元素,而不能一次引用整个数组。
如定义数组:
inta[4],b[4];则要把a的值拷贝到b:
不能使用:
b=a;或b[4]=a[4];
而必须:
b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];
或:
for(i=0;i<=3;i++)
b[i]=a[i];
例:
从键盘输入10个人的成绩,计算平均成绩和不及格人数及高于平均成绩的人数。
main()
{floatscore[10],ave,sum=0;
inti,num1=0,num2=0;
for(i=0;i<10;i++)
{printf(“\n请输入第%d个学生的成绩:
”,i+1);
scanf(“%f”,&score[i]);
sum+=score[i];
if(score[i]<60)num1++;
}
ave=sum/i;
for(i=0;i<10;i++)
if(score[i]>=ave)num2++;
printf(“\nave=%f,不及格人数%d人,高于平均成绩人数%d人。
\n”,ave,num1,num2);
}
例:
找出数组中的最大值。
三.一维数组的初始化
可以用赋值语句或输入语句对数组元素进行初始化,但占用运行时间;也可在编译阶段(程序运行之前)对数组初始化:
inta[10]={0,1,2,3,4,5,6,7,8,9};
说明:
1.可以只给一部分元素赋值。
如:
inta[10]={0,1,2,3};
则给前4个元素赋值为0,1,2,3,而后6个元素值为0。
2.对动态数组,若不赋初值,则其值不确定;对静态数组,若没有赋初值,则其所有元素值为0。
3.在对全部数组元素赋初值时,可以不指定数组的长度:
inta[]={1,2,3,4,5};则数组a的长度为5。
四.一维数组程序举例
例1.用数组求Fibonacci数列。
main()
{inti,f[20]={1,1};
for(i=2;i<20;i++)
f[i]=f[i-1]+f[i-2];
for(i=0;i<20;i++)
printf(“%12d”,f[i]);
}
例2.对10个数从小到大排序。
(选择法,冒泡法)
选择法:
冒泡法:
例3.输入全班同学的成绩,统计各等级的人数。
main()
{inti,x,a[5];
printf(“请输入全班同学成绩(负数结束):
\n”);
scanf(“%d”,&x);
while(x>=0)
{if(x==100)a[4]++;
elseif(x<60)a[0]++;
elseif(x<100)a[x/10-5]++;
scanf(“%d”,&x);
}
printf(“各等级人数如下:
\n”);
printf(“优:
%d人,良:
%d人,中:
%d人,及格:
%d人,不及格:
%d人。
\n”,a[4],a[3],a[2],a[1],a[0]);
}
§6.2二维数组的定义和引用
一.二维数组的定义
数组类型说明符数组名[常量表达式][常量表达式];
如:
inta[3][4],b[5][10];
a为3*4(3行4列),b为5行10列。
注意:
不能写成floata[3,4],b[5,10];
二维数组的元素:
如inta[3][4];
a[0][0]a[0][1]a[0][2]a[0][3]
a[1][0]a[1][1]a[1][2]a[1][3]
a[2][0]a[2][1]a[2][2]a[2][3]
C语言数组元素在内存的存放方式:
按行存放。
可以把二维数组看作是一种特殊的一维数组:
这个一维数组的元素又是一个一维数组:
a[0]:
a[0][0]a[0][1]a[0][2]a[0][3]
a[1]:
a[1][0]a[1][1]a[1][2]a[1][3]
a[2]:
a[2][0]a[2][1]a[2][2]a[2][3]
多维数组:
floata[2][3][4];
二.二维数组的引用
二维数组元素的表示形式:
数组名[下标][下标]
三.二维数组的初始化
1.分行给二维数组赋初值:
inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
a:
1234
5678
9101112
2.将所有数据写在一个花括号内,按数组元素排列的顺序对各元素赋初值:
inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
3.可以对部分元素赋初值,剩余部分值为0:
inta[3][4]={{1},{5},{9}};
intb[3][4]={{1},{0,6},{0,0,11}};
intc[3][4]={{},{1,0,2}};
intd[3][4]={1,2,3,4,5};
对于自动数组,若没有赋初值,则值不确定;
对于静态数组,若没有赋初值,则值为0。
4.若采用分行赋初值或对全部元素赋初值,则可以省略第一维长度的说明,但第二维长度不能省略:
inta[][4]={{0,0,3},{},{0,1}};
intb[][4]={1,2,3,4,5,6,7,8};
intc[][3]={1,2,3,4,5};
四.二维数组程序举例
例1.将一个二维数组行和列元素互换,存到另一个二维数组中。
main()
{inta[2][3]={{1,2,3},{4,5,6}};
intb[3][2],i,j;
printf(“arraya:
\n”);
for(i=0;i<2;i++)
{printf(“\n”);
for(j=0;j<3;j++)
{printf(“%5d”,a[i][j]);
b[j][i]=a[i][j];
}
}
printf(“\narrayb:
\n”);
for(i=0;i<3;i++)
{printf(“\n”);
for(j=0;j<2;j++)
printf(“%5d”,b[i][j]);
}
}
例2.求两个矩阵相乘。
A2*3*B3*4=C2*4
其中c[i][j]=a[i][0]*b[0][j]+a[i][1]*b[1][j]+a[i][2]*b[2][j]
main()
{inta[2][3]={{1,2,3},{4,5,6}};
intb[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
intc[2][4];
inti,j,k;
for(i=0;i<2;i++)
for(j=0;j<4;j++)
{c[i][j]=0;
for(k=0;k<3;k++)
c[i][j]=c[i][j]+a[i][k]*b[k][j];
}
printf(“\n数组C为:
\n”);
for(i=0;i<2;i++)
{for(j=0;j<4;j++)
printf(“%6d”,c[i][j]);
printf(“\n”);
}
}
例3.有一个3*4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。
main()
{inti,j,row=0,col=0,max;
inta[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};
max=a[0][0];
for(i=0;i<3;i++)
for(j=0;j<4;j++)
if(a[i][j]>max)
{max=a[i][j];
row=i;col=j;
}
printf(“max=%d,row=%d,col=%d\n”,max,row,col);
}
二维数组元素的输入。
如inta[2][3];
for(i=0;i<2;i++)
for(j=0;j<3;j++)
scanf(“%d”,&a[i][j]);
§6.3字符数组
用来存放字符数据的数组是字符数组。
字符数组中的一个元素存放一个字符。
一.字符数组的定义
charc1[10],c2[3][5];
二.字符数值的初始化
charc[5]={‘h’,’a’,’p’,’p’,’y’};
c[0]
c[1]
c[2]
c[3]
c[4]
h
a
p
p
y
若花括号内提供的初值个数大于数组长度,则作语法错误。
若初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余元素自动赋值为空字符(’\0’):
charc[7]={‘h’,’a’,’p’,’p’,’y’};
c[0]
c[1]
c[2]
c[3]
c[4]
c[5]
c[6]
h
a
p
p
y
\0
\0
也可以不指定数组的长度,由系统自动确定:
charc[]={‘h’,’a’,’p’,’p’,’y’,’’,’n’,’e’,’w’,’’,’y’,’e’,’a’,’r’};
也可以定义和初始化一个二维字符数组:
chardiamond[5][5]={{‘‘,’‘,’*’},{‘‘,’*’,’‘,’*’},{‘*’,’‘,’‘,’‘,’*’},{‘‘,’*’,’‘,’*’},{‘‘,‘‘,’*’}};
三.字符数组的引用
可以引用字符数组中的一个元素,得到一个字符。
main()
{charc[]={‘h’,’a’,’p’,’p’,’y’,’’,’n’,’e’,’w’,’’,’y’,’e’,’a’,’r’};
inti;
for(i=0;i<14;i++)
printf(“%c”,c[i]);
printf(“\n”);
}
也可以用%s格式输出整个字符数组(字符串)。
main()
{charc[]={‘h’,’a’,’p’,’p’,’y’,’’,’n’,’e’,’w’,’’,’y’,’e’,’a’,’r’};
printf(“%s”,c);
}
四.字符串和字符串结束标志
C语言没有字符串变量,将字符串作为字符数组来处理。
在实际使用过程中,数组长度往往大于字符串的实际长度,C语言规定了一个“字符串结束标志’\0’”,表示字符串的结束。
系统对字符串常量也自动加上一个’\0’字符作为结束标志。
如:
printf(“Howdoyoudo?
\n”);
系统自动在’\n’之后加上一个’\0’,函数printf在输出时,遇到’\0’则停止输出。
可以用字符串常量来使字符数组初始化:
charc[]={“china”};
或charc[]=”china”;
这时,数组c的长度为6,而不是5。
注意:
字符数组并不要求它的最后一个字符为’\0’,甚至可以不包含’\0’。
五.字符数组的输入输出
有两种方法:
1.用“%c”格式:
输入或输出一个字符;
2.用“%s”格式:
输入或输出一个字符串。
用“%s”格式输出时注意:
1.输出的字符中不包括结束符’\0’;
2.在printf中,输出项是字符数组名,而不是数组元素名:
charc[]=”china”;
printf(“%s”,c);而不是printf(“%s”,c[0]);
3.输出时遇到’\0’就结束,而不是按数组的实际长度输出。
若数组中含有多个’\0’,则遇到第一个’\0’就结束。
若没有’\0’,则按数组长度输出。
用“%s”格式输入时应注意:
1.用scanf输入字符串时,输入项也是字符数组名。
2.从键盘输入的字符串应短于已定义的字符数组的长度,系统自动在后面加上一个’\0’;若输入字符比数组长,可能出错。
3.如果利用一个scanf函数输入多个字符串,则以空格分隔(不能用‘,’分隔):
charstr1[5],str2[5],str3[5];
scanf(“%s%s%s”,str1,str2,str3);
六.字符串处理函数
下面介绍几种C函数库提供的一些用来处理字符串的函数。
大多数C版本都提供这些函数。
1.puts(字符串)“stdio.h”
作用:
将一个字符串输出到终端。
#include“stdio.h”
main()
{puts(“abcd\n123456”);
}
注意:
在输出时将’\0’转换成’\n’,即输出完字符串后换行。
2.gets(字符数组)“stdio.h”
作用:
从终端输入一个字符串到字符数组,并且得到一个函数值,是字符数组的起始地址。
注意:
用puts和gets函数只能输入或输出一个字符串,不能写成:
puts(str1,str2)或gets(str1,str2)。
3.strcat(串1,串2)“string.h”
作用:
连接两个字符串,串2接在串1的后面,结果存放在串1中。
返回的函数值:
串1的地址。
如:
charstr[10]=”123”;
strcat(str,”ab”);
说明:
1.串1必须足够大;
2.串1原来的’\0’被取消,只在新串的最后保留一个’\0’。
4.strcpy(串1,串2)“string.h”
作用:
将串2拷贝到串1中。
返回的函数值:
串1的地址。
如:
charstr[]=”abcde”;
strcat(str,”123”);
说明:
1.串1必须足够大;
2.拷贝时连同’\0’一起拷贝到串1中;
3.不能用赋值语句进行字符串赋值,而只能使用函数strcpy。
4.可以用strcpy将串2中前几个字符拷贝到串1中:
strcpy(串1,串2,n);
5.strcmp(str1,str2)“string.h”
作用:
比较str1与str2的大小。
返回的函数值:
0:
str1=str2
正数:
str1>str2
负数:
str1 注意: 两个字符串比较,不能使用如下形式: if(str1==str2)printf(“yes”); 而只能: if(strcmp(str1,str2)==0)printf(“yes”); 6.strlen(str)“string.h” 作用: 测试字符串长度。 返回的函数值: 字符串的实际长度(不包括’\0’)。 7.strlwr(字符串)“string.h” 作用: 将字符串转换成小写字母。 返回的函数值: 串的首地址。 8.strupr(字符串)“string.h” 作用: 将字符串转换成大写字母。 返回的函数值: 串的首地址。 七.字符数组应用举例 例1.输入一行字符,统计其中有多少单词。 单词之间用空格分隔开(空格可能有多个)。 #include“stdio.h” main() {charstring[81]; inti,num=0,word=0; charc; gets(string); for(i=0;(c=string[i])! =’\0’;i++) if(c==’‘)word=0; elseif(word==0) {word=1;num++;} printf(“本行有%d个单词。 \n”,num); } #include“stdio.h” #include“ctype.h” main() {inti,num=0; charc,string[81]; gets(string); for(i=0;(c=string[i])! =’\0’;) {if(isalpha(c))num++; while(c! =’\0’&&isalpha(c))/*跳过所有字母。 */ {i++;c=string[i];} while(c! =’\0’&&! isalpha(c))/*跳过所有分隔符。 */ {i++;c=string[i];} } printf(“num=%d\n”,num); } #include“stdio.h” #include“ctype.h” main() {inti,num=0; charc,string[81]; gets(string); i=0; while((c=string[i])! =’\0’) {if(isalpha(c)) {num++; while(c! =’\0’&&isalpha(c))/*跳过所有字母。 */ {i++;c=string[i];} } elsei++;/*跳过所有分隔符。 */ } printf(“num=%d\n”,num); } 例2.输入一个0~6的数字,输出相应星期几的英文名字。 main() {intn; charweek[][10]={“Sunday”,”Monday”,”Tuesday”,”Wednesday”,”Thursday”,”Friday”,”Saturday”,”Invalid”}; printf(“请输入一个星期数字: ”); scanf(“%d”,&n); if(n<0||n>6)printf(“%s\n”,week[7]); elseputs(week[n]); } printf(“%s\n”,(n<0||n>6)? week[7]: week[n]); §6.3练习题 一.用筛法求100之内的素数。 #include“math.h” main() {inti,j,n,a[101]; for(i=1;i<=100;i++) a[i]=i; for(i=2;i if(a[i]! =0) for(j=i+1;j<=100;j++) if(a[j]! =0) if(a[j]%a[i]==0)a[j]=0; printf(“\n”); for(i=2,n=0;i<=100;i++) {if(a[i]! =0) {printf(“%5d”,a[i]); n++; } if(n==10) {printf(“\n”); n=0; } } } 二.求一个3*3矩阵对角线元素之和。 main() {inta[3][3],sum=0; inti,j; printf(“Enterdata: \n”); for(i=0;i<3;i++) for(j=0;j<3;j++) scanf(“%d”,&a[i][j]); for(i=0;i<3;i++) sum+=a[i][i]; printf(“sum=%5d\n”,sum); } 三.有一个已排好序的数组,今输入一个数,要求按原来排序的规律将它插入数组中。 main() {inta[11]={1,4,6,9,13,16,19,28,40,100}; inti,j,number; printf(“arraya: \n”); for(i=0;i<10;i++) printf(“%5d”,a[i]); printf(“\n”); printf(“Insertdata: ”); scanf(“%d”,&number); for(i=0;i<10;i++) if(a[i]>number)break; for(j=10;j>i;j--) a[j]=a[j-1]; a[i]=number; printf(“Nowarraya: \n”); for(i=0;i<11;i++) printf(“%5d”,a[i]); } 将数组a中值为偶数的元素,按从大到小顺序存放到数组b中. 例如: 数组a中元素的值依次为: 11,-90,-31,-25,-46,52,38,57 则数组b中元素的值依次为: 52,38,-46,-90 b数组元素个数为: 4 main() {inta[]={11,-90,-31,-25,-46,52,38,57}; intb[10],i,j=0,k,n; for(i=0;i<8;i++) if(a[i]%2==0) {for(k=0;k if(a[i]>b[k])break; for(n=j;n>k;n--) b[n]=b[n-1]; b[k]=a[i]; j++; } for(i=0;i printf(“%4d”,b[i]); } 四.将一个数组中的值按逆序重新存放。 #defineN5 main() {inta[N],i,j,temp; printf(“Enterarraya: \n”); for(i=0;i scanf(“%5d”,&a[i]); printf(“arraya: \n”); for(i=0;i printf(“%5d”,a[i]); printf(“\n”); for(i=0,j=N-1;i {temp=a[i]; a[i]=a[j]; a[j]=temp; } printf(“Nowarraya: \n”); for(i=0;i printf(“%5d”,a[i]); printf(“\n”); } 五.有N个数按由从大到小的顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。 若该数不在数组中,则显示出“该数不在表中。 ”。 #defineN15 main() {inta[N]={321,304,245,222,210,198,159,134,123,121,115,112,98,45,2}; inti,j,m,number; printf(“Inputanumber: ”); scanf(“%d”,&number); i=0;j=N-1; while(i<=j) {m=(i+j)/2; if(a[m]==numbe
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第六章 数组 第六