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

下载本文档

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

文档简介

第6章 数组,许建龙 ,C程序设计,内容提要,数组类型; 向函数传递一维数组和二维数组; 常用算法:排序、查找、求最大最小值等; 用字符数组存取字符串; 使用字符串处理函数处理字符串,数组的用处,保存大量同类型的相关数据 如矩阵运算,表格数据等,数组(Array),int a10; 定义一个有10个元素的数组,每个元素的类型均为int 使用a0、a1、a2、a9这样的形式访问每个元素。它们与普通变量没有任何区别 系统会在内存分配连续的10个int空间给此数组 数组下标可以是整型表达式 直接对a的访问,就是访问此数组的首地址,a,a9,a8,a7,a1,a0,数组的定义与初始化,数组定义后的初值仍然是随机数,一般需要我们来初始化 int a5 = 12, 34, 56 ,78 ,9 ; int a5 = 0 ; int a = 11, 22, 33, 44, 55 ; 数组大小最好用宏来定义,以适应未来可能的变化 #define SIZE 10 int aSIZE; 数组大小定义好后,将永远不变,数组的使用,数组的下标都是从0开始 对数组每个元素的使用与普通变量无异 可以用任意表达式作为下标,动态决定访问哪个元素 for (i=0; iSIZE; i+) ai = 2 * i; 下标越界是大忌! 使用大于最大下标的下标,将访问数组以外的空间。那里的数据是未知的,可能带来严重后果 sizeof可以用来获得数组大小,数组的特点,快速地随机访问 一旦定义,不能改变大小,只能逐个对数组元素进行操作(字符数组例外),输入方法:,int a10,i;,输入第i个数组元素:,scanf(“%d“,输入整个数组元素:,for (i=0;i10;i+) scanf(“%d“,输出方法:,输出第i个数组元素:,printf(“%d“,ai);,输出整个数组元素:,for (i=0;i10;i+) printf(“%d“,ai);,一维数组的输入和输出,例6.1,兔子生崽问题 Fibonacci数列 1,2,3,5,8,13,21,34,55,89,144,233,,例6.1,#include #define YEAR_MONTH 12 main() int fYEAR_MONTH+1 = 0,1,2; int month; for (month=3; month=YEAR_MONTH; month+) fmonth = fmonth-1 + fmonth-2; for (month=1; month=YEAR_MONTH; month+) printf(“%dt“, fmonth); printf(“nsum = %dn“, fYEAR_MONTH); ,例6.2 打印出最高分及其学生序号,从键盘输入学生人数n; 从键盘输入所有学生的学号和成绩分别存入数组num和score 假设其中的一个学生成绩为最高,同时记录其学号,即令 maxScore = score0 maxNum = num0; 对所有学生成绩进行比较,即 for (i=0; i maxScore, 则修改maxScore值为scorei, 并记录其学号maxNum = numi; 打印最高分maxScore及其学号maxNum;,#include #define ARR_SIZE 40 main() float scoreARR_SIZE, maxScore; int n, i; long maxNum, numARR_SIZE; printf(“Please enter total number:“); scanf(“%d“, ,#include #define ARR_SIZE 40 float FindMax(float arr,int n); main() float scoreARR_SIZE, maxScore; int n, i; printf(“Please enter total number:“); scanf(“%d“, ,float FindMax(float arr, int n) float max; int i; max = arr0; for (i=1; i max) max = arri; return max; ,数组名作函数参数,用数组名作参数,就是将数组的首地址传递给函数 实参数组与形参数组占用同一段内存 在函数中可对形参数组元素修改,结果会影响主调函数中的实参数组,简单变量作函数参数,数组作函数参数,现场演示排序算法,交换法排序 选择法排序,交换法排序,交换法排序 for (i=0; i scorei) “交换成绩scorej和scorei“, “交换学号numj和numi“; ,交换法排序,选择法排序,选择法排序 for (i=0; i scorek) 记录此轮比较中最高分的元素下标 k = j; 若k中记录的最大数不在位置i,则 “交换成绩scorej和scorei“, “交换学号numj和numi“; ,选择法排序,现场演示查找算法,顺序查找 特例:求最大值,求最小值 折半查找,顺序查找,int Search(long a, int n, long x) int i; for (i=0; in; i+) if (ai = x) return (i); return (-1); ,折半查找,折半查找,int BinSearch(long a, int n, long x) int low, high, mid; low = 0; high = n - 1; while (low amid) low = mid + 1; else if (x amid) high = mid - 1; else return (mid); return(-1); ,字符串(String)与字符数组,字符串 一串以0结尾的字符在C语言中被看作字符串 用双引号括起的一串字符是字符串常量,C语言自动为其添加0终结符 C语言并没有为字符串提供任何专门的表示法,使用字符数组和字符指针来处理 字符数组 每个元素都是字符类型的数组 char string80;,字符数组的初始化,用字符型数据对数组进行初始化 char str6 = C,h,i,n,a,0; 用字符串常量直接对数组初始化 char str6 = “China“; char str6 = “China“;,逐个输入输出,for (i=0; si!=0; i+) putchar(si); putchar(n);,一次性输入输出,scanf(“%s“,s); printf(“%s“,s);,char s10;,字符数组的输入输出,gets(s); puts(s);,scanf(),int i; scanf(“%d“, 不能读入带空格的字符串,gets()可以 这种用法很不安全。当用户的输入多于10个(含10个),str数组将越界 scanf被公认为最易遭到黑客攻击的函数之一,gets(),字符串输入函数gets()也没有提供限制输入字符串长度的方法,容易引起缓冲区溢出,给黑客攻击以可乘之机 对输入字符串长度有限制的函数调用 fgets(buf, sizeof (buf), stdin);,字符串处理函数,在中定义了若干专门的字符串处理函数 strcpy: string copy char *strcpy(char *dest, const char *src); strlen: string length size_t strlen(const char *s); 返回字符串的实际长度,不包括0 strcat: string combination char *strcat(char *dest, const char *src); strcmp: string comparison int strcmp(const char *s1, const char *s2); 当出现第一对不相等的字符时,就由这两个字符决定所在字符串的大小,字符串不能直接整体复制!,str1=str2 /*错误*/,0作为字符串结束符的天生缺陷,假若交给这些字符串处理函数的字符串没有0会如何? 0很关键,如果没有,那么这些处理函数会一直进行处理直到遇到一个0为止。此时可能已经把内存弄得乱七八糟 ANSI C定义了一些“n族”字符处理函数,包括strncpy、strncat、strncmp等,通过增加一个参数来限制处理的最大长度 char *strcpy(char *dest, const char *src, unsigned int count);,例6.9,从键盘任意输入5个学生的姓名,编程找出并输出按字典顺序排在最前面的学生姓名 等价于求最小字符串,#include #include #define ARRA_SIZE 80 main() int n, num; char strARRA_SIZE, minARRA_SIZE; printf(“Please enter five names:n“); gets(str); strcpy(min, str); for (n=1; n5; n+) gets(str); if (strcmp(str, min) 0) strcpy(min, str); printf(“The min is:“); puts(min); ,二维数组的定义,格式: 数据类型 数组名常量表达式常量表达式,int b23;,b为23(2行3列)的数组,注意下标范围,b0 b1,b,- b00 b01 b02,- b10 b11 b12,二维数组的存储结构,int b23;,b10,b11,b12,b00,b01,b02,存放顺序:按行存放,先顺序存放第一行的元素,再存放第二行的元素,二维数组的输入和输出,数组的输入和输出只能逐个对数组元素进行操作(字符数组例外),int b23,i,j;,向函数传递二维数组,实际传送的是指向数组第一个元素的地址 在声明二维数组形参时,不能省略数组第二维的长度,例6.8 计算总分和平均分p222,void Total(int scoreCOURSE, int sum, float aver, int n) /*求每门课的总分和平均分 int i, j; for (j=0; jCOURSE;

温馨提示

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

评论

0/150

提交评论