收藏 分享(赏)

C语言数组教案.ppt

上传人:ysd1539 文档编号:8147696 上传时间:2019-06-11 格式:PPT 页数:77 大小:1.21MB
下载 相关 举报
C语言数组教案.ppt_第1页
第1页 / 共77页
C语言数组教案.ppt_第2页
第2页 / 共77页
C语言数组教案.ppt_第3页
第3页 / 共77页
C语言数组教案.ppt_第4页
第4页 / 共77页
C语言数组教案.ppt_第5页
第5页 / 共77页
点击查看更多>>
资源描述

1、第五章 构造数据类型 -数组和结构体,计算机与信息技术学院 靳小燕,内 容 提 要,数组类型; 常用算法:排序、查找等;难点:二维数组应用 向函数传递一维数组和二维数组; 用字符数组存取字符串; 使用字符串处理函数处理字符串; 结构体。,5.1 数组概述 5.2 一维数组 5.3 一维数组应用 5.4 二维数组 5.5 数组作函数的参数 5.6 字符数组与字符串 5.7 结构体,练习,数学黑洞问题,取任意一个4位数(4个数字均为同一个数的除外),把四个数字对调后组成一个最大的数和一个最小的数,两数相减得出一个新数,重复以上过程,至多7次,就会得到6174,且不再变化。 例子:以7642为例:7

2、642-24675175;7551-15575994;9954-45995355;5553-35551998;9981-18998082;8820-02888532;8532-23586174;7641-14676174。,程序演示,运行结果:,5.1 数组概述,构造数据类型之一 定义:数组是有序数据的集合例如: int a30; 组成数组的数据称为数组的元素 数组的每个元素都属于同一个数据类型 每个数组要用一个统一的标识符标识 用处:保存大量同类型的相关数据 如矩阵运算,表格数据等 。,定义 引用 初始化 输入和输出 举例,5.2 一维数组,数据类型说明符 数组名常量表达式;,合法标识符,例

3、 int a6=1,3,5,7,9,11;,编译时分配连续内存 内存字节数=数组元素的个数*sizeof(元素数据类型),数组名表示内存首地址,是地址常量,常量表达式中可以包括 符号常量和符号常量, 不能包括变量。,定义,一维数组,引用,数组必须先定义,后使用 只能逐个引用数组元素 例如,定义数组 int a8,数组元素为:a2=1; ai+j;(i,j为整型变量),下标的值不要超过数组的范围。,注意,一维数组,例5.2-1 #include void main() int a = 1, c = 2, b5, i;printf(“%p,%p,%pn“,b,初始化初始化方式,在定义数组时,为数组

4、元素赋初值(在编译阶段使之得到初值),int a5=1,2,3,4,5;等价于:a0=1; a1=2; a4=5;,说明: 数组不初始化,其元素值为随机数 对static数组元素不赋初值,系统会自动赋以0值,当全部数组元素赋初值时,可不指定数组长度,如 int a5=6,2,3;等价于: a0=6; a1=2;a2=3; a3=0; a4=0;,static int a5; 等价于:a0=0; a1=0; a2=0; a3=0; a4=0;,只给部分数组元素赋初值,int a=1,2,3,4,5,6; 编译系统根据初值个数确定数组的大小,输入和输出,C语言规定,对数组的使用只能逐个引用数组元素

