1 / 44

第四章 数组

第四章 数组. 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 ) 左结合

Download Presentation

第四章 数组

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第四章 数组 4.1 概述 4.2 一维数组 4.3 二维数组 4.4 字符数组

  2. 4.1 概述 • 数组是有序数据的集合。数组中的每一个元素都属于同一个数据类型。用一个统一的数组名和下标来唯一地确定数组中的元素。 什么是数组呢? 当要对一组数据进行排序、在一组数中查找某个数据,矩阵计算等,通常都要用数组来实现。

  3. 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(元素数据类型) 数组名表示内存首地址, 是地址常量

  4. 例 int i = 15; int data[i]; (不能用变量定义数组长度) 例 int data[5]; data[5] = 10;// C语言对数组不作越界检查,使用时要注意

  5. 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};

  6. 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、用作数组下标

  7. 例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

  8. 数组类题目 定义数组 输入/赋值 基本方法 运算 输出

  9. #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项。 定义数组 计算 输出

  10. 行数 列数 4.3 二维数组 4.3.1 二维数组的定义和初始化 • 1.定义方式: • 类型说明符 数组名[表达式1][表达式2]; 例:float a[3][4],b[5][10];

  11. 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]; 它在内存情况:

  12. 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}};

  13. (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}}

  14. 4.3.2 二维数组元素的引用 • 数组名[行下标] [列下标]; • 例:int a[3][5]; • 则可以有如下引用:a[1+1][2*2-1]等 • 注意:下标值应该在已定义的数组大小范围内。

  15. 例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

  16. 例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

  17. 4.4 字符数组 4.4.1 字符串与一维字符数组 • 字符串:由若干有效字符构成且以字符‘\0‘作为结束符 • 号的一个字符序列 • 字符串常量:用一对双引号括起来的一串字符。 • 定义方法与数值型数组类似:char 数组名[常量表达式];如: char a[5]; • 元素为:a[0],a[1],…….,a[4],每一个元素的值为一个字符。

  18. 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在内存存储示意图如下图

  19. 2.字符数组的初始化 (1) 逐个元素初始化,如:char c[10]={’h’,’a’,’p’,’p’,’y’}; 说明: • 如果初值个数>数组长度,则作语法错误处理; • 如果初值个数<数组长度,则只将这些字符赋给数组中前面那些元素,其余元素自动定为空字符(’\0’); • 如果初值个数=数组长度,则在定义时可省略数组长度。

  20. 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”;

  21. 4.4.2 二维字符数组 • 一维字符数组存放一个字符串,二维字符数组可 • 存放多个字符串。 • char weekday[7][10]={ “sunday”,”monday”,”tuesday”,”wendnesday”,”thursday”,”friday”,”saturday”}; 第二维长度不能省略,应按最长的字符串长度设定

  22. 例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”); } } * * * * * * * * • * • * * • * * • * * • *

  23. 4.4.3 字符串的输入与输出 • 假设有定义char a[10]; 1.用格式符“%c”逐个字符输入输出: scanf(“%c”,&a[0]); printf(“%c”, a[0]);/*每次输入输出一个字符*/

  24. 2. 用格式符“%s”整个字符串输入输出: 用字符数组名,不要加& 输入串长度 < 数组长度 遇空格或回车结束 自动加 ‘\0’ 例 用%s main() { char str[5]; scanf(“%s”, str); printf(“%s”, str); } 用字符数组名, 遇‘\0’结束

  25. 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

  26. h e l \0 l o \0 main() { char a[] = {'h', 'e', 'l', '\0', 'l', 'o', '\0'}; printf("%s",a); } 输出:hel 数组中有多个‘\0’时, 遇第一个结束

  27. 用“%s”输入时,遇空格或回车键结束 C \0 P r o g \0 例如: char s1[5],s2[5]; scanf("%s%s",s1,s2); 若输入数据: C Prog↙ 则字符数组s1和s2的存储情况如右图所示

  28. 4.4.4 字符串处理函数 字符串输入输出函数的函数原型在头文件“stdio.h”中被说明,调用该函数时,应在程序中加入文件包含命令: #include"stdio.h" 1.用字符串输入函数gets实现输入 : • 函数功能:从键盘输入一以回车结束的字符串放入字符数组中,并自动加‘\0’ • 调用形式:gets(字符数组); • 举例:char a[10]; gets(a); printf(" %s" ,a);

  29. 函数功能:向显示器输出字符串(输出完,换行)函数功能:向显示器输出字符串(输出完,换行) • 调用形式:puts(字符串/字符数组); • 应用举例: char a[10]; gets(a); puts(a); • 2.用字符串输出函数puts实现输出

  30. 【例】将字符串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); }

  31. 以下函数在使用时应在程序头文件处添加声明 #include ”string.h”

  32. 3.计算字符串长度的函数strlen(字符数组) 函数功能:求出字符串或字符数组中实际字符个数 (不包括'\0')。 #include "stdio.h" #include "string.h" void main() { static char st[20]={"hello\0abce\0abc\0"}; printf("%d\n",strlen(st)); }

  33. 4. strupr(字符数组) • 函数功能:将字符串中的小写字母转换为大写字母。 5. strlwr(字符数组) • 函数功能:将字符串中的大写字母转换为小写字母。

  34. 6. 字符串比较函数strcmp(字符串1,字符串2) • 函数功能: 从左到右逐个比较两个字符串s1、s2中各个字符(用字符的ASCII码比较),直到出现不同字符或遇到结束标记为止。

  35. 函数返回值: 0 当串1=串2 • 例如: strcmp(" d ", " abc ") 结果为正整数。 • strcmp(" dog ", " door ") 结果为负整数。 负整数 当串1<串2 函数值= 正整数 当串1>串2 • 函数应用举例: 说明:字符串比较不能用“==”,必须用strcmp

  36. 7.字符串连接函数strcat(字符数组1,字符数组2) • 函数功能: 删去字符串字符数组1的结束标志'\0',将字符串或字符数组2连同末尾的结束标记一起连接到字符数组1尾部,返回连接以后的字符串。

  37. 应用举例 char a[20]="My name is ",b[10]="Li ming"; strcat(a,b); 执行 strcat(a,b) 后a数组如下:

  38. 8. 字符串拷贝函数strcpy(字符数组1,字符数组2) • 函数功能:用是将字符数组2复制到字符数组1中去。返回被复制的字符串。 • 函数说明: • 字符数组1长度应≥字符串或字符数组2的长度; • 字符数组1应写成数组名的形式; • 复制时连同通字符串后面的‘\0’一起复制过去。 例 char str1[20],str2[20]; str1 = {“Hello!”}; (×) str2 = str1; (×) strcpy( str2, str1 ); (√) 不能使用赋值语句为一个字符数组赋值

  39. 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数组内存情况:

  40. 【例】分析下面程序的运行结果。 #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]); }

  41. 9. strcpy(字符数组1,字符数组2,n) • 函数功能:用是将字符数组2中前n个字符赋值到字符数组1中去。 • 应用举例: char str1[6]=“the”, str2[5]=“sell”; printf(“%s”,strncpy(str1,str2,2) ); 结果是:see

  42. 例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);

  43. 例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); }

  44. 输入一字符串给 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); }

More Related