《C语言数组教案》PPT课件.ppt

上传人:za****8 文档编号:13335689 上传时间:2020-06-15 格式:PPT 页数:77 大小:1.21MB
返回 下载 相关 举报
《C语言数组教案》PPT课件.ppt_第1页
第1页 / 共77页
《C语言数组教案》PPT课件.ppt_第2页
第2页 / 共77页
《C语言数组教案》PPT课件.ppt_第3页
第3页 / 共77页
点击查看更多>>
资源描述
第五章构造数据类型-数组和结构体,计算机与信息技术学院靳小燕,内容提要,数组类型;常用算法:排序、查找等;难点:二维数组应用向函数传递一维数组和二维数组;用字符数组存取字符串;使用字符串处理函数处理字符串;结构体。,5.1数组概述5.2一维数组5.3一维数组应用5.4二维数组5.5数组作函数的参数5.6字符数组与字符串5.7结构体,练习,数学黑洞问题,取任意一个4位数(4个数字均为同一个数的除外),把四个数字对调后组成一个最大的数和一个最小的数,两数相减得出一个新数,重复以上过程,至多7次,就会得到6174,且不再变化。例子:以7642为例:7642-24675175;7551-15575994;9954-45995355;5553-35551998;9981-18998082;8820-02888532;8532-23586174;7641-14676174。,程序演示,运行结果:,5.1数组概述,构造数据类型之一定义:数组是有序数据的集合例如:inta30;组成数组的数据称为数组的元素数组的每个元素都属于同一个数据类型每个数组要用一个统一的标识符标识用处:保存大量同类型的相关数据如矩阵运算,表格数据等。,定义引用初始化输入和输出举例,5.2一维数组,数据类型说明符数组名常量表达式;,合法标识符,例inta6=1,3,5,7,9,11;,编译时分配连续内存内存字节数=数组元素的个数*sizeof(元素数据类型),数组名表示内存首地址,是地址常量,常量表达式中可以包括符号常量和符号常量,不能包括变量。,定义,一维数组,引用,数组必须先定义,后使用只能逐个引用数组元素例如,定义数组inta8,数组元素为:a2=1;ai+j;(i,j为整型变量),下标的值不要超过数组的范围。,注意,一维数组,例5.2-1#includevoidmain()inta=1,c=2,b5,i;printf(%p,%p,%pn,b,初始化初始化方式,在定义数组时,为数组元素赋初值(在编译阶段使之得到初值),inta5=1,2,3,4,5;等价于:a0=1;a1=2;.a4=5;,说明:数组不初始化,其元素值为随机数对static数组元素不赋初值,系统会自动赋以0值,当全部数组元素赋初值时,可不指定数组长度,如inta5=6,2,3;等价于:a0=6;a1=2;a2=3;a3=0;a4=0;,staticinta5;等价于:a0=0;a1=0;a2=0;a3=0;a4=0;,只给部分数组元素赋初值,inta=1,2,3,4,5,6;编译系统根据初值个数确定数组的大小,输入和输出,C语言规定,对数组的使用只能逐个引用数组元素,不能一次引用整个数组。同样,对数组的输入和输出也是依次对每个元素进行的。例输入10个数,并将它们输出。,printf(pleaseenterthedata:n);for(i=0;i10;i+)scanf(%d,printf(outputthedata:n);for(i=0;i10;i+)printf(%d,arrayi);printf(n);,输入,输出,定义,printf(min=%dn,min);,#includevoidmain()inti,min,x10;,printf(enterdata:n);for(i=0;i10;i+)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=xi3.输出:min,应用举例,printf(min=%dno=%dn,min,no);return0;,#includeintmain()inti,min,x10,no;,printf(enterdata:n);for(i=0;i10;i+)scanf(%d,min=x0;for(i=1;i10;i+)if(ximin)min=xi;no=i;,例5.2-3输入10个数,找出最小和下标。,算法1,有没有错误?,#includeintmain(void)inti,index,n;inta10;printf(“entern:);scanf(%d,算法2,例5.2-4用数组求Fibonacci数列前20个数。,#includevoidmain()inti;intf20=1,1;for(i=2;ia2,则交换;依次类推,直至第n-1个数和第n个数比较为止。第一轮结束时,结果最大的数被安置在最后一个位置上。对前n-1个数进行第二轮排序,结果使次大的数被安置在第n-1个元素位置重复上述过程,共经过n-1趟冒泡排序后,排序结束;算法的整体思路是让大的数不断地往下沉,小的数不断地往上冒,所以叫“冒泡排序法”。,inta5n=5a0a1a2a3a4第一轮21139032-1,13219032-1,13213290-1,第二轮.,13219032-1,132132-190,#include#defineN5voidmain()intaN,i,j,temp;printf(请输入5个数:n);for(i=0;iN;i+)scanf(%d,for(i=1;iaj+1)temp=aj;aj=aj+1;aj+1=temp;,选择法:,基本思想:将第一个元素与第二个到第n个中最小者ap交换(如果apa0),这时n个数中最小的数已调到最前面,这是第一轮的处理结果。依次类推,inta5n=5a0a1a2a3a4第一轮21139032-1,-113903221,第二轮,-113903221,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#defineN5voidmain()intaN,i,j,med,p,temp;printf(请输入10个数:n);for(i=0;iN;i+)scanf(%d,例5.3-2,例5.3-3输入5个整数,将它们存入数组a中,再输入1个数x,然后在数组中查找x,如果找到,输出相应的下标,否则,输出“NotFound”。输入:2981069输出:1输入:2981067输出:NotFound,数据查找-线性查找,折半查找,#includeintmain()inti,flag,x;inta5;printf(“Enter5integers:);for(i=0;i5;i+)scanf(%d,例5.3-4折半查找,基本思路是:对已排好序的数列,先检索中间的一个数据,看它是否为所需的数据,如果不是,则判断要找的数据是在中间数的哪一边,然后继续查找。,0,1,8,4,7,5,3,6,2,9,10,11,12,13,14,下标,#include#defineN50intmain()voidbi_search(inta,intn,intx);inti,x,n;intaN;printf(“Entern:);scanf(%d,voidbi_search(inta,intn,intx)/函数定义intmid,top,bot,find;top=0;bot=n-1;find=0;domid=(top+bot)/2;if(x=amid)printf(找到了%3d,是a%d,x,mid);printf(n);find=1;elseif(xamid)top=mid+1;while(top=bot,数据统计分析,在实际应用中,经常要对大量的数据进行统计、分析和分类等,下面将介绍用数组统计所搜集到的数据。例5.3-5在某一次歌唱比赛中,20名评委给某个参赛选手打分,分数等级从110共10个等级,1表示最低,10表示最高,统计打分结果。,#include#defineN20voidmain()inti,j,k=0;intscore20=1,2,6,4,10,9,8,3,4,6,7,8,9,5,9,7,8,7,8,5;intfrequency11=0;/*存放统计结果*/for(i=0;iN;i+)k=scorei;+frequencyk;/*进行统计*/printf(“等级频率”);for(j=1;j11;j+)printf(“%4d%12dn”,j,frequencyj”);,二维数组的定义二维数组的初始化二维数组的引用二维数组元素在内存中的排列顺序应用举例,5.4二维数组,定义方式:数据类型数组名常量表达式常量表达式;,数组元素的存放顺序内存是一维的二维数组:按行存放,行数,列数,元素个数=行数*列数,二维数组理解,每个元素ai由包含4个元素的一维数组组成,二维数组a是由3个元素组成,1,3,5,7,9,二维数组元素的引用形式:数组名下标下标二维数组元素的初始化inta23=1,2,3,4,5,6;inta23=1,2,3,4,5,6;inta23=1,2,4;inta23=1,4,5;,二维数组元素在内存中的排列顺序,按行存放二维数组的元素在数组中的排列顺序可以计算出来,设一个mn的数组a,数组元素aij在数组中的排列顺序为in+j+1。例如:34数组a,元素a22在数组的排列顺序为24+2+1=11即数组中的第11个元素。,例5.4-1将一个2*3矩阵转置,应用举例,例5.4-2求二维数组中最大元素值及其行列号,#includevoidmain()inta34=1,2,3,4,5,8,0,6,-1,2,-5,2;inti,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#defineMONTHS12intmain()intdays2MONTHS=31,28,31,30,31,30,31,31,30,31,30,31,31,29,31,30,31,30,31,31,30,31,30,31;intyear,month;doprintf(Inputyear,month:);scanf(%d,%d,例5.4-3输入某年某月,输出该年的该月有多少天?,练习#includevoidmain()inta55,i,j;for(i=0;ij)aij=i+j;elseif(ij)aij=i-j;elseaij=0;,for(i=0;i5;i+)for(j=0;jave2)return(1);elsereturn(-1);,“值传递”,#inlcudevoidmain()inti,k=0;inta4=56,88,89,98,b4=60,55,66,77;for(i=0;i0)k=k+1;printf(A班有%d门课程的平均成绩高于B班n,k);,C语言中的数组名表示数组在内存中存放的起始地址(首地址),也是第一个元素的地址。数组名作为函数的参数传递的是数组的起始地址,属于“传地址”,是一种双向传递的方式。例如:inta5;a为首地址。,数组名作为函数的实际参数,例5.5-2编写函数,求5个学生英语课的平均成绩。,floatpj(intb,intn)floatave,sum=0.0;inti;for(i=0;in;i+)sum=sum+bi;ave=sum/n;return(ave);,#includevoidmain()floatpj(intb,intn);inti,a5;floataver;printf(“enterthedatan);for(i=0;i5;i+)scanf(%d,“地址传递”,6593748281,a0a1a2a3a4,a0a1a2a3a4,b0b1b2b3b4,6593748281,开始,调用,起始地址2000,起始地址2000,练习:编写函数bubble(intb,intn)对n个整数进行从小到大排序,在主函数中输入n个数,调用函数bubble,将排序后的结果在主函数中输出。,#include#defineN20voidmain()voidbubble(int,int);intaN,i;printf(tern:n);scanf(%d,for(i=0;in;i+)printf(%d,ai);voidbubble(intb,intn)for(i=1;i;i+)for(j=0;j;j+)if()temp=bj;bj=bj+1;bj+1=temp;,字符数组的定义及初始化用字符数组存放字符串字符串的输入输出用于字符串处理的函数应用举例,5.6字符数组,定义charstr20;初始化逐个为数组中各元素指定初值字符。charstr5=w,e,l,l,0;对一个字符数组指定一个字符串初值。charstr=morning;charstr=morning;,定义及初始化,什么是字符串?字符串是用一对双引号括起来的字符序列,这些字符可以是一般的可显示字符,也可以是某些特殊的控制字符;无字符串变量,用字符数组处理字符串;字符串结束标志:0。C语言中没有字符串变量,字符串存放在一个字符型数组中。因此为了存放字符串,常常在程序中定义字符数组。例如:charc10;,逐个字符I/O:%c整个字符串I/O:%s,#includevoidmain()charstr10;gets(str);puts(str);/也可用scanf(),但有限制,#includevoidmain()charstr10;inti;for(i=0;i5;i+)scanf(“%c”,scanf(),inti;scanf(%d,不能读入带空格的字符串,gets()可以这种用法很不安全。当用户的输入多于10个(含10个),str数组将越界。scanf被公认为最易遭到黑客攻击的函数之一,演示,gets(),字符串输入函数gets()也没有提供限制输入字符串长度的方法,容易引起缓冲区溢出,给黑客攻击以可乘之机。对输入字符串长度有限制的函数调用fgets(buf,sizeof(buf),stdin);,在中定义了若干专门的字符串处理函数strcpy(str1,str2):串复制strlen(str):串长度返回字符串的实际长度,不包括0strcat(str1,str2):串连接strcmp(str1,str2):串比较,字符串不能直接整体复制!,str1=str2/*错误*/,例如:charstr112=“Turbo”;charstr2=“c+”;printf(“%s”,strcpy(str1,str2);输出结果:c+,例如:charstr112=“Turbo”;charstr2=“c+”;printf(“%s”,strcat(str1,str2);输出结果:Turboc+,例如:charstr112=“TurboC”;i=strlen(str1);printf(“%d”,i);输出结果:7,功能:比较两个字符串比较规则:对两串从左向右逐个字符比较(ASCII码),直到遇到不同字符或0为止返值:返回int型整数,a.若字符串1字符串2,返回正整数c.若字符串1=字符串2,返回零说明:字符串比较不能用“=”,必须用strcmp,字符串比较函数strcmp(字符串1,字符串2),例5.6-1统计一行字符中字母、空格、数字及其他字符的个数#includevoidmain()charstr80;intalphabet=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个数字,%d个其他字符:n”,alphabet,space,digit,other);,例5.6-2#includevoidmain()charstr36=“China”,”Japan”,”Korea”;str05=;printf(“%sn”,str0);,str0,str1,str2,例5.6-3按国名确定奥运会入场次序。,问题分析:一个国家名实际上就是一个字符串,可用一维数组来表示,而多个字符串就需要用二维字符数组来表示,因此为表示奥运参赛国的国名,可定义如下二维数组:charname15015,#include#include#defineMAX_LEN15/*字符串最大长度*/#defineN150/*字符串个数*/voidSortString(charstrMAX_LEN,intn);intmain()inti,n;charnameNMAX_LEN;/*定义二维字符数组*/printf(Howmanycountries?);scanf(%d,什么作用?,/*函数功能:冒泡法实现字符串按字典顺序排序*/voidSortString(charstrMAX_LEN,intn)inti,j;chartempMAX_LEN;for(i=0;i0)strcpy(temp,strj);strcpy(strj,strj+1);strcpy(strj+1,temp);,结构体类型的定义结构体变量的定义和引用结构体变量的初始化应用举例,5.7结构体类型,构造一个结构体类的数据类型的一般形式:struct结构类型名类型标识符成员名;类型标识符成员名;:类型标识符成员名;,例如:structstudentcharnumber10;charname20;chargender;intage;floatscore20;charaddr30;,定义先构造结构体类的数据类型,后定义具有这种构造的变量。struct结构体类型名类型标识符成员名;:类型标识符成员名;变量名1,变量名2.;,例如:structstudentcharnumber10;charname20;chargender;intage;floatscore20;charaddr30;stud1,stud2;,引用对结构体变量的使用是通过对其成员的引用来实现的。引用结构体成员的一般形式如下:结构体变量名成员名例如:stud1.age其中的圆点符号称为成员运算符,它的运算级别最高。,structstudlongnum;charname20;chargender;charaddr30;stud1=9708,”Liwei,F,144BeijingRoad”;,#includestructstudentcharname20;floats3;floatave;stu3=“li”,70,80,90,0,“wang”,83,94,75,0,“zhang”,92,86,89,0;voidmain()inti;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个学生的信息并输出。#include#includestructstudlongnum;charname20;chargender;intage;floatscore;,#include#includevoidmain()structstudstudent3;inti;charch;charnumstr20;for(i=0;i3;i+)/*输入*/printf(n输入第%d个学生的数据:n,i);gets(numstr);studenti.num=atol(numstr);gets(studenti.name);studenti.gender=getchar();ch=getchar();gets(numstr);studenti.age=atoi(numstr);gets(numstr);studenti.score=atof(numstr);,printf(nnumtnamegenderagescoren);for(i=0;i3;i+)printf(%ld%-15s%3c%6d%6.2fn,studenti.num,studenti.name,studenti.gender,studenti.age,studenti.score);,小技巧,数值转换函数,练习题,1.#includevoidmain()inta33,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#defineN5voidmain()intyNN,i,j;for(i=0;iN;i+)yii=1;yi0=1;for(i=2;iN;i+)for(j=1;ji;j+)yij=yi-1j-1+yi-1j;printf(杨辉三角:n);for(i=0;iN;i+)for(j=0;j=i;j+)printf(%6d,yij);printf(n);,11121133114641,杨辉三角,#include#defineN5voidmain()voidsetdata(intN,int);voidoutdata(intN,int);intyNN;setdata(y,5);outdata(y,5);,voidsetdata(intsN,intn)inti,j;for(i=0;iN;i+)sii=1;si0=1;for(i=2;iN;i+)for(j=1;ji;j+)sij=si-1j-1+si-1j;,voidoutdata(intsN,intn)inti,j;printf(yanghui:n);for(i=0;iN;i+)for(j=0;j=i;j+)printf(%6d,sij);printf(n);,杨辉三角,3.程序读入20个整数,统计非负数个数,并计算非负数之和。voidmain()inti,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=%dtcount=%dn,s,count);,这一章我们学习了,数组下标不能超界;数组元素在内存中的存放;了解了在什么情况下使用数组这种数据类型;向函数传递一维数组和二维数组的方法;用数组名作为函数参数和用简单变量作为函数参数的不同之处。,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!