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

下载本文档

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

文档简介

1、第6章 数组,C语言大学实用教程,思考,随机生成20个两位整数,按从小到大排序(根据成绩,对一个班的50个学生进行排名) 在一组数据中查找某一数值,数组,若干类型相同的相关数据的有序集合,内容提要,一维数组和多维数组的定义、初始化和引用 向函数传递一维数组和二维数组; 常用算法:排序、查找、求最大最小值等; 用字符数组存取字符串; 使用 字符串处理函数 处理字符串,数组,若干类型相同的相关数据用统一的名字标识 使用数组的原则:先定义后使用 定义数组的语法形式:类型数组名下标1下标2下标n; 类型用于声明数组中元素的数据类型数组名用于标识数组下标的个数表明数组的维数下标值表示相应维的长度,一维数

2、组的声明及存储形式,一维数组的声明 类型说明符 数组名 常量表达式 ; 例如: int A10; 定义一个有10个元素的整型数组A,每个元素的类型均为int同样合法的声明: float farr5; char carr80;,A,(未初始化),数组元素在内存中连续存放,每个元素占据着其类型规定长度的连续内存单元,其后紧跟着它的后继元素。,一维数组元素的引用,引用一维数组元素的语法形式: 数组名下标表达式 数组元素中,下标表达式的值必须是整数,第一个元素的下标是0 可以用任意表达式作为下标,动态决定访问哪个元素 for (i=0; iSIZE; i+) ai = 2 * i; 下标越界是大忌!

3、使用大于最大下标的下标,将访问数组以外的空间。那里的数据是未知的,可能带来严重后果 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);,一维数组的输入和输出,思考,随机生成20个两位整数/通过键盘任意输入20个整数/直接赋值,将其中的最大数和最小数的位置交换,再输出调整后的数组,

4、在声明数组的同时,可以指定数组元素的初值。 例如:int a10=0,1,2,3,4,5,6,7,8,9;,一维数组的初始化,int a10=0,1,2,3,4,5,6; int i; for(i=0;i10;i+) printf(“%d ”,ai);,可以只给一部分元素赋初值,这时必须明确指出总元素个数。未初始化的元素由系统自动初始化为0,若为字符型数组,未初始化的元素初始化为空。,一维数组的初始化,如果对全部数组元素赋初值,可省略数组元素个数。如: int a =1,2,3,4,5,int Frequency5 = 0, 0, 0, 0, 0; int Total5 = 0; int Ze

5、ro = 0; int Digits = 0, 1, 3, 4, 5, 6, 7, 8, 9; char Alphabet = a, b, c, d, e; Clock clocks10;,上机实验:当所赋初值多于所定义数组的元素个数时,将会怎样?,一维数组的初始化,数组定义后的初值仍然是随机数,一般需要我们来初始化 int a5 = 12, 34, 56 ,78 ,9 ; int a5 = 0 ; int a = 11, 22, 33, 44, 55 ; 数组大小最好用宏来定义,以适应未来可能的变化 #define SIZE 10int aSIZE; 数组大小定义好后,将永远不变,pp,二维

6、数组,二维数组的定义 二维数组的存储方式 二维数组的初始化 二维数组的输入输出 二维数组的引用,二维数组的定义,数据类型 数组名常量表达式1常量表达式2; 在逻辑上可以把二维数组看成一个有行和列的表格或矩阵,第一个下标说明行数,第二个下标说明列数。,int a23;说明了一个整型二维数组 a ,其中第一维有2个元素(0-2),每个元素又是有3个元素(0-2)的一维数组。数组的元素个数为6。,a0 a1,a,- a00 a01 a02,- a10 a11 a12,二维数组的存储结构,short int a23;,a10,a11,a12,a00,a01,a02,存放顺序:按行存放 先顺序存放第0行

7、的元素 再存放第1行的元素,将所有数据写在一个 内,按顺序赋值 例: int a22=1,2,3,4; /若初值多于元素个数,则出现语法错误 分行给二维数组赋初值 例: int a22= 1,2 , 3,4 ; /若所赋初值的行数或每行的元素数多于下标中说明的行数或列数,则出现语法错误。 在给出初始化数据的多维数组说明中,最多只能省略其第一维的大小。 int a 2= 1,2 , 3,4 ; 可以对部分元素赋初值 例如: int a22= 1 , 0 , 6 ; int b24=1,2,3;对部分元素初始化时,未被初始化的元素的初值为0,二维数组的初始化,16,可以通过赋初值来确定二维数组的行

