440 likes | 539 Views
第四章 数组. 4.1 概述 4.2 一维数组 4.3 二维数组 4.4 字符数组. 4.1 概述. 数组是有序数据的集合。数组中的每一个元素都属于 同一个数据类型 。用一个 统一的数组名 和 下标 来唯一地确定数组中的元素。. 什么是数组呢 ?. 当要对一组数据进行排序、在一组数中查找某个数据,矩阵计算等,通常都要用数组来实现。. a[0]. 0. a[1]. 1. 2. a[2]. 3. a[3]. 4. a[4]. 5. a[5]. 内存. a. [ ] 数组运算符 单目运算符 优先级 ( 1 ) 左结合
E N D
第四章 数组 4.1 概述 4.2 一维数组 4.3 二维数组 4.4 字符数组
4.1 概述 • 数组是有序数据的集合。数组中的每一个元素都属于同一个数据类型。用一个统一的数组名和下标来唯一地确定数组中的元素。 什么是数组呢? 当要对一组数据进行排序、在一组数中查找某个数据,矩阵计算等,通常都要用数组来实现。
a[0] 0 a[1] 1 2 a[2] 3 a[3] 4 a[4] 5 a[5] 内存 a [ ] 数组运算符 单目运算符 优先级(1) 左结合 不能用( ) 4.2 一维数组 4.2.1一维数组的定义和初始化 1.定义:类型说明符 数组名[常量表达式]; 合法标识符 表示元素个数下标从 0开始 2.在内存分配若干连续空间给数组. • 例 int a[6]; 编译时分配连续内存 内存字节数=数组长度* sizeof(元素数据类型) 数组名表示内存首地址, 是地址常量
例 int i = 15; int data[i]; (不能用变量定义数组长度) 例 int data[5]; data[5] = 10;// C语言对数组不作越界检查,使用时要注意
3. 一维数组的初始化 • 初始化方式 int a[5]={1,2,3,4,5}; 等价于:a[0]=1; a[1]=2; a[2]=3; a[3]=4; a[4]=5; 在定义数组时,为数组元素赋初值 (在编译阶段使之得到初值) • 说明: • 数组不初始化,其元素值为随机数 • 只给部分数组元素赋初值 • 在对全部数组元素赋初值时,可不指定数组长度 如 int a[5] = {6,2,3};// 未指定的用 0填充 等价于:a[0]=6; a[1]=2;a[2]=3; a[3]=0; a[4]=0; 如 int a[3] = {6,2,3,5,1}; () • 如果想使一个数组中全部元素值为0,可以写成: int a[ ] = {1,2,3,4,5,6}; 编译系统根据初值个数确定数组长度 int a[5] = {0,0,0,0,0}; 或int a[5] = {0};
4.2.2 一维数组元素的引用 整型常量 整型常量表达式 • 1.数组同变量一样,必须先定义后引用 • 2.引用数组元素的方法是:数组名[下标] 3.只能逐个引用数组元素,不能一次引用整个数组 例如:有定义 int a[10]; 可以引用元素的从a[0]到a[9] a[3+5] a[10-10] a[5]=6; a[7]=a[5]++; int a[10]; 必须for(j = 0;j < 10;j++) printf(“%d\t”,a[j]);() printf(“%d”,a);() 循环变量 j的作用: 1、控制循环次数 2、用作数组下标
例4-1 把数组a的元素依次赋0,10,20,…,90,再把a的元素值按逆序输出 #include <stdio.h> void main() {int i,a[10]; printf("input 10 numbers:\n"); for(i=0;i<10;i++) a[i]=i*10; for(i=9;i>=0;i--) printf("%d ",a[i]); } 程序运行结果: 90 80 70 60 50 40 30 20 10 0
数组类题目 定义数组 输入/赋值 基本方法 运算 输出
#include "stdio.h“ void main() { int fib[20]={1,1} int i; for(i=2;i<20;i++) fib[i]=fib[i-1]+fib[i-2]; for(i=0;i<20;i++) { if(i%4==0) printf(“\n”); printf("%12d ",fib[i]); } } • 例4-2利用数组,求斐波拉契数列的前20项。 定义数组 计算 输出
行数 列数 4.3 二维数组 4.3.1 二维数组的定义和初始化 • 1.定义方式: • 类型说明符 数组名[表达式1][表达式2]; 例:float a[3][4],b[5][10];
2.说明: • 二维数组可看作特殊的一维数组; • 元素在内存排列顺序为按行存放; • 多维数组定义亦类似于二维数组,如: float a[2][3][4]; a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] 例: int a[2][3]; 它在内存情况:
0 1 0 0 0 6 0 0 0 0 11 0 • 3. 二维数组的初始化 (1)按数组排列的顺序将所有数据写在一个花括号内。 int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; (2)分行初始化。 int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; (3)部分元素初始化。如:int a[3][4]={{,1},{0,6},{0,0,11}};
(4)如果对全部元素都赋初值,则定义数组时可以不指定第一维的长度,(4)如果对全部元素都赋初值,则定义数组时可以不指定第一维的长度, int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12}; 若对部分元素赋初值而省略第一维的长度,必须用分行赋值来实现。 int a[][5]={{1,0,3},{0,15}}
4.3.2 二维数组元素的引用 • 数组名[行下标] [列下标]; • 例:int a[3][5]; • 则可以有如下引用:a[1+1][2*2-1]等 • 注意:下标值应该在已定义的数组大小范围内。
例4-4 编程将下列矩阵中的元素向右移动一列,最右列移至第一列。 #include <stdio.h> void main() { int a[2][3]={{2,5,6}, {9,7,8}}; int i,j,temp; for(i=0;i<2;i++) { temp=a[i][3-i]; for(j=3-i;j>=0;j--) a[i][j+1]=a[i][j]; a[i][0]=temp; } for(i=0;i<2;i++) { for(j=0;j<3;j++) printf(“%6d ”,a[i][j]); printf(“\n”); } } • 2 5 6 • 9 7 8
例4-5 输出杨辉三角的前6行数据。 #include <stdio.h> void main() { int i,j,a[6][6]; for(i=0;i<6;i++) { a[i][0]=1; a[i][i]=1;} for(i=2;i<6;i++) for(j=1;j<=i-1;j++) a[i][j]=a[i-1][j-1]+a[i-1][j]; for(i=0;i<6;i++) { for(j=0;j<=i;j++) printf(“%4d ”,a[i][j]); printf(“\n”); } } • 1 • 1 • 1 2 1 • 3 3 1 • 1 4 6 4 1 • 1 5 10 10 5 1
4.4 字符数组 4.4.1 字符串与一维字符数组 • 字符串:由若干有效字符构成且以字符‘\0‘作为结束符 • 号的一个字符序列 • 字符串常量:用一对双引号括起来的一串字符。 • 定义方法与数值型数组类似:char 数组名[常量表达式];如: char a[5]; • 元素为:a[0],a[1],…….,a[4],每一个元素的值为一个字符。
a[0] a[1] a[2] a[3] a[4] A B o y 1. 字符数组的存储结构 同数值型数组一样,系统在内存为字符数组分配若干(和数组元素个数相同)连续的存储单元,每个存储单元为一个字节。 例如:char a[5]; 假设a[0]='A';a[1]=' '; a[2]='B';a[3]='o'; a[4]='y'; 则数组a在内存存储示意图如下图
2.字符数组的初始化 (1) 逐个元素初始化,如:char c[10]={’h’,’a’,’p’,’p’,’y’}; 说明: • 如果初值个数>数组长度,则作语法错误处理; • 如果初值个数<数组长度,则只将这些字符赋给数组中前面那些元素,其余元素自动定为空字符(’\0’); • 如果初值个数=数组长度,则在定义时可省略数组长度。
I a m a b o y \0 (2) 用字符串来初始化字符数组 例如:char a[11] = {”I am a boy”}; char ch[6] = {“Hello”}; char ch[6] = “Hello”; char ch[ ] = “Hello”;
4.4.2 二维字符数组 • 一维字符数组存放一个字符串,二维字符数组可 • 存放多个字符串。 • char weekday[7][10]={ “sunday”,”monday”,”tuesday”,”wendnesday”,”thursday”,”friday”,”saturday”}; 第二维长度不能省略,应按最长的字符串长度设定
例4-7 输出如下图所示的钻石图形 #include <stdio.h> void main() { char diamond[][5]={{′ ′,′ ′,′*′},{′′,′*′,′ ′,′*′},{′*′,′ ′,′ ′,′ ′,′*′},{′ ′,′*′,′ ′,′*′},{′ ′,′ ′,′*′}}; int i,j; for (i=0;i<5;i++) { for (j=0;j<5;j++) printf(“%c”,diamond[i][j]); printf(“\n”); } } * * * * * * * * • * • * * • * * • * * • *
4.4.3 字符串的输入与输出 • 假设有定义char a[10]; 1.用格式符“%c”逐个字符输入输出: scanf(“%c”,&a[0]); printf(“%c”, a[0]);/*每次输入输出一个字符*/
2. 用格式符“%s”整个字符串输入输出: 用字符数组名,不要加& 输入串长度 < 数组长度 遇空格或回车结束 自动加 ‘\0’ 例 用%s main() { char str[5]; scanf(“%s”, str); printf(“%s”, str); } 用字符数组名, 遇‘\0’结束
0 1 2 3 4 h e l l o 例 main( ) { char a[5]={‘H’,’e’,’l’,’l’,’o’}; printf(“%s”,a); } 用“%s”输出时,遇‘\0’结束 结果:Hello#-=*……(直到偶然遇到 ‘\0’) 例 main( ) { char a[ ] = “Hello”; printf(“%s”,a); } “ ”双引号定义的字符串,末尾自动添加结尾符 ‘ \0’ 结果:Hello
h e l \0 l o \0 main() { char a[] = {'h', 'e', 'l', '\0', 'l', 'o', '\0'}; printf("%s",a); } 输出:hel 数组中有多个‘\0’时, 遇第一个结束
用“%s”输入时,遇空格或回车键结束 C \0 P r o g \0 例如: char s1[5],s2[5]; scanf("%s%s",s1,s2); 若输入数据: C Prog↙ 则字符数组s1和s2的存储情况如右图所示
4.4.4 字符串处理函数 字符串输入输出函数的函数原型在头文件“stdio.h”中被说明,调用该函数时,应在程序中加入文件包含命令: #include"stdio.h" 1.用字符串输入函数gets实现输入 : • 函数功能:从键盘输入一以回车结束的字符串放入字符数组中,并自动加‘\0’ • 调用形式:gets(字符数组); • 举例:char a[10]; gets(a); printf(" %s" ,a);
函数功能:向显示器输出字符串(输出完,换行)函数功能:向显示器输出字符串(输出完,换行) • 调用形式:puts(字符串/字符数组); • 应用举例: char a[10]; gets(a); puts(a); • 2.用字符串输出函数puts实现输出
【例】将字符串s1从第m个字符开始剩余的所有字符,送入字符数组s2中。【例】将字符串s1从第m个字符开始剩余的所有字符,送入字符数组s2中。 #include "stdio.h" void main() {int i,j,m; char s1[80],s2[80]; printf("input a string:\n"); gets(s1); printf("input start point:\n"); scanf("%d",&m); i=m-1; j=0; while(s1[i]!='\0') {s2[j]=s1[i]; i++;j++; } s2[j]='\0'; puts(s2); }
以下函数在使用时应在程序头文件处添加声明 #include ”string.h”
3.计算字符串长度的函数strlen(字符数组) 函数功能:求出字符串或字符数组中实际字符个数 (不包括'\0')。 #include "stdio.h" #include "string.h" void main() { static char st[20]={"hello\0abce\0abc\0"}; printf("%d\n",strlen(st)); }
4. strupr(字符数组) • 函数功能:将字符串中的小写字母转换为大写字母。 5. strlwr(字符数组) • 函数功能:将字符串中的大写字母转换为小写字母。
6. 字符串比较函数strcmp(字符串1,字符串2) • 函数功能: 从左到右逐个比较两个字符串s1、s2中各个字符(用字符的ASCII码比较),直到出现不同字符或遇到结束标记为止。
函数返回值: 0 当串1=串2 • 例如: strcmp(" d ", " abc ") 结果为正整数。 • strcmp(" dog ", " door ") 结果为负整数。 负整数 当串1<串2 函数值= 正整数 当串1>串2 • 函数应用举例: 说明:字符串比较不能用“==”,必须用strcmp
7.字符串连接函数strcat(字符数组1,字符数组2) • 函数功能: 删去字符串字符数组1的结束标志'\0',将字符串或字符数组2连同末尾的结束标记一起连接到字符数组1尾部,返回连接以后的字符串。
应用举例 char a[20]="My name is ",b[10]="Li ming"; strcat(a,b); 执行 strcat(a,b) 后a数组如下:
8. 字符串拷贝函数strcpy(字符数组1,字符数组2) • 函数功能:用是将字符数组2复制到字符数组1中去。返回被复制的字符串。 • 函数说明: • 字符数组1长度应≥字符串或字符数组2的长度; • 字符数组1应写成数组名的形式; • 复制时连同通字符串后面的‘\0’一起复制过去。 例 char str1[20],str2[20]; str1 = {“Hello!”}; (×) str2 = str1; (×) strcpy( str2, str1 ); (√) 不能使用赋值语句为一个字符数组赋值
a b c d e f h a p p y \0 h a p p y \0 g h i \0 g h i \0 • 函数应用举例: • 例如: char a[10]="abcdefghi",b[]="happy"; • strcpy(a,b); a数组内存原始情况: 函数调用后a、b数组内存情况:
【例】分析下面程序的运行结果。 #include "conio.h" #include "string.h" #include "stdio.h" void main() { char c1[10]="abcdefghi",c2[]="china"; strcpy(c1,c2); puts(c1); printf("%c",c1[7]); }
9. strcpy(字符数组1,字符数组2,n) • 函数功能:用是将字符数组2中前n个字符赋值到字符数组1中去。 • 应用举例: char str1[6]=“the”, str2[5]=“sell”; printf(“%s”,strncpy(str1,str2,2) ); 结果是:see
例4-10 输入一行字符,统计其中英文字符、数字字符、空格及其他字符的个数。 #include <stdio.h> #include <string.h> #define Size 100 main() { char str[Size]; int len,i, letter=0,digit=0,space=0,other=0; printf(“please input a string\n"); gets(str); len=strlen(str); for( i=0;i<len;i++) { if((str[i] >=‘a’ && str[i] <= ‘z’) || (str[i] >= ‘A’ && str[i] <= ‘Z’)) letter++; else if(str[i] >= ‘0’ && str[i] <=‘9’) digit++; else if(str[i] == ‘ ‘) space++; else other++; } printf(”%d letters;\n%d digit \n %d space\n %d other\n ", letter,digit,space,other);
例4-11 从键盘上输入5门课程的名字,按字典顺序输出最前面的课程名字. #include <stdio.h> #include <string.h> void main() { int i; char str[30],min[30]; printf(“please enter five courses names:\n”); gets(str); strcpy(min,str); for(i=1;i<5;i++) {gets(str); if (strcmp(str,min)<0) strcpy(min,str); } printf(“the min is:”); puts(min); }
输入一字符串给 str i=0 num=0 word=0 当((c=str[i])!=‘\0’) c=空格 真 假 word==0 真 假 word=0 num=num+1 word=1 i=i+1 输出:num 例4-12 任意输入一行字符,统计其中有多少个单词。 #include <stdio.h> main() { char string[100]; inti,num=0,word=0; char c; gets(str); for(i = 0; (c=str [i])!=‘\0’ ; i++) if( c = = ' ' ) word = 0; else if(word = = 0) {num++; word = 1;} printf("There are %d words \ in the line\n",num); }