第六章 数 组 主讲教师 贾月乐 联系电话: 13402866690
第六章 数组 6.1 一维数组 二维数组 6.2 6.3 字符数组与字符串 C语言程序设计——第一章 C语言概述 SCS-SWPU
唉,有这么多不同主题的书。在哪里才能找到有关中国音乐的书呢? 为什么要使用数组 唉,有这么多不同主题的书。在哪里才能找到有关中国音乐的书呢?
为什么要使用数组 文学类 中国音乐类 计算机类 西方音乐类
为什么要使用数组 数组 内存 120 65 98 4 数组的元素 容器中保 存的物品 日常生活中的容器 程序中的数组
6.1 一维数组 一维数组的定义 一维数组元素的引用 一维数组的初始化 一维数组的输入、输出 一维数组应用举例 1 2 3 4 5 6.1 一维数组 一维数组的定义 1 一维数组元素的引用 2 一维数组的初始化 3 一维数组的输入、输出 4 一维数组应用举例 5 C语言程序设计——算法的描述 SCS-SWPU
6.1.1 一维数组的定义 C语言为这些数据,提供了一种构造数据类型:数组。所谓数组就是一组具有相同数据类型的数据的有序集合。 6.1.1 一维数组的定义 存放一个学生的学习成绩 存放一个班100个学生的成绩呢? 这些数据的特点是: 具有相同的数据类型 float s; C语言为这些数据,提供了一种构造数据类型:数组。所谓数组就是一组具有相同数据类型的数据的有序集合。 C语言程序设计——算法的描述 SCS-SWPU
6.1.1 一维数组的定义 1、定义格式: 数据类型 数组名[ 整型常量表达式 ]; 例如: int socre[50]; 6.1.1 一维数组的定义 1、定义格式: 数据类型 数组名[ 整型常量表达式 ]; 例如: int socre[50]; char a[20]; 定义格式说明: 1、数组名的定义遵循用户自定义标识符的要求。 2、常量表达式中可以包括常量和符号常量,不能包含 变量 #define SIZE 10 int a[SIZE]; C语言程序设计——算法的描述 SCS-SWPU
√ 6.1.1 一维数组的定义 以下数组定义是否正确 #define s 10 int a[s]; float f[5]; 6.1.1 一维数组的定义 以下数组定义是否正确 #define s 10 int a[s]; float f[5]; int s=10; int a[s]; float b[3.4] int n; scanf(“%d″,&n) int a[n]; √ 数组说明中其他常见的错误: ① float a[0]; /* 数组大小为0没有意义 */ ② int b(2); /* 不能使用圆括号 */ C语言程序设计——算法的描述 SCS-SWPU
每个数据元素占用的字节数,就是基本类型的字节数 6.1.1 一维数组的定义 2.一维数组在内存中的存放 一维数组: float mark[100]; mark[0] mark[1] mark[2] mark[3] . mark[99] 86.5 92.0 77.5 52.0 94.0 低地址 高地址 每个数据元素占用的字节数,就是基本类型的字节数 一个元素占4个字节 数组名就是存放数组的首地址 C语言程序设计——算法的描述 SCS-SWPU
注意 数组下标从0开始 6.1.2 一维数组元素的引用 2、数组元素的引用 定义:int a[3]; 6.1.2 一维数组元素的引用 2、数组元素的引用 定义:int a[3]; 则有3个整型变量:a[0]、a[1]、a[2], 数组的下标都是从0开始. 引用数组元素时下标可为任意表达式,动态决定访问哪个元素 for (i=0; i<SIZE; i++) a[i] = 2 * i; 下标越界是大忌! 定义:int a[10]; 那么数组元素为a[0] ~a[9] 使用大于最大下标的下标,将访问数组以外的空间。那里的数 据是未知的,系统不做下标越界检查,但可能带来严重后果 sizeof可以用来获得数组大小 定义数组时用到的“数组名[常量表达式]” 引用数组元素时用到的“数组名[下标]” 是有区别的。 例如∶ int a[10]; t=a[9]; 数组下标从0开始 注意 C语言程序设计——算法的描述 SCS-SWPU
6.1.3 一维数组元素的初始化 3、一维数组的初始化 即:给数组元素赋初值 1)定义数组的同时赋初值 6.1.3 一维数组元素的初始化 3、一维数组的初始化 即:给数组元素赋初值 1)定义数组的同时赋初值 int a[5] = { 12, 34, 56 ,78 ,9 }; 2)给一部分元素赋初值 int a[10]={12,34,56,78,9}; 3)对全部数组元素赋初值,可以不指定数组长度 int a[ ] = { 11, 22, 33, 44, 55 }; a[0]=12 a[1]=34 a[2]=56 a[3]=78 a[4]=9 后5个元素的值为0 等价于:int a[5] = { 11, 22, 33, 44, 55 }; C语言程序设计——算法的描述 SCS-SWPU
6.1.3 一维数组元素的初始化 4)使一个数组中全部元素值为0 5)建议: 数组大小使用宏常量,以适应未来可能的变化 6.1.3 一维数组元素的初始化 4)使一个数组中全部元素值为0 int a[10]={0,0,0,0,0,0,0,0,0,0}; 或 int a[10]={0}; 不能写成:int a[10]={0*10}; 或 int a[10]={ }; 5)建议: 数组大小使用宏常量,以适应未来可能的变化 #define SIZE 10 int a[SIZE]; C语言程序设计——算法的描述 SCS-SWPU
6.1.4 一维数组的输入输出 4、一维数组的输入和输出 只能逐个对数组元素进行操作(字符串数组例外) 设有定义:int a[10],i; 6.1.4 一维数组的输入输出 4、一维数组的输入和输出 只能逐个对数组元素进行操作(字符串数组例外) 设有定义:int a[10],i; 输入方法: 输出方法: 输入第i个数组元素: 输出第i个数组元素: scanf("%d",&a[i]); printf("%d",a[i]); 输入整个数组元素: 输出整个数组元素: for(i=0;i<10;i++) scanf("%d",&a[i]); for(i=0;i<10;i++) printf("%d",a[i]); C语言程序设计——算法的描述 SCS-SWPU
6.1.4 一维数组的输入输出 以下数组操作格式是否正确?? 3、 float a[0]; 4、 int b(2); 6.1.4 一维数组的输入输出 以下数组操作格式是否正确?? 3、 float a[0]; 4、 int b(2); 5、int b[4]={0}; 6、int b[ ]={0,0,0}; 1、 int n; scanf(“%d″,&n); int a[n]; 2、#define n 5 int a[n]; 7、int a[4]; a[4]={1,2,3,4}; 8、int a[4]; a[3]=2; 9、int a[ ]={1,2,3,4}; a[2]=a[1+2]+2; 10、int a[ ]={1,2,3,4}; a[2]=a[2+2]+2; C语言程序设计——算法的描述 SCS-SWPU
练习 1:若有定义语句:int m[]={5,4,3,2,1},i=4;,则 下面对m数组元素的引用中错误的是( ). A)m[--i] B)m[2*2] C)m[m[0]] D)m[m[i]] 2:若要求定义具有10个int型元素的一维数组a,则 下列定义语句中错误的是( )。 A)#def1ne N 10 B)#define n 5 int a [N]; int a[2*n]; C)int a [5+5]; D)int n=10,a[n];
练习 i=1 x[i-1] 下列程序的功能是:求出数组x中各相邻两个元素的和依 次存放到a数组中,然后输出。请填空。 main() { int x[10],a[9],i; for(i=0; i<10; i++) scanf(''%d'',&x[i]); for( ( ) ; i<10; i++) a[i-1]=x[i]+( ); for(i=0;i<9; i++) printf(''%d'',a[i]); printf(''\n''); } i=1 x[i-1]
6.1.5 一维数组的应用举例 例1:从键盘输入10个学生的成绩存放到数组score中, 统计最高分数学生人数,并输出对应的下标 分析: 6.1.5 一维数组的应用举例 例1:从键盘输入10个学生的成绩存放到数组score中, 统计最高分数学生人数,并输出对应的下标 分析: 1、定义float score[10], 最高分max=0,最高分人数 count=0; 2、循环:输入第i位学生的成绩score[i];并与max比较, 如果大于max,则max=score[i]; 3、循环:把每个学生成绩score[i]与max比较,若相等则 count++,并输出下标i C语言程序设计——算法的描述 SCS-SWPU
统计成绩最高分 6.1.5 一维数组的应用举例 #include <stdio.h> main( ) 6.1.5 一维数组的应用举例 统计成绩最高分 #include <stdio.h> main( ) { float score[10],max=0; int count=0,i; for(i=0;i<10;i++) { scanf("%f",&score[i]); if(max<score[i]) max=score[i]; } printf("得到最高分学生序号为:\n"); if(max==score[i]) { count++; printf("%d\t",i); printf("\n共有%d个学生得到最高分!\n",count); C语言程序设计——算法的描述 SCS-SWPU
6.1.5 一维数组的应用举例——冒泡排序 第 一 趟 比 较 例3 :用冒泡排序法对6个整数进行从小到大排序 6.1.5 一维数组的应用举例——冒泡排序 例3 :用冒泡排序法对6个整数进行从小到大排序 如有数:9,8,5,4,2,0 第 一 趟 比 较 经过第一趟(共5次比较与交换)后,最大的数9已“沉底” 。然后进行对余下的前面5个数第二趟比较, C语言程序设计——算法的描述 SCS-SWPU
6.1.5 一维数组的应用举例——冒泡排序 第 二 趟 比 较 6.1.5 一维数组的应用举例——冒泡排序 第 二 趟 比 较 如果有n个数,则要进行n-1趟比较。在第1趟比较中要进行n-1次两两比较,在第j趟比较中要进行n-j次两两比较。 C语言程序设计——算法的描述 SCS-SWPU
6.1.5 一维数组的应用举例——冒泡排序 程序流程图如下: C语言程序设计——算法的描述 SCS-SWPU
冒泡程序 6.1.5 一维数组的应用举例——冒泡排序 #include <stdio.h> #define N 6 6.1.5 一维数组的应用举例——冒泡排序 冒泡程序 #include <stdio.h> #define N 6 void main( ) { int a[N],temp,i,j; for(i=0;i<N;i++) scanf("%d",&a[i]); for(j=1;j<=N-1;j++) for(i=0;i<=N-j-1;i++) if(a[i]>a[i+1]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; } for(i=0;i<N;i++) printf("%4d",a[i]); printf("\n"); C语言程序设计——算法的描述 SCS-SWPU
6.1.5 一维数组的应用举例 例2 求Fibonacci (斐波纳契)数列:1,1,2,3,5,8,……的前40个数。 6.1.5 一维数组的应用举例 例2 求Fibonacci (斐波纳契)数列:1,1,2,3,5,8,……的前40个数。 f[1]=1 f[2]=1 Fn=Fn-1+Fn-2 (n≥3) #include <stdio.h> # define N 40 main( ) { int f[N]={1,1},i; for(i=2;i<N;i++) {f[i]=f[i-1]+f[i-2];} for(i=0;i<N;i++) { if(i%5==0) printf("\n"); printf("%12d",f[i]); } f[0]=1, f[1]=1 for i=2 to 39 f[i]=f[i-1]+f[i-2] C语言程序设计——算法的描述 SCS-SWPU
第六章 数组 6.1 一维数组 二维数组 6.2 6.3 字符数组与字符串 C语言程序设计——第一章 C语言概述 SCS-SWPU
6.2 二维数组 二维数组的定义 二维数组元素的引用 二维数组的初始化 二维数组的输入、输出 二维数组的应用举例 1 2 3 4 5 6.2 二维数组 二维数组的定义 1 二维数组元素的引用 2 二维数组的初始化 3 二维数组的输入、输出 4 二维数组的应用举例 5 C语言程序设计——算法的描述 SCS-SWPU
6.2.1 二维数组的定义 二维数组的定义: 数:2 3 5 6 7 8 若: → 用int a[6]可以存储 2 3 5 6 6.2.1 二维数组的定义 数:2 3 5 6 7 8 若: 2 3 5 6 7 8 9 3 3 4 6 8 二维数组的定义: 数据类型 数组名[常量表达式1][常量表达式2]; 例如: int a[3][4]; //定义三行四列,共有12个元素 → 用int a[6]可以存储 →用怎样的数组存储? 不能写成 int a[3,4],b[5,10]; C语言程序设计——算法的描述 SCS-SWPU
6.2.1 二维数组的定义 a[0] a[1] a[2] a[3] 在逻辑上可以把二维数组看成是一个具有行和列的表格或 一个矩阵。 6.2.1 二维数组的定义 在逻辑上可以把二维数组看成是一个具有行和列的表格或 一个矩阵。 如 int a[4][5],二维数组a[4][5]的逻辑结构见表7-1。 第0列 第1列 第2列 第3列 第4列 a[0] a[0][0] a[0][1] a[0][2] a[0][3] a[0][4] a[1] a[1][0] a[1][1] a[1][2] a[1][3] a[1][4] a[2] a[2][0] a[2][1] a[2][2] a[2][3] a[2][4] a[3] a[3][0] a[3][1] a[3][2] a[3][3] a[3][4] C语言程序设计——算法的描述 SCS-SWPU
6.2.1 二维数组的定义 二维数组在内存中的存放: 下图表示对a[3][4]数组存放的顺序 按行存放 6.2.1 二维数组的定义 二维数组在内存中的存放: 下图表示对a[3][4]数组存放的顺序 按行存放 ——即先顺序存放第一行的元素,再存放第二行的元素…… C语言程序设计——算法的描述 SCS-SWPU
6.2.2 二维数组元素的引用 二维数组元素的表示形式为: 数组名[下标][下标] 例如: a[2][3] 6.2.2 二维数组元素的引用 二维数组元素的表示形式为: 数组名[下标][下标] 例如: a[2][3] 下标可以是整型表达式,如 a[2-1] [2*2-1] 不要写成 a[2,3],a[2-1,2*2-1]形式 二维数组的元素照常按照普通变量使用即可 例如:b[1][2]=a[2][3]/2 常出现的错误有: int a[3][4]; /* 定义a为3×4的数组 */ ┆ a[3][4]=3; C语言程序设计——算法的描述 SCS-SWPU
6.2.3 二维数组的初始化 二维数组的初始化有以下四种形式: ① 分行进行初始化; ② 不分行的初始化; 6.2.3 二维数组的初始化 二维数组的初始化有以下四种形式: ① 分行进行初始化; ② 不分行的初始化; ③ 省略第一维的定义,不省略第二维的定义。 ④ 部分数组元素初始化; int b[2][3] = {{1,2,3},{4,5,6}}; int b[2][3] = {1,2,3,4,5,6}; int b[ ][3] = {1,2,3,4,5,6}; C语言程序设计——算法的描述 SCS-SWPU
6.2.3 二维数组的初始化 ④ 对部分元素赋初值: 例如: int a[3][4]={{1},{5},{9}}; 也可以对各行中的某一元素赋初值,如 int a[3][4]={{1},{0,6},{0,0,0,11}}; 1 0 0 0 5 6 0 0 0 0 0 0 1 0 0 0 0 6 0 0 0 0 0 11 1 0 0 0 5 0 0 0 9 0 0 0 也可以只对某几行元素赋初值。如: int a[3][4]={ {1},{5,6} }; C语言程序设计——算法的描述 SCS-SWPU
6.2.4 二维数组的输入输出 ⑤ 从键盘动态给二维数组元素赋初值 用双重循环动态给二维数组赋初值或输出值 例如:int a[3][4] 6.2.4 二维数组的输入输出 ⑤ 从键盘动态给二维数组元素赋初值 用双重循环动态给二维数组赋初值或输出值 例如:int a[3][4] for(i=0;i<3;i++) for(j=0;j<4;j++) scanf(“%d”,&a[i][j]); printf(“%d”,a[i][j]); C语言程序设计——算法的描述 SCS-SWPU
二维数组的定义、初始化、引用小结 例如:整型数组 b[3][3]={ {1,2,3}, {4,5,6}, {7,8,9} }; 地址 值 数组元素 3000H 3002H 3004H 3006H 3008H 300AH 300CH 300EH 3010H b[0][0] b[0][1] b[0][2] b[1][0] b[1][1] b[1][2] b[2][0] b[2][1] b[2][2] 1 2 3 4 5 6 789 C语言程序设计——算法的描述 SCS-SWPU
练习 下列数组定义中错误的是( )。 A)int x[2][3]={0}; 下列数组定义中错误的是( )。 A)int x[2][3]={0}; B)int x[2][3]={{1,2},{3,4},{5,6}}; C)int x[ ][3]={{1,2,3},{4,5,6}}; D)int x[2][3]={1,2,3,4,5,6}; 有下列程序: main() { int i,t[ ][3]}={9,8,7,6,5,4,3,2,1}; for(i=0;i<3;i++) printf(''%d'',t[2-i][i]); } 程序执行后输出结果是( )。 A)7 5 3 B)3 5 7 C)3 6 9 D)7 5 1
练习 若有定义语句:int a[3][6];,按在内存的存放顺序,a数组 的第10个元素是( )。 A)a[0][4] B)a[1][3] C)a[0][3] D)a[1][4] 以下错误的定义语句是( )。 A)int x[ ][3]={{0},{1},{ 1,2,3}}; B)int x[4][3]={{ 1,2,3},{ 1,2,3},{ 1,2,3},{ 1,2,3}}; C)int x[4][ ]={{ 1,2,3},{ 1,2,3},{ 1,2,3},{ 1,2,3}}; D)int x[ ][3]={1,2,3,4};
练习 有下列程序: main() { int x[3][2]={0},i; for(i=0;i<3;i++) scanf(''%d'',x[i]); printf("%3d%3d%3d\n'',x[0][0],x[0][1],x[1][0]); } 若运行时输入:2 4 6<CR>,则输出结果为( )。 A)2 0 0 B)2 0 4 C)2 4 0 D)2 4 6
6.2.5 二维数组的应用举例 例: 将一个二维数组行和列元素互换,存到另一 个二维数组中。 分析 1、定义变量: 6.2.5 二维数组的应用举例 例: 将一个二维数组行和列元素互换,存到另一 个二维数组中。 分析 1、定义变量: int a[2][3]={1,2,3,4,5,6},b[3][2],i,j; 2、执行: b数组的内容转置赋值给array,即b [j][i]=a[i][j] 3、输出b C语言程序设计——算法的描述 SCS-SWPU
如何实现矩阵加法计算 6.2.5 二维数组的应用举例 main( ) { int a[2][3]={{1,2,3},{4,5,6}}; 6.2.5 二维数组的应用举例 main( ) { int a[2][3]={{1,2,3},{4,5,6}}; int b[3][2],i,j; for (i=0;i<=2;i++) { for(j=0;j<=1;j++) printf("%5d" ,b[i] [j]); printf("\n"); } 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"); 如何实现矩阵加法计算 C语言程序设计——算法的描述 SCS-SWPU
第六章 数组 6.1 一维数组 二维数组 6.2 6.3 字符数组与字符串 C语言程序设计——第一章 C语言概述 SCS-SWPU
6.3 字符数组与字符串 字符数组 字符串及字符串数组 字符数组的输入输出 字符串处理函数 1 2 3 4 6.3 字符数组与字符串 字符数组 1 字符串及字符串数组 2 字符数组的输入输出 3 字符串处理函数 4 C语言程序设计——算法的描述 SCS-SWPU
6.3.1 字符数组 字符数组是每个元素存放一个字符型数据的数组。 字符数组的定义和元素的引用方法与一般数组相同。 1、字符数组的定义 6.3.1 字符数组 字符数组是每个元素存放一个字符型数据的数组。 字符数组的定义和元素的引用方法与一般数组相同。 1、字符数组的定义 例如: char a[5]; char b[3][5]; 2、字符数组的引用及初始化 例如: char a=‘c’; char a[5]= {‘c’, ’h’,’i’,’n’,’a’} char b[3][5]={ {‘I’,’\’’,’m’},{‘ ’,‘a’,’ ’}, {‘b’,’o’,y’} } C语言程序设计——算法的描述 SCS-SWPU
6.3.1 字符数组 ‘I’ ‘’’ ‘m’ 0 0 ‘ ‘ ‘a’ ‘ ‘ 0 0 ‘b’ ‘o’ ‘y’ 0 0 6.3.1 字符数组 初始化列表中的字符个数 > 数组长度,编译出错! 初始化列表中的字符个数 < 数组长度,自动补空字符 ’\0’ 如: char a[5]={‘t’,’h’,’e’}; ‘I’ ‘’’ ‘m’ 0 0 ‘ ‘ ‘a’ ‘ ‘ 0 0 ‘b’ ‘o’ ‘y’ 0 0 t h e \0 char b[3][5]={ {‘I’,’\’’,’m’},{‘ ’,‘a’,’ ’}, {‘b’,’o’,y’} } char a[5]={‘c’,’h’,’i’,’n’,’a’,’!’}; C语言程序设计——算法的描述 SCS-SWPU
6.3.2 字符串数组 利用字符串初始化字符数组 例如: 6.3.2 字符串数组 利用字符串初始化字符数组 一个字符串能够在定义字符数组时作为初始化数据被存入到数组中,但不能通过赋值表达式直接赋值。 例如: char word[20] = “Dictionary” char name[ ] = “Tommy” char c[10] = {‘s’,’t’,’r’,’i’,’n’,’g’,’\0’}; 最后一个字符’\0’必须有,为字符串结束标志。 但是: char mark[10]; mark=''C program''; /*赋值不合法*/ C语言程序设计——算法的描述 SCS-SWPU
6.3.2 字符串数组 H E L O H E L O \0 区分字符数组和字符串数组 6.3.2 字符串数组 区分字符数组和字符串数组 char rat[5]={‘H’,‘E’,‘L’,‘L’,‘O’}; H E L O rat中存放的是单个字符,不是字符串!! 因为是以单个字符形式为数组各元素赋初值, 产生的数组没有结束符‘\0’ char rat[6]={‘H’, ‘E’, ‘L’, ‘L’,‘O’, ‘\0’}; H E L O \0 rat中存放的是字符串!! 等价于char rat[]=“hello”; C语言程序设计——算法的描述 SCS-SWPU
6.3.2 字符串数组 二维字符数组 对于一个二维数组,C编译程序将其视为一个一维数组,这个一维数组中每个元素又是一个一维数组。这一概念对字符型数组仍适用。 char ch [3][4]={{‘a’,’a’},{‘b’,’b’,’b’},{‘c’} }; char ch [3][4]={″aa″,″bbb″,″c″ }; a \0 b c C语言程序设计——算法的描述 SCS-SWPU
6.3.3 字符数组的输入与输出 1、字符数组: 用%c格式单独输入输出 例: main() { int i; char str[10]; 6.3.3 字符数组的输入与输出 1、字符数组: 用%c格式单独输入输出 例: main() { int i; char str[10]; for(i=0;i<10;i++) scanf(“%c”,&str[i]); printf(“%c”,str[i]); } C语言程序设计——算法的描述 SCS-SWPU
6.3.3 字符数组的输入与输出 2、字符串:用%s将字符串整体输入输出 例: main() { int i; char str[10]; 6.3.3 字符数组的输入与输出 2、字符串:用%s将字符串整体输入输出 例: main() { int i; char str[10]; scanf(“%s”,str); printf(“%s”,str); } 注意: 输入的字符串中不能有空格、回车或跳格符(Tab),因为系统遇到这些分隔符时,会认为输入结束。 若输入:hello world!则实际存入str的只有"hello " C语言程序设计——算法的描述 SCS-SWPU
6.3.3 字符数组的输入与输出 3、字符串:调用函数puts()和gets() gets( )函数——专门用于输入字符串 6.3.3 字符数组的输入与输出 3、字符串:调用函数puts()和gets() 只能使用数组名 gets( )函数——专门用于输入字符串 一般形式是: gets(字符数组名); puts()函数——专门用于输出字符串 字符常量或变量名 一般形式是: puts(字符串); char a[10]; gets(a); char a[10]=“hello”; puts(a); char a[10]; gets(“hello”) puts(“hello”); 与printf()的不同: puts()函数打印字符串的全部内容,直至遇到'\0'为止,然后自动多打印一个'\n',起到换行的作用。而printf函数无此功能。 注意:用puts和gets函数只能输入或输出一个字符串,不能写成 : puts(str1,str2) 或 gets(str1,str2) C语言程序设计——算法的描述 SCS-SWPU
6.3.3 字符数组的输入与输出 scanf(“%s”,str); printf(“%s”,str); 小结: 6.3.3 字符数组的输入与输出 小结: 1、与一般数组操作方法相同,例如: char str[20]; for( i = 0;i <20;i++) scanf(“%c”,&str[i]); for(i = 0;i <20;i++) printf(“%c”,str[i]); 2、%s整体访问字符数组 scanf(“%s”,str); printf(“%s”,str); 3、使用库函数gets()和puts() 可以输入全部字符,以回车结束,且默认换行 注意!! 任意键盘输入做为字符输入! C语言程序设计——算法的描述 SCS-SWPU
6.3.3 字符数组的输入与输出 char a[10]; scanf(“%s”,a) printf(“%s”,a) 若输入:hello! 6.3.3 字符数组的输入与输出 char a[10]; scanf(“%s”,a) printf(“%s”,a) 若输入:hello! 输出? 若输入:hello word! 输出? hello! hello! char a[10]=“hello word!” printf(“%s”,a); 输出? char a[20]=“hello word!” printf(“%s”,a); 输出? hello word! char a[10]=“hello”,b[10]=“word”; printf(“%s%s”,a,b); 输出? helloword char a[10]=“hello”,b[10]=“word”; puts(a); puts(b); 输出? hello word C语言程序设计——算法的描述 SCS-SWPU
6.3.4 字符串处理函数 这些函数的原型存放在string.h文件中 strlen( )函数 ——测试字符串的长度 6.3.4 字符串处理函数 strlen( )函数 ——测试字符串的长度 strcat( )函数——字符串连结 strcmp( )函数——字符串比较 strcpy( )函数——字符串的拷贝 strlwr()函数——将字符串中的大写字母转换成小写字母 strupr()函数——将字符串中的小写字母转换成大写字母 这些函数的原型存放在string.h文件中 C语言程序设计——算法的描述 SCS-SWPU
6.3.4 字符串处理函数 strcat()函数 功能:用于连结两个字符串。 一般形式: strcat(字符串1,字符串2); 6.3.4 字符串处理函数 strcat()函数 功能:用于连结两个字符串。 一般形式: strcat(字符串1,字符串2); 将字符串2连结到字符串1的后面 其中:参数1必须是字符数组名,而参数2可以是字符串常量或数组名。 注意: (1) strcat函数不检查字符串1的空白位置是否装得下字符串2。连结前应用strlen函数进行检验,确保不发生溢出。 (2) 长度加1,为新字符串的结束符‘\0’留一个位置。 C语言程序设计——算法的描述 SCS-SWPU
6.3.4 字符串处理函数 结果: hello word! 例如: #include <stdio.h> 6.3.4 字符串处理函数 例如: #include <stdio.h> #include <string.h> void main( ) { char a[20]="hello",b[10]=" word!"; strcat(a,b); puts(a); } 结果: hello word! C语言程序设计——算法的描述 SCS-SWPU
6.3.4 字符串处理函数 strcpy()函数 功能:用于实现两个字符串的拷贝。 一般形式: strcpy(字符串1,字符串2) 6.3.4 字符串处理函数 strcpy()函数 功能:用于实现两个字符串的拷贝。 一般形式: strcpy(字符串1,字符串2) 将字符串2拷贝到字符串1中 其中:字符串1必须是字符数组名,不能是字符串常量。 注意: 1、由于字符串是数组类型,所以两个字符串复制不能通过赋值运算进行。 如: t=s;——错误的字符串复制*/ strcpy(t,s);——正确的字符串复制 C语言程序设计——算法的描述 SCS-SWPU
6.3.4 字符串处理函数 输出: s=ab ab!perfect! 例: #include<stdio.h> 6.3.4 字符串处理函数 例: #include<stdio.h> #include<string.h> #define SIZE 80 void main() { char s[SIZE]="Chinese"; char m[SIZE]="ab"; char t[ ]="ab"; strcpy(s,m); printf("s=%s\n",s); strcpy(s,t); strcat(s, "!perfect!"); puts(s); } 输出: s=ab ab!perfect! C语言程序设计——算法的描述 SCS-SWPU
6.3.4 字符串处理函数 strlen()函数 功能:测试字符串的长度。 一般形式是: length=strlen(字符串) 其中: 6.3.4 字符串处理函数 strlen()函数 功能:测试字符串的长度。 一般形式是: length=strlen(字符串) 其中: 函数参数可以是字符串常量,或者字符数组名。 整型变量length用于保存函数的返回值。 字符串的长度是包围在双引号内的有效字符数,不包括双引号和‘\0’。 如: char t[ ]="\0"; printf("%d,%d\n",strlen(t),sizeof(t)); 0, 2 C语言程序设计——算法的描述 SCS-SWPU
6.3.4 字符串处理函数 strcmp()函数 其中: 比较结果的规定: 功能:比较两个字符串的大小。 6.3.4 字符串处理函数 strcmp()函数 功能:比较两个字符串的大小。 一般形式: i=strcmp(字符串1,字符串2); 比较方法:从左至右逐个比较其ASCII码值大小 其中: (1)字符串1、字符串2均可为字符串常量或数组名. (2) i 是用于存放比较结果的整型变量。 比较结果的规定: ①字符串1<字符串2,函数返回一个负值。 ②字符串1=字符串2,函数返回零。 ③字符串1>字符串2,函数返回一个正值。 C语言程序设计——算法的描述 SCS-SWPU
√ × 6.3.4 字符串处理函数 如:if(“ABC”>“DEF”) if( strcmp("ABC " ,"DEF") ) 6.3.4 字符串处理函数 长度不相同的两个字符串比较: strcmp函数比较到其中一个字符串遇到结束符'\0'为止。 注意:不能用关系运算进行大小比较。 如:if(“ABC”>“DEF”) × 正确的做法是用strcmp函数进行比较。 √ if( strcmp("ABC " ,"DEF") ) C语言程序设计——算法的描述 SCS-SWPU
6.3.4 字符串处理函数 strlwr(字符串) 功能: 将字符串中的大写字母转换为小写字母 strupr(字符串) 6.3.4 字符串处理函数 strlwr(字符串) 功能: 将字符串中的大写字母转换为小写字母 strupr(字符串) 功能:将字符串中的小写字母转换为大写字母 如: char str[12]="Hello Word!"; puts( strlwr(str) ); puts( strupr(str) ); C语言程序设计——算法的描述 SCS-SWPU
6.3.4 字符串处理函数 1.输入字符串 2.逆置字符串内容 使用什么方法可以实现逆置? 3.输出字符串 6.3.4 字符串处理函数 输入一串字符s,把s所指字符串中的内容逆置。例 如:字符串中原有的字符串为:abcdefg,则执行后, 串s中的内容为:gfedcba。 算法分析: 1.输入字符串 2.逆置字符串内容 使用什么方法可以实现逆置? 3.输出字符串 C语言程序设计——算法的描述 SCS-SWPU
#include <stdio. h> #include <string #include <stdio.h> #include <string.h> void main() { char a[100]; printf("请输入一串字符"); gets(a); int n=strlen(a); char temp; for(int i=0;i<n/2;i++) temp=a[i]; a[i]=a[n-i-1]; a[n-i-1]=temp; } printf("%s",a); C语言程序设计——算法的描述 SCS-SWPU
6.3.4 字符串处理函数 例题:从键盘输入三个字符串,找出其中最大的字 符串 #include<stdio.h> 6.3.4 字符串处理函数 例题:从键盘输入三个字符串,找出其中最大的字 符串 #include<stdio.h> #include<string.h> void main ( ) { char maxstring[20]; char str[3][20]; int i; for (i=0;i<3;i++) gets (str[i]); strcpy(maxstring,str[0]); for(i=1;i<3;i++) if(strcmp(str[i],maxstring)>0) strcpy(maxstring,str[i]); printf("the lagest string is:%s\n",maxstring); } C语言程序设计——算法的描述 SCS-SWPU
Thank You !