8、数,但必须有确定的列数。 对于一维数组,可以在数组定义语句中省略方括号中的常量表达式,通过所赋初值的个数来确定数组的大小; 对于二维数组,只可以省略第一个方括号中的常量表达式,而不能省略第二个括号中的常量表达式。第一维的大小按以下规则决定: 当初值的个数能被第二维的常量表达式的值除尽时,第一维的大小=所得商数。 当初值的个数不能被第二维的常量表达式的值除尽时,则第一维的大小=所得的商数+1,通过赋初值定义二维数组的大小,上节课主要内容,一维数组的定义、引用及其初始化 二维数组的定义、引用及其初始化 一维数组的输入、输出 找一组数里的最大数、最小数算法,一维数组的定义、引用及初始化示例,题目:已

9、知有声明“int m=5,4,3,2,1,i=0;”,下列对m数组元素的引用中,错误的是_。 A.m+i B.m5 C.m2*2 D.mm4,以下能正确定义二维数组的是_A)int a3;B)int a3=2*3;C)int a3=;D)int a23=1,2,3,4; 以下能正确定义二维数组并正确赋值的语句是_A)int N =5,bNN;B)int a12=1,3;C)int a2=1,2,3,4;D)int a32=1,2,3,4;,二维数组的定义、引用及初始化示例,最大数、最小数算法的应用,随机生成20个两位整数/通过键盘任意输入20个整数/直接赋值,将其中的最大数和最小数的位置交换,

10、再输出调整后的数组 思路: 步骤1:先定义变量和数组 步骤2:生成20个随机数 步骤3:输出20个随机数 步骤3:找出最大数及其最小数的位置 步骤4:交换最大数及其最小数 步骤5:输出调整后的数组,总结,学习方法:用熟悉的知识来学习新知识! 数组操作的关键: 理解并掌握数组的定义、初始化 理解并掌握数组的引用。数组的操作一般是通过元素进行的,元素是通过下标访问的。 学会分析数据,从中找出待处理元素下标的变化规律 理解并掌握常用的算法(查找、排序、插入、删除、矩阵相关的),本节课的主要内容,二维数组的输入输出 排序算法(直接选择排序法、冒泡排序法、插入排序法) 查找算法(顺序查找法、折半查找法)

11、,二维数组的输入和输出,数组的输入和输出只能逐个对数组元素进行操作(字符数组例外),int a23,i,j;,矩阵,矩阵的转置 加减乘运算 半三角元素运算 求周边元素的和或平均值 主对角线、副对角线元素的处理(关键点:对下标的操作、下标的界限,对数组bbMM应注意M的奇偶性,对周边元素求值应注意不要多加四角元素) 提示:矩阵运算一般都是利用两个for循环来实现,外层循环变量代表矩阵的横坐标,内层循环变量代表矩阵的纵坐标,或者内层循环变量代表矩阵的横坐标,外层循环变量代表矩阵的纵坐标。在进行半三角元素运算及求周边元素的和或平均值时,要特别注意两个循环下标的范围。,例,初始化一个矩阵 int t3

