好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

利用数组处理批量数据课件.ppt

126页
  • 卖家[上传人]:桔****
  • 文档编号:574929338
  • 上传时间:2024-08-17
  • 文档格式:PPT
  • 文档大小:881KB
  • / 126 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 第六章第六章 问题:问题:给一组数排序,这组给一组数排序,这组 数该数该 如何存放如何存放呢呢??? 这些数据如何存放才便于排序82945637617188888888881111111111111118 8 88888888这便是本章所要解决的问题 l l 本章要点 l l 主要内容主要内容6.1 6.1 怎样定义和引用一维数组怎样定义和引用一维数组6.2 6.2 怎样定义和引用二维数组怎样定义和引用二维数组6.3 6.3 字符数组字符数组 数组的概念数组的概念: : C语言为这些数据,提供了一种构造数据类型:数组语言为这些数据,提供了一种构造数据类型:数组 所谓数组所谓数组就是一组具有相同数据类型的数据的有序集合就是一组具有相同数据类型的数据的有序集合 由数组名和下标唯一确定数组中的一个元素,由数组名和下标唯一确定数组中的一个元素,由数组名和下标唯一确定数组中的一个元素,由数组名和下标唯一确定数组中的一个元素,数组中的每数组中的每一个元素都属于一个元素都属于同一个数据类型同一个数据类型 按数组元素的类型不同,数组又可分为按数组元素的类型不同,数组又可分为按数组元素的类型不同,数组又可分为按数组元素的类型不同,数组又可分为数值数组、字符数数值数组、字符数数值数组、字符数数值数组、字符数组、指针数组、结构数组组、指针数组、结构数组组、指针数组、结构数组组、指针数组、结构数组等。

      等•一个班学生的学习成绩一个班学生的学习成绩•一行文字一行文字•一个矩阵一个矩阵这些数据的特点是:这些数据的特点是:1 1、具有相同的数据类型、具有相同的数据类型2 2、使用过程中需要保留原始数据、使用过程中需要保留原始数据 •如果有如果有10001000名学生名学生,,每个学生有每个学生有一个成绩,需要求这一个成绩,需要求这10001000名学生名学生的平均成绩的平均成绩•用用s s1 1,s,s2 2,s,s3 3,……,s,……,s10001000表示每个学表示每个学生的成绩,能体现生的成绩,能体现内在联系内在联系•C C语言用方括号中的数字表示下语言用方括号中的数字表示下标,如用标,如用s[15]s[15]表示表示数组名数组名 6.1 6.1 怎样定义和引用一维数组怎样定义和引用一维数组6.1.1 6.1.1 怎样定义一维数组怎样定义一维数组6.1.2 6.1.2 怎样引用一维数组元素怎样引用一维数组元素6.1.3 6.1.3 一维数组的初始化一维数组的初始化6.1.4 6.1.4 一维数组程序举例一维数组程序举例 6.1.1 6.1.1 怎样定义一维数组怎样定义一维数组•一维数组是数组中最简单的一维数组是数组中最简单的•它的元素只需要用数组名加一个下它的元素只需要用数组名加一个下标,就能惟一确定标,就能惟一确定•要使用数组,必须在程序中先定义要使用数组,必须在程序中先定义数组数组 •定义一维数组的一般形式为:定义一维数组的一般形式为: 类型符类型符 数组名数组名[ [常量表达式常量表达式];];•数组名的命名规则和变量名相同数组名的命名规则和变量名相同如如 int a[10];int a[10];数组名数组名6.1.1 6.1.1 怎样定义一维数组怎样定义一维数组 •定义一维数组的一般形式为:定义一维数组的一般形式为: 类型符类型符 数组名数组名[ [常量表达式常量表达式];];•数组名的命名规则和变量名相同数组名的命名规则和变量名相同如如 int a[10];int a[10];数组数组长度长度6.1.1 6.1.1 怎样定义一维数组怎样定义一维数组 •定义一维数组的一般形式为:定义一维数组的一般形式为: 类型符类型符 数组名数组名[ [常量表达式常量表达式];];•数组名的命名规则和变量名相同数组名的命名规则和变量名相同如如 int a[10];int a[10];1010个元素个元素::a[0],a[1],a[2],…,a[9]a[0],a[1],a[2],…,a[9]每个元素的数据类型每个元素的数据类型a[0] a[1] a[2] a[3] … a[7] a[8] a[9]6.1.1 6.1.1 怎样定义一维数组怎样定义一维数组 •定义一维数组的一般形式为:定义一维数组的一般形式为: 类型符类型符 数组名数组名[ [常量表达式常量表达式];];int a[4+6]; int a[4+6]; 合法合法int n=10; int n=10; int a[n];int a[n];不合法不合法6.1.1 6.1.1 怎样定义一维数组怎样定义一维数组 说明:说明: (1)(1)数组名定名规则和变量名相同,遵循标识符定名规数组名定名规则和变量名相同,遵循标识符定名规则。

      则2)(2)在定义数组时,需要指定数组中元素的个数,方括在定义数组时,需要指定数组中元素的个数,方括弧中的常量表达式用来表示元素的个数,即数组长弧中的常量表达式用来表示元素的个数,即数组长度3)(3)常量表达式中可以包括常量和符号常量,但不能包常量表达式中可以包括常量和符号常量,但不能包含变量也就是说,含变量也就是说,C C语言不允许对数组的大小作语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中动态定义,即数组的大小不依赖于程序运行过程中变量的值变量的值 例如:例如: int n;int n; scanf( scanf(“%d″%d″,,&n); &n); /*/*在程序中临时输入在程序中临时输入数数 组的大小组的大小 * */ / int a int a[[n n]]; ;数组说明中其他常见的错误:数组说明中其他常见的错误:数组说明中其他常见的错误:数组说明中其他常见的错误:① ① float a[0];float a[0];/* /* 数组大小为数组大小为0 0没有意义没有意义 * */ /② int b(2)(3);② int b(2)(3); /* /* 不能使用圆括号不能使用圆括号 * */ /③ ③ int k, a[k];int k, a[k]; /* /* 不能用变量说明数组大小不能用变量说明数组大小* */ / × 6.1.2 6.1.2 怎样引用一维数组元素怎样引用一维数组元素•在定义数组并对其中各元素赋值后,就可在定义数组并对其中各元素赋值后,就可以引用数组中的元素以引用数组中的元素•注意:只能引用数组元素而不能一次整体注意:只能引用数组元素而不能一次整体调用整个数组全部元素的值调用整个数组全部元素的值•数组元素的引用方式:数组元素的引用方式: 数组名[下标]数组名[下标] 下标可以是整型常量或整型表达式。

      下标可以是整型常量或整型表达式 例如例如: : a a[[0 0]]=a=a[[5 5]]+a+a[[7 7]]-a-a[[2*32*3]] int n=5,a[10];a[n]=20; int n=5,a[10];a[n]=20;合法合法不合法不合法 说明说明: :((((1 1)数组必须先定义再使用且数组的引用只能引用)数组必须先定义再使用且数组的引用只能引用)数组必须先定义再使用且数组的引用只能引用)数组必须先定义再使用且数组的引用只能引用单个元素,不能引用数组整体单个元素,不能引用数组整体单个元素,不能引用数组整体单个元素,不能引用数组整体例例例例 ch[0]=’a’;ch[0]=’a’; ch[1]=ch[0]; ch[1]=ch[0]; a[0]=a[5]+a[7]-a[2*3];a[0]=a[5]+a[7]-a[2*3];((((2 2)一维数组的输入输出通常用一重循环完成)一维数组的输入输出通常用一重循环完成)一维数组的输入输出通常用一重循环完成)一维数组的输入输出通常用一重循环完成 for(i=0; i<10; i++)for(i=0; i<10; i++) scanf(“%d”,&a[i]); scanf(“%d”,&a[i]); main( )main( ){ { int i, a[10]; int i, a[10]; for(i=0; i<10; i++) for(i=0; i<10; i++) a[i] = 2*i+1; a[i] = 2*i+1; for(i=0; i<=9; i++) for(i=0; i<=9; i++) printf("%d",a[i]); printf("%d",a[i]);} }例:数组元素赋值和输出例:数组元素赋值和输出例:数组元素赋值和输出例:数组元素赋值和输出 例例6.16.1 对对1010个数组元素依次赋值为个数组元素依次赋值为0,1,2,3,4,5,6,7,8,90,1,2,3,4,5,6,7,8,9,要求按逆序输,要求按逆序输出。

      出•解题思路:解题思路:Ø定义一个长度为定义一个长度为1010的数组,数组定义为整的数组,数组定义为整型型Ø要赋的值是从要赋的值是从0 0到到9 9,可以用循环来赋值,可以用循环来赋值Ø用循环按下标从大到小输出这用循环按下标从大到小输出这1010个元素个元素6.1.2 6.1.2 怎样引用一维数组元素怎样引用一维数组元素 #include int main() { int i,a[10]; for (i=0; i<=9;i++) a[i]=i; for(i=9;i>=0; i--) printf("%d ",a[i]); printf("\n"); return 0; }使使a[0]~~a[9]的值为的值为0~~90 1 2 3 4 5 6 7 8 9a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9] #include int main() { int i,a[10]; for (i=0; i<=9;i++) a[i]=i; for(i=9;i>=0; i--) printf("%d ",a[i]); printf("\n"); return 0; }0 1 2 3 4 5 6 7 8 9a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]先输出先输出a[9],最,最后输出后输出a[0] 例:输入十个整数,然后反序输出。

      例:输入十个整数,然后反序输出例:输入十个整数,然后反序输出例:输入十个整数,然后反序输出main( )main( ){ { int i, a[10]; int i, a[10]; for(i=0; i<10; i++) for(i=0; i<10; i++) scanf(“%d”,&a[i]);scanf(“%d”,&a[i]); for(i=9; i>=0; i--) for(i=9; i>=0; i--) printf(“%3d”,a[i]);printf(“%3d”,a[i]);} } main( )main( ){ { int i, max, sum=0; int i, max, sum=0; int a[10]; int a[10]; for(i=0; i<10; i++) for(i=0; i<10; i++) scanf(“%d”,&a[i]); scanf(“%d”,&a[i]); max = a[0]; max = a[0]; for(i=0; i<10; i++) for(i=0; i<10; i++) { { if(a[i] > max) if(a[i] > max) max = a[i]; max = a[i]; sum += a[i]; sum += a[i]; } } printf(“max=%d,sum=%d\n”,max,sum); printf(“max=%d,sum=%d\n”,max,sum);} }例:输入例:输入例:输入例:输入1010个整数,求其和及其中最大的数。

      个整数,求其和及其中最大的数个整数,求其和及其中最大的数个整数,求其和及其中最大的数 #define NUM 50;#define NUM 50;main( )main( ){ { int i, score[NUM], highest; int i, score[NUM], highest; float sum, average; float sum, average; for (i=0; i highest) if (score[i] > highest) highest = a[i]; highest = a[i]; printf(“ printf(“最高分是:最高分是:最高分是:最高分是:%d\n”,highest)%d\n”,highest);;;;} } 对数组元素初始化的实现方法:对数组元素初始化的实现方法: 1.1.在定义数组时对数组元素赋以初值。

      在定义数组时对数组元素赋以初值例如例如:int a:int a[[1010]]={0,1,2,3,4,5,6,7,8,9};={0,1,2,3,4,5,6,7,8,9}; 将数组元素的初值依次放在一对花括弧内经过上面的定义将数组元素的初值依次放在一对花括弧内经过上面的定义和初始化之后,和初始化之后,a a[[0 0]]=0=0,,a a[[1 1]]=1=1,,a a[[2 2]]=2=2,,a a[[3 3]]=3=3,,a a[[4 4]]=4=4,,a a[[5 5]]=5=5,,a a[[6 6]]=6=6,,a a[[7 7]]=7=7,,a a[[8 8]]=8=8,,a a[[9 9]]=9=9 在声明数组时初始化,基本格式为:在声明数组时初始化,基本格式为:在声明数组时初始化,基本格式为:在声明数组时初始化,基本格式为: 类型类型类型类型 数组名数组名数组名数组名[ [整形常量表达式整形常量表达式整形常量表达式整形常量表达式] = {] = {初值初值初值初值1 1,初值,初值,初值,初值2 2,,,,…}…}6.1.36.1.36.1.36.1.3一维数组的初始化一维数组的初始化一维数组的初始化一维数组的初始化 3. 3. 如果想使一个数如果想使一个数组组中全部元素中全部元素值为值为0 0,可以写成,可以写成: : int aint a[[1010]]={0,0,0,0,0,0,0,0,0,0};={0,0,0,0,0,0,0,0,0,0}; 或或 int aint a[[1010]]={0};={0}; 2. 2. 可以只给一部分元素赋值。

      可以只给一部分元素赋值例如例如: int a: int a[[1010]]={0={0,,1 1,,2 2,,3 3,,4};4}; 定义定义a a数组有数组有1010个元素,但花括弧内只提供个元素,但花括弧内只提供5 5个初个初值,这表示只给前面值,这表示只给前面5 5个元素赋初值,后个元素赋初值,后5 5个元素值为个元素值为0 0 4. 4. 在在对对全部数全部数组组元素元素赋赋初初值时值时,由于数据的个数已,由于数据的个数已经经确定,因此可以不指定数确定,因此可以不指定数组长组长度 例如例如:int a:int a[[5 5]]={1={1,,2 2,,3 3,,4 4,,5};5}; 也可以写成也可以写成 int aint a[][]={1={1,,2 2,,3 3,,4 4,,5};5}; int aint a[[1010]]={1={1,,2 2,,3 3,,4 4,,5};5}; 只初始化前只初始化前5 5个个元素,后元素,后5 5个元素为个元素为0 0 6.1.46.1.4一维数组程序举例一维数组程序举例例例6.2 6.2 用数组处理求用数组处理求FibonacciFibonacci数列问数列问题题•解题思路:解题思路:Ø例例5.85.8中用简单变量处理的,中用简单变量处理的,缺点缺点不能在不能在内存中保存这些数。

      假如想直接输出数内存中保存这些数假如想直接输出数列中第列中第2525个数,是很困难的个数,是很困难的Ø如果用数组处理,每一个数组元素代表如果用数组处理,每一个数组元素代表数列中的一个数,依次求出各数并存放数列中的一个数,依次求出各数并存放在相应的数组元素中在相应的数组元素中 #include int 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]); } printf("\n"); return 0;} 例例6.36.3 有有1010个地区的面积,要求对它们个地区的面积,要求对它们按由小到大的顺序排列按由小到大的顺序排列•解题思路:解题思路:Ø排序的规律有两种:一种是排序的规律有两种:一种是““升序升序””,,从小到大;另一种是从小到大;另一种是““降序降序””,从,从大到小大到小。

      Ø把题目抽象为:把题目抽象为:““对对n n个数按升序排个数按升序排序序””Ø采用起泡法排序采用起泡法排序 985420895420859420854920854290854209大数沉淀,小数起泡大数沉淀,小数起泡a[0]a[1]a[2]a[3]a[4]a[5]for(i=0;i<5;i++) if (a[i]>a[i+1]) { t=a[i];a[i]=a[i+1];a[i+1]=t; } 854209584209548209542809542089a[0]a[1]a[2]a[3]a[4]a[5]for(i=0;i<4;i++) if (a[i]>a[i+1]) { t=a[i];a[i]=a[i+1];a[i+1]=t; } 542089452089425089420589a[0]a[1]a[2]a[3]a[4]a[5]for(i=0;i<3;i++) if (a[i]>a[i+1]) { t=a[i];a[i]=a[i+1];a[i+1]=t; } 420589240589204589a[0]a[1]a[2]a[3]a[4]a[5]for(i=0;i<2;i++) if (a[i]>a[i+1]) { t=a[i];a[i]=a[i+1];a[i+1]=t; } 204589024589a[0]a[1]a[2]a[3]a[4]a[5]for(i=0;i<1;i++) if (a[i]>a[i+1]) { t=a[i];a[i]=a[i+1];a[i+1]=t; } for(i=0;i<5;i++) if (a[i]>a[i+1]) { ……}for(i=0;i<4;i++) if (a[i]>a[i+1]) { ……}for(i=0;i<1;i++) if (a[i]>a[i+1]) { ……}……for(i=0;i<5-j;i++) if (a[i]>a[i+1]) { ……}for(j=0;j<5;j++) int a[10]; int i,j,t;printf("input 10 numbers :\n");for (i=0;i<10;i++) scanf("%d",&a[i]); printf("\n");for(j=0;j<9;j++)for(i=0;i<9-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=0;i<10;i++) printf("%d ",a[i]);printf("\n"); 例:输入例:输入例:输入例:输入1010个整数,求其中的奇数之和,偶数之和。

      个整数,求其中的奇数之和,偶数之和个整数,求其中的奇数之和,偶数之和个整数,求其中的奇数之和,偶数之和main( )main( ){ { int a[10], i; int a[10], i; int sum1=0, sum2=0; int sum1=0, sum2=0; for(i=0; i<10; i++) for(i=0; i<10; i++) scanf(“%d”,&a[i]); scanf(“%d”,&a[i]); for(i=0; i<10; i++) for(i=0; i<10; i++) if(a[i]%2 != 0) if(a[i]%2 != 0) sum1 += a[i]; sum1 += a[i]; else else sum2 += a[i]; sum2 += a[i]; printf(“sum1=%d,sum2=%d”,sum1,sum2); printf(“sum1=%d,sum2=%d”,sum1,sum2);} } 例:冒泡排序(升序)例:冒泡排序(升序)38 23 17 17 6 1 38 23 17 17 6 1 23 17 23 6 1 23 17 23 6 1 6 6 17 38 6 1 17 38 6 1 1717 1717 78 6 1 78 6 1 2323 2323 23 23 6 1 6 1 3838 3838 3838 3838 1 1 7878 7878 7878 7878 7878 原始数据原始数据原始数据原始数据 第第第第1 1轮轮轮轮 第第第第2 2轮轮轮轮 第第第第3 3轮轮轮轮 第第第第4 4轮轮轮轮 第第第第5 5轮轮轮轮排序方法之一:冒泡法排序排序方法之一:冒泡法排序 冒泡法升序排序的思路是:冒泡法升序排序的思路是: 将相邻两个数将相邻两个数a ai i, a, ai+1i+1((i=0i=0,,1 1,,2 2)进行比较,)进行比较,若若a ai i>a>ai+1i+1,就交换此两数,这样,大数就会逐渐,就交换此两数,这样,大数就会逐渐往下沉,小数往上升。

      往下沉,小数往上升4 4个数,经过第一轮个数,经过第一轮3 3次两次两两比较、交换,最大数就会沉到最后,存放在两比较、交换,最大数就会沉到最后,存放在a[3] a[3] 中第二轮再将前面的中第二轮再将前面的3 3个数经过个数经过2 2次这样的次这样的两两比较、交换后,其中的最大数就会被存放在两两比较、交换后,其中的最大数就会被存放在a[2]a[2]中,第三轮将剩下的中,第三轮将剩下的2 2 个数比较个数比较1 1次,大的数次,大的数被换到被换到a[1], a[1], 小的数存放在小的数存放在a[0]a[0]中这样,经过中这样,经过三轮比较就完成了三轮比较就完成了4 4个数的排序个数的排序 一般地,对一般地,对n n个数进行排序,共需进行个数进行排序,共需进行n-1n-1轮轮比较,在第比较,在第i i轮中要对轮中要对n-i+1n-i+1个数进行个数进行n-in-i次相邻元次相邻元素的两两比较、交换素的两两比较、交换 一般地,设:一般地,设: n n个数为个数为 a[0], a[1], a[2],a[0], a[1], a[2],……, , a[n-2], a[n-1] a[n-2], a[n-1],, 则则 n n 个数的冒泡排序算法可用个数的冒泡排序算法可用forfor循环表示为:循环表示为: for(i=0;i<=n-2;i++) for(i=0;i<=n-2;i++) for(j=0;j<=n-2-i;j++) for(j=0;j<=n-2-i;j++) if(a[j] > a[j+1]) if(a[j] > a[j+1]) 将将a[j]a[j]的值与的值与a[j+1]a[j+1]的值互换;的值互换; 冒泡法排序的程序:冒泡法排序的程序: 用符号常量用符号常量N N表表示元素个数示元素个数 #define N 6#define N 6#define N 6#define N 6main() main() main() main() { { { { int a[N]; int a[N]; int a[N]; int a[N]; int i,j,t; int i,j,t; int i,j,t; int i,j,t; printf("Please input printf("Please input printf("Please input printf("Please input %d numbers:\n",N); %d numbers:\n",N); %d numbers:\n",N); %d numbers:\n",N); for(i=0;ia[j+1]) if(a[j]>a[j+1]) if(a[j]>a[j+1]) if(a[j]>a[j+1]) { { { { t=a[j]; t=a[j]; t=a[j]; t=a[j]; a[j]=a[j+1]; a[j]=a[j+1]; a[j]=a[j+1]; a[j]=a[j+1]; a[j+1]=t; a[j+1]=t; a[j+1]=t; a[j+1]=t; } } } } printf("\n The sorted printf("\n The sorted printf("\n The sorted printf("\n The sorted numbers:\n"); numbers:\n"); numbers:\n"); numbers:\n"); for(i=0;i<=N-1;i++) for(i=0;i<=N-1;i++) for(i=0;i<=N-1;i++) for(i=0;i<=N-1;i++) printf("%d, ",a[i]); printf("%d, ",a[i]); printf("%d, ",a[i]); printf("%d, ",a[i]); printf("\n "); printf("\n "); printf("\n "); printf("\n "); } } } }冒泡法冒泡法排序排序 main()main(){ { int a[11], i, j, t; int a[11], i, j, t; printf(“Input 10 printf(“Input 10 numbers:\n");numbers:\n"); for(i=1; i<=10; i++) for(i=1; i<=10; i++) scanf("%d",&a[i]); scanf("%d",&a[i]); printf("\n"); printf("\n"); for(i=1; i<=9; i++) for(i=1; i<=9; i++) for(j=1; j<=10-i; j++) for(j=1; j<=10-i; j++) if(a[ j ] > a[ j+1 ]) if(a[ j ] > a[ j+1 ]) { { t = a[ j ]; t = a[ j ]; a[ j ] = a[ j+1 ]; a[ j ] = a[ j+1 ]; a[ j+1 ] = t; a[ j+1 ] = t;} } printf("The sorted numbers:\n"); printf("The sorted numbers:\n"); for(i=1; i<=10; i++) for(i=1; i<=10; i++) printf("%d ",a[i]); printf("%d ",a[i]);} } 程序流程图如下:程序流程图如下: 6.2 6.2 怎样定义和引用二维数组怎样定义和引用二维数组2456 1847 1243 1600 2346 27573045 2018 1725 2020 2458 14361427 1175 1046 1976 1477 20181分队分队2分队分队3分队分队队员队员1 队员队员2队员队员3 队员队员4队员队员5队员队员6float pay[3][6]; 6.2.16.2.1怎样定义二维数组怎样定义二维数组6.2.26.2.2怎样引用二维数组的元素怎样引用二维数组的元素6.2.36.2.3二维数组的初始化二维数组的初始化6.2.46.2.4二维数组程序举例二维数组程序举例6.2 6.2 怎样定义和引用二维数组怎样定义和引用二维数组 二维数组定义的一般形式为二维数组定义的一般形式为: :类型说明符类型说明符 数组名[常量表达式][常量表达式];数组名[常量表达式][常量表达式];例如:例如:定义定义a a为为3×4(33×4(3行行4 4列列) )的数组,的数组,b b为为5×10(55×10(5行行1010列列) )的数组。

      如下:的数组如下: float afloat a[[3 3][][4 4],],b b[[5 5][][1010];];不能写成不能写成 float afloat a[[3 3,,4 4],],b b[[5 5,,1010]]; ;6.2.16.2.1怎样定义二维数组怎样定义二维数组 注意:注意:我们可以把二维数组看作是一种特殊的一维我们可以把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组数组:它的元素又是一个一维数组例如:例如:可以把可以把a看作是一个一维数组,它有看作是一个一维数组,它有3个元素:个元素:a[[0]、]、a[[1]、]、a[[2],每个元素又是一个包含],每个元素又是一个包含4个元素的一维数组个元素的一维数组6.2.16.2.1怎样定义二维数组怎样定义二维数组 C C语言中,二维数组中元素排列的顺序是按行存语言中,二维数组中元素排列的顺序是按行存放的,即在内存中先顺序存放第一行的元素,再存放放的,即在内存中先顺序存放第一行的元素,再存放第二行的元素下图表示对第二行的元素下图表示对a a[[3 3][][4 4]数组存放的]数组存放的顺序。

      顺序 a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a236.2.16.2.1怎样定义二维数组怎样定义二维数组a[0][0] a[0][1] a[0][2] a[0][3]a[1][0] a[1][1] a[1][2] a[1][3]a[2][0] a[2][1] a[2][2] a[2][3]内存中的存储顺序内存中的存储顺序 二维数组元素的表示形式为:二维数组元素的表示形式为: 数组名[下标][下标]数组名[下标][下标]例如:例如: a a[[2 2][][3 3]]下标可以是整型表达式,如下标可以是整型表达式,如 a a[[2-12-1][][2*2-12*2-1]]数组元素可以出现在表达式中,也可以被赋值数组元素可以出现在表达式中,也可以被赋值例如:例如:b b[[1 1][][2 2]]=a=a[[2 2][][3 3]]/2/2不要写成不要写成 a a[[2 2,,3 3],],a a[[2-12-1,,2*2-12*2-1]形式]形式6.2.2 6.2.2 怎样引用二维数组的元素怎样引用二维数组的元素怎样引用二维数组的元素怎样引用二维数组的元素for(i=0;i

      定义的数组大小的范围内6.2.2 6.2.2 6.2.2 6.2.2 怎样引用二维数组的元素怎样引用二维数组的元素怎样引用二维数组的元素怎样引用二维数组的元素 可以用下面可以用下面4 4种方法对二维数组初始化:种方法对二维数组初始化:11. .分行给二维数组赋初值分行给二维数组赋初值 例如:例如: int aint a[[3 3][][4 4]]={{1={{1,,2 2,,3 3,,4}4},,{5{5,,6 6,,7 7,,8}8},,{9{9,,1010,,1111,,12}}; 12}}; 22. .可以将所有数据写在一个花括弧内,按数组排列可以将所有数据写在一个花括弧内,按数组排列的顺序对各元素赋初值的顺序对各元素赋初值 例如:例如:int aint a[[3 3][][4 4]]={1={1,,2 2,,3 3,,4 4,,5 5,,6 6,,7 7,,8 8,,9 9,,1010,,1111,,12};12};6.2.3 6.2.3 6.2.3 6.2.3 二维数组的初始化二维数组的初始化二维数组的初始化二维数组的初始化 33. .可以对部分元素赋初值可以对部分元素赋初值 例如:例如: int a[[3][][4]]={{1},,{5},,{9}}; 1 0 0 01 0 0 05 0 0 0 5 0 0 0 9 0 0 0 也可以对各行中的某一元素赋初值,如也可以对各行中的某一元素赋初值,如: : int a int a[[3 3][][4 4]]={{1}={{1},,{0{0,,6}6},,{0{0,,0 0,,11}};11}}; 1 0 0 01 0 0 00 6 0 00 6 0 00 0 0 11 00 11 01 0 0 01 0 0 05 6 0 0 5 6 0 0 0 0 0 0也可以只也可以只对对某几行元素某几行元素赋赋初初值值, ,如如::int a[[3][][4]]={{1},,{5,,6}}; 44. .如果对全部元素都赋初值,则定义数组时对第一维如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省的长度可以不指定,但第二维的长度不能省例如:例如:int aint a[[3 3][][4 4]]={1={1,,2 2,,3 3,,4 4,,5 5,,6 6,,7 7,,8 8,,9 9,,1010,,1111,,12};12};它它等价等价于于:: int aint a[][[][4 4]]={1={1,,2 2,,3 3,,4 4,,5 5,,6 6,,7 7,,8 8,,9 9,,1010,,1111,,12};12}; 在定义时也可以只对部分元素赋初值而省略第一在定义时也可以只对部分元素赋初值而省略第一维的长度,但应分行赋初值。

      维的长度,但应分行赋初值例如例如::int aint a[][[][4 4]]={{0={{0,,0 0,,3}3},,{}{},,{0{0,,10}};10}};0 0 3 00 0 0 00 10 0 0 printf("array a:\n"); for(i=0; i<=1; i++) { for(j=0; j<=2; j++) printf("%5d",a[i][j]); printf("\n"); } }main( ){ int a[2][3]; int i, j; printf(“Input a[2][3]:\n” for(i=0; i<=1; i++) for(j=0; j<=2; j++) scanf("%d”,&a[i][j]);输入方法输出方法例:例:/*注意输入输出二维数组的方法注意输入输出二维数组的方法*/输入时用空格或回车分隔输入时用空格或回车分隔 例例6.46.4 将一个二维数组行和列的元素互换,将一个二维数组行和列的元素互换,存到另一个二维数组中。

      存到另一个二维数组中6.2.4 6.2.4 二维数组程序举例二维数组程序举例 解题思路:解题思路:Ø可以定义两个数组:数组可以定义两个数组:数组a a为为2 2行行3 3列,存列,存放指定的放指定的6 6个数个数Ø数组数组b b为为3 3行行2 2列,开始时未赋值列,开始时未赋值Ø将将a a数组中的元素数组中的元素a[i][ja[i][j] ]存放到存放到b b数组中数组中的的b[j][ib[j][i] ]元素中元素中Ø用嵌套的用嵌套的forfor循环完成循环完成6.2.4 6.2.4 二维数组程序举例二维数组程序举例 #include int 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"); }处理处理a的一行中各元素的一行中各元素处理处理a中某一列元素中某一列元素输出输出a的的各元素各元素a元素值赋给元素值赋给b相应元素相应元素 printf("array b:\n"); for (i=0;i<=2;i++) { for(j=0;j<=1;j++) printf("%5d",b[i][j]); printf("\n"); } return 0;} 输出输出b的的各元素各元素 例例6.56.5 有一个有一个3 3××4 4的矩阵,要求编程序求出其的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行中值最大的那个元素的值,以及其所在的行号和列号。

      号和列号解题思路:解题思路:采用采用““打擂台算法打擂台算法””Ø先找出任一人站在台上,第先找出任一人站在台上,第2 2人上去与之比人上去与之比武,胜者留在台上武,胜者留在台上Ø第第3 3人与台上的人比武,胜者留台上,败者人与台上的人比武,胜者留台上,败者下台下台Ø以后每一个人都是与当时留在台上的人比以后每一个人都是与当时留在台上的人比武武,,直到所有人都上台比为止,最后留在台直到所有人都上台比为止,最后留在台上的是冠军上的是冠军 例例6.56.5 有一个有一个3 3××4 4的矩阵,要求编程序求出其的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行中值最大的那个元素的值,以及其所在的行号和列号号和列号解题思路:解题思路:采用采用““打擂台算法打擂台算法””Ø先先把把a[0][0]a[0][0]的值赋给变量的值赋给变量maxmaxØmaxmax用来存放当前已知的最大值用来存放当前已知的最大值Øa[0][1]a[0][1]与与maxmax比较,如果比较,如果a[0][1]>maxa[0][1]>max,则,则表示表示a[0][1]a[0][1]是已经比过的数据中值最大的,是已经比过的数据中值最大的,把它的值赋给把它的值赋给maxmax,取代了,取代了maxmax的原值的原值。

      Ø以后依此处理,以后依此处理,最后最后maxmax就是最大的值就是最大的值 for i=0 to 2 for j=0 to 3max=a[i][j]row=Icolum=ja[i][j]>max真真 max=a[0][0]输出:输出:max,row,colum假假 记行号记行号…… int i,j,row=0,colum=0,max; int a[3][4]={{1,2,3,4},{9,8,7,6}, {-10,10,-5,2}}; 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\nrow=%d\n colum=%d\n",max,row,colum);……记记最大值最大值记记列列号号记记行行号号 例:例:一个学习小组有一个学习小组有5个人,每个人有三门课的考个人,每个人有三门课的考试成绩。

      求各科的平均成绩和各科总平均成绩求各科的平均成绩和各科总平均成绩分析:分析: 可设一个二维数组可设一个二维数组a[5][3]存放五个人三门存放五个人三门课的成绩再设一个一维数组课的成绩再设一个一维数组v[3]存放所求得各存放所求得各科平均成绩设变量科平均成绩设变量ave为总平均成绩为总平均成绩姓名姓名 数学数学 英语英语 语文语文 张张 80 75 92 王王 61 65 71 李李 59 63 70 赵赵 85 87 90 周周 76 77 85 main(){ int i,j,a[5][3]; float ave,v[3],s=0; printf("input score\n"); for(i=0;i<3;i++) { for(j=0;j<5;j++) { scanf("%d",&a[j][i]); s=s+a[j][i]; } v[i]=s/5; s=0; } ave=(v[0]+v[1]+v[2])/3; printf(“Math:%f\nEng:%f\nLang:%f\n",v[0],v[1],v[2]); printf("total:%f\n",ave);}程序如下:程序如下: 6.3.1 6.3.1 怎样定义字符数组怎样定义字符数组6.3.2 6.3.2 字符数组的初始化字符数组的初始化6.3.3 6.3.3 怎样引用字符数组中的元怎样引用字符数组中的元素素6.3.4 6.3.4 字符串和字符串结束标志字符串和字符串结束标志6.3.5 6.3.5 字符数组的输入输出字符数组的输入输出6.3.6 6.3.6 善于使用善于使用字符串处理函数字符串处理函数6.3.7 6.3.7 字符数组应用举例字符数组应用举例6.3 6.3 字符数组字符数组 Ø用来存放字符数据的数组是字符用来存放字符数据的数组是字符数组数组。

      Ø字符数组中的一个元素存放一个字符数组中的一个元素存放一个字符字符Ø定义字符数组的方法与定义数值定义字符数组的方法与定义数值型数组的方法类似型数组的方法类似6.3.16.3.1怎样定义字符数组怎样定义字符数组 例如:例如: char cchar c[[1010]]; ;c[0]=′I′;cc[0]=′I′;c[[1 1]]=′ ′;c=′ ′;c[[2 2]]=′a′;=′a′;c c[[3 3]]=′m′;c=′m′;c[[4 4]]=′ =′ ′;c[5]=′h′;c[6]=′a′;′;c[5]=′h′;c[6]=′a′;c c[[7 7]]=′p′;c=′p′;c[[8 8]]=′p′;c=′p′;c[[9 9]]=′y′;=′y′;6.3.16.3.1怎样定义字符数组怎样定义字符数组 对字符数组初始化,可逐个字符赋给数组中各元素对字符数组初始化,可逐个字符赋给数组中各元素例如:例如:char c[10]={‘I’,’a’,’m’,’h’,’a’,’p’,’p’,’y’}char c[10]={‘I’,’a’,’m’,’h’,’a’,’p’,’p’,’y’}赋值形式:赋值形式:赋值形式:赋值形式: 数组名数组名数组名数组名[ ]={[ ]={字符串字符串字符串字符串} };;;; 或或或或 数组名数组名数组名数组名[ ]=[ ]=字符串;字符串;字符串;字符串; 如:如:如:如:aa[ ]={”good morning!”}aa[ ]={”good morning!”};;;; 或或或或 aa[ ]=”good morning!”;aa[ ]=”good morning!”;注意:数组注意:数组注意:数组注意:数组aaaa的长度为的长度为的长度为的长度为1414而不是而不是而不是而不是1313。

      6.3.2 6.3.2 6.3.2 6.3.2 字符数组的初始化字符数组的初始化字符数组的初始化字符数组的初始化 如果初值个数小于数组长度,则只将这些字符赋如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符给数组中前面那些元素,其余的元素自动定为空字符char cchar c[[1010]]={′c′={′c′,,′ ′′ ′,,′p′′p′,,′r′′r′,,′o′′o′,,′g′′g′,,′r′′r′,,′a′′a′,,′m′}; ′m′}; 如果提供的初值个数与预定的数组长度相同,在如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数定义时可以省略数组长度,系统会自动根据初值个数确定数组长度确定数组长度char cchar c[][]={′I′,′ ′,′a′,′m′,′ ′,′h′,={′I′,′ ′,′a′,′m′,′ ′,′h′,′a′,′p′,′p′,′y′};′a′,′p′,′p′,′y′};数组数组c c的长度自动定为的长度自动定为1010 char diamondchar diamond[[5 5][][5 5]]={{′ ′={{′ ′,,′ ′′ ′,,* *′}′},,{′ ′{′ ′,,′*′′*′,,′ ′′ ′,,′*′}′*′},,{′*′{′*′,,′ ′′ ′,,′ ′ ′′,,′ ′′ ′,,′*′}′*′},,{′ ′{′ ′,,′*′′*′,,′ ′′ ′,,′*′}′*′},,{′ ′{′ ′,,′ ′′ ′,,′*′}}′*′}}定义和初始化一个二维字符数组定义和初始化一个二维字符数组: : 例例6.66.6 输出一个已知的字符串。

      输出一个已知的字符串解题思路:解题思路:Ø定义一个字符数组,并用定义一个字符数组,并用““初始初始化列表化列表””对其赋以初值对其赋以初值Ø用循环逐个输出此字符数组中的用循环逐个输出此字符数组中的字符字符6.3.3 6.3.3 怎样引用字符数组中的元素怎样引用字符数组中的元素 #include int main() { char c[15]={'I',' ','a','m',' ','a', ' ','s','t','u','d','e','n','t','.'}; int i; for(i=0;i<15;i++) printf("%c",c[i]); printf("\n"); return 0;} 6.3.3 6.3.3 怎样引用字符数组中的元素怎样引用字符数组中的元素 例例6.76.7 输出一个菱形图输出一个菱形图解题思路:解题思路:Ø定义一个字符型的二维数组,用定义一个字符型的二维数组,用““初始化列表初始化列表””进行初始化进行初始化Ø用嵌套的用嵌套的forfor循环输出字符数组中循环输出字符数组中的所有元素。

      的所有元素6.3.3 6.3.3 怎样引用字符数组中的元素怎样引用字符数组中的元素 #include int 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"); } return 0;} Ø在在C C语言中,是将字符串作为语言中,是将字符串作为字符数字符数组组来处理的来处理的Ø关心的是字符串的关心的是字符串的有效长度有效长度而不是而不是字符数组的长度字符数组的长度Ø为了测定字符串的实际长度,为了测定字符串的实际长度,C C语言语言规定了字符串结束标志规定了字符串结束标志’\0’’\0’6.3.4 6.3.4 字符串和字符串结束标志字符串和字符串结束标志 Ø ’\0’ ’\0’代表代表ASCIIASCII码为码为0 0的字符的字符。

      Ø从从ASCIIASCII码表可以查到,码表可以查到,ASCIIASCII码为码为0 0的字符不是一个可以显示的字符,的字符不是一个可以显示的字符,而是一个而是一个““空操作符空操作符””,即它什么,即它什么也不做也不做Ø用它作为字符串结束标志不会产生用它作为字符串结束标志不会产生附加的操作或增加有效字符,只起附加的操作或增加有效字符,只起一个供辨别的标志一个供辨别的标志6.3.4 6.3.4 字符串和字符串结束标志字符串和字符串结束标志 char c[]={”I am happy”};可写成可写成char c[]=”I am happy”;相当于相当于char c[11]={”I am happy”};6.3.4 6.3.4 字符串和字符串结束标志字符串和字符串结束标志 char c[10]={”China”};可写成可写成char c[10]=”China”;从从c[5]开始,元素值均为开始,元素值均为\0只显示只显示printf(”%s”,c);China \0\0\0\0\06.3.4 6.3.4 字符串和字符串结束标志字符串和字符串结束标志 例如:例如:定义了如下的字符数组定义了如下的字符数组∶∶char c[]={“Pascal programPascal program”};现在,想用一个新的字符串代替原有的字符串现在,想用一个新的字符串代替原有的字符串””Pascal program” Pascal program” ,从键盘向字符数组输入,从键盘向字符数组输入∶∶HelloHello如果不加如果不加′′\\0′0′的话,字符数组中的字符如下的话,字符数组中的字符如下∶∶Hellol programHellol program6.3.4 6.3.4 字符串和字符串结束标志字符串和字符串结束标志 •字符数组的输入输出可以有两种方法字符数组的输入输出可以有两种方法::Ø 逐个字符输入输出逐个字符输入输出((%c%c)。

      Ø 整个字符串一次输入输出整个字符串一次输入输出((%s%s)•输出的字符中不包括结束符输出的字符中不包括结束符’\0’’\0’•用用%s%s输出字符串时,输出字符串时,printfprintf函数中的输函数中的输出项是字符数组名,不是数组元素名出项是字符数组名,不是数组元素名6.3.5 6.3.5 字符数组的输入输出字符数组的输入输出 •如果一个字符数组中包含如果一个字符数组中包含多个多个’\0’’\0’,则遇第一个,则遇第一个’\0’’\0’时输出时输出就结束就结束•可以用可以用scanfscanf函数输入一个字符串函数输入一个字符串•scanfscanf函数中的输入项函数中的输入项c c是已定义的是已定义的字符数组名,输入的字符串应短于字符数组名,输入的字符串应短于已定义的字符数组的长度已定义的字符数组的长度6.3.5 6.3.5 字符数组的输入输出字符数组的输入输出 char cchar c[][]={″China″};={″China″};printf(″%s″printf(″%s″,,c);c); 例如例如在内存中数组在内存中数组c c的状态的状态 如果利用一个如果利用一个scanfscanf函数输入多个字符串,则在函数输入多个字符串,则在输入时以输入时以空格空格分隔。

      分隔例如:例如:char strlchar strl[[5 5],],str2str2[[5 5],],str3str3[[5 5]]; ;scanf(″%s %s %s″scanf(″%s %s %s″,,str1str1,,str2str2,,str3);str3);输入数据:输入数据: How are you? How are you? 数组中未被赋值的元素的值自动置数组中未被赋值的元素的值自动置′′\\0′0′ 分析图中所示的字符数组分析图中所示的字符数组用用8 8进制形式输出数组进制形式输出数组c c的起始地址的起始地址 printf(″%o″printf(″%o″,,c);c); printf(″%s″printf(″%s″,,c);c);注意:注意: scanfscanf函数中的输入项如果字符数组名不函数中的输入项如果字符数组名不要再加地址符要再加地址符& &,因为在,因为在C C语言中数组名代表该数组语言中数组名代表该数组的起始地址下面写法不对:的起始地址下面写法不对:scanf(″%s″scanf(″%s″,,&str)&str);; main( ){ char word[3][10]; int i; for (i=0;i<3;i++) scanf("%s",word[i]); printf("%s",word[i-2]);}12345abcdef ABCDEFG分析以下程序的运行结果:分析以下程序的运行结果:运行时输入:运行时输入:12345 \0abcdef\0ABCDEFG \0结果:abcdef 1 1、、putsputs函数函数--------输出字符串的函数输出字符串的函数其一般形式为其一般形式为: : puts (puts (字符数组字符数组) )•其作用是将一个字符串其作用是将一个字符串( (以以′′\\0′0′结束的字符序列结束的字符序列) )输出到终端。

      输出到终端•假如已定义假如已定义strstr是一个字符数组名,且该数组已被是一个字符数组名,且该数组已被初始化为初始化为"China""China"则执行puts(strputs(str););其结果是在终其结果是在终端上输出端上输出ChinaChina6.3.6 6.3.6 6.3.6 6.3.6 善于使用善于使用善于使用善于使用字符串处理函数字符串处理函数字符串处理函数字符串处理函数 在在C C函数库中提供了一些用来专门处函数库中提供了一些用来专门处理字符串的函数,使用方便理字符串的函数,使用方便使用字符串函使用字符串函数时数时, ,在程序开头用在程序开头用#include #include 用用putsputs函数输出的字符串中可以包含转函数输出的字符串中可以包含转义字符例如:例如: char strchar str[][]={″China\nBeijing″};={″China\nBeijing″}; puts(str); puts(str);输出结果:输出结果: ChinaChina Beijing Beijing 在输出时,将字符串在输出时,将字符串结束标志结束标志′′\\0′′转换成转换成′′\\n′′,,即输出完字符串后换行。

      即输出完字符串后换行 2 2、、getsgets函数函数--------输入字符串的函数输入字符串的函数其一般形式为:其一般形式为:gets(gets(字符数组字符数组) ) 其作用是从终端输入一个字符串到字符其作用是从终端输入一个字符串到字符数组,并且得到一个函数值该函数值是字数组,并且得到一个函数值该函数值是字符数组的起始地址如执行下面的函数:符数组的起始地址如执行下面的函数: gets(str)gets(str)从键盘输入:从键盘输入: Computer↙Computer↙ 将输入的字符串将输入的字符串“ComputerComputer”送给字符数送给字符数组组strstr(请注意送给数组的共有(请注意送给数组的共有9 9个字符,而不个字符,而不是是8 8个字符),函数值为字符数组个字符),函数值为字符数组strstr的起始地的起始地址 一般利用一般利用getsgets函数的目的是向字符数组输函数的目的是向字符数组输入一个字符串,而不大关心其函数值入一个字符串,而不大关心其函数值注意:注意:用用putsputs和和getsgets函数只能输入或输出一个函数只能输入或输出一个字符串,不能写成字符串,不能写成 puts(str1puts(str1,,str2)str2) 或或 gets(str1gets(str1,,str2)str2) 3 3、、strcatstrcat函数函数--------字符串连接函数字符串连接函数其一般形式为其一般形式为:strcat(strcat(字符数组字符数组1 1,字符数组,字符数组2)2) strcat strcat的作用是连接两个字符数组中的字符的作用是连接两个字符数组中的字符串,把字符串串,把字符串2 2接到字符串接到字符串1 1的后面,结果放在字的后面,结果放在字符数组符数组1 1中,函数调用后得到一个函数值中,函数调用后得到一个函数值——字符字符数组数组1 1的地址。

      的地址 例如:例如:char str1char str1[[3030]]={={“PeoplePeople’s Republic of s Republic of ”};};char str2char str2[][]={={“ChinaChina”};};print(print(“%s%s”,,strcat(str1strcat(str1,,str2));str2)); 输出: People′s Republic of ChinaPeople′s Republic of China 4 4、、strcpystrcpy函数函数和和strncpystrncpy函数函数- -字符串复制字符串复制strcpystrcpy一般形式为一般形式为: strcpy(strcpy(字符数组字符数组1 1,字符串,字符串2)2) strcpystrcpy是是““字字符符串串复复制制函函数数””作作用用是是将将字符串字符串2 2复制到字符数复制到字符数组组1 1中去例如:中去例如:char str1char str1[[1010],],str2str2[][]={″China″};={″China″};strcpy(str1strcpy(str1,,str2);str2); 关于关于strcpy函数的几点说明函数的几点说明((1 1)字符数组)字符数组1必须定义得足够大,以便容必须定义得足够大,以便容纳被复制的字符串。

      字符数组纳被复制的字符串字符数组1的长度不应的长度不应小于字符串小于字符串2的长度 ((2 2))“字字符符数数组组1 1”必必须须写写成成数数组组名名形形式式( (如如str1)str1),,“字字符符串串2 2”可可以以是是字字符符数数组组名名,,也也可可以以 是是 一一 个个 字字 符符 串串 常常 量量 如如 strcpy(str1,,″″China″″);; ((3 3))复复制制时时连连同同字字符符串串后后面面的的′′\\0′′一一起起复复制制到字符数组到字符数组1中 ((4 4))不不能能用用赋赋值值语语句句将将一一个个字字符符数数组组直直接接给给一一个个字字符符数组如下面是不合法的:数组如下面是不合法的: str1=str2; str1=str2; 而而只只能能用用strcpystrcpy函函数数将将一一个个字字符符串串复复制制到到另另一一个个字字符符数组中去数组中去 用用赋赋值值语语句句只只能能将将一一个个字字符符赋赋给给一一个个字字符符型型变变量量或字符数组元素如下面是合法的:或字符数组元素如下面是合法的: char achar a[[5 5],],c1c1,,c2;c2; c1=′A′; c2=′B′; c1=′A′; c2=′B′; a a[[0 0]]=′C′; a=′C′; a[[1 1]]=′h′; a=′h′; a[[2 2]]=′i′; =′i′; a a[[3 3]]=′n′; a=′n′; a[[4 4]]=′a′;=′a′; ((5 5))可以用可以用strncpystrncpy函数将字符串函数将字符串2 2中前中前面面n n个字符复制到字符数组个字符复制到字符数组1 1中去中去。

      strncpy(str1 strncpy(str1,,str2str2,,n); n); 若若n n为为2 2 作用是将作用是将str2str2中最前面中最前面2 2个字个字符复制到符复制到str1str1中,取代中,取代str1str1中原有的最中原有的最前面前面2 2个字符个字符 复制的字符个数复制的字符个数n n不应多于不应多于str1str1中原有的字符中原有的字符 思考下列语句执行后思考下列语句执行后s2的值:的值: char s1[ ]=“abc\ndef\0gh\t”; char s2[80]; strcpy(s2,s1);S2= “abc\ndef\0”“abc\ndef\0” 5、、strcmp函数函数----字符串比字符串比较函数函数其一般形式为其一般形式为:strcmp(字符串字符串1,字符串,字符串2) strcmp strcmp的作用是比的作用是比较较字符串字符串1 1和字符串和字符串2 2。

      例如:例如:strcmp(str1strcmp(str1,,str2);str2); strcmp(″China″ strcmp(″China″,,″Korea″);″Korea″); strcmp(str1 strcmp(str1,,″Beijing″);″Beijing″); Ø字符串比较的规则是:将两个字符字符串比较的规则是:将两个字符串自左至右逐个字符相比,直到出串自左至右逐个字符相比,直到出现不同的字符或遇到现不同的字符或遇到’\0’’\0’为止为止Ø如全部字符相同,认为两个字符串如全部字符相同,认为两个字符串相等相等Ø若出现不相同的字符,则以第一对若出现不相同的字符,则以第一对不相同的字符的比较结果为准不相同的字符的比较结果为准 例:例: ”A”<”B” ”a”>”A” ”computer”>”compare” ”these”>”that” ”1A”>”$20” ”CHINA”>”CANADA” ”DOG”<”cat” ”Tsinghua”>”TSINGHUA” 比较的结果由函数值带回比较的结果由函数值带回: :(1)(1) 如果字符串如果字符串1=1=字符串字符串2 2,函数值为,函数值为0 0。

      2)(2) 如果字符串如果字符串1>1>字符串字符串2 2,函数值为一正整数函数值为一正整数3)(3) 如果字符串如果字符串1<1<字符串字符串2 2,函数值为一负整数函数值为一负整数注意:注意:对两个字符串比较,不能用以下形式:对两个字符串比较,不能用以下形式: if(str1>str2) printf(″yes″);而只能用而只能用 if(strcmp(str1,,str2)>0) printf(″yes″); 例:下列语句执行后例:下列语句执行后n的值分别为多少?的值分别为多少?1、、n=strcmp(“ABCD12”,”ABCD”);2、、 n=strcmp(“ABcd”,”ABCD”);3、、 n=strcmp(“12ABcd”,”ABCD”); 6、、strlen函数函数--------测字符串长度的函数测字符串长度的函数其一般形式为其一般形式为:strlen (字符数组字符数组) strlenstrlen是是测测试试字字符符串串长长度度的的函函数数函函数数的的值为值为字符串中的字符串中的实际长实际长度度( (不包括不包括′′\\0′0′在内在内) )。

      例如:例如:char strchar str[[1010]]={″China″};={″China″}; printf(″%d″ printf(″%d″,,strlen(str));strlen(str)); 输输出出结结果果不不是是1010,,也也不不是是6 6,,而而是是5 5也也可可以以 直直 接接 测测 试试 字字 符符 串串 常常 量量 的的 长长 度度 ,, 如如strlen(″″China″″);; 7 7、、strlwr函数函数----转换为小写的函数转换为小写的函数其一般形式为其一般形式为:strlwr (strlwr (字符串字符串) ) strlwrstrlwr函函数数的的作作用用是是将将字字符符串串中中大大写写字字母母换换成成小写字母小写字母 8 8、、strupr函数函数----转换为大写的函数大写的函数其一般形式为其一般形式为:strupr (strupr (字符串字符串) ) struprstrupr函函数数的的作作用用是是将将字字符符串串中中小小写写字字母母换换成成大写字母大写字母 例:例:char s[]=“1234\n89\r\b\0abcd” n=strlen(s);则则 n==?9 例例6 .8 6 .8 输入一行字符,统计其中有多少个单词,单输入一行字符,统计其中有多少个单词,单 词之间用空格分隔开。

      词之间用空格分隔开6.3.7 6.3.7 6.3.7 6.3.7 字符数组应用举例字符数组应用举例字符数组应用举例字符数组应用举例解题思路:解题思路:问题的关键是怎样确定问题的关键是怎样确定““出现一个新单词了出现一个新单词了””Ø从第从第1 1个字符开始逐个字符进行检个字符开始逐个字符进行检查,判断此字符是否是新单词的开查,判断此字符是否是新单词的开头,如果是,就使变量头,如果是,就使变量numnum的值加的值加1 1,最后得到的,最后得到的numnum的值就是单词总数的值就是单词总数 Ø判断是否出现新单词,可以由是否有判断是否出现新单词,可以由是否有空格出现来决定空格出现来决定( (连续的若干个空格作连续的若干个空格作为出现一次空格;一行开头的空格不为出现一次空格;一行开头的空格不统计在内统计在内) )Ø如果测出某一个字符为非空格,而它如果测出某一个字符为非空格,而它的前面的字符是空格,则表示的前面的字符是空格,则表示““新的新的单词开始了单词开始了””,此时使,此时使numnum累加累加1 1Ø如果当前字符为非空格而其前面的字如果当前字符为非空格而其前面的字符也是非空格,则符也是非空格,则numnum不应再累加不应再累加1 1。

      6.3.7 6.3.7 字符数组应用举例字符数组应用举例 Ø用变量用变量wordword作为判别当前是否开始了作为判别当前是否开始了一个新单词的标志,若一个新单词的标志,若word=0word=0表示未表示未出现新单词,如出现了新单词,就把出现新单词,如出现了新单词,就把wordword置成置成1 1Ø前面一个字符是否空格可以从前面一个字符是否空格可以从wordword的的值看出来,若值看出来,若wordword等于等于0 0,则表示前一,则表示前一个字符是空格;如果个字符是空格;如果wordword等于等于1 1,意味,意味着前一个字符为非空格着前一个字符为非空格6.3.7 6.3.7 字符数组应用举例字符数组应用举例 Yc=空格空格word=0Nword=0Yword=1num++Nif(c==' ') word=0; else if(word==0){ word=1; num++; } 当前字符当前字符I Ia a m ma ab bo o y y . .是否空格是否空格 否否 是是否否否否 是是 否否 是是 否否 否否 否否否否wordword原值原值0 0 1 1 0 0 1 1 1 1 0 0 1 10 01 1 1 1 1 1新单词开新单词开始否始否是是 否否是是否否 否否 是是 否否 是是 否否 否否否否wordword新值新值1 1 0 0 1 1 1 1 0 0 1 1 0 01 11 1 1 1 1 1numnum值值1 1 1 1 2 2 2 2 2 2 3 3 3 34 44 4 4 4 4 4 …… char string[81],c; int i,num=0,word=0; gets(string); for (i=0;(c=string[i])!=‘\0’;i++) if(c==‘ ’) word=0; else if(word==0) { word=1; num++; } printf(“%d words\n”,num); ……一定要设初始值一定要设初始值 …… char string[81],c; int i,num=0,word=0; gets(string); for (i=0;(c=string[i])!=‘\0’;i++) if(c==‘ ’) word=0; else if(word==0) { word=1; num++; } printf(“%d words\n”,num); ……相当于相当于c=string[i];c!=‘\0’ 分析:分析:分析:分析: 3 3个字符串可以放在一个二维字符数组,个字符串可以放在一个二维字符数组,个字符串可以放在一个二维字符数组,个字符串可以放在一个二维字符数组,如如如如str[3][10]str[3][10]。

      C语言把二维数组当成多个一维数C语言把二维数组当成多个一维数C语言把二维数组当成多个一维数C语言把二维数组当成多个一维数组处理,因此组处理,因此组处理,因此组处理,因此str[3][10]str[3][10]相当于相当于相当于相当于3 3个一维数组(或个一维数组(或个一维数组(或个一维数组(或3 3个字符串)个字符串)个字符串)个字符串) for (i=0;i<3;i++) gets (str[i]);例例6.9 6.9 有有3 3个字符串个字符串, ,要求找出其中最大者要求找出其中最大者 China \0\0\0\0\0str[0]Japan \0\0\0\0\0str[1]India \0\0\0\0\0str[2] Ø经过三次两两比较经过三次两两比较, ,就可得到值最大者就可得到值最大者, ,把它放在一维字符数组把它放在一维字符数组stringstring中中 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]); 正确解法#include#includeint main ( ){char str[3][10]; char string[10]; 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:\n%s\n",string); return 0;}考虑如果是求考虑如果是求考虑如果是求考虑如果是求10101010个字符串中的最大值应该如何处理?个字符串中的最大值应该如何处理?个字符串中的最大值应该如何处理?个字符串中的最大值应该如何处理? √例例10:选择法排序:选择法排序 分析:选择法在两两比较后并不马上交换,而是找到最分析:选择法在两两比较后并不马上交换,而是找到最小数后记下其下标。

      在一轮比较完毕后,再将最小的数一次小数后记下其下标在一轮比较完毕后,再将最小的数一次交换到位比较次数不变,交换次数减少交换到位比较次数不变,交换次数减少 假设有假设有n个数的序列个数的序列,要求按递增的次序排序要求按递增的次序排序算法如下:算法如下:①①从从n个数中挑选出最小数,并与第个数中挑选出最小数,并与第1个数交换位置;个数交换位置;②②除除第第1数数外外,,在在其其余余n-1个个数数中中挑挑选选出出最最小小数数,,并并与与第第2个个数数交换位置;交换位置; ③③除除第第1、、2数数外外,,在在其其余余n-2个个数数中中挑挑选选出出最最小小数数,,并并与与第第3个数交换位置;个数交换位置;④④重复步骤重复步骤③③n-1次,这次,这n个数构成递增序列个数构成递增序列 根据以上的步骤,数组的排序需要两重循环,内循环表示根据以上的步骤,数组的排序需要两重循环,内循环表示在一组数中选择最小数后交换位置,外循环变量表示存放最在一组数中选择最小数后交换位置,外循环变量表示存放最小数的位置小数的位置将将23,,45,,11,,90,,49五个数按递增次序排序,五个数按递增次序排序,原始数据:原始数据:90 49 23 45 11 第第1轮交换后:轮交换后:11 49 23 45 90a(1)位置为最小数位置为最小数第第2轮交换后:轮交换后:11 23 49 45 90a(2)位置为最小数位置为最小数第第3轮交换后:轮交换后:11 23 45 49 90a(3)位置为最小数位置为最小数第第4轮交换后:轮交换后:11 23 45 49 90a(4)位置为最小数位置为最小数 #define N 10 for(i=0; i<=N-1; i++) scanf("%d",&a[i]); for(i=0; i

      数组中元素的插入和删除操作数组中元素的插入和删除操作: : 数组中元素的插入与删除一般是在已排好序的数组数组中元素的插入与删除一般是在已排好序的数组中插入或删除一个元素,使得插入或删除后数组还是有序的中插入或删除一个元素,使得插入或删除后数组还是有序的这先要涉及到查找问题,在数组中首先找到插入的位置或要这先要涉及到查找问题,在数组中首先找到插入的位置或要删除的元素,然后进行插入或删除操作删除的元素,然后进行插入或删除操作 二分法查找二分法查找只适合于在已排好序的数组中进行只适合于在已排好序的数组中进行 设设a[low]a[low]和和a[high]a[high]是有序数组中最小和最大元素,待查是有序数组中最小和最大元素,待查找的数为找的数为x x算法描述如下:算法描述如下: ① ① 开始假设待查区间的下界开始假设待查区间的下界lowlow为为0 0,上界,上界highhigh为为N-1N-1 ② ② 求待查区间中间元素的下标求待查区间中间元素的下标mid = (low+high)/2mid = (low+high)/2,,x x和和a[mid]a[mid]比较。

      比较 ③ ③ 若若x==a[mid]x==a[mid],则查找完毕,结束程序;若,则查找完毕,结束程序;若x>a[mid]x>a[mid],则继续查找的范围应为,则继续查找的范围应为a[mid]a[mid]后面的元素,修改查找区间后面的元素,修改查找区间的下界的下界low = mid+1low = mid+1;若;若xhighlow>high无查找区域,找不到无查找区域,找不到 √例例12:把输入的字符串逆序排列如输入:把输入的字符串逆序排列如输入ABCDE,输出为,输出为EDCBAmain(){ char str[80]; int c,i,j; printf("Enter a string:\n"); scanf("%s",str); for(i=0,j=strlen(str)-1;i

      行)ex6_9.c)) 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1分析:分析:1、使第一列和对角线元素为、使第一列和对角线元素为1;; 2、其它各元素为、其它各元素为a[i-1][j-1]+a[i-1][j](用双重用双重for循环循环) 3、输出二维数组的对角线以下的内容、输出二维数组的对角线以下的内容 #define N 11main(){int i,j,a[N][N]; for(i=1;i

      放在另一个数组中一并输出3、设有一个、设有一个4行行3列的整型矩阵,从键盘上输入矩阵元素的列的整型矩阵,从键盘上输入矩阵元素的值,计算并输出每行元素的平均值值,计算并输出每行元素的平均值。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.