5、,不能一次引用整个数组。同样,对数组的输入和输出也是依次对每个元素进行的。 例 输入10个数,并将它们输出。,printf(“please enter the data:n“);for(i=0;i10;i+)scanf(“%d“,printf(“output the data:n“);for(i=0;i10;i+)printf(“%d “,arrayi);printf(“n“); ,输入,输出,定义,printf(“min=%dn“,min);,#include void main() int i,min,x10;,printf(“enter data:n“); for(i=0;i10;i+)

6、 scanf(“%d“, ,min=x0; for(i=1;i10;i+)if(ximin) min=xi;,输入,处理,输出,例5.2-2输入10个数,找出最小的算法: 1. 输入:for循环输入10个整数 2. 处理: (a) 先令min=x0 (b) 依次用xi和min比较(循环) 若ximin,令min=xi 3. 输出:min,应用举例,printf(“min=%d no=%dn“,min,no); return 0;,#include int main() int i,min,x10,no;,printf(“enter data:n“); for(i=0;i10;i+) scanf

7、(“%d“, ,min=x0; for(i=1;i10;i+)if(ximin) min=xi;no=i;,例5.2-3输入10个数,找出最小和下标。,算法1,有没有错误?,#include int main(void) int i, index, n;int a10; printf(“enter n: “); scanf(“%d“, ,算法2,例5.2-4 用数组求Fibonacci数列前20个数。,#include void main() int i;int f20=1,1;for(i=2;i20;i+)fi=fi-2+fi-1;for(i=0;i20;i+) if(i%5=0) prin

8、tf(“n“);printf(“%12d“,fi); ,排序 数据查找 数据统计分析,5.3 一维数组应用,排序 排序的方法很多,主要有:冒泡法选择法比较交换法希尔法插入法例5.3-1 用冒泡法对n个整数按从小到大的顺序排列。,冒泡法,排序过程: 比较第一个数与第二个数,若a0a1,则交换;然后比较第二个数与第三个数,若a1a2,则交换;依次类推,直至第n-1个数和第n个数比较为止。第一轮结束时,结果最大的数被安置在最后一个位置上。 对前n-1个数进行第二轮排序,结果使次大的数被安置在第n-1个元素位置 重复上述过程,共经过n-1趟冒泡排序后,排序结束; 算法的整体思路是让大的数不断地往下沉,

9、小的数不断地往上冒,所以叫“冒泡排序法”。,int a5 n=5a0 a1 a2 a3 a4 第一轮 21 13 90 32 -1,13 21 90 32 -1,13 21 32 90 -1,第二轮 ,13 21 90 32 -1,13 21 32 -1 90,#include #define N 5 void main() int aN , i , j , temp; printf(“请输入5个数:n“); for( i = 0 ; i N ; i+) scanf(“%d“, ,for( i=1; i aj+1 ) temp=aj; aj=aj+1;aj+1=temp; ,选择法:,基本思想

10、:将第一个元素与第二个到第n个中最小者ap交换(如果apa0),这时n个数中最小的数已调到最前面,这是第一轮的处理结果。依次类推,int a5 n=5a0 a1 a2 a3 a4 第一轮 21 13 90 32 -1,-1 13 90 32 21,第二轮,-1 13 90 32 21,for(i=0;iN-1;i+) p=i;for(j=i+1;jN;j+)if(ajap) p=j;if(p!=i)med=ap;ap=ai;ai=med;,#include #define N 5 void main() int aN,i ,j ,med,p,temp; printf(“请输入10个数:n“);

11、 for( i = 0 ; i N ; i+) scanf(“%d“, ,例5.3-2,例5.3-3 输入5个整数,将它们存入数组a中,再输入1个数x,然后在数组中查找x,如果找到,输出相应的下标,否则,输出“Not Found”。 输入:2 9 8 10 6 9 输出:1 输入:2 9 8 10 6 7 输出:Not Found,数据查找-线性查找,折半查找,#include int main( ) int i, flag, x;int a5; printf(“Enter 5 integers: “);for(i = 0; i 5; i+) scanf(“%d“, ,例5.3-4 折半查找,

12、基本思路是:对已排好序的数列, 先检索中间的一个数据,看它是 否为所需的数据,如果不是, 则判断要找的数据是在中间数的 哪一边 ,然后继续查找。,0,1,8,4,7,5,3,6,2,9,10,11,12,13,14,下标,#include #define N 50int main( ) void bi_search(int a,int n, int x); int i, x,n;int aN; printf(“Enter n: “); scanf(“%d“, ,void bi_search(int a,int n, int x) /函数定义 int mid, top, bot, find;to

13、p = 0; bot = n-1; find = 0;do mid =( top + bot ) / 2;if( x = amid ) printf(“找到了%3d,是 a%d“,x,mid);printf(“n“);find = 1; else if( x amid ) top = mid + 1; while( top = bot ,数据统计分析,在实际应用中,经常要对大量的数据进行统计、分析和分类等,下面将介绍用数组统计所搜集到的数据。例5.3-5 在某一次歌唱比赛中,20名评委给某个参赛选手打分,分数等级从110共10个等级,1表示最低,10表示最高,统计打分结果。,#include

14、#define N 20 void main() int i,j,k=0;int score20=1,2,6,4,10,9,8,3,4,6,7,8,9,5,9,7,8,7,8,5;int frequency11=0; /*存放统计结果*/for( i= 0; i N; i+) k= scorei; +frequencyk; /*进行统计*/ printf(“ 等级 频率”); for( j=1; j11;j+)printf(“%4d%12d n”, j, frequencyj”); ,二维数组的定义 二维数组的初始化 二维数组的引用 二维数组元素在内存中的排列顺序 应用举例,5.4 二维数组,

15、定义方式: 数据类型 数组名常量表达式常量表达式;,数组元素的存放顺序 内存是一维的 二维数组:按行存放,行数,列数,元素个数=行数*列数,二维数组理解,每个元素ai由包含4个元素 的一维数组组成,二维数组a是由3个元素组成,1,3,5,7,9,二维数组元素的引用 形式: 数组名下标下标 二维数组元素的初始化 int a23=1,2,3,4,5,6; int a23=1,2,3,4,5,6; int a23=1,2,4; int a23=1,4,5;,二维数组元素在内存中的排列顺序,按行存放二维数组的元素在数组中的排列顺序可以计算出来,设一个mn的数组a,数组元素aij 在数组中的排列顺序为i

16、n+j+1。 例如:34数组a,元素a22在数组的排列顺序为24+2+1=11即数组中的第11个元素。,例 5.4-1将一个2*3矩阵转置,应用举例,例5.4-2求二维数组中最大元素值及其行列号,#include void main() int a34=1,2,3,4,5,8,0,6,-1,2,-5,2;int i,j,row=0,colum=0,max;,printf(“max=%d,row=%d, colum=%dn“,max,row,colum); ,max=a00;for(i=0;imax) max=aij;row=i;colum=j;,#include #define MONTHS

17、12int main() int days2MONTHS = 31,28,31,30,31,30,31,31,30,31,30,31,31,29,31,30,31,30,31,31,30,31,30,31;int year, month;doprintf(“Input year,month:“);scanf(“%d,%d“, ,例5.4-3 输入某年某月,输出该年的该月有多少天?,练习 #include void main() int a55, i, j;for(i=0; ij) aij=i+j;else if (ij) aij=i-j;else aij=0;,for(i=0;i5;i+) f

18、or(j=0;j5;j+)printf(“%4d”,aij);printf(“n”);,0 -1 -2 -3 -4 0 -1 -2 -33 0 -1 -24 5 0 -1 4 5 6 7 0,5.5 数组作函数的参数,数组元素作为函数的实参数组名作为函数的参数,数组元素作为函数的实际参数,数组名表示数组在内存中存放的起始地址(首地址),即数组第一个元素的地址。 数组元素的引用与一般变量的引用是一样的,传递的是数组元素的值,属于“值传递”方式。 例5.5-1 设a4和b4分别保存了A班和B班四门课程的平均成绩,现要统计出A班有几门课程的平均成绩高于B班。(自学),int better(int a

19、ve1,int ave2) if(ave1ave2)return(1);else return(-1);,“值传递”,#inlcude void main( ) int i,k=0; int a4=56,88,89,98,b4=60,55,66,77;for(i=0;i0) k=k+1;printf(“A班有%d门课程的平均成绩高于B班n“,k);,C语言中的数组名表示数组在内存中存放的起始地址(首地址),也是第一个元素的地址。 数组名作为函数的参数传递的是数组的起始地址,属于“传地址”,是一种双向传递的方式。 例如: int a5; a 为首地址。,数组名作为函数的实际参数,例5.5-2 编

20、写函数,求5个学生英语课的平均成绩。,float pj(int b,int n) float ave,sum=0.0; int i;for(i=0;in;i+)sum=sum+bi;ave=sum/n;return(ave);,#include void main( ) float pj(int b,int n); int i,a5; float aver; printf(“ enter the datan“);for(i=0;i5;i+)scanf(“%d“, ,“地址传递”,65 93 74 82 81,a0 a1 a2 a3 a4,a0 a1 a2 a3 a4,b0 b1 b2 b3 b

21、4,65 93 74 82 81,开始,调用,起始地址 2000,起始地址 2000,练习:编写函数bubble(int b,int n)对n个整数进行从小到大排序,在主函数中输入n个数,调用函数bubble,将排序后的结果在主函数中输出。,#include #define N 20 void main() void bubble(int ,int) ; int aN,i; printf(tern:n“); scanf(“%d“,for(i=0; in; i+) printf(“%d “,ai); void bubble(int b,int n) for( i=1; i ;i+) for(j=

22、0;j ;j+)if( ) temp=bj; bj=bj+1;bj+1=temp; ,字符数组的定义及初始化用字符数组存放字符串字符串的输入输出用于字符串处理的函数应用举例,5.6 字符数组,定义char str20; 初始化 逐个为数组中各元素指定初值字符。 char str5 =w,e,l,l,0; 对一个字符数组指定一个字符串初值。char str =“morning“;char str =“ morning“;,定义及初始化,什么是字符串? 字符串是用一对双引号括起来的字符序列,这些字符可以是一般的可显示字符,也可以是某些特殊的控制字符; 无字符串变量,用字符数组处理字符串; 字符串结

23、束标志:0。 C语言中没有字符串变量,字符串存放在一个字符型数组中。因此为了存放字符串,常常在程序中定义字符数组。例如:char c10;,逐个字符I/O: %c整个字符串I/O: %s,#include void main() char str10;gets(str); puts(str); /也可用scanf(),但有限制,#include void main() char str10;int i; for(i=0;i5;i+)scanf(“%c”, ,scanf(),int i; scanf(“%d“, 不能读入带空格的字符串,gets()可以 这种用法很不安全。当用户的输入多于10个(

24、含10个),str数组将越界。 scanf被公认为最易遭到黑客攻击的函数之一,演示,gets(),字符串输入函数gets()也没有提供限制输入字符串长度的方法,容易引起缓冲区溢出,给黑客攻击以可乘之机。 对输入字符串长度有限制的函数调用 fgets(buf, sizeof (buf), stdin);,在中定义了若干专门的字符串处理函数 strcpy(str1, str2): 串复制 strlen(str): 串长度返回字符串的实际长度,不包括0 strcat(str1, str2): 串连接 strcmp(str1, str2): 串比较,字符串不能直接整体复制!,str1=str2 /*错

25、误*/,例如: char str112=“Turbo ”; char str2=“c+”;printf(“%s”, strcpy(str1,str2);输出结果: c+,例如: char str112=“Turbo ”; char str2=“c+”;printf(“%s”, strcat(str1,str2);输出结果: Turbo c+,例如: char str112=“Turbo C”; i=strlen(str1);printf(“%d”, i);输出结果: 7,功能:比较两个字符串 比较规则:对两串从左向右逐个字符比较(ASCII码),直到遇到不同字符或0为止 返值:返回int型整数

26、,a. 若字符串1 字符串2, 返回正整数c. 若字符串1= 字符串2, 返回零 说明:字符串比较不能用“=”,必须用strcmp,字符串比较函数 strcmp (字符串1,字符串2),例5.6-1 统计一行字符中字母、空格、数字及其他字符的个数#include void main() char str80;int alphabet=0,digit=0 ,space=0 , other=0, i=0;gets ( str ); for ( i = 0 ; stri != 0; i+ )if (A= 0) +digit;else +other; printf(“有%d个字母,%d个空格,%d个数

27、字,%d个其他字符:n”, alphabet, space, digit, other);,例5.6-2#includevoid main( )char str36=“China”,”Japan”,”Korea”;str05= ;printf(“%sn”,str0); ,str0,str1,str2,例5.6-3 按国名确定奥运会入场次序。,问题分析:一个国家名实际上就是一个字符串,可用一维数组来表示,而多个字符串就需要用二维字符数组来表示,因此为表示奥运参赛国的国名,可定义如下二维数组:char name15015,#include #include #define MAX_LEN 15 /

28、* 字符串最大长度 */ #define N 150 /* 字符串个数 */ void SortString(char strMAX_LEN, int n);int main() int i, n;char nameNMAX_LEN; /* 定义二维字符数组 */printf(“How many countries?“);scanf(“%d“,什么作用?,/* 函数功能:冒泡法实现字符串按字典顺序排序 */ void SortString(char strMAX_LEN, int n) int i, j;char tempMAX_LEN;for (i=0; i 0) strcpy(temp,s

29、trj); strcpy(strj,strj+1);strcpy(strj+1,temp); ,结构体类型的定义结构体变量的定义和引用结构体变量的初始化应用举例,5.7 结构体类型,构造一个结构体类的数据类型的一般形式:struct 结构类型名 类型标识符 成员名;类型标识符 成员名;:类型标识符 成员名;,例如:struct student char number10;char name20;char gender;int age;float score20;char addr30;,定义 先构造结构体类的数据类型,后定义具有这种构造的变量。struct 结构体类型名 类型标识符 成员名;:

30、类型标识符 成员名;变量名1,变量名2;,例如:struct student char number10;char name20;char gender;int age;float score20;char addr30;stud1,stud2;,引用对结构体变量的使用是通过对其成员的引用来实现的。引用结构体成员的一般形式如下:结构体变量名成员名例如 : stud1.age 其中的圆点符号称为成员运算符,它的运算级别最高。,struct stud long num; char name20;char gender;char addr30; stud1=9708,”Liwei“,F,“144Be

31、ijingRoad”;,#include struct studentchar name20; float s3; float ave;stu3=“li”, 70,80,90,0, “wang”,83,94,75,0, “zhang”,92,86,89,0;void main ( )int i;for ( i=0; i3; i+)stui.ave=(stui.s0+ stui.s1+ stui.s2)/3;printf(“%s,%5.2fn”, stui.name, stui.ave); 输出结果是 。,li,80.00wang,83.00zhang,89.00,例5.7-1 输入3个学生的信

32、息并输出。 #include #include struct stud long num;char name20;char gender;int age;float score;,#include #include void main() struct stud student3; int i; char ch; char numstr20;for( i = 0 ; i 3 ; i+) /*输入*/ printf(“n输入第%d个学生的数据:n“,i);gets(numstr);studenti.num = atol(numstr);gets(studenti.name);studenti.g

33、ender = getchar();ch = getchar(); gets(numstr); studenti.age = atoi(numstr); gets(numstr); studenti.score = atof(numstr); ,printf(“nnumtname gender age scoren“);for( i = 0 ; i 3 ; i+) printf(“%ld%-15s%3c%6d %6.2fn“,studenti.num, studenti.name,studenti.gender,studenti.age, studenti.score); ,小技巧,数 值 转

34、 换 函 数,练习题,1. #include void main( ) int a33, i, j;for ( i=0; i3; i+ )for ( j=0; j3; j+ )aij = i+j+1;for ( i=0; i2; i+ )for ( j=0; j2; j+ )ai+1j+1 += aij;printf (“%dn“, aij); 程序结果是,9,2. #include #define N 5 void main() int yNN, i,j; for(i=0;iN;i+) yii=1;yi0=1; for (i=2;iN;i+) for(j=1;ji;j+) yij=yi-1j

35、-1+yi-1j;printf(“杨辉三角:n“);for (i=0;iN;i+) for (j=0;j=i;j+)printf(“%6d“,yij);printf(“n“); ,11 1 2 1 1 3 3 1 1 4 6 4 1,杨辉三角,#include #define N 5 void main() void setdata(int N,int); void outdata(int N,int); int y NN; setdata (y,5); outdata (y,5); ,void setdata(int sN,int n) int i,j;for(i=0;iN;i+) sii=

36、1; si0=1;for (i=2;iN;i+) for(j=1;ji;j+) sij=si-1j-1+si-1j; ,void outdata (int sN,int n) int i,j; printf(“yanghui:n“);for (i=0;iN;i+) for (j=0;j=i;j+)printf(“%6d“,sij);printf(“n“); ,杨辉三角,3.程序读入20个整数,统计非负数个数,并计算非负数之和。 void main ( ) int i, a20, s, count;s=count=0;for ( i=0; i20; i+ )scanf(“%d“, _ _);for ( i=0; i20; i+ ) if ( ai0 )_;s += ai;count+;printf (“s=%dt count=%dn“, s, count);,这一章我们学习了,数组下标不能超界;数组元素在内存中的存放; 了解了在什么情况下使用数组这种数据类型; 向函数传递一维数组和二维数组的方法; 用数组名作为函数参数和用简单变量作为函数参数的不同之处 。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报