12、4 = 1,2,3,4,2,3,4,5,3,4,5,6; 并将每个元素都输出,分别计算每一行的元素之和,并将和直接存放在每行的第一个元素中,输出各行元素的和。,思考,编写一个求一维数组最大数的函数GetMax()和一个求一维数组最小数的函数GetMin()数组通过参数传递。,max(i=0),max(i=2),max(i=3),计算最大值算法,例6.2 打印最高分,从键盘输入学生人数n; 从键盘输入所有学生的学号和成绩分别存入数组num和score 假设其中的一个学生成绩为最高 maxScore = score0; 对所有学生成绩进行比较,即 for (i=1; i maxScore 则修改m

13、axScore值为scorei 打印最高分maxScore,. main() . for (i=0; i maxScore) maxScore = scorei; printf(maxScore = %.0fn, maxScore); ,例6.2 打印最高分,. main() . for (i=0; i maxScore) maxScore = scorei; maxNum = numi; printf(maxScore = %.0f, maxNum = %ldn, maxScore, maxNum); ,例6.2 打印最高分及其学生序号,用函数实现?,#include #define ARR

14、_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; ,用函数实现打印最高分,本次课主要内容,字符输入/输出函数P51 字符串与字符数组 字符数组的初始化 字符数组的输入输出

15、字符串的输入输出,字符输入/输出函数,简单的字符输入输出函数P51-P53 格式化输入输出P60P63忽略输入修饰符P62scanf()的返回值是成功读入的数据项数P68 在%c前加空格:忽略空白符P66,字符串(String)与字符数组 P229,字符串 以0结尾的一串字符在C语言中被看作字符串 用双引号括起的一串字符是字符串常量 P24,C语言自动为其添加字符串结束符0(提示:0的ASCII码值为零) C语言并没有为字符串提供任何专门的表示法,完全使用字符数组和字符指针来处理 字符数组 每个元素都是字符类型的数组 char string80; 数组名代表_ ? _ 一维数组可以存放一个字符

16、串,二维字符数组可用于存放多个字符串 提示:字符串用字符数组存放,但字符数组存放的不一定是字符串!,零,字符数组的初始化 P230,用字符型数据对数组进行初始化 char str6 = C,h,i,n,a,0; 用字符串常量直接对数组初始化 char str6 = China; char str6 = China;,上节课主要内容,矩阵转置的算法 顺序查找算法 字符输入/输出函数 简单字符输入输出函数getchar函数、putchar函数 格式化字符输入输出函数scanf函数、printf函数 字符串与字符数组 字符数组的初始化 字符数组输入输出的部分内容,本节课的主要内容,课后作业:P152

17、P158 字符数组的输入输出 字符串处理函数 上次作业:统计数字字符09在字符串a中分别出现的次数。(思考:大写字母分别出现的次数?小写字母分别出现的次数?) 数组作为函数参数,逐字符输出,for (i=0; si!=0; i+) putchar(si); putchar(n);,格式化输入/输出,scanf(%s,s); printf(%s,s);,char s10;,字符数组的输入输出 P231,gets(s); puts(s);,输入输出函数,scanf(),char str10;scanf(%s, str); 不能读入带空格的字符串,gets()可以 这两种用法都不安全。当用户的输入多

18、于10个(含10个),str数组将越界 现场编程做试验 scanf被公认为最易遭到黑客攻击的函数之一,gets(),字符串输入函数gets()也没有提供限制输入字符串长度的方法,容易引起缓冲区溢出,给黑客攻击以可乘之机 对输入字符串长度有限制的函数调用 fgets(buf, sizeof (buf), stdin);,思考,1、从键盘任意输入5个学生的姓名,编程找出并输出按字典顺序排在最前面的学生姓名 (从键盘任意输入5个整数,编程找出并输出最小数 )思考:如何实现将排在最前面的学生姓名和排在最后的学生姓名交换?,字符串处理函数P233,在中定义了若干专门的字符串处理函数 strcpy: st

19、ring copy strcpy(目的字符串,源字符串); strlen: string length strlen(字符串); 返回字符串的实际长度,不包括0 strcat: string combination strcat(目的字符串,源字符串); strcmp: string comparison strcmp(字符串1,字符串2); 当出现第一对不相等的字符时,就由这两个字符决定所在字符串的大小 返回其ASCII码比较的结果值,字符串处理函数P233,str1 = str2; /*错误*/ strcpy(str1,str2); /*正确*/ if (str1 str2) /*错误*/

20、 if (strcmp(str1,str2) 0) /*正确*/,字符串不能直接整体赋值!也不能用关系运算符比较大小,#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

21、is:); puts(min); ,上节课的主要内容,课后作业:P152P158 统计数字字符09在字符串a中分别出现的次数。(思考:大写字母分别出现的次数?小写字母分别出现的次数?) 字符数组的输入输出 字符串处理函数,字符串处理函数,在中定义了若干专门的字符串处理函数 strcpy: string copy strcpy(目的字符串,源字符串); strlen: string length strlen(字符串); 返回字符串的实际长度,不包括0 strcat: string combination strcat(目的字符串,源字符串); strcmp: string comparison

