




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
如何使用下标遍历一维数组1.2 如何使用下标遍历一维数组这是一个微不足道的问题。在数据结构中,经常需要遍历数组,我们可以使用任何逻辑来遍历数组。为此,我们可以使用简单循环。我们能够通过下标或通过与数组元素类型相同的指针来访问数组元素。在希望使用指针访问数组元素的情况下,我们需要使用数组的基地址(也就是第一个元素的地址)来初始化指针。下面的代码展示了如何使用下标来访问数组元素:1./在C中使用下标 2.int my_array_name4=10,20, 30,40; 3.int counter=0; 4.for(counter=0;counter4;counter+) 5. printf(%dn,my_array_namecounter); 数组名就是一个指向该数组的指针,除此之外它什么也不是。1.2.1 如何使用指针遍历一维数组1./使用指针 2.int my_array_name4=10,20,30,40; 3.int counter=0; 4.for(counter=0;counter4;counter+) 5. printf(%dn,*(my_array_name+counter); 1.2.2 如何使用下标遍历二维数组1.int my_2d_array1010; 2./假定数组my_2d_array 已经预先被填充了数据 3.int i,j; /遍历这个数组 4.for(i=0;i10;i+) /向下遍历各行 5. for(j=0;j10;j+) /穿越各列 6. printf(%d, aij); 7.printf(n); 如何使用指针遍历二维数组 9.for(i=0;i10;i+) 10. for(j=0;j10;j+) 11. printf(%d,*(*(a+i)+j); 12.printf(n); 1.3 如何操作数组元素在数据结构中,你或许必须求数组元素的和,或者对数组元素作某种类型的数学运算。为了让事情更复杂,你或许需要对数组下标进行函数运算,之后使用满足某个预先确定条件的那些下标的元素,并将这些元素作为另一个函数的参数。下面是输出110之间偶数平方的一段代码:1.#include 2.#include 3.#include 4.int isEven(int m) 5. 6. return m%2=0?1:0; 7. 8. 9.int main() 10. 11. int a10; int i; for(i=0;i9;i+) 12. ai=i+1; 13. for(i=0;i9;i+) 14. 15. /检查下标是不是偶数 16. if(isEven(i+1) 17. /能够完成像 18. /加法 19. /乘法 20. /之类的任何数学运算 21. printf(%fn,pow(float)ai,2); 22. 23. getch(); 24. return 0; 25. 你或许被要求对数组的某个特定部分进行函数运算。例如,如果想找出某个数是否能够被11整除,那么你需要找出偶数位置和奇数位置数字和之间的差值。下面给出了一些数组元素的操作示例:1.4 如何把指定范围内的数据元素加起来这个函数把数组的所有元素加起来,并把和返回给调用方法。这个函数以数组名称和开始下标与结束下标作为参数。下面是C代码:1.int Add(int array,int start,int finish) 2. 3. int i=start; 4. int sum = 0; 5. for(;i=finish;i+) 6. sum+=arrayi; 7. return sum; 8. 这个方法把位于开始下标和结束下标(包括这两个下标)之间的所有数组元素加起来。比如说,存在下面的数组:1.int a=1,2,3,4,5,66,7,8,9,10,11,12; 我们想把15加起来;那么我们可以用Add(a,0,6)调用上面的方法。如果把开始下标设为0,结束下标设为数组元素的个数减1,那么这个函数就能够用于计算所有数组元素的和。也就是说,对于上面的数组,如果你想计算所有数组元素的和,那么我们应该编写:1.Add(a,0,11); 1.5 如何把数组中偶数位置和奇数位置的元素加起来要把指定范围内的元素加起来,我们能够像上面的代码那样传递开始下标和结束下标。我们能够让这个函数更加智能化。这一智能函数能够用于将数组中偶数位置或奇数位置内的整数加起来,或者能够用于返回指定范围所有元素的和。将一个标志作为第三个参数传递。如果该参数为0,那么方法返回指定范围内(包括开始下标和结束下标元素)所有元素的和,如果该参数为1,那么它将返回偶数位置数值的和。如果该参数为2,那么这个方法返回由开始下标和结束下标指定范围内所有奇数元素的整数和。下面是C代码:1. doubleArrayAdd(doublearray,intstart,intfinish,intflag) 2. 3. inti=start; 4. doublesum=0; 5. if(flag=0)/将start到finish之间的所有元素加起来 6. 7. for(;i=finish;i+) 8. sum+=arrayi; 9. 10. if(flag=1)/仅仅将偶数位置的数值加起来 11. 12. if(start%2=0)/到底从什么地方开始呢 13. i=start; 14. else 15. i=start+1; 16. for(;i=finish;i+=2) 17. sum+=arrayi; 18. 19. if(flag=2)/仅仅将奇数位置的数值加起来 20. 21. if(start%2!=0)/到底从什么地方开始呢 22. i=start; 23. elsei=start+1; 24. for(;i=finish;i+=2) 25. sum+=arrayi; 26. 27. returnsum; 28. 1.10 如何删除数组中的某个特定数据项可以通过两种方法实现数组中的删除。它们是:(1)按数据项删除。(2)按位置删除。假定存在一个数组,它保存了下述整数1、2、3、4、5。我们想删除3。在删除之前,情况类似于图1.2(a)所示,删除之后内存分布如图1.2(b)所示。(点击查看大图)图1.2 删除数据项3前后数组的变化因此,为了删除3,必须做下列工作:(1)找出要被删除的数据项的位置。(2)对于位于要被删除元素右侧的所有元素,其下标减1。对于位于要被删除元素前面的元素,其下标保持不变。(3)要被删除的元素被紧跟在其后的元素覆盖。(4)这个过程持续进行,直到数组的末尾为止。被删除数据项后面的元素下标都被减少1。1. voiddelete_item(inta,intsize,intx) 2. 3. inti; 4. intflag=0; 5. for(i=0;isize;i+) 6. if(ai=x)/找到要被删除的数字 7. 8. flag=1;/找到了所搜索的数字 9. break; 10. 11. if(flag=1)/将所有生育的元素都左移一个位置 12. for(intk=i;k=0&delete_locationsize) 5. 6. for(inti=delete_location;istrlen(myCodes)-1;i+) 7. arrayi=arrayi+1; 8. flag=1;/如果删除成功的话 9. 10. returnflag; 11. 当我们想要按照某种特定模式或依据某个条件删除数组元素时,就会发生更复杂的情况。这里,我们仅仅讨论遵从某个特定模式的删除。考虑一下,假设我们要从头位置开始每隔一个元素删除一个数组元素。也就是说,如果初始数组如图1.3(a)所示的话,删除之后内存分布如图1.3(b)所示。(点击查看大图)图1.3 每隔一个元素删除一个元素让我们仔细观察一下删除前后的数组下标。我们将删除前的数组称为old_array,删除后的数组称为new_array。那么,从图1.3中能够清晰地得出结论:1. new_array0=old_array0; 2. new_array1=old_array2; 3. new_array2=old_array4; 4. new_array3=old_array6;一般来说,我们得到new_array i = old_array 2*i = old_array i + i/1 。这就是说,如果我们想删除数组中位于4的倍数位置的元素,那么新数组的元素可以使用语句new_arraycounter=old_arraycounter + counter /3得到。删除之后,数组元素的个数将由下述公式给出:原始长度 原始长度/(要被删除的第一个数据项的下标1)因此,如果原始数组存储了20个元素,我们要删除数组中位于4的倍数位置的元素,那么删除之后,数组中元素的个数可以由下述公式给出:新的长度原始长度 原始长度/(要被删除的第一个数据项的下标1)新的长度20 20/(31)20515下面是删除数组中位于4的倍数位置元素的C 代码:1. #include2. #include3. intmain() 4. 5. inta=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20; 6. /删除数组中位于4的倍数位置的元素 7. for(inti=0;i20;i+) 8. ai=ai+i/3; 9. /显示删除元素后的数组 10. for(inti=0;i20-20/(3+1);i+) 11. printf(%d,ai); 12. printf(n); 13. getch(); 14. return0; 15. 下面是删除数组中任意元素的通用代码:1. #include2. #include3. intmain() 4. 5. intwhichnumber; 6. inta=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20; 7. printf(Enterwhichnumberyouwanttodelete:); 8. scanf(%d,&whichnumber); 9. for(inti=0;i20;i+) 10. ai=ai+i/(whichnumber-1); 11. /显示删除元素后的数组 12. for(inti=0;i20-20/whichnumber;i+) 13. printf(%d,ai); 14. printf(n); 15. getch(); 16. return0; 17. 1.12 如何得到数组中的最大值找出数组的最大值是件简单的任务,所需要做的工作仅仅是比较两个数据项。如果一个数据项大于另一个数据项,那么就两个值中最大值的下标保存在一个临时变量中。最后,返回该值。从数组中找出最大值所需花费的循环次数为数组中数据项的个数。下面是找出整型数组中最大值的C代码:1. intFindMaximumNumber(intarray,intsize) 2. 3. intmax=array0; 4. for(i=1;imax) 7. max=arrayi; 8. 9. returnmax; 10. 1.14 如何按字母顺序排序数组这是一个很常见的编程任务。要按字母顺序排序,我们能够使用库方法strcmp(),如果忽略大小写的话,能够使用字符串库中的函数strcmpi()。这里,采用字符串数组保存少量名称,之后在C中按字母顺序排序:1. voidAlphaSort(char*array,intsize) 2. 3. char*temp; 4. for(intj=0;jsize;j+) 5. for(inti=0;i0) 8. 9. strcpy(temp,arrayi); 10. strcpy(arrayi,arrayi+1); 11. strcpy(arrayi+1,temp); 12. 13. 14. /显示排序后的数组 15. for(inti=0;isize;i+) 16. printf(%sn,arrayi); 17. 这种方法能够按字母顺序排序名称和字母数字。使用下述数组试一试这个方法:1. char*names=Zamal,Fakir,Amal,Kalam; 2. char*codes=A235,Z324,B325;像AlphaSort(names, 4)这样调用该方法。1.15 如何检查字符串是否是回文字符串回文是一种字符对称的字符串,无论从前面往后读还是从后往前读结果都一样。存在这样的一个误解-仅仅存在回文单词。事实并非如此,也存在回文的句子。其中一个示例是Was it a cat I saw。这个句子摘自艾丽斯梦游仙境(Alice in Wonderland)。要确定字符串是否是回文字符串,人们通常颠倒字符串,之后以正常字符串方式对其检查。我们可以使用C中的库函数来完成这个工作。只要有可能,使用库函数代替人工编码总是更好的选择。这种做法使得代码运行速度更快并且也有更好的可读性。下面是C代码:1. intIsItAPalindrome(char*whatever) 2. 3. /为了提高代码的可读性,使用了enum 4. enumNOT_PALINDROME,PALINDROME; 5. if(strcmpi(whatever,strrev(whatever)=0) 6. returnPALINDROME; 7. else 8. returnNOT_PALINDROME; 9. 这里,我们使用了两个库函数:strcmpi():比较两个常量字符串,忽略它们的大小写。strrev():颠倒给定的字符串。上面的程序仅能用于单一单词。像下面的回文:1. MadamI.madam或wasitacatIsaw将不能够由上面的程序进行检查。为了确定这些字符串是否是回文,我们将必须首先从字符串中剔除特殊字符。下面是完成这个工作的代码:1. #include2. #include3. #include4. intmain() 5. 6. chars20=MadamImAdam; 7. charcs20=; 8. char*rcs=; 9. intk=0; 10. inti=0; 11. intflag=0; 12. for(i=0;i=a&si=A&si=Z) 16. 17. csk=si;k+; 18. 19. if(strcmp(cs,strrev(cs)=0) 20. printf(ItsaPalindromen); 21. else 22. printf(ItsnotaPalindromen); 23. return0; 24. 1.16 如何搜索数组元素这是数组最平凡的操作之一,但这种操作十分常见。存在很多种方法能够找出数组元素,但这里给出了最强有力的方法。这是一个有点费时但永远不会失效的方法。这种搜索方法称为线性搜索。这个方法使用了4个参数。它们是:(1)数组名。(2)起始下标,指定从什么地方开始搜索。(3)结束下标,指定搜索的结束位置。(4)要查找的数据。下面是搜索整型数组中某个元素实现方法的C代码:1. intFind(intarray,intstart,intfinish,intwhattofind) 2. 3. enumNOT_FOUND,FOUND; 4. intsearch_result=NOT_FOUND; 5. inti; 6. for(i=start;ifinish;i+) 7. /检查当前元素是否是要搜索的数组元素 8. if(arrayi=whattofind) 9. 10. search_result=FOUND;/找到目标! 11. break; 12. 13. returnsearch_result; 14. 正如你所看到的,这个方法使用了枚举变量来存储搜索的状态。这个做法提高了代码的可读性,坚持使用这样的状态变量。枚举的附加优点是不需要明确地初始化枚举变量。它们自动从0开始自动初始化。这里使用break在找到搜索元素时跳出循环。否则的话,我们需要运行完毕整个循环,用在计算上的代价昂贵。1.17 如何让数组元素唯一如果你熟悉数据库,那么你或许就会知道,SQL中有一个称之为DISTINCT的命令,它用于从表中选择不同的(也就是说,唯一的)字段值。存在很多与此相似的情形,你需要找出数组的唯一值。假设你想统计分析班级中学生的分数,会有很多学生的分数相同。因此,在得到各个分数的出现频率(也就是说,特定分数有多少个学生取得)之前,你需要先把分数处理成唯一了。下面的方法以数组名称及其长度为参数,将数组元素处理为唯一元素。现在,我们将使用这个Find()方法构造另一个实用程序,它将仅仅显示数组的不同元素。下面是将整型数组处理为唯一元素的C代码。1. #include2. #include3. intFind(intarray,intstart,intfinish,intwhattofind) 4. 5. enumNOT_FOUND,FOUND; 6.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年家政服务员执业能力水平考核试题及答案解析
- 2025年香道师面试问题解析大全
- 2025年计算机科学试题及答案解析
- 2025年护理学专业资格考试试题及答案解析
- 2025年汉语教师职业技能考试试题及答案解析
- 2025年国际贸易法务专家资格考试试题及答案解析
- 2025年导盲犬训练师面试高频题
- 课件中任务卡模板制作步骤
- 课件中video的缩写形式
- 2025年小美容院美容安全考核题及答案
- 第四节道亨slw2d架空送电线路评断面处理及定位设计系统部分操作说明
- 测振仪使用方法
- 2023-2024学年湖南省耒阳市小学语文六年级下册期末自测测试题
- 12YJ4-1 常用门窗标准图集
- 表- 邻二氯苯的理化性质和危险特性表
- 工程项目全过程造价管理课件PPT超详细
- 成人手术后疼痛处理专家共识
- 读书分享-《教育的情调》
- 《材料力学》说课-课件
- 物资采购付款报销单
- 政务云收费标准 云托管收费标准
评论
0/150
提交评论