1 / 162

揭安全

揭安全. E_mail: jieanquan@163.com QQ:461254151. 江西师范大学计算机信息工程学院. 揭安全 jieanquan@163.com 江西师范大学计算机信息工程学院. 指针. 第 6 章 数组、指针与字符串. 数组. 字符串. 第 6 章 数组、指针与字符串. 数组的定义、引用和初始化. 向函数传递一维数组. 数组基本算法. 内容提要. 数组类型; 向函数传递一维数组和二维数组; 常用算法:排序、查找、求最大最小值等; 指针 动态内存分配 使用字符数组存储和处理字符串 String 类. 数组的用处.

blithe
Download Presentation

揭安全

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 揭安全 E_mail: jieanquan@163.com QQ:461254151 江西师范大学计算机信息工程学院

  2. 揭安全 jieanquan@163.com 江西师范大学计算机信息工程学院

  3. 指针 第6章 数组、指针与字符串 数组 字符串

  4. 第6章 数组、指针与字符串 • 数组的定义、引用和初始化 • 向函数传递一维数组 • 数组基本算法

  5. 内容提要 数组类型; 向函数传递一维数组和二维数组; 常用算法:排序、查找、求最大最小值等; 指针 动态内存分配 使用字符数组存储和处理字符串 String类

  6. 数组的用处 保存大量同类型的相关数据 如矩阵运算,表格数据等

  7. 数组(Array) inta[10]; 定义一个有10个元素的数组,每个元素的类型均为int 使用a[0]、a[1]、a[2]、……、a[9]这样的形式访问每个元素。可以像使用普通变量一样使用他们。 系统会在内存分配连续的10个int空间给此数组 直接对a的访问,就是访问此数组的首地址 a[9] a[1] a[8] a[7] a[0] 数组首地址 … a

  8. 数组的定义与初始化 数组定义后的初值仍然是随机数,一般需要我们来初始化 int a[5] = { 12, 34, 56 ,78 ,9 }; int a[5] = { 0 }; int a[] = { 11, 22, 33, 44, 55 }; 数组大小最好用宏来定义,以适应未来可能的变化 #define SIZE 10int a[SIZE]; 数组大小定义好后,将永远不变

  9. 数组的使用 数组的下标都是从0开始 对数组每个元素的使用与普通变量无异 可以用任意表达式作为下标,动态决定访问哪个元素 for (i=0; i<SIZE; i++) a[i] = 2 * i; 下标越界是大忌! 使用大于最大下标的下标,将访问数组以外的空间。那里的数据是未知的,可能带来严重后果 sizeof可以用来获得数组大小

  10. 数组的特点 快速地随机访问 一旦定义,不能改变大小

  11. 一维数组的输入和输出 • 只能逐个对数组元素进行操作(字符数组例外) inta[10],i; 输出方法: 输入方法: 输入第i个数组元素: 输出第i个数组元素: cout<<a[i]; cin>>a[i]; 输出整个数组元素: 输入整个数组元素: for (i=0;i<10;i++) cout<<a[i]<<" "; for (i=0;i<10;i++) cin>>a[i];

  12. 数组名作函数参数 传递整个数组到另一个函数内,可以将数组的首地址作为参数传过去 用数组名作为函数参数 只拷贝一个地址自然比拷贝全部数据效率高 由于首地址相同,故实参数组与形参数组占用同一段内存 在该函数内,不仅可以读这个数组的元素,还可以修改它们

  13. 简单变量和数组作函数参数的区别 未变化 修改 实参 实参 实参 变量值 变量值 变量值 主调函数 被调函数 变量值 变量值 变量值 形参 形参 形参 调用时 执行被调函数 从被调函数返回

  14. 简单变量和数组作函数参数的区别 实参 地址值 已改变 主调函数 … … 数组 被调函数 修改 地址值 形参 调用时

  15. 现场演示建立输入输出函数头文件的方法 /* 对长度为n的整型数组作输入 */ void input( int a[],int n) { int i; printf(“请输入%d个整型数据:\n",n); for (i=0;i<n;i++) cin>>a[i]; }

  16. 现场演示建立输入输出函数头文件的方法 /*随机产生长度为n的整型数组*/ void init(int a[ ],int n) { int i; srand(time(NULL)); for (i=0;i<n;i++) a[i]=rand()%100; }

  17. 现场演示建立输入输出函数头文件的方法 /*输出长度为n的整型数组*/ void print(int a[ ],int n) { int i,k=0; for (i=0;i<n;i++) { cout<<a[i]<<" "; k=k+1; /*计数器*/ if (k%10==0) cout<<endl; } printf("\n"); } ArrayIo.h 存盘

  18. 测试数组作函数参数对实参数组的影响 #include “ArrayIo.h” int main() { int a[5]; input(a,5); /*输入数组*/ print(a,5); /*输出数组*/ return 0; }

  19. 数组基本算法 • 数组应用举例 • 简单选择排序 • 顺序查找与二分查找 • 插入排序 • 冒泡排序

  20. 单击倒置 一维数组的应用举例 案例1:火车时刻表发车时间查询。

  21. 实现原理:编写一个函数void verge(int a[ ],int n),对长度为n的数组进行就地倒置。 一维数组的应用举例

  22. j i 6 5 2 4 3 10 16 32 7 23 54 83 算法演示: … 0 1 n-1 a 3 15 29 96

  23. 数组倒置算法程序填空 void verge(int a[ ],int n) { int x,i,j; i=0; j= ; while () { x=a[i]; = a[j]; a[j--]=x; } } n-1 i<j a[i++]

  24. 插入6077 一维数组的应用举例 案例2:数据表中记录的插入操作。

  25. 一维数组的应用举例 案例2:数据表中记录的插入操作。

  26. i=6 5 6 8 3 9 2 4 1 11 0 12 7 10 j a 16 10 23 29 54 7 29 96 23 83 15 3 96 x 83 54 32 一维数组的应用举例 实现原理:编写一个函数将x插入到长度为n的数组的第i个位置(i>=0 && i<=n)。 int insert(int a[],int n,int i,int x) { }

  27. 删除谢丰 一维数组的应用举例 案例3:数据表记录的删除操作。

  28. 一维数组的应用举例 案例3:数据表记录的删除操作。

  29. i=3 5 6 4 3 2 10 1 8 0 9 7 a j 3 16 32 15 45 16 7 10 一维数组的应用举例 实现原理:编写一个函数删除数组中的第一个x,函数返回数组的长度。 int deletex(int a[],int n,int x) { } 例如x=16 16 45 32 7 =i+1

  30. i=3 10 9 8 7 6 4 3 5 2 1 0 a 16 45 32 3 15 45 16 32 10 7 16 7 一维数组的应用举例 思考:如果要用函数删除数组中的所有值为x的数据,函数返回数组的长度,该如何设计算法? 利用随机函数产生100000个数,测试程序效率。 int deleteAllx(int a[],int n,int x) { }

  31. i 5 … 4 n-1 2 3 1 0 a 10 15 23 83 15 7 15 15 3 j 一维数组的应用举例 高效方法: (例如:x=15) 23 10 7 83 if ( a[i]!=x) a[j++]=a[i++] else i++;

  32. 编程提示: 程序正确只是程序设计的基本要求,信息化时代,数据规模呈现指数级增长,如何设计效率高的程序,以满足海量数据处理对时间性能的要求是现代程序员必须思考的基本问题之一。 推荐阅读:前Google(谷歌)全球副总裁、创新工场董事长兼首席执行官李开复博士文章:《算法的力量》

  33. 案例4:Windows计算器的进位制转换。

  34. 实现原理:编写一个函数Dton(int m,int n)将10进制整数m转换为n进制输出,n一般取2,8,16。 • 输出格式示例: • 当m=215,n=2时,输出215D=11010111(2) • 当m=215,n=8时,输出215D=327(8) • 当m=125,n=16时,输出215D=D7(16)

  35. i 0 10 8 7 6 5 9 4 3 1 2 a 32 16 7 16 45 算法演示: 215 8 7 8 26 2 8 3 0 3

  36. void Dton(int m,int n) {int a[32]; int i=0; cout<<m<<"D="; while (m) { if (m%n>9) a[i]=m%n+55; else a[i]=m%n+'0'; m/=n; i++; } i--; while (i>-1) cout<<a[i--]<<" "; cout<<n<<endl; }

  37. 数组基本算法 • 数组应用举例 • 简单选择排序 • 顺序查找与二分查找 • 插入排序 • 冒泡排序

  38. 简单选择排序法 (1)引例1 从一个数组中找出一个最小数,换到数组的最前面。 (2)引例2 从一个数组的第i个位置开始向后找出一个最小数,换到数组的第i个位置。

  39. int main() {int a[10]; input(a,10); print(a,10); select(a,10); print(a,10); } #include “ArrayIo.h" void select(int a[ ],int n) { int j,k,x; k=0; //记录最小元位置 for (j=1;j<n;j++) if (a[j]<a[k]) k=j; if (k!=0) { x=a[0]; a[0]=a[k]; a[k]=x; } }

  40. int main() {int a[10]; input(a,10); print(a,10); select(a,10,0); select(a,10,1); select(a,10,2); print(a,10); } #include “ArrayIo.h" void select(int a[ ],int n, int i) { int j,k,x; k=i; //记录最小元位置 for (j=i+1;j<n;j++) if (a[j]<a[k]) k=j; if (k!=i) { x=a[i]; a[i]=a[k]; a[k]=x; } }

  41. 49 25 25* 初始 21 16 08 0 1 2 3 4 5 直接选择排序演示 21 08 49 25 25* i = 0 16 49 i = 1 25 25* 21 16 08

  42. 49 49 25* 25 i = 2 25* 25 21 结果 21 16 16 08 08 0 1 2 3 4 5 49 25* 25 i = 3 21 16 08 49 25* 25 i = 4 21 16 08

  43. 2、简单选择排序法 首先从所有n个待排序记录中选择排序码最小的记录,将该记录与第1个记录交换,再从剩下的n-l个记录中选出排序码最小的记录和第2个记录交换。重复这样的操作直到剩下2个记录时,再从中选出排序码最小的记录和第n-1个记录交换。剩下的那1个记录肯定是排序码最大的记录,这样排序即告完成。

  44. 直接选择排序法程序 /*对数组a进行选择排序*/ int selectsort(int a[ ],int n) { int i,j,k,min; for (i=0;i<n-1;i++) { k=i; for ( j=i+1; j<n; j++) if (a[j]<a[k]) k=j;

  45. 直接选择排序法程序 if (k!=i) { min=a[k]; a[k]=a[i]; a[i]=min; } } }

  46. 拓展题:最大子段和问题 • 给定由n个整数(可能为负数)组成的序列a1,a2,…,an,求该序列形如 • 的子段和的最大值。当所有整数均为负整数时定义其子段和为0。依此定义,所求的最优值为: • 例如, (-2, 11,-4,13,-5,-2)时,最大子段和为:

  47. 现场演示查找算法 顺序查找 折半查找

  48. 顺序查找 int Search(long a[], int n, long x) { int i; for (i=0; i<n; i++) { if (a[i] == x) { return (i); } } return (-1); } 哈,找到了!

  49. 折半查找

  50. 折半查找 数组下标 0 1 2 3 4 第一次循环:99011 99013 99015 99017 99019①查找值x=99017 low mid high x>a[mid], low=mid+1 第二次循环:99011 99013 99015 99017 99019 low=mid high x==a[mid],找到 哈,找到了!

More Related