22、 strcmp(字符串1,字符串2); 当出现第一对不相等的字符时,就由这两个字符决定所在字符串的大小 返回其ASCII码比较的结果值,字符串处理函数,str1 = str2; /*错误*/ strcpy(str1,str2); /*正确*/ if (str1 str2) /*错误*/ if (strcmp(str1,str2) 0) /*正确*/,字符串不能直接整体赋值!也不能用关系运算符比较大小,掌握字符串处理函数的关键,函数所在的头文件:string.h 函数名 函数功能 函数参数:均为要处理的字符串的首地址,本节课的主要内容,顺序查找算法 根据姓名查找指定学生的成绩(存储多个学生姓名的

23、数组以及成绩的数组) 交换5个学生姓名中,按字典顺序排在最前以及排在最后的学生的姓名,输出交换后的5个学生姓名 数组作为函数参数P208 排序算法(直接选择排序法、冒泡排序法、优化的冒泡排序法、插入排序法),数组作为函数参数,一维数组P208 数组元素作实参 数组名作实参 数组元素地址作实参(学指针时再介绍) 二维数组P221 数组元素作实参 数组名作实参 数组元素地址作实参(学指针时再介绍),数组元素作实参,数组元素实际上代表内存中的一个存储单元,故和普通变量一样,所以可以作为实参传送给形参,对应的形参必须是类型相同的变量。 思考:随机生成50个199的整数(50个数用数组表示),统计其中素

24、数的个数(素数用函数实现)。,简单变量和数组作函数参数的区别,数组名作实参,数组名是一个地址常量:C语言中,数组名中存放的是数组的起始地址(第一个元素的地址),且不可以给数组名重新赋值。 因为数组名是一个地址值,如果数组名作为实参,对应的形参应当是维数相同的数组或指针变量,且类型必须和实参数组类型相同。 把数组名作为实参,在被调用函数中可以对调用函数中对应的数组元素进行操作。,例6-2 使用数组名作为函数参数示例,设计一个函数rowsum,完成对一个二维数组的每一行求和功能,并将和放在每行的首元素中。 主函数中初始化一个二维数组,并输出其元素,调用函数rowsum,然后输出各行元素的和。,思考

25、,编程实现将整型数组a中的元素逆置(设数组a中有10个元素,值为:1、2、3、4、5、6、7、8、9、10, 逆置后,元素值为10、9、8、7、6、5、4、3、2、1) ,逆置算法用函数实现,简单变量和数组作函数参数的区别,向函数传递二维数组,实际传送的是指向数组第一个元素的地址 在声明二维数组形参时,不能省略数组第二维的长度?,上节课内容,数组作为函数参数 数组元素作为函数参数 数组名作为函数参数 排序算法,例6.8 计算每门课程的总分和平均分P225,void Total(int scoreCOURSE, int sum, float aver, int n) int i, j; for

26、(j=0; jCOURSE; j+) sumj = 0; for (i=0; in; i+) sumj = sumj + scoreij; averj = (float) sumj / n; ,可以省略数组第一维的长度 不能省略数组第二维的长度,排序(sorting),排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列。 在排序过程中需要完成两种基本操作: 比较两个数的大小 调整元素在序列中的位置,排序算法,交换法排序 选择法排序 冒泡排序法 插入排序,交换法排序,交换法排序,例:将84、83、88、87、61按降序排列 P207,例:将

27、84、83、88、87、61按降序排列,例:将84、83、88、87、61按降序排列,例:将84、83、88、87、61按降序排列,交换法排序(降序),交换法排序 for (i=0; i scorei) 交换成绩scorej和scorei, 交换学号numj和numi; ,选择法排序,k=1,k=2,k=0,k=1,选择法排序,k=3,k=4,k=3,k=4,选择法排序(降序) P213,选择法排序(降序),选择法排序(降序),选择法排序(降序),选择法排序 for (i=0; i scorek) 记录此轮比较中最高分的元素下标 k = j; if(k!=i) 交换成绩scorek和score

