已阅读5页,还剩90页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章 数组,C语言大学实用教程,如何计算一个班级学生的平均分数? 如何记录直线上的整数点? 比如(0,0)、(1、1)、(2、2)、(3、3)、(4、4)、(5、5)。,数组,问题:给一组数排序,这组 数该 如何存放呢,? 这些数据如何存放才便于排序,1,8,8,8,8,8,8,8,8,8,8,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,8,8,8,8,8,8,8,8,8,8,第6章 数组,数组,内容提要,数组类型; 向函数传递一维数组和二维数组; 常用算法:排序、查找、求最大最小值等; 用字符数组存取字符串; 使用字符串处理函数处理字符串,数组的用处,保存大量同类型的相关数据 如矩阵运算,表格数据等,构造数据类型之一 数组:有序数据的集合,用数组名标识 元素:属同一数据类型,用数组名和下标确定,6.1 一维数组 一维数组的定义: 数据类型 数组名常量或常量表达式;,合法标识符,表示元素个数 下标从0开始,例 int a6;,编译时分配连续内存 内存字节数 =数组定义的元素个数*sizeof(元素数据类型),数组名表示内存首地址, 是地址常量,一维数组的引用 数组必须先定义,后使用 只能逐个引用数组元素,不能一次引用整个数组 数组元素表示形式: 数组名下标 其中:下标可以是整型常量或整型表达式 以0开始,到n-1结束,例 int a10; printf(“%d”,a); () 必须 for(j=0;j10;j+) printf(“%dt”,aj); (),例 int data5; data5=10; /C语言对数组不作越界检查,使用时要 注意 下标越界是大忌! 使用大于最大下标的下标,将访问数组以外的空间。那里的数据是未知的,可能带来严重后果,数组的定义与初始化,数组定义后的初值仍然是随机数,一般需要我们来初始化 int a5 = 12, 34, 56 ,78 ,9 ; int a5 = 0 ; int a = 11, 22, 33, 44, 55 ; 数组大小最好用宏来定义,以适应未来可能的变化 #define SIZE 10 int aSIZE; 数组大小定义好后,将永远不变,一维数组的初始化 初始化方式,在定义数组时,为数组元素赋初值 (在编译阶段使之得到初值),int a5=1,2,3,4,5; 等价于:a0=1; a1=2; a2=3; a3=4; a4=5;,说明: 数组不初始化,其元素值为随机数 对static数组元素不赋初值,系统会自动赋以0值,当全部数组元素赋初值时,可不指定数组长度,如 int a5=6,2,3; 等价于: a0=6; a1=2;a2=3; a3=0; a4=0; 如 int a3=6,2,3,5,1; (),static int a5; 等价于:a0=0; a1=0; a2=0; a3=0; a4=0;,只给部分数组元素赋初值,int a=1,2,3,4,5,6; 编译系统根据初值个数确定数组元素个数, float a0; /* 数组大小为0没有意义 */ int b(2)(3); /* 不能使用圆括号 */ int k, ak; /* 不能用变量说明数组大小*/,数组说明中其他常见的错误,数组的特点,快速地随机访问 一旦定义,不能改变大小,只能逐个对数组元素进行操作(字符数组例外),输入方法:,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);,一维数组的输入和输出,程序举例,例 将10个整数存入数组,并打印输出。,#include #define SIZE 10 main() int xSIZE=0,1,2,3,4,5,6,7,8,9; int i; for(i=0;iSIZE;i+) printf(“%d “,xi); ,#include #define SIZE 10 main() int xSIZE,i; printf(“Enter 10 integers:n“); for(i=0;iSIZE;i+) scanf(“%d“, ,程序举例,例 读10个整数存入数组,找出其中最大值和最小值,步骤: 1. 输入:for循环输入10个整数 2. 处理: (a) 先令max=min=x0 (b) 依次用xi和max,min比较(循环) 若maxxi,令min=xi 3. 输出:max和min,#include #define SIZE 10 main() int xSIZE,i,max,min; printf(“Enter 10 integers:n“); for(i=0;ixi) min=xi; printf(“Maximum value is %dn“,max); printf(“Minimum value is %dn“,min); ,文曲星猜数游戏,由计算机随机生成一个各位相异的4位数字,由人来猜,每次提示:xAxB A前面的数字表示有几个数字猜对位置也对了 B前面的数字表示有几个数字猜对但位置不对 提示 用数组a存计算机随机生成的4位数 用数组b存人猜的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,文曲星猜数游戏,统计人猜对的数字个数,对a和b的不同位置的元素进行比较,得到B前面的数字 good = 0; for (j=0; j4; j+) for (k=0; k4; k+) if (ak = bj ) good = good + 1; good = good - right;,k=0,k=1,k=2,k=3,j=0,a,b,j=1,餐饮服务质量调查打分,有40个学生被邀请给自助餐厅的食品和服务质量打分(110等级),统计调查结果,并用*打印如下形式的统计结果直方图 Grade Count Histogram 1 5 * 2 10 * 3 7 * .,餐饮服务质量调查打分,提示 定义数组score存放打的分数 定义数组count为计数器(count0不用) 计算统计结果:设置一个循环,依次检查数组元素值scorei,是1则将数组元素count1加1,是2则将数组元素count2加1,依此类推 for (i=0; iSTUDENTS; i+) countscorei +; 打印统计结果,设置一个循环,按count数组元素的值,打印相应个数的符号*,例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 打印出最高分及其学生序号,从键盘输入信管1班学生高数成绩(每班最多不超过45人,具体人数由键盘输入),试编程输出最高分及其学生序号。,max(i=0),max(i=2),max(i=3),计算最大值算法,Step1 从键盘输入学生人数n; Step2 从键盘输入所有学生的学号和成绩分别存入数组num和score Step3 假设其中的一个学生成绩为最高,同时记录其学号,即令 maxScore = score0 maxNum = num0; Step4 对所有学生成绩进行比较,即 for (i=0; i maxScore, 则修改maxScore值为scorei, 并记录其学号maxNum = numi; Step5 打印最高分maxScore及其学号maxNum。,例6.2 算法, 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_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; ,现场编程 用函数实现打印最高分,数组名作函数参数 P174-6.3,传递整个数组到另一个函数内,可以将数组的首地址作为参数传过去 用数组名作为函数参数 只拷贝一个地址自然比拷贝全部数据效率高 由于首地址相同,故实参数组与形参数组占用同一段内存 在该函数内,不仅可以读这个数组的元素,还可以修改它们,简单变量和数组作函数参数的区别,用数组名作函数参数时,此时形参应当用数组名或用指针变量 。,例-L函数地址传递.c 有一个一维数组score,内放3个学生成绩,求平均成绩。,#include float average(float array3); /* 函数声明 */ void main() float score3,aver; int i; printf(“input 3 scores:n“); for(i=0;i3;i+) scanf(“%f“, ,float average (float array3) int i; float aver,sum=0; for(i=0;i3;i+) sum=sum+arrayi; aver=sum/3.0; return aver; ,运行情况如下:,长度可以不声明吗? P174-175,作业,P198 6.4,现场演示排序算法,交换法排序 选择法排序,交换法排序,第一轮后,交换法排序,第二轮后,第三轮后,交换法排序,交换法排序 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,选择法排序,选择法排序 for (i=0; i scorek) 记录此轮比较中最高分的元素下标 k = j; 若k中记录的最大数不在位置i,则 “交换成绩scorek和scorei“, “交换学号numk和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); ,排序&查找作业,作业: 1. 请将从键盘输入的5个整数,从大到小排列后输出到屏幕。 2.从键盘随便输入的5个整数存储到数组a中,将这5个数中最大数的下标输出到屏幕。,二维数组的定义和引用,二维数组定义的一般形式为 类型说明符 数组名常量表达式常量表达式; 例如:定义a为34(3行4列)的数组,b为510(5行10列)的数组。如下: float a34,b510;,不能写成 float a3,4,b5,10;,二维数组的定义,二维数组中的元素在内存中的排列顺序是:按行存放,即先顺序存放第一行的元素,再存放第二行的元素,一维数组在内存中的存放,下图表示对a34数组存放的顺序,地址 值 数组元素,b00 b01 b02 b10 b11 b12 b20 b21 b22,3000H 3002H 3004H 3006H 3008H 300AH 300CH 300EH 3010H,例如:整型数组 b33= 1,2,3, 4,5,6, 7,8,9 ;,1 2 3,4 5 6,789,二维数组元素的表示形式为:数组名下标下标 例如: a23 下标可以是整型表达式,如 a2-12*2-1,数组元素可以出现在表达式中,也可以被赋值,例如:b12=a23/2,二维数组的引用,常出现的错误有: int a34; /* 定义a为34的数组 */ a34=3;,在使用数组元素时,应该注意下标值应在已定义的数组大小的范围内。,可以用下面4种方法对二维数组初始化,数据类型 数组名 常量表达式1常量表达式2 初始化数据 ;,(1) 分行给二维数组赋初值。如: int a34=1,2,3,4,5,6,7,8,9,10,11,12;,(2) 可以将所有数据写在一个花括弧内,按数组排列的顺序对各元素赋初值。如: int a34=1,2,3,4,5,6,7,8,9,10,11,12;,二维数组的引用,(3) 可以对部分元素赋初值。如 int a34=1,5,9;,1 0 0 0 5 0 0 0 9 0 0 0,也可以对各行中的某一元素赋初值,如 int a34=1,0,6,0,0,0,11;,1 0 0 0 0 6 0 0 0 0 0 11,1 0 0 0 5 6 0 0 0 0 0 0,也可以只对某几行元素赋初值。如: int a34=1,5,6;,(4)如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。如: int a34=1,2,3,4,5,6,7,8,9,10,11,12;它等价于:int a4=1,2,3,4,5,6,7,8,9,10,11,12;,在定义时也可以只对部分元素赋初值而省略第一维的长度,但应分行赋初值。如:int a4=0,0,3,0,10;,0 0 3 0 0 0 0 0 0 10 0 0, 7.2.3二维数组的引用,二维数组的输入和输出,数组的输入和输出只能逐个对数组元素进行操作(字符数组例外),int b23,i,j;,二维数组程序举例,例kw1 将一个二维数组行和列元素互换,存到另一个 二维数组中。,#include void main() int a23=1,2,3,4,5,6; int b32,i,j; printf(“array a:n“); for (i=0;i=1;i+) for (j=0;j=2;j+) printf(“%5d“,aij);/*打印输出矩阵a的元素,先行后列*/ bji=aij;/*给矩阵b赋值*/ printf(“n“);/*下一行输出前,先换行*/ ,printf(“array b:n“); for (i=0;i=2;i+) for(j=0;j=1;j+) printf(“%5d“,bij);/*打印输出矩阵b的元素,先行后列*/ printf(“n“); /*程序结束*/,运行结果如下: array a: 1 2 3 4 5 6 array b: 1 4 2 5 3 6,例kw2: 有一个34的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。,先用N-S流程图表示算法 ,如下:,二维数组程序举例,+1,+1,#include void main() int i,j,row=0,colum=0,max; int a34=1,2,3,4,9,8,7,6,-10,10,-5,2; max=a00; for (i=0;imax) max=aij; /*最大值为当前值*/ row=i+1; /*记录行、列号*/ colum=j+1; printf(“max=%d,row=%d,colum=%dn“,max,row,colum); /*程序结束*/,6.4 向函数传递二维数组,实际传送的是指向数组第一个元素的地址 在声明二维数组形参时,不能省略数组第二维的长度,为什么?,例6.8 计算每门课程的总分和平均分,void Total(int scoreCOURSE, int sum, float aver, int n) int i, j; for (j=0; jCOURSE; j+) sumj = 0; for (i=0; in; i+) sumj = sumj + scoreij; averj = (float) sumj / n; ,可以省略数组第一维的长度 不能省略数组第二维的长度,6.5 字符数组,字符 char 字符串,字符串(String)与字符数组,字符串 一串以0结尾的字符在C语言中被看作字符串 用双引号括起的一串字符是字符串常量,C语言自动为其添加0终结符 C语言并没有为字符串提供任何专门的表示法,完全使用字符数组和字符指针来处理 字符数组 每个元素都是字符类型的数组 char string80;,字符数组的初始化 P188,用字符型数据对数组进行初始化 char str6 = C,h,i,n,a,0; 字符数组长度为6,但字符串实际长度为5 char str6 = C,h,i,n,a; 用字符串常量直接对数组初始化 char str6 = “China“; char str6 = “China“; char str = “China“; char str = “China“; char str5 = “China“; 长度不够,无法按照字符串来处理,结尾不是0 不是字符串!,0作为字符串结束符的天生缺陷,假若交给这些字符串处理函数的字符串没有0会如何? 0很关键,如果没有,那么这些处理函数会一直进行处理直到遇到一个0为止。此时可能已经把内存弄得乱七八糟 ANSI C定义了一些“n族”字符处理函数,包括strncpy、strncat、strncmp等,通过增加一个参数来限制处理的最大长度,例kw3 字符数组的输出,#include #include #define ARRA_SIZE 4 /*字符串最大长度*/ main(void) int n; char strARRA_SIZE=a,b,c, minARRA_SIZE; printf(“%sn“,str); for (n=0; strn!=0; n+) printf(“%c”,strn); /*每次输出一个字符串*/ printf(“n“); ,把4改成3看看输出结果, 字符数组, 字符数组的输入输出,字符数组的输入输出可以有两种方法:,逐个字符输入输出。用格式符“%c”输入或输出一个字符。 将整个字符串一次输入或输出。用“%s”格式符,意思是对字符串的输入输出。,在内存中数组c的状态,逐个输入输出,for (i=0; si!=0; i+) putchar(si); putchar(n);,一次性输入输出,scanf(“%s“,s); printf(“%s“,s);,char s10;,字符数组的输入输出,gets(“%s“,s); puts(“%s“,s);,如果利用一个scanf函数输入多个字符串,则在输入时以空格分隔(scanf函数遇空格、回车、制表符结束)。例如: char str15,str25,str35; scanf(%s%s%s,str1,str2,str3); 输入数据: How are you? 数组中未被赋值的元素的值自动置0。,scanf(%s,str1); 输入: How are you? 数组str1中的字符串为“how”,而不是“How are you? ”,str1: str2: str3:,puts() /gets()字符串处理函数,在C的函数库中提供了一些用来处理字符串的函数,使用方便。几乎所有版本的C编译系统都提供这些函数。下面介绍几种常用的函数。,1. puts函数 其一般形式为: puts (字符数组) 其作用是将一个字符串(以0结束的字符序列)输出到终端。假如已定义str是一个字符数组名,且该数组已被初始化为“China“。则执行puts(str);其结果是在终端上输出China。 由于可以用printf函数输出字符串,因此puts函数用的不多。,用puts函数输出的字符串中可以包含转义字符。例如: char str=ChinanBeijing; puts(str); 输出结果: China Beijing,同时,在输出时,将字符串 结束标志0 转换成n, 即输出完字符串后换行。,2. gets函数 其一般形式为:gets(字符数组) 其作用是从终端输入一个字符串到字符数组,函数值返回值为字符串的首地址。该函数值是字符数组的起始地址。如执行下面的函数: gets(str); 可以输入空格! 从键盘输入: Computer,将输入的字符串“Computer“送给字符数组str(请注意送给数组的共有9个字符,而不是8个字符。 注意:用puts和gets函数只能输入或输出一个字符串,不能写成 puts(str1,str2) 或 gets(str1,str2),scanf(),int i; scanf(“%d“, 不能读入带空格的字符串,gets()可以 这种用法很不安全。当用户的输入多于10个(含10个),str数组将越界 scanf被公认为最易遭到黑客攻击的函数之一,gets(),字符串输入函数gets()也没有提供限制输入字符串长度的方法,容易引起缓冲区溢出,给黑客攻击以可乘之机 对输入字符串长度有限制的函数调用 fgets(buf, sizeof (buf), stdin);,字符串处理函数,在中定义了若干专门的字符串处理函数 strcpy: string copy 字符串2复制到字符数组1中,应确保字符串数组1足够大 strlen: string length 返回字符串的实际长度,不包括0 strcat: string combination 字符串2连接到字符数组1的字符串后面,结果存在字符串数组1中 strcmp: string comparison 当出现第一对不相等的字符时,就由这两个字符决定所在字符串的大小,赋值运算符“=”不能用于字符串赋值!,str1=str2 /*错误*/,str1=str2 /*错误*/,字符串不能用关系运算符比较大小!,if(str1str2) /*错误*/,1. strcat函数 其一般形式为:strcat(字符数组1,字符数组2) Strcat的作用是连接两个字符数组中的字符串,把字符串2接到字符串1的后面,结果放在字符数组1中,函数调用后得到一个函数值字符数组1的地址。,例如: char str130=Peoples Republic of ; char str2=China; printf(%s,strcat(str1,str2); 或printf(%s,str1); 输出: Peoples Republic of China,2. strcpy函数 其一般形式为:strcpy(字符数组1,字符串2) strcpy是“字符串复制函数”。作用是将字符串2复制到字符数组1中去。例如: char str110,str2=China; strcpy(str1,str2);,str1:,1.字符数组1必须定义得足够大,以便容纳被复制的字符串。字符数组1的长度不应小于字符串2的长度。,2.“字符数组1”必须写成数组名形式(如str1),“字符串2”可以是字符数组名,也可以是一个字符串常量。如strcpy(str1,China);,3.复制时连同字符串后面的0一起复制到字符数组1中。,4.可以用strcpy函数将字符串2中前面若干个字符复制到字符数组1中去。例如:strcpy(str1,str2,2); 作用是将str2中前面2个字符复制到str1中去,然后再加一个0。,5.不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组。如下面两行都是不合法的: str1=China; str1=str2; 而只能用strcpy函数将一个字符串复制到另一个字符数组中去。用赋值语句只能将一个字符赋给一个字符型变量或字符数组元素。如下面是合法的: char a5,c1,c2; c1=A; c2=B; a0=C; a1=h; a2=i; a3=n; a4=a;,3. strcmp函数 其一般形式为:strcmp(字符串1,字符串2) strcmp的作用是比较字符串1和字符串2。 例如:strcmp(str1,str2); strcmp(China,Korea); strcmp(str1,Beijing);,“A“A“, “computer“compare“, “36+
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年教学电子白板行业分析报告及未来发展趋势预测
- 2025年乙二醇丁醚(化白水)行业分析报告及未来发展趋势预测
- 2025年速冻汤圆行业分析报告及未来发展趋势预测
- 2025年一氯频那酮行业分析报告及未来发展趋势预测
- 2025年养生行业分析报告及未来发展趋势预测
- 2025年锂电隔膜行业分析报告及未来发展趋势预测
- 2025年运动控制行业分析报告及未来发展趋势预测
- 2025年氯酸钾行业分析报告及未来发展趋势预测
- 2025年百分表的考试试题及答案
- 2025年宠物驱虫类考试题及答案
- 交通银行测评题库答案大全
- 矿山合规与法律风险防控
- 夜班管理中的质量控制和监督措施
- 钼评估项目可行性研究报告
- JCT2460-2018 预制钢筋混凝土化粪池
- 2019火灾自动报警系统施工及验收标准
- 安徽东昇木业股份有限公司年产80000m3中(高)密度纤维板技改项目环境影响报告表
- 乳糜泻:诊断与治疗指南
- 型糖尿病病程记录模板
- 铁路专用线建设工程竣工备案材料
- 中南大学湘雅二医院神经外科重点专科申报书内容
评论
0/150
提交评论