您好,欢迎访问三七文档
郑州信息科技职业学院教案授课题目:数组的定义运算和字符数组第七讲:数组的定义运算和字符数组授课时数:2教学目的与教学要求:1、掌握C语言中数组的定义和使用;2、掌握C语言中数组的运算;3、掌握C语言中字符数组的定义和使用。主要内容:1、数组的定义和使用;2、数组的初始化;3、数组的运算(冒泡排序和折半查找);4、字符数组的定义和使用;5、字符串的结束标志;6、字符串的输入和输出;7、常见字符串处理函数。重点和难点:1、数组的运算;2、字符串的输入和输出;3、字符串处理函数的使用。教学方法和手段教具多媒体演示和板书相结合授课内容:第六章数组前面各章所使用的数据都属于基本数据类型(整型、实型、字符型),C语言还提供了构造类型的数据,是数组类型、结构体类型、共同体类型。构造数据类型是由基本数据类型的数据按照一定的规则组成。数组:具有相同数据类型的数据的有序的集合。数组元素:数组中的元素。数组中的每一个数组元素具有相同的名称,不同的下标,可以作为单个变量使用,所以也称为下标变量。在定义一个数组后,数组元素在内存中连续存放的。数组的下标:是数组元素的位置的一个索引或指示。数组的维数:数组元素下标的个数。根据数组的维数可以将数组分为一维、二维、三维、多维数组。6、1一维数组一维数组中的各个数组元素是排成一行的一组下标变量,用一个统一的数组名来标识,用一个下标来指示其在数组中的位置。下标从0开始。一维数组通常和一重循环相配合,对数组元素进行处理。6、1、1一维数组的定义(先定义后使用)定义一维数组的格式:类型说明数组名[整型常量表达式]例如:inta[100];定义了一个数组a,元素个数为100,数组元素类型为整型。说明:(1)数组名:按标识符规则。(2)整型常量表达式:表示数组元素个数(数组的长度)。可以是整型常量或符号常量,不允许用变量。整型常量表达式在说明数组元素个数的同时也确定了数组元素下标的范围,下标从0开始~整型常量表达式-1(注意不是1~整型常量表达式)。本例数组元素个数是100个,下标从0-99。(3)类型说明:指的是数据元素的类型,可以是基本数据类型,也可以是构造数据类型。本例数组元素是整型,每个元素占2个字节,因为有100个数组元素,所以占用200字节。(4)C编译程序为数组分配了一片连续的空间。(5)C语言还规定,数组名是数组的首地址。即a=&a[0]6、1、2一维数组的初始化数组可以在定义时初始化,给数组元素赋初值。数组初始化常见的几种形式:(1)对数组所有元素赋初值,此时数组定义中数组长度可以省略。例如:inta[5]={1,2,3,4,5};或inta[]={1,2,3,4,5};(2)对数组部分元素赋初值,此时数组长度不能省略。例如:inta[5]={1,2};a[0]=1,a[1]=2,其余元素为编译系统指定的默认值0。(3)对数组的所有元素赋初值0。例如:inta[5]={0};注意:如果不进行初始化,如定义inta[5];那么数组元素的值是随机的,不要指望编译系统为你设置为默认值0。静态数组见书89页6、1、3数组元素的引用数组元素的引用形式:数组名[下标]注意:数组元素引用时,下标为整型的表达式,可以使用变量。例:数组元素的引用例子。main(){inta[10],b[5]={55,44,33,22,11},i;for(i=0;i10;i++){a[i]=i+1;printf(“%4d”,a[i]);}printf(“\n”);for(i=0;i5;i++){printf(“%4d”,b[i]);}printf(“\n”);}说明:(1)引用数组元素时,下标可以是整型常数、已经赋值的整型变量或整型表达式。(2)数组元素本身可以看作是同一个类型的单个变量,因此对变量可以进行的操作同样也适用于数组元素。也就是数组元素可以在任何相同类型变量可以使用的位置引用。(3)引用数组元素时,下标不能越界。否则结果难以预料(覆盖程序区-程序飞出,覆盖数据区-数据覆盖破坏,操作系统被破坏,系统崩溃)。6、1、4数组的运算例:采用“冒泡法”对任意输入的10个整数按由小到大的顺序排序。分析:1、从完整的过程(步骤S0-Sn-2)可以看出,排序的过程就是大数沉底的过程(或小数上浮的过程),总共进行了n-2-0+1=n-1次,整个过程中的每个步骤都基本相同,可以考虑用循环实现-外层循环。2、从每一个步骤看,相邻两个数的比较,交换过程是从前向后进行的,也是基本相同的,共进行了n-i-1次,所以也考虑用循环完成-内层的循环。3、为了便于算法的实现,考虑使用一个一维数组存放这10个整型数据,排序的过程中数据始终在这个数组中(原地操作,不占用额外的空间),算法结束后,结果在也在此数组中。#defineN10main(){inta[10],i,j,t;for(i=0;iN;i++)scanf(“%d”,&a[i]);for(i=0;iN-1;i++)for(j=0;jN-(i+1);j++)if(a[j]a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}for(i=0;iN;i++)printf(“%d”a[i]);例:折半查找法(只能对有序数列进行查找),使用折半查找法,在一批有序数列中查找给定的数x。分析:设n个有序数(从小到大)存放在数组a[0]~a[n-1]中,要查找的数为x。用变量bot、top和mid分别表示查找数据下界、顶界和中间,mid=(top+bot)/2,折半查找的算法如下。(1)x=a[mid],则已找到退出循环,否则进行下面的判断。(2)xa[mid],x必定落在bot~mid-1的范围之内,即top=mid-1。(3)xa[mid],x必定落在mid+l~top的范围之内,即bot=mid+l。(4)在确定了新的查找范围后,重复进行以上比较,直到找到或者bot=top。可见查找二分折半法每进行一次,查找范围就缩小一半。#includestdio.h#defineN10/*N代表数据的个数*/voidmain(){inta[N]={1,4,7,13,16,19,28,36,49,60};intmid,bot,top,x,find;printf(pleaseinputthenumberyouwantfind:\n);scanf(%d,&x);printf(\n);bot=0;top=N-1;/*给数组下界和上界变量赋初值*/find=0;/*find=0代表设有找到*/while(bot=top&&find==0){mid=(top+bot)/2;/*计算中间要比较的元素小标*/if(x==a[mid]){find=1;break;/*查找成功*/}elseif(xa[mid])top=mid-1;/*数据X在下半部分*/elsebot=mid+1;/*数据X在上半部分*/}if(find==1)printf(thenumberisfoundtheno.%d!\n,mid);elseprintf(thenumberisnotfound!\n);}6、2字符数组字符数组:存放字符型数据的数组。其中每个数组元素存放的值都是单个字符。6、2、1字符数组的定义、初始化及引用字符数组也是数组,只是数组元素的类型为字符型。所以字符数组的定义、初始化,字符数组数组元素的引用与一般的数组类似。(定义时类型说明符为char,初始化使用字符常量或相应的ASCII码值,赋值使用字符型的表达式,凡是可以用字符数据的地方也可以引用字符数组的元素)。例如:charc1[10],str[5][10];charc2[3]={‘r’,’e’,’d’};或charc2[]={‘r’,’e’,’d’};printf(“%c%c%c\n”,c2[0],c2[1],c2[2]);6、2、2字符串与字符数组()1、字符串与字符数组字符串(字符串常量):字符串是用双引号括起来的若干有效的字符序列。C语言中,字符串可以包含字母、数字、符号、转义符。字符数组:存放字符型数据的数组。它不仅用于存放字符串,也可以存放一般的、对一般读者看来毫无意义的字符序列。C语言没有提供字符串变量(存放字符串的变量),对字符串的处理常常采用字符数组实现。因此也有人将字符数组看作为字符串变量。C语言许多字符串处理库函数既可以使用字符串,也可以使用字符数组。为了处理字符串方便,C语言规定以’\0’(ASCII码为0的字符)作为“字符串结束标志”。“字符串结束标志”占用一个字节。对于字符串常量,C编译系统自动在其最后字符后,增加一个结束标志;对于字符数组,如果用于处理字符串,在有些情况下,C系统会自动在其数据后自动增加一个结束标志,在更多情况下结束标志要由程序员自己负责(因为字符数组不仅仅用于处理字符串)。如果不是处理字符串,字符数组中可以没有字符串结束标志。例如:charstr1[]={‘C’,’H’,’I’,’N’,’A’};str1:字符数组,占用空间5个字节CHINAcharstr2[]=”CHINA”;占用空间6个字节CHINA‘\0’2、字符数组的初始化(除了一般数组的初始化方法外,增加了一些方法)(1)以字符常量的形式对字符数组初始化。一般数组的初始化方法,给各个元素赋初值。注意:这种方法,系统不会自动在最后一个字符后加’\0’。例如:charstr1[]={‘C’,’H’,’I’,’N’,’A’};或charstr1[5]={‘C’,’H’,’I’,’N’,’A’};没有结束标志。如果要加结束标志,必须明确指定。charstr1[]={‘C’,’H’,’I’,’N’,’A’,’\0’};charstr2[100]={‘C’,’H’,’I’,’N’,’A’};还有100-5=95个字节暂时未使用,初始化为0,相当于有字符串结束标志。(2)以字符串(常量)的形式对字符数组初始化。(系统会自动在最后一个字符后加’\0’)例如:charstr1[]={”CHINA”};或chars1[6]=”CHINA”;charstr2[80]={”CHINA”};或chars2[80]=”CHINA”;还有100-6=94个字节暂时未使用。说明:以字符串常量形式对字符数组初始化,系统会自动在该字符串的最后加入字符串结束标志;以字符常量形式对字符数组初始化,系统不会自动在最后加入字符串结束标志。3、字符数组的输入输出(两种形式:逐个字符输入/输出,整串输入/输出)(1)逐个字符输入/输出:采用“%c”格式说明和循环,像处理数组元素一样输入输出。说明:格式化输入是缓冲读。必须在接受到“回车”时,scanf才开始读取数据。读字符数据时,空格、回车都保存进字符数组。如果按“回车”键时,输入的字符少于scanf循环读取的字符时,scanf继续等待用户将剩下的字符输入;如果“回车”键时,输入的字符多于scanf循环读取的字符时,scanf循环只将前面的字符读入。逐个读入字符结束后,不会自动在末尾加’\0’。所以输出时,最好也使用逐个字符输出。(2)整串输入/输出:采用“%s”格式符来实现说明:格式化输入输出字符串,参数要求字符数组的首地址,即字符数组名。按照%s格式格式化输入字符串时,输入的字符串中不能有空格(空格,Tab),否则空格后面的字符不能读入,scanf函数认为输入的是两个字符串。如果要输入含有空格的字符串可以使用gets()函数。按照%s格式格式化输入字符串时,并不检查字符数组的空间是否够用。如果输入长字符串,可能导致数组越界,应当保证字符数组分配了足够的空间。按照%s格式格式化输入字符串时,自动在最后加“字符串结束标志”。按照%s格式格式化输入字符串时,可以用“%c”或“%s”格式逐个输出。不是按照%s格式格式化输入的字符串在输出时,应该确保末尾有“字符串结束标志”。6、2、3字符串(字符数组)处理函数字符串(字符数组)的处理可以采用对数组元素进行处理,这在对字符串中字符做特殊的处理时相当有效。C语言库函数为
本文标题:教案C语言7
链接地址:https://www.777doc.com/doc-2421242 .html