28、i, “交换学号numk和numi”; ,选择排序法(降序),从aian-1中找出最大数ak,与ai交换,冒泡排序法,第一趟:首先将第一个元素与第二个元素进行比较,若为逆序,则将两元素交换。然后比较第二、第三个元素,依次类推,直到第n-1和第n个元素进行了比较和交换。经过第一趟,最大的元素便被交换到第n个位置。 第二趟:对前n-1个元素进行第二趟起泡排序,将其中最大元素交换到第n-1个位置。 如此继续,直到某一趟排序未发生任何交换时,排序完毕。对n个元素的序列,起泡排序最多需要进行n-1趟。,第1轮:8483 88 87 61,冒泡排序:将84、83、88、87、61按升序排列,交换,8384

29、 88 87 61,不交换,8384 88 87 61,交换,8384 87 88 61,交换,8384 87 61 88,第2轮:8384 87 61 88,冒泡排序:将84、83、88、87、61按升序排列,不交换,8384 87 61,不交换,8384 87 61,交换,8384 61 87 88,第3轮:8384 61 87 88,冒泡排序:将84、83、88、87、61按升序排列,不交换,8384 61,交换,8361 84 87 88,第4轮: 8361 84 87 88,冒泡排序:将84、83、88、87、61按升序排列,交换,排序结果: 6183 84 87 88,冒泡排序(升

30、序),交换法排序 for (i=0; i scorej+1) 交换成绩scorej和scorei, 交换学号numj和numi; ,冒泡排序(升序),交换法排序 for (i=n-1; i0; i-) /下标为0i的元素为待排序的数据 for (j=0; j scorej+1) 交换成绩scorej和scorei, 交换学号numj和numi; ,冒泡排序的优化,int lastExchangeIndex; i = n-1; while (i 0) lastExchangeIndex = 0; for (j = 0; j i; j+) if (Aj+1 Aj) swap(Aj,Aj+1); l

31、astExchangeIndex=j; i=lastExchangeIndex; ,#include #define n 10 main() int an=3,5,7,9,1,15,24,13,19,2,i,j,t; enum statsorder,unorder; enum stats flag=unorder; i=n-1; while(i0 ,删除/插入算法,从数组a中删除下标为k的元素 从数组a中删除数x 将数x插入到有序(升序或降序)数组a中,使插入x后的数组仍有序 i=n; while(i0 ,插入法排序,在插入排序过程中,由于寻找插入位置的方法不同又可以分为不同的插入排序算法,这

32、里我们只介绍最简单的直接插入排序算法。,直接插入排序法思想,每一步将一个待排序元素按其关键字值的大小插入到已排序序列的适当位置上,直到待排序元素插入完为止。,初始状态: 5 4 10 20 12 3,直接插入排序法思想,for (i = 1; i 0 ,将元素ai插入到有序序列a0ai-1中,使插入后的序列a0ai仍有序,查找算法,顺序查找 折半查找,顺序查找,int Search(long a, int n, long x) int i; for (i=0; in; i+) if (ai = x) return (i); return (-1); ,哈,找到了!,折半查找,哈,找到了!,折半

33、查找,唉,没找到!,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); ,文曲星猜数游戏,由计算机随机生成一个各位相异的4位数字,由人来猜,每次提示:xAxB A前面的数字表示有几个数字猜对位置也对了 B前面的数字表示有几个数字猜对但位置不对 提示 用数组a存计算机随机生成的4位数 用数组b存入猜的

34、4位数 对a和b的相同位置的元素进行比较,得到A前面的数字 对a和b的不同位置的元素进行比较,得到B前面的数字,文曲星猜数游戏,随机生成一个各位相异的4位数字 srand(time(NULL); a0 = rand()%10; do a1 =rand()%10; while (a0 = a1 ); do a2 = rand()%10; while (a0 = a2 | a1 = a2); do a3 = rand()%10; while (a0 = a3 | a1 = a3 | a2 = a3);,文曲星猜数游戏,统计数字和位置都猜对的个数,对a和b的相同位置的元素进行比较,得到A前面的数字 right = 0; for (j=0; j4; j+) if (aj = bj) right = right + 1; ,j=0,j=1,j=2,j=3,a,b,文曲星猜数游戏

温馨提示

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

评论

0/150

提交评论