资源预览内容
第1页 / 共80页
第2页 / 共80页
第3页 / 共80页
第4页 / 共80页
第5页 / 共80页
第6页 / 共80页
第7页 / 共80页
第8页 / 共80页
第9页 / 共80页
第10页 / 共80页
亲,该文档总共80页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第5章 数组、字符串、指针本章要求:1、掌握C语言数组在内存中的存储形式 2、掌握一维数组和二维数组的定义及使用 3、掌握使用指针处理数组的方法 4、掌握使用字符数组及指针处理字符串数据 的方法 5、掌握与数组有关的基本算法(如排序、查 找、插入、删除等)的程序设计 重点:一维数组、二维数组的定义与使用 方法,使用指针访问数组和字符串的 方法。 难点:二维数组与指针;与数组有关的常 用算法(排序、查找与插入等)。5.1 数组概述 例. 输入10个数,求出他们的平均数。main() int n,a,s=0; float ave;for (n=1;nave) printf(“%d”,a1); if (a2ave) printf(“%d”,a2); if (a3ave) printf(“%d”,a3);. /* 实际程序是不能这样写*/思考: 发现:如果不是10个数,而是100,1000 ,甚至是10000,此时按上面方法编写程序 就非常冗长。 如果可以使用循环来编写,程序可以简洁 许多。 要使用循环:必须使用ai (i=1,210)的形式 来代表a1,a2a10 在C语言中使用“数组”来实现: aia0 a1a9#include void main() int n,i;float s=0, ave, a10;for(i=0;iave) printf(“%f “,ai); 声明有10个元素 的一维数组aa0 a1 a9ai aiaiai在程序设计中,为了处理方便, 把具有相 同类型的若干变量按有序的形式组织起来 。这些按序排列的同类数据元素的集合称 为数组。 在语言中, 数组属于构造数据类型。 按类型分为: 数值数组、 字符数组、 指 针数组、结构数组等 按维数可分为:一维数组、二维数组、 多维数组。 数组在内存中占用一片连续的存储单元5.2 一维数组只有一个下标变量的数组,称为一维数组。 5.2.1 一维数组定义一般形式为: 类型符 数组名 常量表达式 ; 其中: 类型说明符是任一种基本数据类型或构 造数据类型, 数组名是用户定义的标识符; 方括号中的常量表达式表示数据元素的 个数,也称为数组的长度。 例如: int a10; float b10,c20; char ch20; 数组在内存中占据一片连续的存储空间: 以 int a5为例,在内存中为:a0a1a2a3a4相当于声明了5个整型变量说明: 数组的所有元素的数据类型都是相同的。 数组取名规则应符合标识符的规定,数组 名不能与同一函数中其它变量名相同:int a; float a10; 是错误的。 C语言中规定数组的下标从0开始,方括号 中常量表达式表示数组元素的个数。 不能在方括号中用变量来表示元素的个数 , 但是可以是符号常数或常量表达式。例 如:int n=5,an; 是错误的。5.2.2 一维数组的初始化1、数组声明时初始化在编译阶段进行的。这样将减少运行时间,提高效率。数组初始化的一般形式为: 类型符 数组名常量表达式=值,值值;例如: int a10= 0,1,2,3,4,5,6,7,8,9 ;相当于a0=0; a1=1;. a9=9; 说明: int a10=0,1,2,3,4; int a10=1; static int a3;int a =1,2,3,4,5;int a5=1,2,3,4,5,1 ;给前5个元素赋 值,其余赋0值不能给数组整体 赋值,改成1可以省略数组元 素个数。静态存储类型, 初值为0初值的个数不能 超过元素个数2、使用赋值语句初始化用赋值语句初始化是在程序执行过程中实现 的。例如: int a3; a0=5;a1=8;a2=9;对于数组的元素用赋值语句初始化,常常使 用循环来完成,例如: int k,a10; for(k=0;k max)max = ai; printf(“ The Max =%dn“,max); p=0;a%d=%dn“,p,max); p = i; 及其下标求最大、最小值以及排序 算法中的最大、最小值确 定 都可以采用类似方法 :把第一个元素假想为当前 找到的最大、最小值,在 后续的比较中进行更新。5-2.c一维数组的倒置for(i=0;iaj+1) t=aj;aj=aj+1;aj+1=t;ivoid main() int *p;*p =5;printf(“*p=%dn“,*p); 错误代码:可能引 起严重后果不定值p指向不可预料的 内存空间 *p可以表示p 变量所指的 变量初始化指针变量的方法主要有以下3种: int a,*p; p= int a, *p1,*p2= p1=p2; 使用malloc函数或calloc函数,给它们分 配一个自由的内存空间地址。apap1p22.6.5 指针变量的访问 格式为:*指针变量 例:int a=5, *p=la为整型变量,变量里存放的是5 lp为指针变量,变量里存放的是变量a的 地址 l p=a; 方法二: int a10, *p=a;a0 a1 a2.ai. a9pp+1或a+1 p+2或a+2p+i或a+ip+9或a+9a数组注意:指针变 量p的运算*(p+0) *(p+1) *(p+2)*(p+i)*(p+9)说明:p+i指向元素ai使用指针法引用一维数组的第i个元素的方法:使用指针变量*(p+i)访问元素ai。使用数组名*(a+i)访问元素ai。指向数组的指针变量也可以带下标,即:pi与*(p+i)等价,表示元素ai。 例子:方法一分析 int i,imax,max,aN; for(i=0;i max) max = ai ;imax = i; printf(“Max:a%d=%dn“,imax,max);*(a+i) *(a+i)a+i*(a+i)替代aia+i指向元素ai, 即为ai的地址, 替代 for(i=0;i max) max = ai ;imax = i; printf(“Max:a%d=%dn“,imax,max);,*p; (p=a;p 0 ) k = j; temp = pci; pci = pck; pck = temp;for (i=0; i=N)printf(“Not found!n“);elseprintf(“It is the NO.%d!n“,i); 思考:如果数 据中有相同的 数据,要求将 所有数据都查 找出来,如何 修改? 5-10.c2折半查找法(只能对有序数列进行查找)1 2 4 9 10 15 26 35 36 39 54 59 68 71 75 77 79 95 96 99bottop mid=(bot+top)/2比较:x Vs amid的情况 x= amid则找到 xamid则 到后半部分找 ,则top不变,bot=mid+126xtopbotmid循环结束的条件:找到了: x=a(mid)bottop25bottopmidbottopmid此时bot=top=mid 而xa(mid)则bot=mid+1 则bottop0 1 234 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19#define N 10 void main() int aN=1,4,7,13,16,19,28,36,49,60;int mid,bot,top,x,i;scanf(“%d“,bot=0; top=N-1;while(bottop) printf(“Not found!n“);else printf(“It is the NO.%d!n“,mid);5-11.c5.8.3 插入法125610 16 25 48 95 994x 确定插入的位置p: for(p=0; p p; i-)ai=ai-1, ap=x;此时q为 最后一个 元素地址 确定插入的位置p: for(p=0; p p; i-)ai=ai-1, ap=x;下标法: int p; 确定插入的位置: for(p=a; p p; q-)*q =*(q-1), *p=x;指针法: int *p, *q;5.8.4 字符串的处理1简单加密和解密 2统计文本单词的个数
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号