1
第七章 数 组主讲 福 州大学数学与计算机学院 韩晓芸
E-mail:hxy@fjtv.net
第 7章 数 组
10:39 2
第一节 数组概述
第二节 一维数组
第三节 二维数组
第四节 字符数组第七章 数 组第 7章 数 组
10:39 3
第一节 数组概述例 1:
输入三个数 a,b,c,由大到小进行排序 。
main()
{int a,b,c,t;
scanf(“%d%d%d”,&a,&b,&c);
if(a<b) {t=a;a=b;b=t;}
if(a<c) {t=a;a=c;c=t;}
if(b<c) {t=b;b=c;c=t;}
printf(“%d,%d,%d”,a,b,c);
}
第 7章 数 组
10:39 4
数组的有关概念
– 数组是 具有一定顺序关系的若干相同类型变量 的集合,特点:
数组具有 有序性
数组具有 同一性
数组具有 整体性
– 组成数组的每个分量称为 数组的元素 ;
– 数组的维数(一维,二维,三维)
第 7章 数 组
10:39 5
2.1 定义
2.2 引用
2.3 初始化
2.4 输入和输出
2.5 应用举例第二节 一维数组第 7章 数 组
10:39 6
a[0] a[1] a[2] a[3] a[4]
2.1 定义类型说明符 数组名 [常量表达式 ];
int a[5];
char c[20];
float x[10];
注意:
– 数组名命名规则与变量名相同 ;
– 数组名后是 方括号,而不是小括号;
– 常量表达式 表示元素的个数,下标从零开始 。
– 数组的大小是固定的,不能动态定义 。
– 例如,int n; scanf(“%d”,&n);int a[n];是错误的。
第 7章 数 组
10:39 7
2.2 引用
数组必须先定义,后使用 。
只能 逐个 引用数组元素。
引用形式,数组名 [下标 ];
– 其中下标可以是 整型的 常量、变量或表达式;
– 数组长度为 M时,下标值为 0,1,2…M -1
例如,
定义数组 int a[3],数组元素为 a[0] a[1] a[2]
a[2]=1;
a[i+j];(i,j为整型变量)
第 7章 数 组
10:39 8
2.3 初始化一维数组的初始化可以用 赋值语句或输入语句 使数组中的元素得到值,但占运行时间,同时也可以使数组在程序运行之前初始化,即在编译期间使之得到初值。对数组元素的初始化可以用以下方法:
1) 在定义数组时,对数组元素赋以初值 。
如,int a[10]={0,1,2,3,4,5,6,7,8,9};
第 7章 数 组
10:39 9
一维数组的初始化
2) 可以只给一部分元素赋值。
如,int a[10]={0,1,2,3,4};
表示 只给前 5个元素赋初值,后 5个元素自动赋以 0值 。若要对所有元素赋同一值时应该将所有值逐个写出,不能省略。
如,int s[5]={1,1,1,1,1};
第 7章 数 组
10:39 10
一维数组的初始化
3) 在对全部数组元素赋初值时,可以不指定数组长度。
如,int a[5]={1,2,3,4,5}; 可以书写成
int a[ ]={1,2,3,4,5};
第 7章 数 组
10:39 11
2.4 输入和输出
C语言规定,对数组的使用只能逐个引用数组元素,不能一次引用整个数组。同样,对数组的输入和输出也是依次对每个元素进行的 。
例 2,定义一个数组 a,a有 10个元素,分别赋值为 0,1,2,…,9,并输出。
main( )
{int i,a[10];
for (i=0;i<=9;i++)
{a[i]=i;}
for (i=0;i<=9;i++)
{printf("%4d",a[i] );}
}
第 7章 数 组
10:39 12
说明,在循环体内 利用循环控制变量作为下标输入输出数组元素,因此数组元素输入输出的次序和数量可以控制。
例如,下面的程序段将一个数组按照 逆序 打印数组元素的值。
for(i=9;i>=0;i--)
printf("%5d",a[i]);
下面程序段只打印一个数组的 前五个 元素值。
for(i=0;i<5;i++)
printf("%5d",a[i]);
第 7章 数 组
10:39 13
例 3:
定义具有 10个元素的数组 a,输入 10数据
,并输出。
main( )
{int i,a[10];
for (i=0;i<=9,i++)
scanf("%d",&a[i]);
for (i=0;i<=9;i++)
printf("%4d",a[i] );
}
第 7章 数 组
10:39 14
2.5 一维数组应用举例例 4,有一个一维数组,输入 10个整数存放其中,
找出其中最大的一个数。
main()
{int i,max,x[10];
printf("enter 10 data:\n");
for(i=0;i<10;i++)
scanf("%d",&x[i]);
max=x[0];
for(i=1;i<10;i++)
if(x[i]>max) max=x[i];
printf("max=%d\n",max);}
第 7章 数 组
10:39 15
例 5,使用数组编程,计算出前 40项 fibonacci
数列,要求一行打印 5个数。
1 1 2 3 5
第 1次 f[0] + f[1] → f[2]
第 2次 f[1] + f[2]→ f[3]
第 3次 f[2] + f[3] → f[4]
…….
main()
{ long f[40]; int i;
f[0]=1; f[1]=1;
for(i=2;i<40;i++)
f[i]=f[i-1]+f[i-2];
for(i=0;i<40;i++)
{ if(i%5==0)
printf(“\n”);
printf("%12ld",f[i]); }
}
第 7章 数 组
10:39 16
例 6:
用 冒泡法 对 5个整数按 从小到大 的顺序排列输出。 排序的方法很多,主要有:
冒泡法
选择法
希尔法
插入法第 7章 数 组
10:39 17
第 1轮比较 4次:第 1次 21 13 90 32 -1 进行交换第 2次 13 21 90 32 -1 不进行交换第 3次 13 21 90 32 -1 进行交换第 4次 13 21 32 90 -1 进行交换第 1轮比较结果,13 21 32 -1 90
最大的数已排好应用举例(排序:冒泡法)
假定有 5个无序的数 21,13,90,32,-1
第 7章 数 组
10:39 18
第 2轮比较 3次:第 1次 13 21 32 -1 90 不进行交换第 2次 13 21 32 -1 90 不进行交换第 3次 13 21 32 -1 90 进行交换第 2轮比较结果,13 21 -1 32 90
第 3轮比较 2次:第 1次 13 21 -1 32 90 不进行交换第 2次 13 21 -1 32 90 进行交换第 3轮比较结果,13 -1 21 32 90
第 4轮比较 1次:第 1次 13 -1 21 32 90 进行交换第 4轮比较结果,-1 13 21 32 90
应用举例(排序:冒泡法)续第 7章 数 组
10:39 19
应用举例(排序:冒泡法)续例 6,源程序编写如下:
#include,stdio.h”
void main()
{ int i,j,a[5],temp;
for(i=0;i<5;i++)
scanf (“%d”,&a[i]);
printf (“\n”) ;
for(i=0;i<5;i++)
printf (“%5d”,a[i]);
printf (“\n”);
第 7章 数 组
10:39 20
应用举例(排序:冒泡法)续例 6,源程序续写如下:
for(i=0;i<4;i++)
for(j=0;j<4-i;j++)
if(a[j]>a[j+1])
{temp=a[j];a[j]=a[j+1];a[j+1]= temp;}
for(i=0;i<5;i++)
printf(“%5d”,a[i]);
printf(“\n”);
}
第 7章 数 组
10:39 26
第三节 二维数组
3.1 二维数组的定义
3.2 二维数组的引用
3.3 二维数组的输入输出
3.4 二维数组的初始化
3.5 应用举例第 7章 数 组
10:39 27
a[0][0]
a[0][1]
a[0][2]
a[1][0]
a[1][1]
a[1][2]
3.1 定义
二维数组定义的一般形式为:
类型说明符 数组名 [常量表达式 ] [常量表达式 ]
int a[2][3]; char c[20][7]; float x[50][3];
1,可以把二维数组看作是一种特殊的一维数组。即每个元素又是一维数组。如:
a[0] ---> a[0][0] a[0][1] a[0][2] a[0][3]
2,二维数组的元素在数组中的是按行排列的 。
第 7章 数 组
10:39 28
注意两个下标的值不要超过各自的范围;
要严格区分定义数组时 a[2][3],和引用数组时的 a[2][3];
3.2 引用
引用形式,数组名 [下标 ][下标 ];
其中 下标可以是 整型的 常量、变量或表达式 ;
例如,定义数组 int a[2][3],数组元素为
a[0][0] a[0][1] a[0][2]
a[1][0] a[1][1] a[1][2]
则 a[0][2]=1;
a[i+j]=i+j;(i,j为整型变量)
第 7章 数 组
10:39 29
3.3 输入和输出
有两个下标,要用双重循环。
例如,输入 2个学生 3门课的成绩:
课程 1 课程 2 课程 3
学生 1 65 78 75
学生 2 70 66 82
第 7章 数 组
10:39 30
65 78 75 70 66 82
a[0][0]
a[0][1]
a[0][2]
a[1][0]
a[1][1]
a[1][2]
第一种方法:
for(i=0;i<2;i++)
for(j=0;j<3;j++)
scanf("%d",&a[i][j]);
for(i=0;i<2;i++)
{for(j=0;j<3;j++)
printf(" a[%d][%d]=%d",i,j,a[i][j]);
printf("\n");}
应该 按行 输入数据:
65 78 75 70 66 82(回车)
第 7章 数 组
10:39 31
65 78 75 70 66 82
a[0][0]
a[0][1]
a[0][2]
a[1][0]
a[1][1]
a[1][2]
第二种方法:
for(j=0;j<3;j++)
for(i=0;i<2;i++)
scanf("%d",&a[i][j]);
for(j=0;j<3;j++)
{for(i=0;i<2;i++)
printf(" a[%d][%d]=%d",i,j,a[i][j]);
printf("\n");}
应该 按列 输入数据:
65 70 78 66 75 82(回车)
第 7章 数 组
10:39 32
3.4 初始化
分行赋初值
–int a[2][3]={{1,2,3},{4,5,6}};
不分行赋初值
–int b[2][3]={1,2,3,4,5,6};
第 7章 数 组
10:39 33
3.4 初始化
对部分元素赋初值
int c[3][4]={ {1},{0,2},{0,0,3} };
int d[3][4]={{1},{},{9}};
– 未赋值的元素自动赋值 0,且前面的 0不能省,
后面的 0可以省
对全部元素赋初值,可省略第一维的长度
int a[ ][2]={ {1,2},{3,4} };
Int a[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12} ;
第 7章 数 组
10:39 34
3.5 应用举例例 8,求两个 3*4矩阵的和。参考程序如下:
– main( )
– { int a[3][4],b[3][4],c[3][4];
– int i,j;
– printf("input array a:\n");
– for(i=0;i<3;i++)
– for(j=0;j<4;j++)
– scanf("%d",&a[i][j]);
– printf(“input array b:\n");
第 7章 数 组
10:39 35
– for(i=0;i<3;i++)
– for(j=0;j<4;j++)
– scanf("%d",&b[i][j]);
– for(i=0;i<3;i++)
– for(j=0;j<4;j++)
– c[i][j]=a[i][j]+b[i][j];
–printf(“sum of array a and b is:\n");
– for(i=0;i<3;i++)
– {for(j=0;j<4;j++)
– printf("%5d",c[i][j]);
– printf("\n");}}
第 7章 数 组
10:39 36
例 9,将一个 2*3的数组行、列元素互换,存到另外一个数组中。注意两个数组的定义。 程序如下:
main()
{int a[2][3]={{1,2,3},{4,5,6}};
int b[3][2],i,j;
printf("array a:\n");
for(i=0;i<=1;i++)
{for(j=0,j<=2;j++)
{printf("%5d"a[i][j]);
b[j][i]=a[i][j];}
printf("\n");}
printf("array b:\n");
for(i=0;i<=2;i++)
{for(j=0;j<=1;j++)
printf("%5d",b[i][j]);
printf("\n");}
}
第 7章 数 组
10:39 37
例 10,求一个 3*4矩阵中的 最大值及其所在的行、列 。
参考程序如下:
– main( )
– {int a[3][4],row=0,col=0,i,j,max;
– for(i=0;i<3;i++)
– for(j=0;j<4;j++)
– scanf("%d",&a[i][j]);
– 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+1;col=j+1;}
– printf(“max=%d,row=%d,col=%d\n”,max,row,col);
– }
第 7章 数 组
10:39 38
思考题,初始化一个 4× 4矩阵,结果如下:
1 0 0 -1
0 1 -1 0
0 -1 1 0
-1 0 0 1
即主对角线元素值为 1,副对角线元素值为-
1,其余元素为零。
第 7章 数 组
10:39 39
1 0 0 0 0 0 1
3 1 0 0 0 1 4
3 3 1 0 1 4 4
3 3 3 1 4 4 4
3 3 1 2 1 4 4
3 1 2 2 2 1 4
1 2 2 2 2 2 1
练习,打印如下方阵( 7× 7)
主对角线副对角线主对角线上元素的特点,i=j
副对角线上元素的特点,i+j=6
i<j && i+j<6
i>j && i+j>6
i<j && i+j>6i>j && i+j<6
第 7章 数 组
10:39 40
第四节 字符数组
4.1 字符数组的定义及初始化
4.2 字符串
4.3 字符数组的输入输出
4.4 字符串处理函数
4.5 二维字符数组
4.6 字符数组应用举例第 7章 数 组
10:39 41
4.1 字符数组的定义及初始化存放字符数据的数组是字符数组,字符数组中的一个元素存放一个字符 。
定义
char 字符数组名 [整型常量表达式 ][…]
例如:
char str[20];
由于字符型与整型是互相通用的,因此,
上面的定义也可改写为,int str[20];
第 7章 数 组
10:39 42
4.1 字符数组的定义及初始化
初始化
– 逐个为数组中各元素指定初值字符。
– char str[4] ={'w','e','l','l'};
例,char c[10]={'I',' ','a','m',' ','h','a','p','p','y'};
char c[3][2]={{' ','*'},{'*',' '},{' ','*'}};
注,对字符数组未被赋值的元素系统自动将其赋值为空 (‘\0’)。
第 7章 数 组
10:39 43
4.2 字符串
字符串 是用一对 双引号 括起来的字符序列,这些字符 可以是一般的可显示字符,也可以是某些特殊的控制字符 ;
字符串只能用字符数组来处理,C语言中没有字符串变量。
字符串在内存中存放时,系统将自动在字符串的末尾添加一个字符串的结束 标记‘ \0’(空字符),碰到第一个 '\0'就认为字符串处理结束 。
第 7章 数 组
10:39 44
系统对字符串常量自动加‘ \0’
用字符串给字符数组初始化
char st[8]= {"welcome"}; 或
char st[8]= "welcome";
等价于
char st[8]={'w','e','l','c','o','m','e','\0'};
w e l c o m e \0
st[0] st[1] st[2] st[3] st[4] st[5] st[6] st[7]
第 7章 数 组
10:39 45
4.3 字符数组的输入输出
– 逐个 输入输出
– main()
– {int i;char a[10];
– for(i=0;i<10;i++)
– scanf("%c",&a[i]);
– for(i=0;i<10;i++)
– printf("%c",a[i]);
– printf ("\n");
– }
– 整体 输入 /输出
– main()
– {char a[10];
– scanf("%s",a);
– printf("%s\n",a);
– }
第 7章 数 组
10:39 46
输出字符时不包含‘ \0’
用,%s”格式符时,输出项 是数组名,而 不是数组元素 名 。
输入项为数组名时,前面不要再加,&”。
当数组长度大于字符串实际长度,也只输出到遇 ‘ \0’结束 。如:
char c[10]={“well”};
printf(“%s”,c);
如果一个字符数组中有多个‘ \0’,则遇到第一个‘ \0’,输出就结束。
4.3 字符数组的输入输出第 7章 数 组
10:39 47
h o w \0
a r e \0
y o u? \0
利用 scanf输入多个字符串,以 空格 分隔。 如:
– char c1[5],c2[5],c3[5];
– scanf(“%s%s%s”,c1,c2,c3);
– 输入 how are you?(回车)
4.3 字符数组的输入输出第 7章 数 组
10:39 48
h o w \0
注意,scanf函数不能完整地读入带空格的字符串。
例如上例改为:
char c[13];
scanf(“%s”,c);
– 如果输入 how are you! (回车)
4.3 字符数组的输入输出第 7章 数 组
10:39 49
h o w a r e y o u ! \0
C语言提供了一个用于读字符串的函数,它读入全部字符(包括空格),直到 遇到回车符为止,
它是 gets()。
例如,char c[13];
gets(c);
键盘输入,How are you! (回车)
4.3 字符数组的输入输出第 7章 数 组
10:39 50
4.4 字符串处理函数
字符串的输入 gets(字符数组 )
– 格式,gets(ch)
– 功能:从终端输入一个字符串到字符数组 ch
中,输入 回车键时结束,并将回车符‘ \n’转换成 '\0',其中 ch只能 是一个字符数组名。
字符串的输出 puts(字符数组 )
– 格式,puts(ch)
– 功能:向终端输出字符串,并 将 '\0'转换成 '\n'输出,其中 ch可以是某个字符数组名,也可以是一个字符串常量。
第 7章 数 组
10:39 51
字符串的复制 strcpy(字符数组 1,字符串
2)
– 格式,strcpy(ch1,ch2)
– 功能,将 ch2中的字符串复制到 ch1字符数组,
限定 ch1为字符数组名,ch2可以是字符串常量或字符数组名 。
4.4 字符串处理函数第 7章 数 组
10:39 52
str1
C h i n a \0str1
复制前复制后
字符串的复制 strcpy(字符数组 1,字符串 2)
– 例如:
char str1[11];
strcpy(str1,”China”); printf(“%s”,str1);
4.4 字符串处理函数第 7章 数 组
10:39 53
C l a n g u a g e \0str1
C h i n a \0 u a g e \0str1
复制前复制后
– 又如:
char str1[ ]={,C language”};
strcpy(str1,”China”);printf(“%s”,str1);
4.4 字符串处理函数第 7章 数 组
10:39 54
说明:
– ch1必须定义的足够大
– 拷贝时 ‘ \0’一起拷贝过去
– 不能用 赋值语句 将一个字符串常量或字符数组直接赋给一个字符数组。如:
str1=“china”;或 str1=str2;
– 可以 将字符串 2前面的 n个字符 拷贝到字符数组 1中,如,strcpy(ch1,ch2,2);
4.4 字符串处理函数第 7章 数 组
10:39 55
字符串的比较 strcmp( )
– 格式,strcmp(ch1,ch2)
– 功能:对 ch1和 ch2所对应的字符串 从左到右 一一进行比较(比较字符的 ASCII码值 的大小),第一个不相等的字符的大小决定了整个字符串的大小,若 ch1和 ch2的所有字符完全相同,则 ch1等于 ch2。
4.4 字符串处理函数第 7章 数 组
10:39 56
字符串的比较 strcmp( )
– ch1=ch2 函数返回 0
– ch1<ch2 函数返回一个负整数
– ch1>ch2 函数返回一个正整数
– 说明:对两个字符串比较,不能用
–if(ch1==ch2) printf(“yes”);
– 只能用
–if(strcmp(ch1,ch2)==0)
printf(“yes”);
4.4 字符串处理函数第 7章 数 组
10:39 57
字符串的连接函数 strcat()
– 格式,strcat(ch1,ch2);
– 功能,将 ch2复制到 ch1的后面,连接时将
ch1的‘ \0’去掉,只在新字符串后保留一个
‘ \0’ 。 要求 ch1必须是一个足够大的字符数组,ch2可以是字符串常量或字符数组名 。
4.4 字符串处理函数第 7章 数 组
10:39 58
s t r1 P r o g r a m m i n g \ 0
s t r2 D e s i g n \ 0
s t r1 P r o g r a m m i n g D e s i g n \ 0
字符串的连接函数 strcat()
– 例如:
– char str1[19]={“Programming”};
– char str2[ ]={“Design”};
– strcat(str1,str2);
– puts(str1);
4.4 字符串处理函数第 7章 数 组
10:39 59
求字符串长度的 strlen( )
– 格式,strlen(ch)
– 功能:返回 ch的有效字符的个数,不包括‘ \0’在内,
其中 ch为字符数组名或某个字符串常量。
字符串大小写转换 strlwr()
– 格式,strlwr(ch);
– 功能:将 ch中所有的大写字母转换成小写字母。
字符串大小写转换 strupr()
– 格式,strupr(ch);
– 功能:将 ch中所有的小写字母转换成大写字母。
4.4 字符串处理函数第 7章 数 组
10:39 60
4.5 二维字符数组
定义
char str[3][6]; 或 int str[3][6];
– 相当于三个一维字符数组,可以存放三个字符串
引用
– 可以单独输出某一个元素,也可以输出某一行的元素,即某一个字符串。如,printf(“%s”,str[2]);
初始化
char str[3][6]={”China”,”Japan”,”Korea”};
C h i n a
J a p a n
K o r e a
\0
\0
\0
第 7章 数 组
10:39 61
例 11,输入一行文字,找出其中大写字母,小写字母,空格,数字及其它字符各有多少?程序如下,
#include "stdio.h"
main()
{ int i,up=0,low=0,space=0,digit=0,other=0;
char str[60]; gets(str);
for(i=0;str[i]!='\0';i++)
{if((str[i]>='A') && (str[i]<='Z')) up++;
else if((str[i]>='a') && (str[i]<='z')) low++;
else if ((str[i]<='9')&&(str[i]>='0')) digit++;
else if(str[i]==' ') space++;
else other++;}
printf("up=%d low=%d space=%d",up,low,space);
printf(" digit=%d other=%d",digit,other);}
第 7章 数 组
10:39 73
#define N 10
main()
{int i,j,a[N][N];
for(i=0;i<N;i++)
{a[i][i]=1; a[i][0]=1;}
for(i=2;i<N;i++)
for(j=1;j<i;j++)
a[i][j]=a[i-1][j]+a[i-1][j-1];
for(i=0;i<N;i++)
{for(j=0;j<=i;j++)
printf("%6d",a[i][j]);
printf("\n");}
printf("\n");}
第七章 数 组主讲 福 州大学数学与计算机学院 韩晓芸
E-mail:hxy@fjtv.net
第 7章 数 组
10:39 2
第一节 数组概述
第二节 一维数组
第三节 二维数组
第四节 字符数组第七章 数 组第 7章 数 组
10:39 3
第一节 数组概述例 1:
输入三个数 a,b,c,由大到小进行排序 。
main()
{int a,b,c,t;
scanf(“%d%d%d”,&a,&b,&c);
if(a<b) {t=a;a=b;b=t;}
if(a<c) {t=a;a=c;c=t;}
if(b<c) {t=b;b=c;c=t;}
printf(“%d,%d,%d”,a,b,c);
}
第 7章 数 组
10:39 4
数组的有关概念
– 数组是 具有一定顺序关系的若干相同类型变量 的集合,特点:
数组具有 有序性
数组具有 同一性
数组具有 整体性
– 组成数组的每个分量称为 数组的元素 ;
– 数组的维数(一维,二维,三维)
第 7章 数 组
10:39 5
2.1 定义
2.2 引用
2.3 初始化
2.4 输入和输出
2.5 应用举例第二节 一维数组第 7章 数 组
10:39 6
a[0] a[1] a[2] a[3] a[4]
2.1 定义类型说明符 数组名 [常量表达式 ];
int a[5];
char c[20];
float x[10];
注意:
– 数组名命名规则与变量名相同 ;
– 数组名后是 方括号,而不是小括号;
– 常量表达式 表示元素的个数,下标从零开始 。
– 数组的大小是固定的,不能动态定义 。
– 例如,int n; scanf(“%d”,&n);int a[n];是错误的。
第 7章 数 组
10:39 7
2.2 引用
数组必须先定义,后使用 。
只能 逐个 引用数组元素。
引用形式,数组名 [下标 ];
– 其中下标可以是 整型的 常量、变量或表达式;
– 数组长度为 M时,下标值为 0,1,2…M -1
例如,
定义数组 int a[3],数组元素为 a[0] a[1] a[2]
a[2]=1;
a[i+j];(i,j为整型变量)
第 7章 数 组
10:39 8
2.3 初始化一维数组的初始化可以用 赋值语句或输入语句 使数组中的元素得到值,但占运行时间,同时也可以使数组在程序运行之前初始化,即在编译期间使之得到初值。对数组元素的初始化可以用以下方法:
1) 在定义数组时,对数组元素赋以初值 。
如,int a[10]={0,1,2,3,4,5,6,7,8,9};
第 7章 数 组
10:39 9
一维数组的初始化
2) 可以只给一部分元素赋值。
如,int a[10]={0,1,2,3,4};
表示 只给前 5个元素赋初值,后 5个元素自动赋以 0值 。若要对所有元素赋同一值时应该将所有值逐个写出,不能省略。
如,int s[5]={1,1,1,1,1};
第 7章 数 组
10:39 10
一维数组的初始化
3) 在对全部数组元素赋初值时,可以不指定数组长度。
如,int a[5]={1,2,3,4,5}; 可以书写成
int a[ ]={1,2,3,4,5};
第 7章 数 组
10:39 11
2.4 输入和输出
C语言规定,对数组的使用只能逐个引用数组元素,不能一次引用整个数组。同样,对数组的输入和输出也是依次对每个元素进行的 。
例 2,定义一个数组 a,a有 10个元素,分别赋值为 0,1,2,…,9,并输出。
main( )
{int i,a[10];
for (i=0;i<=9;i++)
{a[i]=i;}
for (i=0;i<=9;i++)
{printf("%4d",a[i] );}
}
第 7章 数 组
10:39 12
说明,在循环体内 利用循环控制变量作为下标输入输出数组元素,因此数组元素输入输出的次序和数量可以控制。
例如,下面的程序段将一个数组按照 逆序 打印数组元素的值。
for(i=9;i>=0;i--)
printf("%5d",a[i]);
下面程序段只打印一个数组的 前五个 元素值。
for(i=0;i<5;i++)
printf("%5d",a[i]);
第 7章 数 组
10:39 13
例 3:
定义具有 10个元素的数组 a,输入 10数据
,并输出。
main( )
{int i,a[10];
for (i=0;i<=9,i++)
scanf("%d",&a[i]);
for (i=0;i<=9;i++)
printf("%4d",a[i] );
}
第 7章 数 组
10:39 14
2.5 一维数组应用举例例 4,有一个一维数组,输入 10个整数存放其中,
找出其中最大的一个数。
main()
{int i,max,x[10];
printf("enter 10 data:\n");
for(i=0;i<10;i++)
scanf("%d",&x[i]);
max=x[0];
for(i=1;i<10;i++)
if(x[i]>max) max=x[i];
printf("max=%d\n",max);}
第 7章 数 组
10:39 15
例 5,使用数组编程,计算出前 40项 fibonacci
数列,要求一行打印 5个数。
1 1 2 3 5
第 1次 f[0] + f[1] → f[2]
第 2次 f[1] + f[2]→ f[3]
第 3次 f[2] + f[3] → f[4]
…….
main()
{ long f[40]; int i;
f[0]=1; f[1]=1;
for(i=2;i<40;i++)
f[i]=f[i-1]+f[i-2];
for(i=0;i<40;i++)
{ if(i%5==0)
printf(“\n”);
printf("%12ld",f[i]); }
}
第 7章 数 组
10:39 16
例 6:
用 冒泡法 对 5个整数按 从小到大 的顺序排列输出。 排序的方法很多,主要有:
冒泡法
选择法
希尔法
插入法第 7章 数 组
10:39 17
第 1轮比较 4次:第 1次 21 13 90 32 -1 进行交换第 2次 13 21 90 32 -1 不进行交换第 3次 13 21 90 32 -1 进行交换第 4次 13 21 32 90 -1 进行交换第 1轮比较结果,13 21 32 -1 90
最大的数已排好应用举例(排序:冒泡法)
假定有 5个无序的数 21,13,90,32,-1
第 7章 数 组
10:39 18
第 2轮比较 3次:第 1次 13 21 32 -1 90 不进行交换第 2次 13 21 32 -1 90 不进行交换第 3次 13 21 32 -1 90 进行交换第 2轮比较结果,13 21 -1 32 90
第 3轮比较 2次:第 1次 13 21 -1 32 90 不进行交换第 2次 13 21 -1 32 90 进行交换第 3轮比较结果,13 -1 21 32 90
第 4轮比较 1次:第 1次 13 -1 21 32 90 进行交换第 4轮比较结果,-1 13 21 32 90
应用举例(排序:冒泡法)续第 7章 数 组
10:39 19
应用举例(排序:冒泡法)续例 6,源程序编写如下:
#include,stdio.h”
void main()
{ int i,j,a[5],temp;
for(i=0;i<5;i++)
scanf (“%d”,&a[i]);
printf (“\n”) ;
for(i=0;i<5;i++)
printf (“%5d”,a[i]);
printf (“\n”);
第 7章 数 组
10:39 20
应用举例(排序:冒泡法)续例 6,源程序续写如下:
for(i=0;i<4;i++)
for(j=0;j<4-i;j++)
if(a[j]>a[j+1])
{temp=a[j];a[j]=a[j+1];a[j+1]= temp;}
for(i=0;i<5;i++)
printf(“%5d”,a[i]);
printf(“\n”);
}
第 7章 数 组
10:39 26
第三节 二维数组
3.1 二维数组的定义
3.2 二维数组的引用
3.3 二维数组的输入输出
3.4 二维数组的初始化
3.5 应用举例第 7章 数 组
10:39 27
a[0][0]
a[0][1]
a[0][2]
a[1][0]
a[1][1]
a[1][2]
3.1 定义
二维数组定义的一般形式为:
类型说明符 数组名 [常量表达式 ] [常量表达式 ]
int a[2][3]; char c[20][7]; float x[50][3];
1,可以把二维数组看作是一种特殊的一维数组。即每个元素又是一维数组。如:
a[0] ---> a[0][0] a[0][1] a[0][2] a[0][3]
2,二维数组的元素在数组中的是按行排列的 。
第 7章 数 组
10:39 28
注意两个下标的值不要超过各自的范围;
要严格区分定义数组时 a[2][3],和引用数组时的 a[2][3];
3.2 引用
引用形式,数组名 [下标 ][下标 ];
其中 下标可以是 整型的 常量、变量或表达式 ;
例如,定义数组 int a[2][3],数组元素为
a[0][0] a[0][1] a[0][2]
a[1][0] a[1][1] a[1][2]
则 a[0][2]=1;
a[i+j]=i+j;(i,j为整型变量)
第 7章 数 组
10:39 29
3.3 输入和输出
有两个下标,要用双重循环。
例如,输入 2个学生 3门课的成绩:
课程 1 课程 2 课程 3
学生 1 65 78 75
学生 2 70 66 82
第 7章 数 组
10:39 30
65 78 75 70 66 82
a[0][0]
a[0][1]
a[0][2]
a[1][0]
a[1][1]
a[1][2]
第一种方法:
for(i=0;i<2;i++)
for(j=0;j<3;j++)
scanf("%d",&a[i][j]);
for(i=0;i<2;i++)
{for(j=0;j<3;j++)
printf(" a[%d][%d]=%d",i,j,a[i][j]);
printf("\n");}
应该 按行 输入数据:
65 78 75 70 66 82(回车)
第 7章 数 组
10:39 31
65 78 75 70 66 82
a[0][0]
a[0][1]
a[0][2]
a[1][0]
a[1][1]
a[1][2]
第二种方法:
for(j=0;j<3;j++)
for(i=0;i<2;i++)
scanf("%d",&a[i][j]);
for(j=0;j<3;j++)
{for(i=0;i<2;i++)
printf(" a[%d][%d]=%d",i,j,a[i][j]);
printf("\n");}
应该 按列 输入数据:
65 70 78 66 75 82(回车)
第 7章 数 组
10:39 32
3.4 初始化
分行赋初值
–int a[2][3]={{1,2,3},{4,5,6}};
不分行赋初值
–int b[2][3]={1,2,3,4,5,6};
第 7章 数 组
10:39 33
3.4 初始化
对部分元素赋初值
int c[3][4]={ {1},{0,2},{0,0,3} };
int d[3][4]={{1},{},{9}};
– 未赋值的元素自动赋值 0,且前面的 0不能省,
后面的 0可以省
对全部元素赋初值,可省略第一维的长度
int a[ ][2]={ {1,2},{3,4} };
Int a[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12} ;
第 7章 数 组
10:39 34
3.5 应用举例例 8,求两个 3*4矩阵的和。参考程序如下:
– main( )
– { int a[3][4],b[3][4],c[3][4];
– int i,j;
– printf("input array a:\n");
– for(i=0;i<3;i++)
– for(j=0;j<4;j++)
– scanf("%d",&a[i][j]);
– printf(“input array b:\n");
第 7章 数 组
10:39 35
– for(i=0;i<3;i++)
– for(j=0;j<4;j++)
– scanf("%d",&b[i][j]);
– for(i=0;i<3;i++)
– for(j=0;j<4;j++)
– c[i][j]=a[i][j]+b[i][j];
–printf(“sum of array a and b is:\n");
– for(i=0;i<3;i++)
– {for(j=0;j<4;j++)
– printf("%5d",c[i][j]);
– printf("\n");}}
第 7章 数 组
10:39 36
例 9,将一个 2*3的数组行、列元素互换,存到另外一个数组中。注意两个数组的定义。 程序如下:
main()
{int a[2][3]={{1,2,3},{4,5,6}};
int b[3][2],i,j;
printf("array a:\n");
for(i=0;i<=1;i++)
{for(j=0,j<=2;j++)
{printf("%5d"a[i][j]);
b[j][i]=a[i][j];}
printf("\n");}
printf("array b:\n");
for(i=0;i<=2;i++)
{for(j=0;j<=1;j++)
printf("%5d",b[i][j]);
printf("\n");}
}
第 7章 数 组
10:39 37
例 10,求一个 3*4矩阵中的 最大值及其所在的行、列 。
参考程序如下:
– main( )
– {int a[3][4],row=0,col=0,i,j,max;
– for(i=0;i<3;i++)
– for(j=0;j<4;j++)
– scanf("%d",&a[i][j]);
– 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+1;col=j+1;}
– printf(“max=%d,row=%d,col=%d\n”,max,row,col);
– }
第 7章 数 组
10:39 38
思考题,初始化一个 4× 4矩阵,结果如下:
1 0 0 -1
0 1 -1 0
0 -1 1 0
-1 0 0 1
即主对角线元素值为 1,副对角线元素值为-
1,其余元素为零。
第 7章 数 组
10:39 39
1 0 0 0 0 0 1
3 1 0 0 0 1 4
3 3 1 0 1 4 4
3 3 3 1 4 4 4
3 3 1 2 1 4 4
3 1 2 2 2 1 4
1 2 2 2 2 2 1
练习,打印如下方阵( 7× 7)
主对角线副对角线主对角线上元素的特点,i=j
副对角线上元素的特点,i+j=6
i<j && i+j<6
i>j && i+j>6
i<j && i+j>6i>j && i+j<6
第 7章 数 组
10:39 40
第四节 字符数组
4.1 字符数组的定义及初始化
4.2 字符串
4.3 字符数组的输入输出
4.4 字符串处理函数
4.5 二维字符数组
4.6 字符数组应用举例第 7章 数 组
10:39 41
4.1 字符数组的定义及初始化存放字符数据的数组是字符数组,字符数组中的一个元素存放一个字符 。
定义
char 字符数组名 [整型常量表达式 ][…]
例如:
char str[20];
由于字符型与整型是互相通用的,因此,
上面的定义也可改写为,int str[20];
第 7章 数 组
10:39 42
4.1 字符数组的定义及初始化
初始化
– 逐个为数组中各元素指定初值字符。
– char str[4] ={'w','e','l','l'};
例,char c[10]={'I',' ','a','m',' ','h','a','p','p','y'};
char c[3][2]={{' ','*'},{'*',' '},{' ','*'}};
注,对字符数组未被赋值的元素系统自动将其赋值为空 (‘\0’)。
第 7章 数 组
10:39 43
4.2 字符串
字符串 是用一对 双引号 括起来的字符序列,这些字符 可以是一般的可显示字符,也可以是某些特殊的控制字符 ;
字符串只能用字符数组来处理,C语言中没有字符串变量。
字符串在内存中存放时,系统将自动在字符串的末尾添加一个字符串的结束 标记‘ \0’(空字符),碰到第一个 '\0'就认为字符串处理结束 。
第 7章 数 组
10:39 44
系统对字符串常量自动加‘ \0’
用字符串给字符数组初始化
char st[8]= {"welcome"}; 或
char st[8]= "welcome";
等价于
char st[8]={'w','e','l','c','o','m','e','\0'};
w e l c o m e \0
st[0] st[1] st[2] st[3] st[4] st[5] st[6] st[7]
第 7章 数 组
10:39 45
4.3 字符数组的输入输出
– 逐个 输入输出
– main()
– {int i;char a[10];
– for(i=0;i<10;i++)
– scanf("%c",&a[i]);
– for(i=0;i<10;i++)
– printf("%c",a[i]);
– printf ("\n");
– }
– 整体 输入 /输出
– main()
– {char a[10];
– scanf("%s",a);
– printf("%s\n",a);
– }
第 7章 数 组
10:39 46
输出字符时不包含‘ \0’
用,%s”格式符时,输出项 是数组名,而 不是数组元素 名 。
输入项为数组名时,前面不要再加,&”。
当数组长度大于字符串实际长度,也只输出到遇 ‘ \0’结束 。如:
char c[10]={“well”};
printf(“%s”,c);
如果一个字符数组中有多个‘ \0’,则遇到第一个‘ \0’,输出就结束。
4.3 字符数组的输入输出第 7章 数 组
10:39 47
h o w \0
a r e \0
y o u? \0
利用 scanf输入多个字符串,以 空格 分隔。 如:
– char c1[5],c2[5],c3[5];
– scanf(“%s%s%s”,c1,c2,c3);
– 输入 how are you?(回车)
4.3 字符数组的输入输出第 7章 数 组
10:39 48
h o w \0
注意,scanf函数不能完整地读入带空格的字符串。
例如上例改为:
char c[13];
scanf(“%s”,c);
– 如果输入 how are you! (回车)
4.3 字符数组的输入输出第 7章 数 组
10:39 49
h o w a r e y o u ! \0
C语言提供了一个用于读字符串的函数,它读入全部字符(包括空格),直到 遇到回车符为止,
它是 gets()。
例如,char c[13];
gets(c);
键盘输入,How are you! (回车)
4.3 字符数组的输入输出第 7章 数 组
10:39 50
4.4 字符串处理函数
字符串的输入 gets(字符数组 )
– 格式,gets(ch)
– 功能:从终端输入一个字符串到字符数组 ch
中,输入 回车键时结束,并将回车符‘ \n’转换成 '\0',其中 ch只能 是一个字符数组名。
字符串的输出 puts(字符数组 )
– 格式,puts(ch)
– 功能:向终端输出字符串,并 将 '\0'转换成 '\n'输出,其中 ch可以是某个字符数组名,也可以是一个字符串常量。
第 7章 数 组
10:39 51
字符串的复制 strcpy(字符数组 1,字符串
2)
– 格式,strcpy(ch1,ch2)
– 功能,将 ch2中的字符串复制到 ch1字符数组,
限定 ch1为字符数组名,ch2可以是字符串常量或字符数组名 。
4.4 字符串处理函数第 7章 数 组
10:39 52
str1
C h i n a \0str1
复制前复制后
字符串的复制 strcpy(字符数组 1,字符串 2)
– 例如:
char str1[11];
strcpy(str1,”China”); printf(“%s”,str1);
4.4 字符串处理函数第 7章 数 组
10:39 53
C l a n g u a g e \0str1
C h i n a \0 u a g e \0str1
复制前复制后
– 又如:
char str1[ ]={,C language”};
strcpy(str1,”China”);printf(“%s”,str1);
4.4 字符串处理函数第 7章 数 组
10:39 54
说明:
– ch1必须定义的足够大
– 拷贝时 ‘ \0’一起拷贝过去
– 不能用 赋值语句 将一个字符串常量或字符数组直接赋给一个字符数组。如:
str1=“china”;或 str1=str2;
– 可以 将字符串 2前面的 n个字符 拷贝到字符数组 1中,如,strcpy(ch1,ch2,2);
4.4 字符串处理函数第 7章 数 组
10:39 55
字符串的比较 strcmp( )
– 格式,strcmp(ch1,ch2)
– 功能:对 ch1和 ch2所对应的字符串 从左到右 一一进行比较(比较字符的 ASCII码值 的大小),第一个不相等的字符的大小决定了整个字符串的大小,若 ch1和 ch2的所有字符完全相同,则 ch1等于 ch2。
4.4 字符串处理函数第 7章 数 组
10:39 56
字符串的比较 strcmp( )
– ch1=ch2 函数返回 0
– ch1<ch2 函数返回一个负整数
– ch1>ch2 函数返回一个正整数
– 说明:对两个字符串比较,不能用
–if(ch1==ch2) printf(“yes”);
– 只能用
–if(strcmp(ch1,ch2)==0)
printf(“yes”);
4.4 字符串处理函数第 7章 数 组
10:39 57
字符串的连接函数 strcat()
– 格式,strcat(ch1,ch2);
– 功能,将 ch2复制到 ch1的后面,连接时将
ch1的‘ \0’去掉,只在新字符串后保留一个
‘ \0’ 。 要求 ch1必须是一个足够大的字符数组,ch2可以是字符串常量或字符数组名 。
4.4 字符串处理函数第 7章 数 组
10:39 58
s t r1 P r o g r a m m i n g \ 0
s t r2 D e s i g n \ 0
s t r1 P r o g r a m m i n g D e s i g n \ 0
字符串的连接函数 strcat()
– 例如:
– char str1[19]={“Programming”};
– char str2[ ]={“Design”};
– strcat(str1,str2);
– puts(str1);
4.4 字符串处理函数第 7章 数 组
10:39 59
求字符串长度的 strlen( )
– 格式,strlen(ch)
– 功能:返回 ch的有效字符的个数,不包括‘ \0’在内,
其中 ch为字符数组名或某个字符串常量。
字符串大小写转换 strlwr()
– 格式,strlwr(ch);
– 功能:将 ch中所有的大写字母转换成小写字母。
字符串大小写转换 strupr()
– 格式,strupr(ch);
– 功能:将 ch中所有的小写字母转换成大写字母。
4.4 字符串处理函数第 7章 数 组
10:39 60
4.5 二维字符数组
定义
char str[3][6]; 或 int str[3][6];
– 相当于三个一维字符数组,可以存放三个字符串
引用
– 可以单独输出某一个元素,也可以输出某一行的元素,即某一个字符串。如,printf(“%s”,str[2]);
初始化
char str[3][6]={”China”,”Japan”,”Korea”};
C h i n a
J a p a n
K o r e a
\0
\0
\0
第 7章 数 组
10:39 61
例 11,输入一行文字,找出其中大写字母,小写字母,空格,数字及其它字符各有多少?程序如下,
#include "stdio.h"
main()
{ int i,up=0,low=0,space=0,digit=0,other=0;
char str[60]; gets(str);
for(i=0;str[i]!='\0';i++)
{if((str[i]>='A') && (str[i]<='Z')) up++;
else if((str[i]>='a') && (str[i]<='z')) low++;
else if ((str[i]<='9')&&(str[i]>='0')) digit++;
else if(str[i]==' ') space++;
else other++;}
printf("up=%d low=%d space=%d",up,low,space);
printf(" digit=%d other=%d",digit,other);}
第 7章 数 组
10:39 73
#define N 10
main()
{int i,j,a[N][N];
for(i=0;i<N;i++)
{a[i][i]=1; a[i][0]=1;}
for(i=2;i<N;i++)
for(j=1;j<i;j++)
a[i][j]=a[i-1][j]+a[i-1][j-1];
for(i=0;i<N;i++)
{for(j=0;j<=i;j++)
printf("%6d",a[i][j]);
printf("\n");}
printf("\n");}