如何使用下标遍历一维数组.docx
- 文档编号:15617745
- 上传时间:2023-07-06
- 格式:DOCX
- 页数:17
- 大小:73.50KB
如何使用下标遍历一维数组.docx
《如何使用下标遍历一维数组.docx》由会员分享,可在线阅读,更多相关《如何使用下标遍历一维数组.docx(17页珍藏版)》请在冰点文库上搜索。
如何使用下标遍历一维数组
如何使用下标遍历一维数组
1.2如何使用下标遍历一维数组
这是一个微不足道的问题。
在数据结构中,经常需要遍历数组,我们可以使用任何逻辑来遍历数组。
为此,我们可以使用简单循环。
我们能够通过下标或通过与数组元素类型相同的指针来访问数组元素。
在希望使用指针访问数组元素的情况下,我们需要使用数组的基地址(也就是第一个元素的地址)来初始化指针。
下面的代码展示了如何使用下标来访问数组元素:
1.//在C中使用下标
2.intmy_array_name[4]={10,20,30,40};
3.intcounter=0;
4.for(counter=0;counter<4;counter++)
5.printf("%d\n",my_array_name[counter]);
数组名就是一个指向该数组的指针,除此之外它什么也不是。
1.2.1如何使用指针遍历一维数组
1.//使用指针
2.intmy_array_name[4]={10,20,30,40};
3.intcounter=0;
4.for(counter=0;counter<4;counter++)
5.printf("%d\n",*(my_array_name+counter));
1.2.2如何使用下标遍历二维数组
1.intmy_2d_array[10][10];
2.//假定数组my_2d_array已经预先被填充了数据
3.inti,j;//遍历这个数组
4.for(i=0;i<10;i++)//向下遍历各行
5.for(j=0;j<10;j++)//穿越各列
6.printf("%d",a[i][j]);
7.printf("\n");
8.
1.2.3如何使用指针遍历二维数组
9.for(i=0;i<10;i++)
10.for(j=0;j<10;j++)
11.printf("%d",*(*(a+i)+j));1
2.printf("\n");
1.3如何操作数组元素
在数据结构中,你或许必须求数组元素的和,或者对数组元素作某种类型的数学运算。
为了让事情更复杂,你或许需要对数组下标进行函数运算,之后使用满足某个预先确定条件的那些下标的元素,并将这些元素作为另一个函数的参数。
下面是输出1~10之间偶数平方的一段代码:
1.#include
2.#include
3.#include
4.intisEven(intm)
5.{
6.returnm%2==0?
1:
0;
7.}
8.
9.intmain()
10.{
11.inta[10];inti;for(i=0;i<9;i++)
12.a[i]=i+1;
13.for(i=0;i<9;i++)
14.
{15.//检查下标是不是偶数
16.if(isEven(i+1))
17.//能够完成像
18.//加法
19.//乘法
20.//之类的任何数学运算
21.printf("%f\n",pow((float)a[i],2));
22.}
23.getch();
24.return0;
25.}你或许被要求对数组的某个特定部分进行函数运算。
例如,如果想找出某个数是否能够被11整除,那么你需要找出偶数位置和奇数位置数字和之间的差值。
下面给出了一些数组元素的操作示例:
1.4如何把指定范围内的数据元素加起来
这个函数把数组的所有元素加起来,并把和返回给调用方法。
这个函数以数组名称和开始下标与结束下标作为参数。
下面是C代码:
1.intAdd(intarray[],intstart,intfinish)
2.{
3.inti=start;
4.intsum=0;
5.for(;i<=finish;i++)
6.sum+=array[i];
7.returnsum;
8.}这个方法把位于开始下标和结束下标(包括这两个下标)之间的所有数组元素加起来。
比如说,存在下面的数组:
1.inta[]={1,2,3,4,5,66,7,8,9,10,11,12};我们想把1~5加起来;那么我们可以用Add(a,0,6)调用上面的方法。
如果把开始下标设为0,结束下标设为数组元素的个数减1,那么这个函数就能够用于计算所有数组元素的和。
也就是说,对于上面的数组,如果你想计算所有数组元素的和,那么我们应该编写:
1.Add(a,0,11);
1.5 如何把数组中偶数位置和奇数位置的元素加起来
要把指定范围内的元素加起来,我们能够像上面的代码那样传递开始下标和结束下标。
我们能够让这个函数更加智能化。
这一智能函数能够用于将数组中偶数位置或奇数位置内的整数加起来,或者能够用于返回指定范围所有元素的和。
将一个标志作为第三个参数传递。
如果该参数为0,那么方法返回指定范围内(包括开始下标和结束下标元素)所有元素的和,如果该参数为1,那么它将返回偶数位置数值的和。
如果该参数为2,那么这个方法返回由开始下标和结束下标指定范围内所有奇数元素的整数和。
下面是C代码:
1.double ArrayAdd(double array[],int start,int finish,int flag)
2.{
3. int i=start;
4. double sum = 0;
5. if(flag==0) //将start到finish之间的所有元素加起来
6. {
7. for(;i<=finish;i++)
8. sum+=array[i];
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+=array[i];
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+=array[i];
26. }
27. return sum;
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.void delete_item(int a[],int size,int x)
2.{
3. int i;
4. int flag=0;
5. for(i=0;i 6. if(a[i]==x) //找到要被删除的数字 7. { 8. flag=1; //找到了所搜索的数字 9. break; 10. } 11. if(flag==1) //将所有生育的元素都左移一个位置 12. for(int k=i;k 13. a[k]=a[k+1]; 14. else 15. printf("The value is not found! "); 16.} 17.int main() 18.{ 19. int a[10]={1,2,3,4,5,6,7,8,9,10}; 20. display(a,10); 21. getch(); 22. delete_item(a,10,3); 23. display(a,9); 24. getch(); 25. return 0; 26.} 1.11 如何删除特定位置的数据项 有的时候,我们想删除特定位置的特定数据项。 在这种情况下,该位置的数据项并不重要。 只有数组中的位置是重要的。 比如说,删除数组中从头开始计数的第4个数据项,或者删除从尾部开始计数的第2个元素。 在这些情况下,不需要在数组中搜索这个数据项,我们所要做的所有工作就是将剩余的数据相应地向左移位。 下面是一个示例。 比如有一个字符数组: 1.char myCodes[]={"X", "Y","W","Z","D","C","B","A"}; 我们想删除数组的第4个元素。 为此目的,需要编写一个函数,它以数组为参数,查找指定位置,并删除标识位置的元素。 如果删除成功,那么返回真,否则返回假: 1.int delete_by_location(char myCodes[], int delete_location) 2.{ 3. int flag = 0; 4. if(delete_location>=0 && delete_location 5. { 6. for(int i=delete_location;i 7. array[i]=array[i+1]; 8. flag = 1; //如果删除成功的话 9. } 10. return flag; 11.} 当我们想要按照某种特定模式或依据某个条件删除数组元素时,就会发生更复杂的情况。 这里,我们仅仅讨论遵从某个特定模式的删除。 考虑一下,假设我们要从头位置开始每隔一个元素删除一个数组元素。 也就是说,如果初始数组如图1.3(a)所示的话,删除之后内存分布如图1.3(b)所示。 (点击查看大图)图1.3 每隔一个元素删除一个元素 让我们仔细观察一下删除前后的数组下标。 我们将删除前的数组称为old_array,删除后的数组称为new_array。 那么,从图1.3中能够清晰地得出结论: 1.new_array[0] = old_array[0]; 2.new_array[1] = old_array[2]; 3.new_array[2] = old_array[4]; 4.new_array[3] = old_array[6]; 一般来说,我们得到new_array[i]=old_array[2*i]=old_array[i+i/1]。 这就是说,如果我们想删除数组中位于4的倍数位置的元素,那么新数组的元素可以使用语句new_array[counter]=old_array[counter+counter/3]得到。 删除之后,数组元素的个数将由下述公式给出: 原始长度原始长度/(要被删除的第一个数据项的下标+1) 因此,如果原始数组存储了20个元素,我们要删除数组中位于4的倍数位置的元素,那么删除之后,数组中元素的个数可以由下述公式给出: 新的长度=原始长度原始长度/(要被删除的第一个数据项的下标+1) 新的长度=2020/(3+1)=20-5=15 下面是删除数组中位于4的倍数位置元素的C代码: 1.#include 2.#include 3.int main() 4.{ 5. int a[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}; 6. //删除数组中位于4的倍数位置的元素 7. for(int i=0;i<20;i++) 8. a[i] = a[i + i/3]; 9. //显示删除元素后的数组 10. for(int i=0;i<20-20/(3+1);i++) 11. printf("%d",a[i]); 12. printf("\n"); 13. getch(); 14. return 0; 15.} 下面是删除数组中任意元素的通用代码: 1.#include 2.#include 3.int main() 4.{ 5. int whichnumber; 6. int a[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}; 7. printf("Enter which number you want to delete : "); 8. scanf("%d",&whichnumber); 9. for(int i=0;i<20;i++) 10. a[i] = a[i + i/(whichnumber-1)]; 11. //显示删除元素后的数组 12. for(int i=0;i<20-20/whichnumber;i++) 13. printf("%d",a[i]); 14. printf("\n"); 15. getch(); 16. return 0; 17.} 1.12 如何得到数组中的最大值 找出数组的最大值是件简单的任务,所需要做的工作仅仅是比较两个数据项。 如果一个数据项大于另一个数据项,那么就两个值中最大值的下标保存在一个临时变量中。 最后,返回该值。 从数组中找出最大值所需花费的循环次数为数组中数据项的个数。 下面是找出整型数组中最大值的C代码: 1.int FindMaximumNumber(int array[],int size) 2.{ 3. int max=array[0]; 4. for(i=1;i 5. { 6. if(array[i]>max) 7. max = array[i]; 8. } 9. return max; 10.} 1.14 如何按字母顺序排序数组 这是一个很常见的编程任务。 要按字母顺序排序,我们能够使用库方法strcmp(),如果忽略大小写的话,能够使用字符串库中的函数strcmpi()。 这里,采用字符串数组保存少量名称,之后在C中按字母顺序排序: 1.void AlphaSort(char *array[],int size) 2.{ 3. char *temp; 4. for(int j=0;j 5. for(int i=0;i 6. { 7. if(strcmp(array[i],array[i+1])>0) 8. { 9. strcpy(temp,array[i]); 10. strcpy(array[i],array[i+1]); 11. strcpy(array[i+1],temp); 12. } 13. } 14. //显示排序后的数组 15. for(int i=0;i 16. printf("%s\n",array[i]); 17.} 这种方法能够按字母顺序排序名称和字母数字。 使用下述数组试一试这个方法: 1.char *names[]={"Zamal","Fakir","Amal","Kalam"}; 2.char *codes[]={"A235","Z324","B325"}; 像AlphaSort(names,4)这样调用该方法。 1.15 如何检查字符串是否是回文字符串 回文是一种字符对称的字符串,无论从前面往后读还是从后往前读结果都一样。 存在这样的一个误解--仅仅存在回文单词。 事实并非如此,也存在回文的句子。 其中一个示例是WasitacatIsaw。 这个句子摘自"艾丽斯梦游仙境"(AliceinWonderland)。 要确定字符串是否是回文字符串,人们通常颠倒字符串,之后以正常字符串方式对其检查。 我们可以使用C中的库函数来完成这个工作。 只要有可能,使用库函数代替人工编码总是更好的选择。 这种做法使得代码运行速度更快并且也有更好的可读性。 下面是C代码: 1.int IsItAPalindrome(char *whatever) 2.{ 3. //为了提高代码的可读性,使用了enum 4. enum{NOT_PALINDROME,PALINDROME}; 5. if(strcmpi(whatever,strrev(whatever))==0) 6. return PALINDROME; 7. else 8. return NOT_PALINDROME; 9.} 这里,我们使用了两个库函数: strcmpi(): 比较两个常量字符串,忽略它们的大小写。 strrev(): 颠倒给定的字符串。 上面的程序仅能用于单一单词。 像下面的回文: 1."Madam I.m adam"或"was it a cat I saw" 将不能够由上面的程序进行检查。 为了确定这些字符串是否是回文,我们将必须首先从字符串中剔除特殊字符。 下面是完成这个工作的代码: 1.#include 2.#include 3.#include 4.int main() 5.{ 6. char s[20]="Madam I'm Adam"; 7. char cs[20]=""; 8. char *rcs=""; 9. int k=0; 10. int i=0; 11. int flag=0; 12. for(i=0;i 13. { 14. //不考虑字母之外的所有其他字符 15. if((s[i]>='a' && s[i]<='z') ||(s[i]>='A' && s[i]<='Z')) 16. { 17. cs[k]=s[i]; k++;} 18. } 19. if(strcmp(cs,strrev(cs))==0) 20. printf("It's a Palindrome\n"); 21. else 22. printf("It's not a Palindrome\n"); 23. return 0; 24.} 1.16 如何搜索数组元素 这是数组最平凡的操作之一,但这种操作十分常见。 存在很多种方法能够找出数组元素,但这里给出了最强有力的方法。 这是一个有点费时但永远不会失效的方法。 这种搜索方法称为线性搜索。 这个方法使用了4个参数。 它们是: (1)数组名。 (2)起始下标,指定从什么地方开始搜索。 (3)结束下标,指定搜索的结束位置。 (4)要查找的数据。 下面是搜索整型数组中某个元素实现方法的C代码: 1.int Find(int array[],int start,int finish,int whattofind) 2.{ 3. enum{NOT_FOUND,FOUND}; 4. int search_result = NOT_FOUND; 5. int i; 6. for(i=start;i 7. //检查当前元素是否是要搜索的数组元素 8. if(array[i]==whattofind) 9. { 10. search_result = FOUND; //找到目标! 11. break; 12. } 13. return search_result; 14.} 正如你所看到的,这个方法使用了枚举变量来存储搜索的状态。 这个做法提高了代码的可读性,坚持使用这样的状态变量。 枚举的附加优点是不需要明确地初始化枚举变量。 它们自动从0开始自动初始化。 这里使用break在找到搜索元素时跳出循环。 否则的话,我们需要运行完毕整个循环,用在计算上的代价昂贵。 1.17 如何让数组元素唯一 如果你熟悉数据库,那么你或许就会知道,SQL中有一个称之为DISTINCT的命令,它用于从表中选择不同的(也就是说,唯一的)字段值。 存在很多与此相似的情形,你需要找出数组的唯一值。 假设你想统计分析班级中学生的分数,会有很多学生的分数相同。 因此,在得到各个分
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 如何 使用 下标 遍历 数组
![提示](https://static.bingdoc.com/images/bang_tan.gif)