C语言课件第5章数组.ppt_第1页
C语言课件第5章数组.ppt_第2页
C语言课件第5章数组.ppt_第3页
C语言课件第5章数组.ppt_第4页
C语言课件第5章数组.ppt_第5页
已阅读5页,还剩90页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章 数组,5.1 一维数组 5.2 二维数组 5.3 字符数组 5.4 多维数组 5.5 变长数组 5.6 数组应用举例,C语言程序设计,第2页,本章学习目标,理解数组的概念 掌握数组的定义、初始化和引用 掌握数组的应用 数组作为函数参数 掌握字符串的定义、初始化和引用 掌握常用的字符处理函数 能够编写较复杂的程序,C语言程序设计,第3页,1. 什么是数组,next part, 属于构造类型 是有序的数据集合,用数组名标识。 数组中的元素属于同一数据类型,用数组名和下标标识。,C语言程序设计,第4页,2. 一维数组,next part,一维数组的定义 一维数组元素的引用 一维数组的初始化 一维数组程序举例 一维数组编程练习 一维数组作为函数参数,go,go,go,go,go,go,C语言程序设计,第5页,一维数组的定义,类型说明符 数组名常量表达式,(1) 语法形式:,(2) 说明:, 数组名: 遵循标识符命名规则 常量表达式: 包括直接常量和符号常量,用于表示数组元素的个数 : 下标运算符,example,C语言程序设计,第6页,int a6;,编译时分配连续内存 内存字节数=数组元素个数* sizeof(元素数据类型),数组名表示内存首地址, 是地址常量,一维数组定义实例:,例1:,注意:当定义一个长度为n的数组时,数组下标范围为0n-1!,C语言程序设计,第7页,#define N 6 int aN; int bN*N; int cN*3+2; int cN+c;,例2:,int n=10; int an;,例3:,int n; scanf(“%d”,例4:,return,C语言程序设计,第8页, 一维数组元素的引用,(1) 语法形式:,数组名下标,(2) 注意事项:, 下标必须是整型常量或整型表达式 下标值范围: 0(数组元素个数-1) 数组必须先定义,后使用。 对于数值型数组,一次只能引用一个数组元素,example,C语言程序设计,第9页,一维数组元素引用实例:,float score50; score3=90; for(i=0;i50;i+) printf(“%f”,scorei);,float score50; score50=90; for(i=0;i=50;i+) printf(“%f”,scorei);,float score50; score3=90; printf(“%f”,score);,return,C语言程序设计,第10页, 一维数组的初始化,在定义数组的同时,对其进行赋初值。,对一维数组进行初始化的若干情形:,(1) 在定义数组时对所有数组元素赋初值,int a5=1,2,3,4,5;,int a5; a0=1; a1=2; a2=3; a3=4; a4=5;,也可以写成:,int a =1,2,3,4,5;,注: 当给所有数组元素赋初值时,定义数组时可省略个数!,数组不初始化,其元素值为随机数对static数组元素不赋初值,系统会自动赋以0值,C语言程序设计,第11页,(2) 在定义数组时对部分数组元素赋初值,int a5=1,2,3;,int a5; a0=1; a1=2; a2=3; a3=0; a4=0;,当希望给数组所有元素都赋值为0时 可以这样写:,int a5=0;,错误的初始化:,int a3=1,2,3,4,5;,return,C语言程序设计,第12页, 一维数组程序举例,例1: 从键盘输入10个整数存入数组,找出其中最大值和最小值,例2: 用数组求Fibonacci数列前20个数,例3: 用起泡法对10个数排序(由小到大),例4: 用选择法对10个数排序(由小到大),return,例1: 从键盘输入10个整数存入数组,找出其中最大值和最小值,算法:,算法的c程序实现:,用自然语言描述: 1. 输入:for循环输入10个整数 2. 处理: (a) 先令max=min=a0 (b) 依次用ai和max,min比较(循环) 若maxai,令min=ai 3. 输出:max和min,#include int main() int a10,i,max,min; for(i=0;imax) max=ai; if(aimin) min=ai; printf(“max=%dn“,max); printf (“min=%dn“,min); return 0; ,return,例2: 用数组求Fibonacci数列前20个数,(教材P133例7.2),#include int main() int i; int f20=1,1; for(i=2;i20;i+) fi=fi-2+fi-1; for(i=0;i20;i+) if(i%5=0) printf(“n“); printf(“%12d“,fi); printf(“n“); return 0; ,f0,f1,f2,f3,f4,f5,f19,.,1,1,f19,0,1,4,5,2,3,19,return,例3: 用起泡法对10个数排序(由小到大),(教材P134例7.3), 预备知识起泡法基本思想:, 用起泡法对n个数排序的过程:,第1趟: 对n个数进行第1趟起泡排序: 比较第1个数与第2个数,若a0a1,则交换; 比较第2个数与第3个数,若a1a2,则交换; 依次类推 比较第n-1个数和第n个数,若an-2an-1 ,则交换; 经过(n-1)次比较后,最大的数被放在第n个元素位置上,即an-1 第2趟: 对前n-1个数进行第2趟起泡排序: 经过(n-2)次比较后,次大的数被放在第n-1个元素位置,即an-2 第n-1趟: 对前2个数进行第n-1趟起泡排序: 经过1次比较后,次小的数被放在第2个元素为之,即a1 至此,排序过程结束。 总结: 用起泡法对n个数排序,共需要进行(n-1)趟,第j趟需要比较(n-j)次,将相邻两个数比较,较小的调到前头。,next,C语言程序设计,第16页,初始序列:,4 3 1 2,(n=4),第1趟:,第2趟:,第3趟:,比较1:,3 4 1 2,比较2:,3 1 4 2,比较3:,3 1 2 4,1 3 2,比较1:,比较2:,1 2 3,比较1:,1 2,next,输入n 个数给a0 到 an-1,for j=0 to n-2,for i=0 to n-1-j,aiai+1,真,假,aiai+1,输出a0 到 an-1,#include int main() int a10; int i,j,t; for (i=0;iai+1) t=ai; ai=ai+1; ai+1=t; for(i=0;i10;i+) printf(“%d “,ai); return 0; ,return,zoom in,例4: 用选择法对10个数排序(由小到大),(参考教材P181例8.13), 预备知识选择法基本思想:, 用选择法对n个数排序的过程:,选出n个数中最小的数与第1个数对换;选出次小的数与第2个对换;依此类推,;选出次大的与第(n-1)个对换。,第1趟: 对n个数进行第1趟选择排序: 经过(n-1)次比较后,找出最小的数放在第1个元素位置上,即a0 第2趟: 对后n-1个数进行第2趟选择排序: 经过(n-2)次比较后,找出次小的数放在第2个元素位置上,即a1 第n-1趟: 对后2个数进行第n-1趟选择排序: 经过1次比较后,找出次大的数放在第(n-1)个元素位置上,即an-2 至此,排序过程结束。 总结: 用选择法对n个数排序,共需要进行(n-1)趟,第i趟需要比较(n-i)次,return,next,初始序列: (n=4),4 3 1 2,第1趟: (i=1),第2趟: (i=2),第3趟: (i=3),4 3 1 2,1 3 4 2,3 4 2,2 4 3,4 3,3 4,next,#include int main() int a10; int i,j,k,t; for (i=0;i10;i+) scanf(“%d“, ,return,zoom in,C语言程序设计,第21页, 一维数组编程练习,return,1. 将数组元素左移1个位置,2. 将数组元素倒序存放,3. 插入法排序,C语言程序设计,第22页,附: 插入法排序的算法思想及代码实现,第i个元素插入到前面i-1个已排好序的元素中,具体过程为: 将第i个元素Ki顺次与其前面元素Ki-1,Ki-2,K1进行比较 将所有大于(或小于)Ki的记录依次向后移动一个位置 遇见一个小于(或大于)等于Ki的记录Kj,此时Kj后面必为空位置,将第i个元素插入空位置即可 完整的插入排序是从i=2开始,也就是说,将第1个元素视为已排好序,然后将第2个元素插入到单元素中。i从2循环到n,即可实现完整的插入排序,C语言程序设计,第23页,1) 48 62 35 77 55 14 35 98 2) 48 62 35 77 55 14 35 98 3) 35 48 62 77 55 14 35 98 4) 35 48 62 77 55 14 35 98 5) 35 48 55 62 77 14 35 98 6) 14 35 48 55 62 77 35 98 7) 14 35 35 48 55 62 77 98 8) 14 35 35 48 55 62 77 98 ,插入排序实例分析,例: 输入10个整数,用插入排序按从小到大排序,#include int main() int a10; int i,j,t; for(i=0;i=0;j-) if( taj ) break; else aj+1=aj; aj+1 = t; for(i=0;i10;i+) printf(“%5d“,ai); printf(“n“); return 0; ,return,C语言程序设计,第25页,数组元素作为函数实参 数组名作为函数实参 要求: 在主调函数与被调函数中分别定义数组,且类型一致 形参数组大小可以不指定,example,example,next part, 一维数组作为函数参数,C语言程序设计,第26页,例8.10: a和b为有10个元素的整型数组,比较两数组对应元素,要求: 分别用变量l,e,s记录aibi,ai=bi,ais,认为数组ab 若ls,认为数组ab 若l=s,认为数组a=b,C语言程序设计,第27页,int large(int x,int y) int flag; if(xy) flag=1; else if(xy) flag=-1; else flag=0; return(flag); ,/* 函数定义 */,#include int main() int large(int x,int y); int a10,b10,i,l=0,e=0,s=0; for(i=0;is) printf(“abn“); else if(ls) printf(“abn“); else printf(“a=bn“); return 0; ,return,C语言程序设计,第29页,例8.11: 有1个一维数组score,内放10个学生成绩,求平均成绩,要求: 在主函数中输入10个成绩,并输出平均成绩 编写函数对数组求平均值,C语言程序设计,第30页,float average(float array10) int i; float aver,sum=0; for(i=0;i10;i+) sum=sum+arrayi; aver=sum/10; return(aver); ,/* 函数定义 */,C语言程序设计,第31页,#include int main() float average(float array10); float score10,aver; int i; for(i=0;i10;i+) scanf(“%f“, ,C语言程序设计,第32页,float average(float array,int n) int i; float aver,sum=0; for(i=0;in;i+) sum=sum+arrayi; aver=sum/n; return(aver); ,改进:,C语言程序设计,第33页,#include int main() float average(float array,int n); float score10,aver; int i; for(i=0;i10;i+) scanf(“%f“, ,/* 函数调用*/,/* 函数声明 */,C语言程序设计,第34页,例8.13: 用选择法对数组中10个整数按由小到大排序,要求: 在主函数中输入待排序的数组元素并输出排序后的数组元素 编写函数对包含n个整数的数组进行排序,初始序列: (n=4),4 3 1 2,第1趟: (i=1),第2趟: (i=2),第3趟: (i=3),4 3 1 2,1 3 4 2,3 4 2,2 4 3,4 3,3 4,C语言程序设计,第36页,void sort(int array,int n) int i,j,k,t; for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+) if(arrayjarrayk) k=j; t=arrayk; arrayk=arrayi; arrayi=t; ,/* 函数定义 */,C语言程序设计,第37页,#include int main() void sort(int array,int n); int a10,i; for(i=0;i10;i+) scanf(“%d“, ,return,C语言程序设计,第38页,3. 二维数组,next part,二维数组的定义 二维数组元素的引用 关于二维数组元素的相关说明 二维数组的初始化 二维数组程序举例 二维数组编程练习,go,go,go,go,go,go,C语言程序设计,第39页, 二维数组的定义,类型说明符 数组名常量表达式1常量表达式2,(1) 语法形式:,行数,列数,元素个数=行数*列数, 二维数组元素的引用,(1) 语法形式:,数组名下标1下标2,例: 定义: char a34; 引用: a00, a12,注意: 左例中,引用元素下标的范围为a00a23,return,C语言程序设计,第40页, 关于二维数组元素的相关说明,(1) 二维数组在机内的存贮方式:,按行存放,例: int a23;,a00,a01,a02,a10,a11,a12,C语言程序设计,第41页,(2) 对二维数组的理解:,每个元素ai由包含4个元素 的一维数组组成,二维数组a是由3个元素组成,return,C语言程序设计,第42页, 初始化,对二维数组进行初始化的若干情形:,(1) 分行初始化,(2) 按数组元素排列顺序初始化, 对所有元素, 对部分元素, 对所有元素, 对部分元素,实例1-1,实例1-2,实例2-1,实例2-2,实例1-3,实例2-3,return,C语言程序设计,第43页,例1-1: 分行初始化(对所有元素),return,C语言程序设计,第44页,例1-2: 分行初始化(对部分元素),注: 未赋值的数值型数组元素自动为0,return,C语言程序设计,第45页,例1-3: 分行初始化(省略第一维),return,C语言程序设计,第46页,例2-1: 按数组元素排列顺序初始化(对所有元素),return,C语言程序设计,第47页,return,例2-2: 按数组元素排列顺序初始化(对部分元素),C语言程序设计,第48页,return,例2-3: 按数组元素排列顺序初始化(省略第一维长度),C语言程序设计,第49页, 二维数组程序举例,例1: 将二维数组行列元素互换,存到另一个数组中,例2: 求二维数组中最大元素值及其行列号,return,(教材P138例7.4),(1) 问题分析:,数组a与数组b的元素满足关系:,bji =aij,例1: 将二维数组行列元素互换,存到另一个数组中,(2) c代码实现:,#include int main() int a23=1,2,3,4,5,6; int b32; int i,j; for(i=0;i2;i+) for(j=0;j3;j+) bji=aij; printf(“array a is :n“); for(i=0;i2;i+) for(j=0;j3;j+) printf(“%5d “, aij); printf(“n“); printf(“array b is :n“); for(i=0;i3;i+) for(j=0;j2;j+) printf(“%5d “,bij); printf(“n“); return 0; ,return,(教材P138例7.5),(1) 算法:,例2:求二维数组中最大元素值及其行列号,(2) c代码实现:,C语言程序设计,第53页,#include int main() int a34=1,2,3,4,9,8,7,6,-10,10,5,2; int i,j,row,column,max; max=a00; row=0; column=0; for(i=0;i3;i+) for(j=0;j4;j+) if(maxaij) max=aij; row=i; column=j; printf(“max=%d,row=%d,column=%dn“,max,row,column); return 0; ,return,C语言程序设计,第54页, 二维数组编程练习,return,求两个矩阵的加、乘积 计算一个矩阵各行、各列和所有元素之和 将数组元素转置 将数组按顺时针旋转90度,C语言程序设计,第55页,例 读入下表中值到数组,分别求各行、各列及表中所有数之和,#include int main() int x54,i,j; for(i=0;i4;i+) for(j=0;j3;j+) scanf(“%d“, ,for(i=0;i5;i+) for(j=0;j4;j+) printf(“%5dt“,xij); printf(“n“); return 0; ,C语言程序设计,第56页,4. 字符数组,next part,字符数组的定义 字符数组元素的引用 字符数组的初始化 字符串和字符串结束标志 字符数组的输入输出 字符串处理函数 字符数组程序举例,go,go,go,go,go,go,go,C语言程序设计,第57页, 字符数组的定义, 字符数组元素的引用, 字符数组的初始化,(1) 逐个字符初始化,(2) 用字符串常量初始化,定义方法同一般数组,如: char a10; char b310;,引用字符数组元素方法同一般数组,如: a2=*; b21=k;,example,应用实例分析,example,return,字符数组初始化实例: 逐个字符初始化, 对所有元素, 对部分元素,注: 未赋值的字符数组元素自动定为空字符0!,return,字符数组初始化实例: 用字符串常量初始化, 对所有元素, 对部分元素,对于字符串常量,系统会在末尾自动加一个0作为结束符!,return,字符数组定义、初始化、引用实例分析,(1) 一维字符数组举例: 输出一个字符串,(教材P141例7.6),#include int main() char c10=I, ,a,m, ,a, ,b,o,y; int i; for(i=0;i10;i+) printf(“%c“,ci); printf(“n“); return 0; ,字符数组定义、初始化、引用实例分析,(2) 二维字符数组举例: 输出一个菱形图,(教材P142例7.7),#include int main() char diamond5= , ,*, ,*, ,*, *, , , ,*, ,*, ,*, , ,*; int i,j; for(i=0;i5;i+) for(j=0;j5;j+) printf(“%c“,diamondij); printf(“n“); return 0; ,return,C语言程序设计,第62页, 字符串和字符串结束标志,(1) 在c语言中,无字符串变量,用字符数组处理字符串,(2) 字符串结束标志: 0, 在程序中,当检测到0时,则认为字符串结束。, 对于字符串常量,系统会自动地在末尾加一个0作为结束符。,C语言程序设计,第63页,(3) 关于字符串结束标志0的注意事项:, char ch=H,e,l,l,o,0;, char ch=H,e,l,l,o;,问题: 以下5种初始化是否等价?, char ch=“Hello“;, char ch6= “Hello“;, char ch= “Hello“;,等价,(详见教材142-143),return,C语言程序设计,第64页, 字符数组的输入输出,(1) 两种方法:, 逐个字符I/O: 用格式符%c, 整个字符串I/O: 用格式符%s,(2) 相关说明:,实例分析,example,return,注: 用%s输入字符串时: 要求输入项是已定义的字符数组名 输入多个字符串时以空格或回车分隔 字符串中不能包含空格; 用%s输出字符串时: 遇0则输出结束,return,有关字符数组I/O注意事项的实例分析:,#include int main( ) char a5=H,e,l,l,o; printf(“%sn“,a); return 0; ,#include int main() char a=“hello“; printf (“%sn“, a); return 0; ,注意点1: 用%s输出时,遇0结束!,实例1:,有关字符数组I/O注意事项的实例分析:,实例2:,#include int main( ) char a=H,e,l,0,l,o,0; printf(“%sn“,a); return 0; ,注意点2: 用%s输出时,若数组中有多个0,遇第1个即结束输出!,有关字符数组I/O注意事项的实例分析:,实例3: 设输入: how are you ,分析程序输出结果,#include int main( ) char str15,str25,str35; scanf(“%s%s%s“,str1,str2,str3); printf(“str1=%s,str2=%s,str3=%sn“,str1,str2,str3); return 0; ,#include int main( ) char str115; scanf(“%s“,str1); printf(“str1=%sn“,str1); return 0; ,注意点3: scanf中%s输入时,遇空格或回车结束!,return,C语言程序设计,第69页, 常用的字符串处理函数,(1) puts函数,(2) gets函数,(3) strcat函数,(4) strcpy函数,(5) strcmp函数,(6) strlen函数,(7) strlwr函数,(8) strupr函数,被包含在头文件stdio.h中,被包含在头文件string.h中,return,C语言程序设计,第70页,puts函数 格式: puts(字符数组名) 或 puts(字符串常量) 功能: 将一个字符串输出到显示器,输出后自动换行 说明: 字符数组必须以0结束,(2) gets函数 格式: gets(字符数组名) 功能: 从键盘输入一个字符串到字符数组 说明: 输入的字符串以回车结束,系统会自动在字符串末尾加0 输入的字符串的长度要小于字符数组的长度,example,return,#include int main() char str1=“oh,my god!“; char str220; puts(str1); gets(str2); puts(str2); return 0; ,运行结果:,return,C语言程序设计,第72页,(3) strcat函数 格式: strcat(字符数组名1,字符数组名2) 功能: 把字符串2连接到字符串1的后面,结果放在字符数组1中 返回值: 字符数组1的首地址 说明: 字符数组1必须足够大 连接前,两个字符串的末尾都有0, 连接后,字符串1末尾的0被取消,只在新串最后保留0,example,return,运行结果:,#include #include int main() char str150=“oh,my god!“; char str2=“ whats matter?“; puts(str1); puts(str2); strcat(str1,str2); puts(str1); return 0; ,return,C语言程序设计,第74页,(4) strcpy函数 格式: strcpy(字符数组名1,字符串2) 功能: 把字符串2复制到字符数组1中 返回值: 字符数组1的首地址 说明: 字符数组1必须足够大 字符串2可以是一个字符串常量,也可以是一个字符数组名 复制字符串2时连同0一起复制 不能用赋值语句将一个字符串常量或字符数组直接赋给另 一个字符数组,example,return,#include #include int main() char str150=“oh,my god!“; char str2=“ whats matter?“; puts(str1); puts(str2); strcpy(str1,str2); puts(str1); return 0; ,运行结果:,思考:这样赋值 str1=“oh,my god!“ ; 或 str1=str2; 可以吗?为什么?,return,C语言程序设计,第76页,(5) strcmp函数 格式: strcmp(字符串1,字符串2) 功能: 比较字符串1和字符串2 比较规则: 对两个字符串自左至右逐个字符相比(ASC码) 直到遇到不同字符或0时为止 返回值: 如果字符串1=字符串2,返回0 如果字符串1字符串2,返回一个正整数 如果字符串1等关系运算符,example,return,C语言程序设计,第77页,str1,str2,str1,str2,str1,str2,strcmp(str1,str2)=0,strcmp(str1,str2)0,strcmp(str1,str2)0,return,#include #include int main() char str1=“student“; char str2=“Student“; char str3=“student name“; puts(str1); puts(str2); puts(str3); printf(“%dn“,strcmp(str1,str2); printf(“%dn“,strcmp(str1,str3); return 0; ,运行结果:,C语言程序设计,第79页,(6) strlen函数 格式: strlen(字符数组) 功能: 测试字符串的实际长度(不包括0) 返回值: 字符串的实际长度值,#include #include int main() char str120=“student“; puts(str1); printf(“%dn“,strlen(str1); return 0; ,运行结果:,return,C语言程序设计,第80页,(7) strlwr函数 格式: strlwr(字符串) 功能: 将字符串中大写字母转换成小写字母,(8) strupr函数 格式: strupr(字符串) 功能: 将字符串中小写字母转换成大写字母,#include #include int main() char str1=“I come from CHINA“; puts(str1); puts(strlwr(str1); puts(strupr(str1); return 0; ,运行结果:,return,C语言程序设计,第81页, 字符数组程序举例,例1: 输入一行字符,统计其中有多少个单词,单词之间用空格分隔,例2: 有三个字符串,要求找出其中最大者,例3: 将两个字符串连接起来,不要用strcat函数,return,例1: 输入一行字符,统计其中有多少个单词,实例分析:,Iamaboy.,求解思路:,设: num用来统计单词的个数 word用来判别是否出现单词, 若word=0,表示未出现新单词;若word=1表示出现新单词,#include int main() char string81; int i,num=0,word=0; char c; gets(string); for(i=0;(c=stringi)!=0;i+) if(c= ) word=0; else if(word=0) word=1; num+; printf(“%dn“,num); return 0; ,C语言程序设计,第84页,for(i=0;(c=stringi)!=0;i+) if(c= ) word=0; else if(word=0) word=1; num+; ,否,0,是,1,1,是,1,未,0,1,否,0,是,1,2,否,1,未,1,2,是,1,未,0,2,否,0,是,1,3,是,1,未,0,3,否,0,是,1,4,否,1,未,1,4,否,1,未,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论