第七章 数组
整型
基本类型,实型
字符型, 枚举类型
数组类型
构造类型,结构体类型
公用体类型
指针类型
空类型
C语言的
数据类型
什么构造类型?
所谓构造类型是指由基本类型数据按一定
的规则组成的,是用户自己按规则定义的
。数组是构造类型之一。
什么是数组?
在数学中我们学过数列、矩阵的概念,
数列通常表示为,a1, a2, a3,…,,an
矩阵通常表示为,
a11 a12 a13 a14
a21 a22 a23 a24 2× 4
在 C语言中表示数组和矩阵的方法是,
数组,a[0],a[1],a[2],a[3],a[4],a[5]
其中 a,称为数组名。
方括号中的数:称为下标
下标是一个数时,也就是数列,称为一
维数组。
下标是两个数时,也就是矩阵,称为二
维数组。还有三维数组、四维数组等。
例如:有五名学生的一组学号,
2004035012,2004035013,2004035014、
2004035015,2004035016。
如果用数组来表示的话可以用统一的数
组名比如,num,
用下标区别每个变量。 即
num[0],num[1],num[2],num[3],um[4]
表示一个学号数组。
§ 7.1 一维数组的定义和引用
?1、一维数组的定义
?定义方式,
数据类型说明符 数组名 [常量表达式 ];
例 long num[4] ;
表示 num数组包含五个元素分别是,num[0],num[1]
,num[2],num[3],num[4]
注意:下标从 0 开始,数组元素取值类型是长整型。
定义数组中元
素的取值类型
定义数组
中元素的
个数
一维数组在内存的存储形式,
num 就是数组存储区域的首地址,即 num=200 。
一组变量
num 200
num[0]
num[1]
num[2]
num[3]
num[4]
204
208
212
216
2004035012
2004035013
2004035014
2004035015
2004035016
2、一维数组的引用
?数组必须先定义,后使用
?只能逐个引用数组元素,不能一次引用整个数组
?数组元素表示形式,数组名 [下标 ]
其中:下标可以是常量、变量或表达式。
例 int a[10];
scanf(“%d”,a) ; (?)
必须 int a[10];
for(j=0;j<10;j++)
scanf(“%d”,&a[j]);
例如,int k=5 ;
a[1],a[1.5], a[k],a[10-k] 都是合法的。
3、一维数组元素值的输入与输出
例如,
main()
{int i,a[10];
for(i=0 ; i<10 ; i++)
scanf(“%d”,& a[i ]) ;
for(i=0 ; i<10 ; i++)
printf (“%d,,a[i ]) ;
}
一维数组元素的 输出
一维数组元素的 输入
使用数组定义和数组元素时的几点注意,
1、把数组定义时 方括号中的数 和 元素下标值 区别开
方括号中的数表示数组含有的 元素个数
元素下标值是标识具体的 数组元素的
方括号中的数不能是变量,只能是常量。
2、数组元素的下标可以是常量,也可以是变量,
其值必须是非负数,如果是小数,系统自动取整。
3、数组必须先定义后使用。
4、系统不检查数组元素下标的越界问题。
5、一维数组元素的输入、输出使用单层循环语句 。
?4、一维数组的初始化
在定义数组时,为数组元素赋初值
(在编译阶段使之得到初值)
?说明,
?数组不初始化,其元素值为随机数
?当全部数组元素赋初值时,可不指定数组长度 如 int a[5]={6,2,3};
等价于,a[0]=6; a[1]=2;a[2]=3; a[3]=0; a[4]=0;
如 int a[3]={6,2,3,5,1}; (?)
?只给部分数组元素赋初值
int a[]={1,2,3,4,5,6};
编译系统根据初值个数确定数组维数值
int a[5]={1,2,3,4,5};
等价于,a[0]=1; a[1]=2; a[2]=3; a[3]=4; a[4]=5;
初始化方式
?5、程序举例
例 读 10个整数存入数组,找出其中最大值和最小值
步骤,
1,输入,for循环输入 10个整数
2,处理,
(a) 先令 max=min=x[0]
(b) 依次用 x[i]和 max,min比较 (循环 )
若 max<x[i],令 max=x[i]
若 min>x[i],令 min=x[i]
3,输出,max和 min
#include <stdio.h>
#define SIZE 10
main()
{ int x[SIZE],i,max,min;
printf("Enter 10 integers:\n");
for(i=0;i<SIZE;i++)
{ printf("%d:",i+1);
scanf("%d",&x[i]);
}
max=min=x[0];
for(i=1;i<SIZE;i++)
{ if(max<x[i]) max=x[i];
if(min>x[i]) min=x[i];
}
printf("Maximum value is %d\n",max);
printf("Minimum value is %d\n",min);
} lt15
例 用数组求 Fibonacci数列前 20个数
#include <stdio.h>
main()
{ int i;
int f[20]={1,1};
for(i=2;i<20;i++)
f[i]=f[i-2]+f[i-1];
for(i=0;i<20;i++)
{ if(i%5==0) printf("\n");
printf("%12d",f[i]);
}
}
分析:定义一个含有
20个元素的数组 f, 即
int f[20] ;
其中 f[0]=1,f[1]=1,
f[n]=f[n-1]+f[n-2] (n≥2)
用一个循环结构:让循环变
量 n从 2到 20,循环体为
f[n]=f[n-1]+f[n-2]
程序如右面所示,lt16
例 用冒泡法对 8 个数排序(输入时数据无次序,输出按升序)
排序过程:首先把八个数放到数组 a[9] 中。
a[1] =38,a[2]=49,a[3]=65,a[4]=76,a[5]=13,a[6]=27、
a[7]=30,a[8]=97 。
( 1)比较第一个数与第二个数,若为逆序 a[1]>a[2],
则交换值;然后比较第二个数与第三个数,若为逆序
a[2]>a[3],则交换值 ;依次类推,直至第 7个数和第 8
个数比较为止 ——第一趟冒泡排序,结果 最大 的数
被安置在最后一个元素位置上,即在 a[8]中 。
( 2)对前 7个数进行第二趟冒泡排序,结果使 次大
的数被安置在第 7个元素位置,即在 a[7]中 。
( 3)重复上述过程,共经过 7趟冒泡排序后,排序
结束。
例 38
49
65
76
13
27
30
97
第
一
趟
38
49
65
13
27
30
76
第
二
趟
38
49
13
27
30
65
第
三
趟
38
13
27
30
49
第
四
趟
13
27
30
38
第
五
趟
13
27
30
第
六
趟
49
38
65
97
76
13
27
30
初
始
关
键
字
n=8
38
49
76
97 13
97 27
97 30
97
13
76
76
76 27
30
13
65 27
65 30
65
13
13
49
49 30
49 27
38 27
38 30
38
13
27
第
七
趟
输入 n 个数给 a[1] 到 a[n]
for j=1 to n-1
for i=1 to n-j
a[i]>a[i+1] 真 假
a[i]?a[i+1]
输出 a[1] 到 a[n]
#include <stdio.h>
main()
{ int a[11],i,j,t;
printf("Input 10 numbers:\n");
for(i=1;i<11;i++)
scanf("%d",&a[i]);
printf("\n");
for(j=1;j<=9;j++)
for(i=1;i<=10-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");
for(i=1;i<11;i++)
printf("%d ",a[i]);
} lt17
§ 7.2 二维数组及多维数组
一维数组通常是用来处理数列问题的
例如,
a1, a2, a3, …., an,…,
可以用一维来表示。
二维数组通常是用来矩阵问题的,例如下面
的数表(矩阵),
a11 a12 a13 a14
a21 a22 a23 a24
a31 a32 a33 a34 3× 4
可以用二维数
组来表示。
?1、二维数组的定义
?定义方式,
数据类型 数组名 [常量表达式 ][常量表达式 ];
?数组元素的存放顺序
在内存中按行顺序存放。
即先存第一行,接着存第二行,
以此类推。例如,
例 int a[3][4];
float b[2][5];
int a[3,4]; (?)
行数 列数 元素个数 =行数 *列数
int a[3][2]
a[0][1]
a[1][0]
a[1][1]
a[2][0]
a[2][1]
0
1
4
5
2
3
a[0][0]
a[0][0] a[0][1]
a[1][0] a[1][1]
a[2][0] a[2][1]
0
1
2
3 4
5
6
7 ……….
..
20
21
22
23
int c[2][3][4]
c[0][0][0]
c[0][0][1]
c[0][0][2]
c[0][0][3]
c[0][1][0]
c[0][1][1]
c[0][1][2]
c[0][1][3]
c[0][2][0]
c[0][2][1]
c[0][2][2]
c[0][2][3]
c[1][0][0]
c[1][0][1]
c[1][0][2]
c[1][0][3]
c[1][1][0]
c[1][1][1]
c[1][1][2]
c[1][1][3]
c[1][2][0]
c[1][2][1]
c[1][2][2]
c[1][2][3]
2、二维数组理解
由按上述定义的二维数组的方式 (比如,int a[2][3] ),
我们可以把二维数组看成是一种特殊的一维数组:它的
元素又是一维数组。例如,把 a看成是一维数组,它有
3个元素,分别是,a[0],a[1],a[2],每个元素又是一
个包含 4个元素的一维数组。如下表,
a[0] a[0][0], a[0][1], a[0][2], a[0][3]
a 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]
其中 a 是数组 a[0],a[1],a[2] 的数组名
而 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]的数组名
3、二维数组元素的引用
形式,数组名 [下标 ][下标 ]
4、二维数组的输入输出。 使用双层循环 。例如,
main()
{ int a[4][5],i,j ;
for (i=1 ;i<=3;i++)
for(j=1;j<=4;j++)
scanf(“%d”,&a[i][j]);
for (i=1 ;i<=3;i++)
for(j=1;j<=4;j++)
printf(“%d”,a[i][j]);
}
输入,数据用空格或回
车隔开
输出
5、二维数组元素的初始化
?分行初始化,
?按元素排列顺序初始化 例 int a[2][3]={{1,2,3},{4,5,6}};
a[0][0] a[0][1] a[0][2]
a[1][0] a[1][1] a[1][2]
1 2 3
4 5 6
全部初始化
=
例 int a[2][3]={{1,2},{4}};
a[0][0] a[0][1] a[0][2]
a[1][0] a[1][1] a[1][2]
1 2 0
4 0 0
部分初始化
=
例 int a[ ][3]={{1 },{4,5}};
a[0][0] a[0][1] a[0][2]
a[1][0] a[1][1] a[1][2]
1 0 0
4 5 0
第一维长度省略初始化
=
例 int a[ 2][3]={1,2,3,4,5,6};
a[0][0] a[0][1] a[0][2]
a[1][0] a[1][1] a[1][2]
1 2 3
4 5 6
全部初始化
=
例,, 4,};
4
0 0 0
部分初始化
例 int a[ ][3]={1,2,3,4,5};
a[0][0] a[0][1] a[0][2]
a[1][0] a[1][1] a[1][2]
1 2 3
4 5 0
第一维长度省略初始化
=
?程序举例
例 将二维数组行列元素互换,存到另一个数组中
a= 1 2 3 4 5 6 b= 1 4 2 5
3 6
#include <stdio.h>
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");
}
}
例 求二维数组中最大元素值及其行列号
max=a[0][0]
for i=0 to 2
for j=0 to 3
a[i][j]>max 真 假
max=a[i][j]
row=i
colum=j
输出, max和 row,colum
#include <stdio.h>
main()
{ int a[3][4]={{1,2,3,4},
{9,8,7,6},
{-10,10,-5,2}};
int i,j,row=0,colum=0,max;
max=a[0][0];
for(i=0;i<=2;i++)
for(j=0;j<=3;j++)
if(a[i][j]>max)
{ max=a[i][j];
row=i;
colum=j;
}
printf("max=%d,row=%d,
colum=%d\n",max,row,colum);
}
lt19
思考题,作业,141页 7.3 7.5
1,float a[10]; 是一个定义一维数组的例子,
理解 float,a, 10 各部分的含义。
2、下面定义哪一个是错的?为什么?
1) #define N 10 2) int a[n];
int a[N];
3、下面对数组元素的引用是否正确?为什么?
a[3.5], a[3+5], a[-5],int n=3; a[n+1] 。
4,下面对一维数组的初始化是否正确?为什么?
int a[3]={1,2,3}, int a[]={1,2,3},int a[3]={1},
int a[3]={1,2,3,4}
5、为什么对一维数组赋值使用单层循环?
6、下面对二维数组初始化是否正确?为什么?
int a[2][3]={1,2},int a[][2]={{1,2,3},{4,5,6}},
int a[3][4]={{1},{0,6},{0,0,1}}
实验项目:数组 ( 写实验报告 ) 本周 4( 21日 ) 实验课交
实验目的,1,掌握一维数组的定义规则
2,正确运用一维数组进行程序设计 。
实验内容, 程序 (一 )
功能,编程实现用一维数组实现杨辉三角形的打印 。 参考程序
,
main()
{ int a[6],i,j,k;
a[1]=1;
printf("%d\n",a[1]);
for(i=2;i<6;i++)
{ a[i]=1;
for(j=i-1;j>=2;j--)
a[j]=a[j]+a[j-1];
for(k=1;k<=i;k++)
printf("%d",a[k]);
printf("\n");
}
}
程序 (二 ) 功能,编程实现用数组打印 Fibonacci数列的前 20
项。 参考程序,
#include <stdio.h>
main()
{ int i;
int ____________;
for(i=2;i<20;i++)
_______________;
for(i=0;i<20;i++)
{if(i%5==0) printf("\n");
printf("%12d",f[i]);
}
}
程序 (三 ) 功能,编程实现读 10个整数存入数
组,找出其中最大值和最小值。
问题
1.程序一中语句 for(k=1;k<=i;k++)改成
for(k=1;k<=5;k++),程序的输出结果是什么?
2,完成程序二的空白部分,如何定义数组能实
现数列的打印?
3,独立完成程序三的编程。
141页 7.1题:用筛法求 100之内的素数。程序,
分析,
3,4,5,6,7,8,9,10,11,12,13,14,15,
16,17,18,19,20,21,22,23,24,25,26,27,
28,29,30,31,32,33,34,35,36,37,38,39,
40,41,42,43,44,45,46,47,48,49,50
分别用 2,3,4,5,…,≈ 7.07
即 2,3,4,5,6,7
50
141页 7.1题:用筛法求 100之内的素数。程序,
#include <math.h>
main()
{int a[101],j,k,n;
for (j=1; j<=100 ; j++) a[j]=j;
for(j=2;j<sqrt(100) ; j++)
for(k=j+1;k<=100 ;k++)
{if(a[j]!=0 && a[k]!=0)
if(a[k] % a[j] ==0) a[k]=0; }
printf(―\n‖);
for( j=2,n=0 ; j<=100 ;j++)
{ if(a[j]!=0)
{printf(―%5d‖,a[j]); n++; }
if(n==10)
{printf(―\n‖); n=0;}
}
}
141页 7.3 题 矩阵主对角线的概念,
a11 a12 a13 a14
a21 a22 a23 a24
a31 a32 a33 a34
a41 a42 a44
主对角线
a43
本次课的主要内容,
1、字符数组的定义
2、字符数组的初始化
3、字符数组与字符串常量之间的关系
4、字符数组(字符串常量)的输入输出
5、字符串处理函数
§ 7.3 字符数组和字符串
一、字符数组定义
字符数组的定义方法与前面讲过的类似
二、字符数组的 初始化
例 char c[10],ch[3][4];
例 char ch[5]={?H?,?e?,?l?,?l?,?o?};
ch[0]
H e l l o
逐个字符赋值
ch[1] ch[2] ch[3] ch[4]
1、逐个字符赋值
在内存中情况示意
字符是以 ascll码存的
例 char ch[5]={?B?,?o?,?y?};
ch[0]
B o y \0 \0
逐个字符赋值
ch[1] ch[2] ch[3] ch[4]
1、逐个字符赋值
int a[5]={1,2,3};
结果,a[0]=1,a[1]=2,a[2]=3,a[3]=0,a[4]=0
对照
例 char ch[ ]={?a?,?b?,?c?,?d?};
ch[0]
a b c d
逐个字符赋值
ch[1] ch[2] ch[3]
1、逐个字符赋值
int a[ ]={1,2,3,4};
结果,a[0]=1,a[1]=2,a[2]=3,a[3]=4
对照
2、用字符串常量
例 char ch[6]={“Hello”};
char ch[6]=“Hello”;
char ch[]=“Hello”;
用字符串常量
ch[0]
H e l l o
ch[1] ch[2] ch[3] ch[4]
\0
ch[5]
系统自动加的 字符串结束
标记” \0”
例 char ch[5]=“Boy”;
ch[0]
B o y \0 \0
用字符串常量
ch[1] ch[2] ch[3] ch[4]
2、用字符串常量
char ch[6]={“Hello”}; char ch[6]=“Hello”;
char ch[]= {?h?,?e?,?l?,?l?,?o?,?\0?};
char ch[]=“Hello”;数组中有 6个元素。
char ch[]={?h?,?e?,?l?,?l?,?o?};数组中有 5个元素。
最后一个元素是‘ o?而不是‘ \0?。
ch[0]
H e l l o
ch[1] ch[2] ch[3] ch[4]
\0
ch[5]
示意图
例 char f[][7]={{?A?,?p?,?p?,?l?,?e?},
{?O?,?r?,?a?,?n?,?g?,?e?},
{?G?,?r?,?a?,?p?,?e?}};
也可以这样,char fruit[][7]={“Apple”,
,Orange”,
,Grape”};
二维字符数组初始化
f[0]
f[1]
f[2]
A p p l e \0 \0
O r a n g e \0
G r a p e \0 \0
三、字符串以及结束标记
1、字符串及其结束标志
字符串:双引号扩起来的一串字符。
结束标志,‘ \0? 。
2、无字符串变量,用字符数组处理字符串
例, hello”共 5个字符,在内存占 6个字节 字符串长度 5
h e l l o \0
104 101 108 108 111 0
内存存放字符 ASCII码
四、一维字符数组(字符串 )的输入输出
使用函数 scanf 与 printf
1、整个字符串的输入与输出,
格式符为,%s
例 用 %s
main()
{ char str[5];
scanf(―%s‖,str);
printf(―%s‖,str);
}
运行结果,
输入,China
输出,China
用字符数组名,不要加 &
输入串长度 <数组长度 >遇空
格或回车结束 自动加‘ \0?
2、逐个字符输入与输出,格式符 为,%c
例 用 %c
main()
{ char str[5];
int i;
for(i=0;i<5;i++)
scanf(―%c‖,&str[i]);
for(i=0;i<5;i++)
printf(―%c‖,str[i]);
}
运行结果,
输入,
abcde
输出,
abcde
例 main( )
{ char a[5]={?H‘,‘e‘,‘l‘,‘l‘,‘o‘};
printf(―%s‖,a);
}
例 main( )
{ char a[ ]=―Hello‖;
printf(―%s‖,a);
}
结果,Hello#-=* H e l l o
0 2 3 1 4
结果,Hello
用, %s‖输出时,遇
‘ \0‘结束
例 字符串输入举例
H o w \0
a r e \0
y o u? \0
#include <stdio.h>
main()
{ char a[15],b[5],c[5];
scanf("%s%s%s",a,b,c);
printf("a=%s\nb=%s\nc=%s\n",a,b,c);
scanf("%s",a);
printf("a=%s\n",a);
}
运行情况,
输入,How are you?
输出,a=How
b=are
c=you?
输入,How are you?
输出,a=How
scanf中 %s输入时,遇空格
或回车结束
六、常用的字符串处理函数
包含在头文件 string.h
1,字符串输出函数 puts
格式,puts(字符数组 名 )
功能:向显示器输出字符串(输出完,换行)
说明:字符数组必须以‘ \0?结束
例 #include <stdio.h>
main( )
{ char str[10]={“How are you?”};
puts(str); /* printf(“%s”,str) ; */ √
} 运行结果,
输出, How are you?
2、字符串输入函数 gets
格式,gets(字符数组 名 )
功能:从键盘输入一以 回车结束 的字符串放入
字符数组中,并自动加‘ \0’
说明:输入串长度应小于字符数组长度
例 #include <stdio.h>
main( )
{char str[30];
printf(“Input a string:”);
gets(str); /* scanf(“%s”,str); */
puts(str);
} 输入, How are you? 输出, How are you?
3、字符串连接函数 strcat
格式,strcat(字符数组 1,字符数组 2)
功能:把 字符数组 2 连到 字符数组 1 后面
说明,?字符数组 1必须足够大
?连接前,两串均以‘ \0’结束 ;连接后,
串 1的‘ \0’取消,新串最后加‘ \0’
例 #include <string.h>
main()
{char a[20] = "Turbo";
char b[]=, C++",
strcat(a,c);
printf("%s\n",a);
}
输出结果,
Turbo C++
例 char str1[20],str2[20];
str1={―Hello!‖}; (?)
str2=str1; (?)
4、字符串拷贝函数 strcpy
格式,strcpy(字符数组 1,字符串 2)
功能:将字符串 2,拷贝到字符数组 1中去
说明,?字符数组 1必须足够大
?拷贝时‘ \0’一同拷贝
?不能使用赋值语句为一个字符数组赋值
例,#include <string.h>
main()
{char a[25];
char b[]= ― C++",
c[] = "Turbo";
strcpy(a,c);
strcat(a,b);
printf("%s\n",a); 输出结果,
} Turbo C++
5、字符串比较函数 strcmp
格式,strcmp(字符串 1,字符串 2)
功能:比较两个字符串
比较规则:对两串从左向右逐个字符比较( ASCII码)
直到遇到不同字符或‘ \0’为止
返值:返回 int型整数,
a,若字符串 1< 字符串 2,返回 负整数
b,若字符串 1> 字符串 2,返回 正整数
c,若字符串 1== 字符串 2,返回 零
说明,字符串比较不能用,= =”,必须用 strcmp
例如:比较,
Hello! 与 Hell0!
H e l l o !
H e l I 0 !
例 #include <string.h>
#include <stdio.h>
main()
{char str1[] = ―Hell0!‖,str2[] =―Hello!‖;
if(strcmp(str1,str2)>0)
printf( ―Hell0!> Hello!‖);
else if(strcmp(str1,str2)==0)
printf(―Hell0!= = Hello!‖) ;
else
printf(―Hell0!< Hello!‖);
}
输出结果,
Hell0!<Hello!
6、字符串长度函数 strlen 作业,141页
格式,strlen(字符数组 ) 7.11, 7.14,7.15
功能:计算字符串长度
返值:返回字符串实际长度,不包括‘ \0’在内
例,
#include <string.h>
main()
{char str1[] =,Hello!",str2[] =,How are you?”;
int len1,len2,len3;
len1=strlen(str1) ; len2=strlen(str2);
printf(“len1=%d len2=%d”,len1,len2);
} 结果,len1=6 len2=12
应用举例
例 1,输入一行字符,统计其中有多少个单词,单词之间用
空格间隔
输入一字符串给字符数组 string
i=0, num=0, word=0
当 ( ( c=string[i] ) !=?\0? )
c= =空格 真
真
假
假
word=0 word=1
num=num+1
i=i+1
输出,num
word==0
例如:有下面一行字符
,
由一个空格间隔。
I ?am ?a ?boy,
再比如:有多个空格间
隔
? I ? ? am ? ? ? ? a ?boy,
#include <stdio.h>
main()
{ char string[81];
int i,num=0,word=0;
char c;
gets(string);
for(i=0;(c=string[i])!='\0';i++)
if(c==' ') word=0;
else if(word==0)
{ word=1; num++; }
printf("There are %d words in the line\n",num);
}
例 2,有三个字符串,找出其中最大者
定义三个一维字符数组 str1[20],str2[20],str3[20]
即
定义部分,char str1[20],str2[20],str[20],str [20] ;
输入部分,scanf(“%s%s%s”,str1,str2,str3);
比较部分,if( strcmp(str1,str2)>0) strcpy(str,str1);
else strcpy(str,str2);
if( strcmp(str3,str) >0) strcpy(str,str3);
输出部分,printf(“\n the largest string is,%s\n”
,str);
例 2,有三个字符串,找出其中最大者
H o w \0
H e l l o \0
H i g h \0
str[0]
str[1]
str[2]
#include <stdio.h>
#include <string.h>
main()
{ char string[20],str[3][20];
int i;
for(i=0;i<3;i++)
gets(str[i]);
if(strcmp(str[0],str[1])>0)
strcpy(string,str[0]);
else
strcpy(string,str[1]);
if(strcmp(str[2],string)>0)
strcpy(string,str[2]);
printf("\nThe largest string \
is:\n%s\n",string);
}
定义一个两维字符数组 str[3][20]
即 3行 20列。每一行可以容纳
20个字符。如下图,
1、若有代数表达式,则不正确的 C语言表达式是 ( C ),
A) a/b/c*e*3 B) 3*a*e/b/c
C)3*a*e/b*c D) a*e/c/b*3
2、下列运算符中优先级最高的是( B )
A) < B) + C) && D)!=
3、若有 int x=3,y=4,z=5;则下面表达式中值为 0的是( D)
A) ?x‘ && ?y‘ B) x<=y
C) x || y+z && y-z D) !((x<y) && !z || 1)
3ae
bc
4、以下程序的运行结果是( B)
main()
{int a,b,d=241;
a=d/100%9;
b=(-1) && (-1);
printf(―%d,%d ‖,a,b);
}
A) 6,1 B) 2,1 C) 6,0 D) 2,0
5、以下程序的运行结果是( C)
main()
{int m=5;
if(m++>5) printf(―%d\n‖,m);
else printf(%d\n‖,m--); A) 4 B) 5 C) 6 D) 7
}
6、以下程序输出结果是 (C )
main()
{int a=100,x=10,y=20,ok1=5,ok2=0;
if(x<y)
if(y!=10)
if(!ok1)
a=1;
else
if(ok2) a=10;
a=-1;
printf(―%d\n‖,a); } A) 1 B) 0 C) –1 D) 值不确定
7、下面程序段的运行结果是 ( C)
int n=0;
while(n++<=2) ; printf(―%d‖,n);
A) 2 B) 3 C) 4 D)有语法错误
8、以下正确计算 1× 2× 3× … × 10的程序段是 (D)
A) do {i=1;s=1; B) do{i=1;s=0;
s=s* i; s=s*i;
i++; i++;
}while(i<=10); }while(i<=10);
C) i=1;s=1; D) i=1;s=0;
do{s=s*i; do{s=s*i;
i++; i++;
}while(i<=10); }while(i<=10);
9、若运行以下程序时,从键盘输入 Adescriptor<CR>
(<CR>表示回车键 ),则下面程序的运行结果是 (D)
#include<stdio.h>
main()
{char c;
int v0=0,v1=0,v2=0;
do {
switch (c=getchar())
{case ?a‘,case ?A‘,
case ?e‘, case ?E‘,
case ?i‘,case ?I‘,
case ?o‘,case ?O‘,
case ?u‘,case ?U‘:v1+=1;
default,v0+=1; v2+=1;
}
}while(c!=‘\n‘);
printf(―v0=%d,v1=%d,v2=%d\n‖,v0,v1,v2);
}
A) v0=8 v1=4 v2=8 B)v0=11 v1=4 v2=11
C)v0=12 v1=4 v2=0 D)v0=12 v1=4 v2=12
10、以下不是无限循环的语句是 (A)
A) for(y=0,x=1;x>++y;x=i++) i=x;
B) for( ; ; x++=i);
C) while(1) {x++;}
D) for(i=10 ; ; i--) sum+=i ;
11、下面程序的运行结果是 (D)
#include<stdio.h>
main()
{int j,b,k=0;
for(j=1 ;j<=5 ;j++)
{b=j%2;
while(b- - >=0) k++;
}
printf(―%d,%d‖,k,b);
}
A) 3,-1 B) 8,-1 C) 3,0 D) 8,-2
12、下面程序段 (D)
for(t=1 ; t<=100 ;t++)
{scanf(―%d‖,&x); A)当 x<0时整个循环结束
if(x<0) continue ; B) x>=0时什么也不输出
printf(―%3d‖,t); C) printf函数永远也不执行
} D) 最多允许输出 100个非负整数 。
二,读程序,写出运行结果
1,main() 2,main()
{int x,y,z; {int a=-10,b=-3;
x=1;y=2;z=3; printf(―%d,‖,-a%b);
x=y--<=x||x+y!=z; printf(―%d,‖,(a-b,a+b));
printf(―%d,%d‖,x,y); printf(―%d\n‖,a-b?a-b:a+b);
} }
答案,1,( 1,1 ) 2、( 1, -13, -7 )
3,main() 4,main()
{int a,b,c,s,w,t; {int j,x,y;
s=w=t=0; j=x=y=0;
a=-1;b=3;c=3; do{++j;
if(c>0)s=a+b; if(j%2!=0)
if(a<=0) {x=x+j;j++;}
{if(b>0) y=y+j++;
if(c<=0) w=a-b }while(j<=7);
} printf(―x=%d,y=%d\n‖,x,y);
else if(c>0) w=a-b; }
else t=c;
printf(―%d %d %d‖,s,w,t);
}
3、( 2 0 0) 4、( x=1 y=20)
5,main()
{int i,k=19;
while(i=k-1) while( (i=k-1)!=0)
{k-=3;
if(k%5==0){i++;continue;}
else if(k<5) break;
i++;
}
printf(―i=%d,k=%d\n‖,i,k);
} 5,(i=6,k=4 )
四、阅读程序回答问题
1,问题 1,功能是求 m,n 的最大公约数
问题 2,结果是 0
三,程序填空
1,以下程序的功能是判断输入的年份是否是闰年。
答案,[1] y%4==0 && y%100!=0 [2] f=0
2,下面程序的功能是打印 100以内个位数为 6且能被 3
整除的所有数。 答案, [1] j<=9 [2] k%3!=0
实验十一 (在有序数组中插入一个数)
main() {int a[11]={1,4,6,9,13,16,19,28,40,100};
int temp1,temp2,numder,end,i,j;
scanf(“%d”,&number); end=a[9];
if(number>end) a[10]=number; else
{for(i=0;i<10;i++)
{if(a[i]>number) { temp1=a[i];
a[i]=number; for(j=i+1;j<11;j++)
{temp2=a[j];a[j]=temp1;temp1=temp2;}
break; }
} }
}
for(j=10;j>=i+1;j--)
{temp2=a[j+1];
a[j+1]=a[j];
a[j]=temp2;
}
for(i=0;i<11;i++) printf(―%5d‖,a[i]);
main()
{int a[11]={1,4,6,9,13,16,19,28,40,100};
int number,end,i,j;
scanf(“%d”,&number); end=a[9];
if(number>end) a[10]=number;
else
for(i=0;i<10;i++)
if(a[i]>number)
{ for(j=9; j>=i ; j--)
a[j+1]=a[j];
a[i]=number;
break;
}
for(i=0;i<11;i++) printf(“%5d”,a[i]);
}
整型
基本类型,实型
字符型, 枚举类型
数组类型
构造类型,结构体类型
公用体类型
指针类型
空类型
C语言的
数据类型
什么构造类型?
所谓构造类型是指由基本类型数据按一定
的规则组成的,是用户自己按规则定义的
。数组是构造类型之一。
什么是数组?
在数学中我们学过数列、矩阵的概念,
数列通常表示为,a1, a2, a3,…,,an
矩阵通常表示为,
a11 a12 a13 a14
a21 a22 a23 a24 2× 4
在 C语言中表示数组和矩阵的方法是,
数组,a[0],a[1],a[2],a[3],a[4],a[5]
其中 a,称为数组名。
方括号中的数:称为下标
下标是一个数时,也就是数列,称为一
维数组。
下标是两个数时,也就是矩阵,称为二
维数组。还有三维数组、四维数组等。
例如:有五名学生的一组学号,
2004035012,2004035013,2004035014、
2004035015,2004035016。
如果用数组来表示的话可以用统一的数
组名比如,num,
用下标区别每个变量。 即
num[0],num[1],num[2],num[3],um[4]
表示一个学号数组。
§ 7.1 一维数组的定义和引用
?1、一维数组的定义
?定义方式,
数据类型说明符 数组名 [常量表达式 ];
例 long num[4] ;
表示 num数组包含五个元素分别是,num[0],num[1]
,num[2],num[3],num[4]
注意:下标从 0 开始,数组元素取值类型是长整型。
定义数组中元
素的取值类型
定义数组
中元素的
个数
一维数组在内存的存储形式,
num 就是数组存储区域的首地址,即 num=200 。
一组变量
num 200
num[0]
num[1]
num[2]
num[3]
num[4]
204
208
212
216
2004035012
2004035013
2004035014
2004035015
2004035016
2、一维数组的引用
?数组必须先定义,后使用
?只能逐个引用数组元素,不能一次引用整个数组
?数组元素表示形式,数组名 [下标 ]
其中:下标可以是常量、变量或表达式。
例 int a[10];
scanf(“%d”,a) ; (?)
必须 int a[10];
for(j=0;j<10;j++)
scanf(“%d”,&a[j]);
例如,int k=5 ;
a[1],a[1.5], a[k],a[10-k] 都是合法的。
3、一维数组元素值的输入与输出
例如,
main()
{int i,a[10];
for(i=0 ; i<10 ; i++)
scanf(“%d”,& a[i ]) ;
for(i=0 ; i<10 ; i++)
printf (“%d,,a[i ]) ;
}
一维数组元素的 输出
一维数组元素的 输入
使用数组定义和数组元素时的几点注意,
1、把数组定义时 方括号中的数 和 元素下标值 区别开
方括号中的数表示数组含有的 元素个数
元素下标值是标识具体的 数组元素的
方括号中的数不能是变量,只能是常量。
2、数组元素的下标可以是常量,也可以是变量,
其值必须是非负数,如果是小数,系统自动取整。
3、数组必须先定义后使用。
4、系统不检查数组元素下标的越界问题。
5、一维数组元素的输入、输出使用单层循环语句 。
?4、一维数组的初始化
在定义数组时,为数组元素赋初值
(在编译阶段使之得到初值)
?说明,
?数组不初始化,其元素值为随机数
?当全部数组元素赋初值时,可不指定数组长度 如 int a[5]={6,2,3};
等价于,a[0]=6; a[1]=2;a[2]=3; a[3]=0; a[4]=0;
如 int a[3]={6,2,3,5,1}; (?)
?只给部分数组元素赋初值
int a[]={1,2,3,4,5,6};
编译系统根据初值个数确定数组维数值
int a[5]={1,2,3,4,5};
等价于,a[0]=1; a[1]=2; a[2]=3; a[3]=4; a[4]=5;
初始化方式
?5、程序举例
例 读 10个整数存入数组,找出其中最大值和最小值
步骤,
1,输入,for循环输入 10个整数
2,处理,
(a) 先令 max=min=x[0]
(b) 依次用 x[i]和 max,min比较 (循环 )
若 max<x[i],令 max=x[i]
若 min>x[i],令 min=x[i]
3,输出,max和 min
#include <stdio.h>
#define SIZE 10
main()
{ int x[SIZE],i,max,min;
printf("Enter 10 integers:\n");
for(i=0;i<SIZE;i++)
{ printf("%d:",i+1);
scanf("%d",&x[i]);
}
max=min=x[0];
for(i=1;i<SIZE;i++)
{ if(max<x[i]) max=x[i];
if(min>x[i]) min=x[i];
}
printf("Maximum value is %d\n",max);
printf("Minimum value is %d\n",min);
} lt15
例 用数组求 Fibonacci数列前 20个数
#include <stdio.h>
main()
{ int i;
int f[20]={1,1};
for(i=2;i<20;i++)
f[i]=f[i-2]+f[i-1];
for(i=0;i<20;i++)
{ if(i%5==0) printf("\n");
printf("%12d",f[i]);
}
}
分析:定义一个含有
20个元素的数组 f, 即
int f[20] ;
其中 f[0]=1,f[1]=1,
f[n]=f[n-1]+f[n-2] (n≥2)
用一个循环结构:让循环变
量 n从 2到 20,循环体为
f[n]=f[n-1]+f[n-2]
程序如右面所示,lt16
例 用冒泡法对 8 个数排序(输入时数据无次序,输出按升序)
排序过程:首先把八个数放到数组 a[9] 中。
a[1] =38,a[2]=49,a[3]=65,a[4]=76,a[5]=13,a[6]=27、
a[7]=30,a[8]=97 。
( 1)比较第一个数与第二个数,若为逆序 a[1]>a[2],
则交换值;然后比较第二个数与第三个数,若为逆序
a[2]>a[3],则交换值 ;依次类推,直至第 7个数和第 8
个数比较为止 ——第一趟冒泡排序,结果 最大 的数
被安置在最后一个元素位置上,即在 a[8]中 。
( 2)对前 7个数进行第二趟冒泡排序,结果使 次大
的数被安置在第 7个元素位置,即在 a[7]中 。
( 3)重复上述过程,共经过 7趟冒泡排序后,排序
结束。
例 38
49
65
76
13
27
30
97
第
一
趟
38
49
65
13
27
30
76
第
二
趟
38
49
13
27
30
65
第
三
趟
38
13
27
30
49
第
四
趟
13
27
30
38
第
五
趟
13
27
30
第
六
趟
49
38
65
97
76
13
27
30
初
始
关
键
字
n=8
38
49
76
97 13
97 27
97 30
97
13
76
76
76 27
30
13
65 27
65 30
65
13
13
49
49 30
49 27
38 27
38 30
38
13
27
第
七
趟
输入 n 个数给 a[1] 到 a[n]
for j=1 to n-1
for i=1 to n-j
a[i]>a[i+1] 真 假
a[i]?a[i+1]
输出 a[1] 到 a[n]
#include <stdio.h>
main()
{ int a[11],i,j,t;
printf("Input 10 numbers:\n");
for(i=1;i<11;i++)
scanf("%d",&a[i]);
printf("\n");
for(j=1;j<=9;j++)
for(i=1;i<=10-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");
for(i=1;i<11;i++)
printf("%d ",a[i]);
} lt17
§ 7.2 二维数组及多维数组
一维数组通常是用来处理数列问题的
例如,
a1, a2, a3, …., an,…,
可以用一维来表示。
二维数组通常是用来矩阵问题的,例如下面
的数表(矩阵),
a11 a12 a13 a14
a21 a22 a23 a24
a31 a32 a33 a34 3× 4
可以用二维数
组来表示。
?1、二维数组的定义
?定义方式,
数据类型 数组名 [常量表达式 ][常量表达式 ];
?数组元素的存放顺序
在内存中按行顺序存放。
即先存第一行,接着存第二行,
以此类推。例如,
例 int a[3][4];
float b[2][5];
int a[3,4]; (?)
行数 列数 元素个数 =行数 *列数
int a[3][2]
a[0][1]
a[1][0]
a[1][1]
a[2][0]
a[2][1]
0
1
4
5
2
3
a[0][0]
a[0][0] a[0][1]
a[1][0] a[1][1]
a[2][0] a[2][1]
0
1
2
3 4
5
6
7 ……….
..
20
21
22
23
int c[2][3][4]
c[0][0][0]
c[0][0][1]
c[0][0][2]
c[0][0][3]
c[0][1][0]
c[0][1][1]
c[0][1][2]
c[0][1][3]
c[0][2][0]
c[0][2][1]
c[0][2][2]
c[0][2][3]
c[1][0][0]
c[1][0][1]
c[1][0][2]
c[1][0][3]
c[1][1][0]
c[1][1][1]
c[1][1][2]
c[1][1][3]
c[1][2][0]
c[1][2][1]
c[1][2][2]
c[1][2][3]
2、二维数组理解
由按上述定义的二维数组的方式 (比如,int a[2][3] ),
我们可以把二维数组看成是一种特殊的一维数组:它的
元素又是一维数组。例如,把 a看成是一维数组,它有
3个元素,分别是,a[0],a[1],a[2],每个元素又是一
个包含 4个元素的一维数组。如下表,
a[0] a[0][0], a[0][1], a[0][2], a[0][3]
a 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]
其中 a 是数组 a[0],a[1],a[2] 的数组名
而 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]的数组名
3、二维数组元素的引用
形式,数组名 [下标 ][下标 ]
4、二维数组的输入输出。 使用双层循环 。例如,
main()
{ int a[4][5],i,j ;
for (i=1 ;i<=3;i++)
for(j=1;j<=4;j++)
scanf(“%d”,&a[i][j]);
for (i=1 ;i<=3;i++)
for(j=1;j<=4;j++)
printf(“%d”,a[i][j]);
}
输入,数据用空格或回
车隔开
输出
5、二维数组元素的初始化
?分行初始化,
?按元素排列顺序初始化 例 int a[2][3]={{1,2,3},{4,5,6}};
a[0][0] a[0][1] a[0][2]
a[1][0] a[1][1] a[1][2]
1 2 3
4 5 6
全部初始化
=
例 int a[2][3]={{1,2},{4}};
a[0][0] a[0][1] a[0][2]
a[1][0] a[1][1] a[1][2]
1 2 0
4 0 0
部分初始化
=
例 int a[ ][3]={{1 },{4,5}};
a[0][0] a[0][1] a[0][2]
a[1][0] a[1][1] a[1][2]
1 0 0
4 5 0
第一维长度省略初始化
=
例 int a[ 2][3]={1,2,3,4,5,6};
a[0][0] a[0][1] a[0][2]
a[1][0] a[1][1] a[1][2]
1 2 3
4 5 6
全部初始化
=
例,, 4,};
4
0 0 0
部分初始化
例 int a[ ][3]={1,2,3,4,5};
a[0][0] a[0][1] a[0][2]
a[1][0] a[1][1] a[1][2]
1 2 3
4 5 0
第一维长度省略初始化
=
?程序举例
例 将二维数组行列元素互换,存到另一个数组中
a= 1 2 3 4 5 6 b= 1 4 2 5
3 6
#include <stdio.h>
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");
}
}
例 求二维数组中最大元素值及其行列号
max=a[0][0]
for i=0 to 2
for j=0 to 3
a[i][j]>max 真 假
max=a[i][j]
row=i
colum=j
输出, max和 row,colum
#include <stdio.h>
main()
{ int a[3][4]={{1,2,3,4},
{9,8,7,6},
{-10,10,-5,2}};
int i,j,row=0,colum=0,max;
max=a[0][0];
for(i=0;i<=2;i++)
for(j=0;j<=3;j++)
if(a[i][j]>max)
{ max=a[i][j];
row=i;
colum=j;
}
printf("max=%d,row=%d,
colum=%d\n",max,row,colum);
}
lt19
思考题,作业,141页 7.3 7.5
1,float a[10]; 是一个定义一维数组的例子,
理解 float,a, 10 各部分的含义。
2、下面定义哪一个是错的?为什么?
1) #define N 10 2) int a[n];
int a[N];
3、下面对数组元素的引用是否正确?为什么?
a[3.5], a[3+5], a[-5],int n=3; a[n+1] 。
4,下面对一维数组的初始化是否正确?为什么?
int a[3]={1,2,3}, int a[]={1,2,3},int a[3]={1},
int a[3]={1,2,3,4}
5、为什么对一维数组赋值使用单层循环?
6、下面对二维数组初始化是否正确?为什么?
int a[2][3]={1,2},int a[][2]={{1,2,3},{4,5,6}},
int a[3][4]={{1},{0,6},{0,0,1}}
实验项目:数组 ( 写实验报告 ) 本周 4( 21日 ) 实验课交
实验目的,1,掌握一维数组的定义规则
2,正确运用一维数组进行程序设计 。
实验内容, 程序 (一 )
功能,编程实现用一维数组实现杨辉三角形的打印 。 参考程序
,
main()
{ int a[6],i,j,k;
a[1]=1;
printf("%d\n",a[1]);
for(i=2;i<6;i++)
{ a[i]=1;
for(j=i-1;j>=2;j--)
a[j]=a[j]+a[j-1];
for(k=1;k<=i;k++)
printf("%d",a[k]);
printf("\n");
}
}
程序 (二 ) 功能,编程实现用数组打印 Fibonacci数列的前 20
项。 参考程序,
#include <stdio.h>
main()
{ int i;
int ____________;
for(i=2;i<20;i++)
_______________;
for(i=0;i<20;i++)
{if(i%5==0) printf("\n");
printf("%12d",f[i]);
}
}
程序 (三 ) 功能,编程实现读 10个整数存入数
组,找出其中最大值和最小值。
问题
1.程序一中语句 for(k=1;k<=i;k++)改成
for(k=1;k<=5;k++),程序的输出结果是什么?
2,完成程序二的空白部分,如何定义数组能实
现数列的打印?
3,独立完成程序三的编程。
141页 7.1题:用筛法求 100之内的素数。程序,
分析,
3,4,5,6,7,8,9,10,11,12,13,14,15,
16,17,18,19,20,21,22,23,24,25,26,27,
28,29,30,31,32,33,34,35,36,37,38,39,
40,41,42,43,44,45,46,47,48,49,50
分别用 2,3,4,5,…,≈ 7.07
即 2,3,4,5,6,7
50
141页 7.1题:用筛法求 100之内的素数。程序,
#include <math.h>
main()
{int a[101],j,k,n;
for (j=1; j<=100 ; j++) a[j]=j;
for(j=2;j<sqrt(100) ; j++)
for(k=j+1;k<=100 ;k++)
{if(a[j]!=0 && a[k]!=0)
if(a[k] % a[j] ==0) a[k]=0; }
printf(―\n‖);
for( j=2,n=0 ; j<=100 ;j++)
{ if(a[j]!=0)
{printf(―%5d‖,a[j]); n++; }
if(n==10)
{printf(―\n‖); n=0;}
}
}
141页 7.3 题 矩阵主对角线的概念,
a11 a12 a13 a14
a21 a22 a23 a24
a31 a32 a33 a34
a41 a42 a44
主对角线
a43
本次课的主要内容,
1、字符数组的定义
2、字符数组的初始化
3、字符数组与字符串常量之间的关系
4、字符数组(字符串常量)的输入输出
5、字符串处理函数
§ 7.3 字符数组和字符串
一、字符数组定义
字符数组的定义方法与前面讲过的类似
二、字符数组的 初始化
例 char c[10],ch[3][4];
例 char ch[5]={?H?,?e?,?l?,?l?,?o?};
ch[0]
H e l l o
逐个字符赋值
ch[1] ch[2] ch[3] ch[4]
1、逐个字符赋值
在内存中情况示意
字符是以 ascll码存的
例 char ch[5]={?B?,?o?,?y?};
ch[0]
B o y \0 \0
逐个字符赋值
ch[1] ch[2] ch[3] ch[4]
1、逐个字符赋值
int a[5]={1,2,3};
结果,a[0]=1,a[1]=2,a[2]=3,a[3]=0,a[4]=0
对照
例 char ch[ ]={?a?,?b?,?c?,?d?};
ch[0]
a b c d
逐个字符赋值
ch[1] ch[2] ch[3]
1、逐个字符赋值
int a[ ]={1,2,3,4};
结果,a[0]=1,a[1]=2,a[2]=3,a[3]=4
对照
2、用字符串常量
例 char ch[6]={“Hello”};
char ch[6]=“Hello”;
char ch[]=“Hello”;
用字符串常量
ch[0]
H e l l o
ch[1] ch[2] ch[3] ch[4]
\0
ch[5]
系统自动加的 字符串结束
标记” \0”
例 char ch[5]=“Boy”;
ch[0]
B o y \0 \0
用字符串常量
ch[1] ch[2] ch[3] ch[4]
2、用字符串常量
char ch[6]={“Hello”}; char ch[6]=“Hello”;
char ch[]= {?h?,?e?,?l?,?l?,?o?,?\0?};
char ch[]=“Hello”;数组中有 6个元素。
char ch[]={?h?,?e?,?l?,?l?,?o?};数组中有 5个元素。
最后一个元素是‘ o?而不是‘ \0?。
ch[0]
H e l l o
ch[1] ch[2] ch[3] ch[4]
\0
ch[5]
示意图
例 char f[][7]={{?A?,?p?,?p?,?l?,?e?},
{?O?,?r?,?a?,?n?,?g?,?e?},
{?G?,?r?,?a?,?p?,?e?}};
也可以这样,char fruit[][7]={“Apple”,
,Orange”,
,Grape”};
二维字符数组初始化
f[0]
f[1]
f[2]
A p p l e \0 \0
O r a n g e \0
G r a p e \0 \0
三、字符串以及结束标记
1、字符串及其结束标志
字符串:双引号扩起来的一串字符。
结束标志,‘ \0? 。
2、无字符串变量,用字符数组处理字符串
例, hello”共 5个字符,在内存占 6个字节 字符串长度 5
h e l l o \0
104 101 108 108 111 0
内存存放字符 ASCII码
四、一维字符数组(字符串 )的输入输出
使用函数 scanf 与 printf
1、整个字符串的输入与输出,
格式符为,%s
例 用 %s
main()
{ char str[5];
scanf(―%s‖,str);
printf(―%s‖,str);
}
运行结果,
输入,China
输出,China
用字符数组名,不要加 &
输入串长度 <数组长度 >遇空
格或回车结束 自动加‘ \0?
2、逐个字符输入与输出,格式符 为,%c
例 用 %c
main()
{ char str[5];
int i;
for(i=0;i<5;i++)
scanf(―%c‖,&str[i]);
for(i=0;i<5;i++)
printf(―%c‖,str[i]);
}
运行结果,
输入,
abcde
输出,
abcde
例 main( )
{ char a[5]={?H‘,‘e‘,‘l‘,‘l‘,‘o‘};
printf(―%s‖,a);
}
例 main( )
{ char a[ ]=―Hello‖;
printf(―%s‖,a);
}
结果,Hello#-=* H e l l o
0 2 3 1 4
结果,Hello
用, %s‖输出时,遇
‘ \0‘结束
例 字符串输入举例
H o w \0
a r e \0
y o u? \0
#include <stdio.h>
main()
{ char a[15],b[5],c[5];
scanf("%s%s%s",a,b,c);
printf("a=%s\nb=%s\nc=%s\n",a,b,c);
scanf("%s",a);
printf("a=%s\n",a);
}
运行情况,
输入,How are you?
输出,a=How
b=are
c=you?
输入,How are you?
输出,a=How
scanf中 %s输入时,遇空格
或回车结束
六、常用的字符串处理函数
包含在头文件 string.h
1,字符串输出函数 puts
格式,puts(字符数组 名 )
功能:向显示器输出字符串(输出完,换行)
说明:字符数组必须以‘ \0?结束
例 #include <stdio.h>
main( )
{ char str[10]={“How are you?”};
puts(str); /* printf(“%s”,str) ; */ √
} 运行结果,
输出, How are you?
2、字符串输入函数 gets
格式,gets(字符数组 名 )
功能:从键盘输入一以 回车结束 的字符串放入
字符数组中,并自动加‘ \0’
说明:输入串长度应小于字符数组长度
例 #include <stdio.h>
main( )
{char str[30];
printf(“Input a string:”);
gets(str); /* scanf(“%s”,str); */
puts(str);
} 输入, How are you? 输出, How are you?
3、字符串连接函数 strcat
格式,strcat(字符数组 1,字符数组 2)
功能:把 字符数组 2 连到 字符数组 1 后面
说明,?字符数组 1必须足够大
?连接前,两串均以‘ \0’结束 ;连接后,
串 1的‘ \0’取消,新串最后加‘ \0’
例 #include <string.h>
main()
{char a[20] = "Turbo";
char b[]=, C++",
strcat(a,c);
printf("%s\n",a);
}
输出结果,
Turbo C++
例 char str1[20],str2[20];
str1={―Hello!‖}; (?)
str2=str1; (?)
4、字符串拷贝函数 strcpy
格式,strcpy(字符数组 1,字符串 2)
功能:将字符串 2,拷贝到字符数组 1中去
说明,?字符数组 1必须足够大
?拷贝时‘ \0’一同拷贝
?不能使用赋值语句为一个字符数组赋值
例,#include <string.h>
main()
{char a[25];
char b[]= ― C++",
c[] = "Turbo";
strcpy(a,c);
strcat(a,b);
printf("%s\n",a); 输出结果,
} Turbo C++
5、字符串比较函数 strcmp
格式,strcmp(字符串 1,字符串 2)
功能:比较两个字符串
比较规则:对两串从左向右逐个字符比较( ASCII码)
直到遇到不同字符或‘ \0’为止
返值:返回 int型整数,
a,若字符串 1< 字符串 2,返回 负整数
b,若字符串 1> 字符串 2,返回 正整数
c,若字符串 1== 字符串 2,返回 零
说明,字符串比较不能用,= =”,必须用 strcmp
例如:比较,
Hello! 与 Hell0!
H e l l o !
H e l I 0 !
例 #include <string.h>
#include <stdio.h>
main()
{char str1[] = ―Hell0!‖,str2[] =―Hello!‖;
if(strcmp(str1,str2)>0)
printf( ―Hell0!> Hello!‖);
else if(strcmp(str1,str2)==0)
printf(―Hell0!= = Hello!‖) ;
else
printf(―Hell0!< Hello!‖);
}
输出结果,
Hell0!<Hello!
6、字符串长度函数 strlen 作业,141页
格式,strlen(字符数组 ) 7.11, 7.14,7.15
功能:计算字符串长度
返值:返回字符串实际长度,不包括‘ \0’在内
例,
#include <string.h>
main()
{char str1[] =,Hello!",str2[] =,How are you?”;
int len1,len2,len3;
len1=strlen(str1) ; len2=strlen(str2);
printf(“len1=%d len2=%d”,len1,len2);
} 结果,len1=6 len2=12
应用举例
例 1,输入一行字符,统计其中有多少个单词,单词之间用
空格间隔
输入一字符串给字符数组 string
i=0, num=0, word=0
当 ( ( c=string[i] ) !=?\0? )
c= =空格 真
真
假
假
word=0 word=1
num=num+1
i=i+1
输出,num
word==0
例如:有下面一行字符
,
由一个空格间隔。
I ?am ?a ?boy,
再比如:有多个空格间
隔
? I ? ? am ? ? ? ? a ?boy,
#include <stdio.h>
main()
{ char string[81];
int i,num=0,word=0;
char c;
gets(string);
for(i=0;(c=string[i])!='\0';i++)
if(c==' ') word=0;
else if(word==0)
{ word=1; num++; }
printf("There are %d words in the line\n",num);
}
例 2,有三个字符串,找出其中最大者
定义三个一维字符数组 str1[20],str2[20],str3[20]
即
定义部分,char str1[20],str2[20],str[20],str [20] ;
输入部分,scanf(“%s%s%s”,str1,str2,str3);
比较部分,if( strcmp(str1,str2)>0) strcpy(str,str1);
else strcpy(str,str2);
if( strcmp(str3,str) >0) strcpy(str,str3);
输出部分,printf(“\n the largest string is,%s\n”
,str);
例 2,有三个字符串,找出其中最大者
H o w \0
H e l l o \0
H i g h \0
str[0]
str[1]
str[2]
#include <stdio.h>
#include <string.h>
main()
{ char string[20],str[3][20];
int i;
for(i=0;i<3;i++)
gets(str[i]);
if(strcmp(str[0],str[1])>0)
strcpy(string,str[0]);
else
strcpy(string,str[1]);
if(strcmp(str[2],string)>0)
strcpy(string,str[2]);
printf("\nThe largest string \
is:\n%s\n",string);
}
定义一个两维字符数组 str[3][20]
即 3行 20列。每一行可以容纳
20个字符。如下图,
1、若有代数表达式,则不正确的 C语言表达式是 ( C ),
A) a/b/c*e*3 B) 3*a*e/b/c
C)3*a*e/b*c D) a*e/c/b*3
2、下列运算符中优先级最高的是( B )
A) < B) + C) && D)!=
3、若有 int x=3,y=4,z=5;则下面表达式中值为 0的是( D)
A) ?x‘ && ?y‘ B) x<=y
C) x || y+z && y-z D) !((x<y) && !z || 1)
3ae
bc
4、以下程序的运行结果是( B)
main()
{int a,b,d=241;
a=d/100%9;
b=(-1) && (-1);
printf(―%d,%d ‖,a,b);
}
A) 6,1 B) 2,1 C) 6,0 D) 2,0
5、以下程序的运行结果是( C)
main()
{int m=5;
if(m++>5) printf(―%d\n‖,m);
else printf(%d\n‖,m--); A) 4 B) 5 C) 6 D) 7
}
6、以下程序输出结果是 (C )
main()
{int a=100,x=10,y=20,ok1=5,ok2=0;
if(x<y)
if(y!=10)
if(!ok1)
a=1;
else
if(ok2) a=10;
a=-1;
printf(―%d\n‖,a); } A) 1 B) 0 C) –1 D) 值不确定
7、下面程序段的运行结果是 ( C)
int n=0;
while(n++<=2) ; printf(―%d‖,n);
A) 2 B) 3 C) 4 D)有语法错误
8、以下正确计算 1× 2× 3× … × 10的程序段是 (D)
A) do {i=1;s=1; B) do{i=1;s=0;
s=s* i; s=s*i;
i++; i++;
}while(i<=10); }while(i<=10);
C) i=1;s=1; D) i=1;s=0;
do{s=s*i; do{s=s*i;
i++; i++;
}while(i<=10); }while(i<=10);
9、若运行以下程序时,从键盘输入 Adescriptor<CR>
(<CR>表示回车键 ),则下面程序的运行结果是 (D)
#include<stdio.h>
main()
{char c;
int v0=0,v1=0,v2=0;
do {
switch (c=getchar())
{case ?a‘,case ?A‘,
case ?e‘, case ?E‘,
case ?i‘,case ?I‘,
case ?o‘,case ?O‘,
case ?u‘,case ?U‘:v1+=1;
default,v0+=1; v2+=1;
}
}while(c!=‘\n‘);
printf(―v0=%d,v1=%d,v2=%d\n‖,v0,v1,v2);
}
A) v0=8 v1=4 v2=8 B)v0=11 v1=4 v2=11
C)v0=12 v1=4 v2=0 D)v0=12 v1=4 v2=12
10、以下不是无限循环的语句是 (A)
A) for(y=0,x=1;x>++y;x=i++) i=x;
B) for( ; ; x++=i);
C) while(1) {x++;}
D) for(i=10 ; ; i--) sum+=i ;
11、下面程序的运行结果是 (D)
#include<stdio.h>
main()
{int j,b,k=0;
for(j=1 ;j<=5 ;j++)
{b=j%2;
while(b- - >=0) k++;
}
printf(―%d,%d‖,k,b);
}
A) 3,-1 B) 8,-1 C) 3,0 D) 8,-2
12、下面程序段 (D)
for(t=1 ; t<=100 ;t++)
{scanf(―%d‖,&x); A)当 x<0时整个循环结束
if(x<0) continue ; B) x>=0时什么也不输出
printf(―%3d‖,t); C) printf函数永远也不执行
} D) 最多允许输出 100个非负整数 。
二,读程序,写出运行结果
1,main() 2,main()
{int x,y,z; {int a=-10,b=-3;
x=1;y=2;z=3; printf(―%d,‖,-a%b);
x=y--<=x||x+y!=z; printf(―%d,‖,(a-b,a+b));
printf(―%d,%d‖,x,y); printf(―%d\n‖,a-b?a-b:a+b);
} }
答案,1,( 1,1 ) 2、( 1, -13, -7 )
3,main() 4,main()
{int a,b,c,s,w,t; {int j,x,y;
s=w=t=0; j=x=y=0;
a=-1;b=3;c=3; do{++j;
if(c>0)s=a+b; if(j%2!=0)
if(a<=0) {x=x+j;j++;}
{if(b>0) y=y+j++;
if(c<=0) w=a-b }while(j<=7);
} printf(―x=%d,y=%d\n‖,x,y);
else if(c>0) w=a-b; }
else t=c;
printf(―%d %d %d‖,s,w,t);
}
3、( 2 0 0) 4、( x=1 y=20)
5,main()
{int i,k=19;
while(i=k-1) while( (i=k-1)!=0)
{k-=3;
if(k%5==0){i++;continue;}
else if(k<5) break;
i++;
}
printf(―i=%d,k=%d\n‖,i,k);
} 5,(i=6,k=4 )
四、阅读程序回答问题
1,问题 1,功能是求 m,n 的最大公约数
问题 2,结果是 0
三,程序填空
1,以下程序的功能是判断输入的年份是否是闰年。
答案,[1] y%4==0 && y%100!=0 [2] f=0
2,下面程序的功能是打印 100以内个位数为 6且能被 3
整除的所有数。 答案, [1] j<=9 [2] k%3!=0
实验十一 (在有序数组中插入一个数)
main() {int a[11]={1,4,6,9,13,16,19,28,40,100};
int temp1,temp2,numder,end,i,j;
scanf(“%d”,&number); end=a[9];
if(number>end) a[10]=number; else
{for(i=0;i<10;i++)
{if(a[i]>number) { temp1=a[i];
a[i]=number; for(j=i+1;j<11;j++)
{temp2=a[j];a[j]=temp1;temp1=temp2;}
break; }
} }
}
for(j=10;j>=i+1;j--)
{temp2=a[j+1];
a[j+1]=a[j];
a[j]=temp2;
}
for(i=0;i<11;i++) printf(―%5d‖,a[i]);
main()
{int a[11]={1,4,6,9,13,16,19,28,40,100};
int number,end,i,j;
scanf(“%d”,&number); end=a[9];
if(number>end) a[10]=number;
else
for(i=0;i<10;i++)
if(a[i]>number)
{ for(j=9; j>=i ; j--)
a[j+1]=a[j];
a[i]=number;
break;
}
for(i=0;i<11;i++) printf(“%5d”,a[i]);
}