关闭

关闭

关闭

封号提示

内容

首页 6.C语言数组.PPT

6.C语言数组.PPT

6.C语言数组.PPT

上传者: wanroutianze 2011-08-27 评分 0 0 0 0 0 0 暂无简介 简介 举报

简介:本文档为《6.C语言数组ppt》,可适用于高等教育领域,主题内容包含第六章第六章数组为什么要用数组?迄今为止我们在程序中接触到的都是属于基本类型(整型、字符型、实型)的数据它们都是简单的数据类型。对于简单的问题用以上符等。

第六章第六章数组为什么要用数组?迄今为止我们在程序中接触到的都是属于基本类型(整型、字符型、实型)的数据它们都是简单的数据类型。对于简单的问题用以上简单的数据类型处理就可以了但对有些数据对象用简单的数据类型还不能充分反映出数据的特性从而对它们进行有效的操作。例如要处理一个班个学生的成绩如果用普通变量来代表个学生的成绩就要用个变量如s,s,s…如果有个学生呢?这显然是很不方便的应当有更简化的方法。在C程序中常根据需要定义数组并且用循环对数组中的元素进行操作可以有效的处理大批量的数据大大提高了工作效率,十分方便。问题:给一组数排序这组数该如何存放呢这些数据如何存放才便于排序主要内容主要内容一维数组的定义和引用二维数组的定义和引用字符数组C语言为这些数据提供了一种构造数据类型:数组。所谓数组就是一组具有相同数据类型的数据的有序集合。一个班学生的学习成绩一行文字一个矩阵这些数据的特点是:具有相同的数据类型使用过程中需要保留原始数据在定义数组时需要指定数组中元素的个数方括弧中的常量表达式用来表示元素的个数即数组长度。常量表达式中可以包括常量和符号常量但不能包含变量。也就是说C语言不允许对数组的大小作动态定义即数组的大小不依赖于程序运行过程中变量的值。说明:数组名定名规则和变量名相同遵循标识符定名规则。例如:intnscanf(“d″n)*在程序中输入数组的大小*intan数组说明中其他常见的错误:floata*数组大小为没有意义*intb()()*不能使用圆括号*intk,ak*不能用变量说明数组大小*一维数组在内存中的存放每个数据元素占用的字节数就是基类型的字节数一个元素占个字节一维数组:floatmark注意:定义数组时用到的“数组名[常量表达式]”和引用数组元素时用到的“数组名[下标]”是有区别的。例如intat=a简便的判别方法:如果在数组名常量前有类型名(如int,float,char等)则此时是定义数组如果在其前面没有类型名则引用数组元素。一维数组元素的引用数组元素的引用方式数组名[下标]下标可以是整型常量或整型表达式。例如:a[]=a[]a[]a[*]注意:数组必须先定义后使用C语言对数组不作越界检查只能逐个引用数组元素不能一次引用整个数组例intaa=C语言对数组不作越界检查使用时要注意例intaprintf(“d”,a)()必须for(j=j<j)printf(“dn”,aj)()一维数组元素引用的程序实例(c)#include<stdioh>voidmain(){intia[]for(i=i<=i)a[i]=ifor(i=i>=i)printf(“d”a[i])printf(“n”)}运行结果如下:程序使a[]到a[]的值为~然后按逆序输出。对数组元素初始化的实现方法:在定义数组时对数组元素赋以初值。例如:inta[]={,,,,,,,,,}将数组元素的初值依次放在一对花括弧内。经过上面的定义和初始化之后a[]=a[]=a[]=a[]=a[]=a[]=a[]=a[]=a[]=a[]=。一维数组的初始化如果想使一个数组中全部元素值为可以写成:inta[]={,,,,,,,,,}或inta[]={}不能写成:inta[]={*}可以只给一部分元素赋值。例如:inta[]={}定义a数组有个元素但花括弧内只提供个初值这表示只给前面个元素赋初值后个元素值为。在对全部数组元素赋初值时由于数据的个数已经确定因此可以不指定数组长度。例如:inta[]={}也可以写成inta[]={}inta[]={}只初始化前个元素后个元素为。例读个整数存入数组找出其中最大值和最小值(c)步骤:输入:for循环输入个整数处理:(a)先令max=min=x(b)依次用xi和max,min比较(循环)若max<xi,令max=xi若min>xi,令min=xi输出:max和min#include<stdioh>main(){intx,i,max,minfor(i=i<i)scanf("d",xi)max=min=xfor(i=i<i){if(max<xi)max=xiif(min>xi)min=xi}printf("Maxvalueisdn",max)printf("Minvalueisdn",min)}程序举例例用数组求Fibonacci数列前个数#include<stdioh>main(){intiintf={,}for(i=i<i)fi=fififor(i=i<i){if(i==)printf("n")printf("d",fi)}printf(“n”)}例用数组求Fibonacci数列前个数(c)运行结果如下:例对个数排序冒泡法排序过程(从小到大):()比较第一个数与第二个数若为逆序a>a则交换然后比较第二个数与第三个数依次类推直至第n个数和第n个数比较为止第一趟冒泡排序结果最大的数被安置在最后一个元素位置上()对前n个数进行第二趟冒泡排序结果使次大的数被安置在第n个元素位置()重复上述过程共经过n趟冒泡排序后排序结束例#include<stdioh>voidmain(){intainti,j,tprintf(“inputnumbers:n”)for(i=i<i)scanf("d",ai)printf(“n”)for(j=j<j)for(i=i<ji)if(ai>ai){t=aiai=aiai=t}printf(“thesortednumbers:n”)for(i=i<i)printf("d",ai)printf(“n”)}例对个数排序(c)冒泡法程序运行结果如下:inputnumbers:thesortednumbers:排序过程:()首先通过n次比较从n个数中找出最小的将它与第一个数交换第一趟选择排序结果最小的数被安置在第一个元素位置上()再通过n次比较从剩余的n个数中找出关键字次小的记录将它与第二个数交换第二趟选择排序()重复上述过程共经过n趟排序后排序结束简单选择法例初始:n=一趟:六趟:#include<stdioh>voidmain(){inta,i,j,k,tprintf(“inputnumbers:n”)for(i=i<i)scanf("d",ai)printf(“n”)for(i=i<=i){k=ifor(j=ij<=j)if(aj<ak)k=jt=aiai=akak=t}printf(“thesortednumbers:n”)for(i=i<i)printf("d",ai)printf(“n”)}简单选择法(c)二维数组二维数组的定义定义方式:  数据类型 数组名常量表达式常量表达式数组元素的存放顺序原因:内存是一维的二维数组:按行序优先例intafloatbinta,()行数列数元素个数=行数*列数二维数组理解每个元素ai由包含个元素的一维数组组成二维数组a是由个元素组成 二维数组的引用 二维数组的引用二维数组元素的表示形式为:数组名[下标][下标]例如:a[][]下标可以是整型表达式如a[][*]数组元素可以出现在表达式中也可以被赋值例如:b[][]=a[][]常出现的错误有:inta[][]*定义a为的数组*a[][]=在使用数组元素时应该注意下标值应在已定义的数组大小的范围内。可以用下面种方法对二维数组初始化:数据类型数组名常量表达式常量表达式={初始化数据}1分行给二维数组赋初值。例如:inta[][]={{}{}{}}2可以将所有数据写在一个花括号内按数组排列的顺序对各元素赋初值。例如:inta[][]={}二维数组的初始化3可以对部分元素赋初值。例如:inta[][]={{}{}{}}也可以对各行中的某一元素赋初值如inta[][]={{}{}{}}也可以只对某几行元素赋初值。如:inta[][]={{}{}}4如果对全部元素都赋初值则定义数组时对第一维的长度可以不指定但第二维的长度不能省。例如:inta[][]={}它等价于:inta[][]={}在定义时也可以只对部分元素赋初值而省略第一维的长度但应分行赋初值。例如:inta[][]={{}{}{}}例从键盘为一个行列数组赋值并打印出来(c)#include<stdioh>voidmain(){intainti,jfor(i=i<i)for(j=j<j)scanf("d",aij)for(i=i<i){for(j=j<j)printf("d",aij)printf("n")}}程序举例例将二维数组行列元素互换存到另一个数组中(c)运行结果如下:arraya:arrayb:    例有一个的矩阵要求编程序求出其中值最大的那个元素的值以及其所在的行号和列号。NS流程图表示算法如下:#include<stdioh>voidmain(){inti,j,row=,colum=,maxinta={{,,,},{,,,},{,,,}}max=afor(i=i<=i)for(j=j<=j)if(aij>max){max=aijrow=icolum=j}printf("max=d,row=d,colum=dn",max,row,colum)}例有一个的矩阵要求编程序求出其中值最大的那个元素的值以及其所在的行号和列号。(c)例有一个班共个学生已知每个学生有门课的成绩要求输出平均成绩最高的学生的成绩以及该学生的序号(c)解题思路:对于批量数据的处理宜用数组。对本题而言宜用二维数组用一行中的各元素存放一个学生的成绩即行代表学生列代表一门课的成绩。存放个学生门课的成绩要用一个*的二维数组。另外由于要比较各人的平均成绩因此对每个学生来说应该存放个数据每个人的平均成绩要计算出来并存放在数组中。这样数组的大小应该是*设计算法:求每人平均成绩放在数组每一行的最后一列中找出最高的平均分和该学生的序号输出最高的平均分和该学生的序号。为了减少输入数据的工作量在程序中改为个学生门课成绩。#include<stdioh>voidmain(){inti,j,maxifloatsum,max=floats={{,,,,},{,,,,},{,,,,},{,,,,},{,,,,}}for(i=i<i){sum=for(j=j<j)sum=sumsijsi=sum}for(i=i<i)if(si>max){max=simaxi=i}printf("stuorder=dnmax=fn",maxi,max)}运行结果如下:stuorder=max=字符数组字符数组字符数组的定义定义方法与前面介绍的类似。例如:charc[]c=′I′c[]=′′c[]=′a′c[]=′m′c[]=′′c=′h′c=′a′c[]=′p′c[]=′p′c[]=′y′对字符数组初始化可逐个字符赋给数组中各元素。例如:Charc={‘I’,’a’,’m’,’h’,’a’,’p’,’p’,’y’}字符数组的初始化如果初值个数小于数组长度则只将这些字符赋给数组中前面那些元素其余的元素自动定为空字符。如果提供的初值个数与预定的数组长度相同在定义时可以省略数组长度系统会自动根据初值个数确定数组长度。charc[]={′I′,′′,′a′,′m′,′′,′h′,′a′,′p′,′p′,′y′}数组c的长度自动定为。chardiamond[][]={{′′′′*′}{′′′*′′′′*′}{′*′′′′′′′′*′}{′′′*′′′′*′}{′′′′′*′}}定义和初始化一个二维字符数组字符数组的引用例输出一个字符串。程序如下:#include<stdioh>voidmain(){charc[]={’I’,’’,’a’,’m’,’’,’a’,’’,’b’’o’’y’}intifor(i=i<i)printf(″c″c[i])printf(″\n″)}运行结果:Iamaboy例输出一个钻石图形#include<stdioh>voidmain(){chardiamond[][]={{′′′′′*′}{′′′*′′′′*′}{′*′′′′′′′′*′}{′′′*′′′′*′}{′′′′′*′}}intijfor(i=i<i){for(j=j<j)printf(″c″diamond[i][j])printf(″\n″)}}运行结果********字符串和字符串结束标志在C语言中是将字符串作为字符数组来处理的。为了测定字符串的实际长度C语言规定了一个“字符串结束标志”‘\’。字符数组并不要求它的最后一个字符为′\′甚至可以不包含′\′。例如:charc[]={′C′′h′′i′′n′′a′}但是由于系统对字符串常量自动加一个′\′。因此为了使处理方法一致在字符数组中也常人为地加上一个′\′。例如:charc[]={′C′′h′′i′′n′′a′′\′}例如:定义字符数组charc[]={“Pascalprogram”}要用一个新的字符串代替原有的字符串”Pascalprogram”从键盘向字符数组输入Hello如果不加′\′的话字符数组中的字符如下Hellolprogram可以看出新字符串和老字符串连成一片无法区分开。如果我们在字符串Hello后面加一个′\′它取代了第个字符l由于它是字符串结束标志在输出字符数组中的字符串时遇′\′就停止输出因此只输出了字符串Hello从这里可以看到在字符串末尾加′\′的作用。字符数组的输入输出字符数组的输入输出可以有两种方法:逐个字符输入输出。用格式符“c”输入或输出一个字符。将整个字符串一次输入或输出。用“s”格式符意思是对字符串的输入输出。在内存中数组c的状态输出时遇结束符‘’就停止输出。输出结果为:China说明:()用“s”格式符输出字符串时printf函数中的输出项是字符数组名而不是数组元素名。例如:printf(″s″c)写成printf(″s″c)错误()如果数组长度大于字符串实际长度也只输出到遇′\′结束。()输出字符不包括结束符′\′。()如果一个字符数组中包含一个以上′\′则遇第一个′\′时输出就结束。()可以用scanf函数输入一个字符串。如果利用一个scanf函数输入多个字符串则在输入时以空格分隔。例如:charstrl[]str[]str[]scanf(″sss″strstrstr)输入数据:Howareyou数组中未被赋值的元素的值自动置′\′。如果想知道数组在内存中的起始地址用进制形式输出数组c的起始地址printf(″d″c)由于数组名c代表数组起始地址。因此得到用十进制形式表示的数组c的起始地址。注意:scanf函数中的输入项如果是字符数组名。不要再加地址符因为在C语言中数组名代表该数组的起始地址。下面写法不对:scanf(″s″str)puts函数其一般形式为:puts(字符数组)其作用是将一个字符串(以′\′结束的字符序列)输出到终端。假如已定义str是一个字符数组名且该数组已被初始化为"China"。则执行puts(str)其结果是在终端上输出China。字符串处理函数用puts函数输出的字符串中可以包含转义字符。例如:charstr[]={″ChinanBeijing″}puts(str)输出结果:ChinaBeijing在输出时将字符串结束标志′\′转换成′\n′即输出完字符串后换行。gets函数其一般形式为:gets(字符数组)其作用是从终端输入一个字符串到字符数组并且得到一个函数值。该函数值是字符数组的起始地址。如执行下面的函数:gets(str)从键盘输入:Computer将输入的字符串"Computer"送给字符数组str说明:函数值为字符数组str的起始地址。一般利用gets函数的目的是向字符数组输入一个字符串而不大关心其函数值。注意:用puts和gets函数只能输入或输出一个字符串不能写成puts(strstr)或gets(strstr)strcat函数其一般形式为:strcat(字符数组字符数组)Strcat的作用是连接两个字符数组中的字符串把字符串接到字符串的后面结果放在字符数组中函数调用后得到一个函数值字符数组的地址。例如:charstr[]={″People′sRepublicof″}charstr[]={″China″}printf(″s″strcat(strstr))输出:People′sRepublicofChina关于strcat函数的几点说明关于strcat函数的几点说明()字符数组必须定义得足够大以便容纳连接后的新字符串。()连接前两个字符串的后面都有’’连接时将字符串后面的’’取消只在新串最后保留’’。strcpy函数其一般形式为:strcpy(字符数组字符串)strcpy是“字符串复制函数”。作用是将字符串复制到字符数组中去。例如:charstr[]str[]={″China″}strcpy(strstr)关于strcpy函数的几点说明关于strcpy函数的几点说明()字符数组必须定义得足够大以便容纳被复制的字符串。字符数组的长度不应小于字符串的长度。()“字符数组”必须写成数组名形式(如str)“字符串”可以是字符数组名也可以是一个字符串常量。如strcpy(str″China″)()复制时连同字符串后面的′\′一起复制到字符数组中。()可以用strncpy函数将字符串中前面若干个字符复制到字符数组中去。例如:strncpy(strstr)作用是将str中前面个字符复制到str中去取代str中原有的最前面的个字符。()不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组。如:str=″China″不合法str=str不合法用strcpy函数只能将一个字符串复制到另一个字符数组中去。用赋值语句只能将一个字符赋给一个字符型变量或字符数组元素。下面是合法的使用:chara[]ccc=′A′c=′B′a[]=′C′a[]=′h′a[]=′i′a[]=′n′a[]=′a′strcmp函数其一般形式为:strcmp(字符串字符串)strcmp的作用是比较字符串和字符串。例如:strcmp(strstr)strcmp(″China″″Korea″)strcmp(str″Beijing″)字符串比较的规则与其他语言中的规则相同即对两个字符串自左至右逐个字符相比(按ASC码值大小比较)直到出现不同的字符或遇到’’为止。如果全部字符相同则认为相等若出现不相同的字符则以第一个不相同的字符的比较结果为准。例如:“computer”>“compare”,“these”>“that”“DOG”<“dog”比较的结果由函数值带回()如果字符串=字符串函数值为。()如果字符串>字符串函数值为一正整数。()如果字符串<字符串函数值为一负整数。注意:对两个字符串比较不能用以下形式:if(str>str)printf(″yes″)而只能用if(strcmp(strstr)>)printf(″yes″)strlen函数其一般形式为:strlen(字符数组)strlen是测试字符串长度的函数。函数的值为字符串中的实际长度(不包括′\′在内)。例如:charstr[]={″China″}printf(″d″strlen(str))输出结果不是也不是而是。也可以直接测试字符串常量的长度如strlen(″China″)strlwr函数其一般形式为:strlwr(字符串)strlwr函数的作用是将字符串中大写字母换成小写字母。strupr函数其一般形式为:strupr(字符串)strupr函数的作用是将字符串中小写字母换成大写字母。例有个字符串,要求找出其中最大者(c)字符串比较的规则与其他语言中的规则相同即对两个字符串自左至右逐个字符相比(按ASC码值大小比较)直到出现不同的字符或遇到’’为止。如果全部字符相同则认为相等若出现不相同的字符则以第一个不相同的字符的比较结果为准。解题思路:题目要求处理个字符串需要定义一个二维的字符数组(取名str)假定每个字符串不超过个字符则可定义二维的大小为*即有行列每一行可以容纳个字符(包括最后的结束字符’’)字符数组应用举例#include<stdioh>#include<stringh>voidmain(){charstring*用来存放最大的字符串*charstr*分别存放个字符串*intifor(i=i<i)gets(stri)*先后读入个字符串*if(strcmp(str,str)>)*比较如果串>串*strcpy(string,str)*把串复制到string中*else*如果串<=串*strcpy(string,str)*把串复制到string中*if(strcmp(str,string)>)*比较如果串>string*strcpy(string,str)*把串复制到string中*printf(″nthelargeststringis:nsn″,string)}运行结果如下:CHINAHOLLANDAMERICA thelargeststringisHOLLAND

职业精品

用户评论

0/200
    暂无评论

精彩专题

上传我的资料

热门资料

资料评价:

/68
0下载券 下载 加入VIP, 送下载券

意见
反馈

返回
顶部