《C语言程序设计基础》课件_第6章.pptx

上传人(卖家):kld 文档编号:8179213 上传时间:2024-12-23 格式:PPTX 页数:102 大小:1.05MB
下载 相关 举报
《C语言程序设计基础》课件_第6章.pptx_第1页
第1页 / 共102页
《C语言程序设计基础》课件_第6章.pptx_第2页
第2页 / 共102页
《C语言程序设计基础》课件_第6章.pptx_第3页
第3页 / 共102页
《C语言程序设计基础》课件_第6章.pptx_第4页
第4页 / 共102页
《C语言程序设计基础》课件_第6章.pptx_第5页
第5页 / 共102页
点击查看更多>>
资源描述

1、第6章 数组批量数据的表示与处理6.1 一维数组一维数组6.2 二维数组二维数组6.3 字符数组字符数组实操训练实操训练课外练习课外练习6.1 一一 维维 数数 组组何谓一维数组?一维数组在程序中如何表示与处理?何谓一维数组?一维数组在程序中如何表示与处理?一维数组可用来表示具有相同类型且具有线性关系的批量数据(数据集合),如数学中的一维向量等。一维数组作为一个数据对象在程序中使用,必须先定义,编译系统按一定的存储结构存储后才能使用。6.1.1 一维数组的定义与存储结构一维数组的定义与存储结构一维数组定义的一般形式为基类型符 数组名常量表达式;其中,基类型符可以是基本类型中任一种类型的关键字,

2、如int、char、float、double等,说明了构成数组各元素的数据类型。数组名是数组引用的标识符,命名规则同变量。方括号中的常量表达式表示数组元素的个数,也称为数组的长度。常量表达式是只能包含常量和符号常量,不能包含变量的表达式,即表达式具有确定的值。例如:定义数组就定义了数组的引用符号、元素的类型和元素的个数及元素的顺序关系。数组元素的序号是从0开始的,所以最大序号应是常量表达式的值减1。如a5表示数组a有 5个元素,分别为a0、a1、a2、a3、a4。在定义数组时需注意以下几点:(1)常量表达式中可以使用符号常量,但不能出现变量。例如:(2)数组长度说明只能用方括号,不能使用其他形

3、式的括号。(3)在一个定义语句中,可以定义一个数组,也可定义多个同一类型的数组,还可以和同一类型的变量一起定义,但各变量和数组之间要用逗号分隔。例如:int i,j,k,a10,b20;在程序中定义的数组,C语言编译系统会给数组元素分配一段连续的存储空间,每个元素按数据类型占用相同的字节数。6.1.2 一维数组的初始化一维数组的初始化定义了数组,并且编译系统给其分配了存储空间,但数组元素还不具有值。数组的初始化就是给数组元素提供初值。数组的初始化有以下几种情况:(1)给全部元素赋初值。例如:int a5=5,8,9,12,3;给数组元素提供的初值要用花括号括起来,数据之间用逗号分隔。编译时,把

4、数据依次赋给数组元素,即5赋给a0,8赋给a1,9赋给a2,12赋给a3,3赋给a4。给全部元素赋值时,在数组定义中,数组元素的个数可以缺省,元素个数默认为数据的个数,定义语句可以写成int a=5,8,9,12,3;(2)只给部分元素赋初值。例如:int a10=0,1,2,3;系统将提供的数据从a0开始,按顺序赋给前面的元素,剩余元素无初值,即将0赋给a0,1赋给a1,2赋给a2,3赋给a3,a4a9无初值。(3)若给全部元素赋相同初值,也只能给元素逐个赋值,不能给数组整体赋值。例如:给5个元素全部赋1值,只能写为int a5=1,1,1,1,1;而不能写为int a5=1;6.1.3 一

5、维数组元素的引用一维数组元素的引用虽然数组是作为一个数据对象,但只能引用数组的元素,而不能整体引用。对一个数组元素的引用相当于对一个变量的引用。数组元素引用的一般形式为数组名下标其中,下标只能为整型常量或整型表达式,如为小数,则系统自动取整。例如:a5、ai+j、ai+都是合法的数组元素引用形式。注意:注意:引用数组元素时,其下标表示元素在数组中的位置信息,而数组定义时方括号中的整型常量或整型表达式表示的是元素个数。例例6.1 定义数组,依次给10个元素赋值09,并逆序输出。编程思路:这是一个数组元素引用的例子。因为数组只能按元素引用,所以赋值和输出都只能逐个元素依次来进行。分析:从程序可以看

6、出,利用循环实现了数组逐个元素赋初值和输出。数组的下标变量与循环的控制变量使用一个变量i,利用循环规律能方便地实现数组元素的引用。6.1.4 一维数组的应用程序设计一维数组的应用程序设计一维数组的应用程序设计主要涉及具有线性关系的批量数据的处理问题,设计的关键是把数组元素的下标变量与循环控制变量结合起来,利用循环规律来达到按数组元素逐个进行处理的目的。例例6.2 定义一个具有10个元素的一维数组,输入元素的值,并输出其中最大值。编程思路:利用循环输入10个数,依次赋给数组元素。求10个元素中的最大数,可定义一个存放最大数的变量max,先将a0赋给max(暂设a0中的值为最大数),然后将max与

7、a1a9比较,遇到max小于某一元素值,则将该元素值赋给max,作为当前的最大数。逐个元素比较完,max中的值就是10个元素中的最大数。分析:程序中第一个循环控制变量i初值为0,循环终值为9,循环10次,从键盘输入10个整数,依次赋给a0a9。第二个循环控制变量i初值为1,循环终值为9,循环9次,从a1开始,与max值比较,找出最大元素。在数组处理循环中一定要注意下标越界的问题。如果将for(i=1;i10;i+)改为for(i=1;i2)即从第3项开始,每一项是前两项之和。迭代处理是一类常见的数据处理问题,利用数组和循环结构能有效地实现这类问题的处理。分析:定义数组时,按Fibonacci数

8、列的形成规律,给数组前两个元素赋初值1,从第3个元素开始,由循环根据迭代公式求出。例例6.4 使用冒泡法将10个数按由小到大的次序排序并输出。编程思路:排序问题是数据处理的常见问题之一。冒泡法排序是最基本的排序方法。在程序中实现对n个数排序,应定义一个有n个元素的一维数组。对数组元素两两进行比较,如果符合序(前一个小于后一个),则不交换;如果不符合序(前一个大于后一个),则进行交换。如此进行n-1次比较,找出最大的数,交换到最后一个元素(an-1)中。这样的比较过程称为一轮比较。经过第1轮比较,前面n-1个元素若仍是无序状态,则需要进行第2轮比较。在第2轮中,对n-1个元素进行n-2次比较,可

9、将最大的数交换到an-2中。如此需要进行n-1轮比较。最后一轮变为a1与a2的比较。最后在数组中就存放了排好序的数。冒泡法排序过程如图6.1所示(图中双向箭头线表示两数比较操作)。图6.1 冒泡法排序过程从算法分析可知,冒泡法排序要用双重循环来实现,外循环控制轮次,内循环实现每一轮中数组元素的两两比较。若n个数排序,设外循环控制变量为i,内循环控制变量为j,则其取值范围分别为0in-1和0jj-i。分析:程序中用了4个for循环。第一个for循环实现输入10个待排序的数,依次赋给数组元素。第二个for循环实现输出排序前的10个数。第三个for双重循环实现对10个数排序。外层循环语句实现排序数的

10、9轮比较,内层循环语句实现本轮排序数的两两比较,不符合序则交换。最后一个for循环实现排序后的10个数的输出。以上排序方法如要实现数据由大到小排列,只需将第三个for循环中的循环嵌套比较条件改为ajaj+1即可。例例6.5 使用选择法对10个数按由小到大的顺序排序并输出。编程思路:选择法是对冒泡法排序的改进。冒泡法对n个数排序,相邻两数比较,只要不符合序都要进行交换。在例6.4中,每轮比较找出一个最大数,放在最后一个数组元素中。这种方式称为“下沉法”。换一个思路,每轮比较找出一个最小数,放在最前一个数组元素中,这种方式则称为“上浮法”。选择法排序采用“上浮法”。在内循环中,每轮比较中只将最小值

11、元素的下标记录在一个变量中,每轮比较结束后只将所记录的最小值元素与首元素进行一次交换,以减少冒泡法排序中的交换次数,提高排序效率。分析:输入与例6.4相同的数,运行结果也相同。程序中定义变量k,记录本轮比较最小值元素的下标号。在内循环外,k赋值i,即设ai为最小数元素,也是本轮比较的首元素。在内循环中,ak与其后的元素两两比较,如有一元素aj比ak的值小,就将j记录在k中。结束内循环时,ak是最小数元素,与ai进行一次交换。内循环控制变量j的初值是i+1,表示前i个元素已排好序,本轮只进行第i个元素后的n-i个元素的比较排序。只需对程序稍作改进,即可实现数据由大到小排序的功能,读者可自行修改验

12、证。6.2 二二 维维 数数 组组何谓二维数组?二维数组在程序中如何表示与处理?何谓二维数组?二维数组在程序中如何表示与处理?二维数组可用来表示具有相同类型且具有二维关系的批量数据(数据集合),如平面表格数据、数学中的矩阵等。同一维数组一样,二维数组也必须先定义,编译系统按一定的存储结构存储后才能使用。6.2.1 二维数组的定义与存储结构二维数组的定义与存储结构二维数组定义的一般形式为基类型符 数组名常量表达式1常量表达式2其中,基类型符和数组名的表示与作用同一维数组的定义。数组名后跟两个方括号,其中常量表达式1表示二维数组的行数,常量表达式2表示二维数组的列数。例如:int a34;定义了一

13、个3行4列的二维数组a,包含34=12个整型数据元素,即a00,a01,a02,a03a10,a11,a12,a13a20,a21,a22,a23二维数组的行号和列号都是从0开始的,最大行号是常量表达式1的值减1,最大列号是常量表达式2的值减1。在程序中定义的二维数组,C语言编译系统给各元素按所定义的数据类型分配一段连续的存储空间。与一维数组不同的是,二维数组是二维逻辑结构,但存储器是线性存储结构,二维数组是按行线性存储的,即按第1行、第2行、第3行、,直到最后一行的顺序存储。6.2.2 二维数组的初始化二维数组的初始化定义了二维数组,只说明了二维数组的符号名称、所包含元素的个数及类型,数组元

14、素不具有值。要使数组元素具有值,需对二维数组初始化。二维数组的初始化也可以分为如下几种情况。(1)按行分段给全部元素赋初值。(2)线性连续给全部元素赋初值。(3)按行分段给部分元素赋初值。(4)线性连续给部分元素赋初值。6.2.3 二维数组元素的引用二维数组元素的引用对二维数组的数据处理中,也只能对其元素进行引用,不能进行整体引用。二维数组元素引用的一般形式为数组名行下标列下标其中,行下标和列下标只能为整型常量或整型表达式,如为小数,系统自动取整。行下标和列下标分别表示元素在数组中的行位置和列位置信息。对二维数组中一个元素的引用也如同对一个变量的引用一样。例例6.6 从键盘输入一个二维数组各元

15、素的值,并输出。编程思路:同一维数组一样,二维数组也只能按元素引用,给数组元素输入值和输出数组元素值都只能逐个元素依次来进行。分析:从程序可以看出,利用双重循环实现了数组逐个元素值的输入和输出。数组的行下标变量、列下标变量与内外循环的控制变量结合,利用双重循环能方便地实现数组元素的引用。6.2.4 二维数组的应用程序设计二维数组的应用程序设计二维数组的应用程序设计主要涉及行列结构的批量数据处理。程序结构采用双重循环,把二维数组元素的行列下标变量与外内循环控制变量相结合,既能反映批量数据的逻辑关系,又能达到按数组元素逐个进行处理的目的。例例6.7 编写程序,求4个同学、3门课程的单科成绩的平均分

16、和所有科目总的平均分,并输出。编程思路:4个学生、3门课程成绩表属于二维数组结构数据。定义学生数据为行、课程成绩为列的二维数组,则求单科成绩平均分需按列求和。为求所有科目总的平均分,需将单科平均分保存,可将二维数组多定义一行,最后一行用于保存单科平均分。分析:外循环控制变量i代表第i门课程,内循环控制变量j代表第j个学生。外循环一次,内循环执行一遍,就求出4个学生一门课程的总分。内循环结束时,求出第i门课程的平均分,存入a4i中。结束外循环后,又对数组第4行元素求和再除以课程门数得平均分。例例6.8 编写程序,实现求一个34矩阵的转置矩阵,并输出转置前后的矩阵。编程思路:求转置矩阵是将原矩阵的

17、列变成行,行变成列。利用二维数组可以很容易地实现。定义原矩阵为a,转置矩阵为b,则在双重循环中用“bij=aji;”语句即可实现转置。分析:程序中用了3个双重循环。第1个双重循环实现原矩阵输出;第2个双重循环实现求转置矩阵;第3个双重循环实现转置矩阵输出。例例6.9 编写程序,在一个33矩阵中找出最大的元素,输出元素值及其所在的行号和列号,并求主对角线元素值之和。编程思路:定义一个存放最大数变量max,以及行号、列号存放变量row、column,先将矩阵二维数组的首元素赋给max,在双重循环中,使每一元素与max比较,遇到大于max的元素,则将其值置换到max中,并将行号、列号记录在row、c

18、olumn中。求对角线元素值之和是行号与列号相等的元素累加。分析:对角线元素值之和,使用一个单层循环即可实现,放在外循环中。找最大元素值可在内循环中实现。在内循环外先设定首元素值为最大元素值。实际上,设定比矩阵中最大元素值小的一个数值即可。例例6.10 利用二维数组打印杨辉三角形。编程思路:定义一个二维数组,存放杨辉三角形数据。利用杨辉三角形规律形成数据,存入二维数组。杨辉三角形数组元素形成的算法是,数组的第0列和对角线元素值为1;其余各行元素是其上一行同列元素和上一行前一列元素之和。下面以5行数据为例编写程序。分析:程序中第1个单层循环使第1列和对角线元素为1。第2个双重循环生成杨辉三角形的

19、其他元素。第3个双重循环输出生成的杨辉三角形元素值。定义了常量N作数组行列数,只要修改N的定义值,可生成任意行数的杨辉三角形。6.3 字字 符符 数数 组组何谓字符数组?字符数组在程序中如何表示与处理?何谓字符数组?字符数组在程序中如何表示与处理?在C语言中只有字符和字符串常量、字符变量,没有专门的字符串变量。对于一个字符串的存储和处理是通过字符数组来实现的,每个数组元素存放一个字符。用来存放字符串的数组称为字符数组。6.3.1 字符数组的定义与初始化字符数组的定义与初始化字符数组的定义形式与数值数组的定义形式相同,只是基类型说明符用char。例如:char c10;由于字符型和整型可以通用,

20、也可以定义int c10来存储字符串,但这时每个数组元素在VC中占用4个字节的内存单元,会造成空间的浪费。字符数组也可以是二维的。例如:char c510;即为二维字符数组。字符数组也允许在定义时,对部分或全部元素进行初始化赋值。字符数组初始化是给元素提供字符常量。例如:char c10=c,p,r,o,g,r,a,m;该字符数组的存储结构如图6.2所示。图6.2 字符数组的存储结构因为字符串是按字符数组存储的,所以可以用字符串对字符数组初始化,而且字符数组定义时,方括号中的长度可以缺省。用字符串初始化的字符数组可称为字符串数组。例如:char c=C program;C语言规定,一个字符串有

21、一个字符串结束符“0”。所以,用字符串给字符数组提供初值,系统自动在字符串最后一个字符后增加一个字节,用于存储“0”。如图6-2的c9中即存“0”。字符数组与字符串数组的不同之处是,字符串数组的存储字节数比实际字符多一个。也可以定义、初始化二维字符数组。初始化的方法同数值数组,只是提供的数据为字符数据。例如:定义一个表示5行5列的“*”菱形图案的二维字符数组。char c55=,*,,*,*,*,*,,*,*,,*;6.3.2 字符数组的引用字符数组的引用C语言中各种类型的数组都只能按元素来引用。但字符串数组的输入/输出可以是整体方式。字符串数组使用printf函数和scanf函数以及“%s”

22、格式符,可一次性输入/输出一个字符数组中的字符串。例如:char c=C Programe;printf(%s,c);scanf(%s,c);注意:注意:scanf中使用的是数组名。这与数组元素的引用不同,数组元素引用是地址方式。字符串输入结束后,系统也自动加存一个字符串结束符“0”例例6.11 输入一个字符串,然后输出,测试字符串长度。编程思路:C语言库函数中提供了一个测试字符串函数int strlen(str)。使用时,在程序开头要使用预处理命令#include。下面采用字符串输入/输出方式。分析:程序中定义的字符数组要比输入的字符串长度大,在输入字符串时,系统自动加字符串结束符“0”。输

23、出时,识别到“0”就认为字符串结束,仅输出有效字符。字符串长度测试函数也只计数有效字符。例例6.12 编写程序,输出一个钻石图形。编程思路:钻石图形用“*”表示。定义一个二维字符数组,存放图形字符数据,采用字符数组元素输出方式。6.3.3 字符串处理函数字符串处理函数C语言提供了丰富的字符串处理函数。按其功能,字符串处理函数大致可分为字符串的输入、输出、连接、比较、转换、复制、搜索等几类。使用这些函数可大大减轻编程的负担。输入/输出字符串函数puts、gets在使用时应包含头文件“stdio.h”,其他字符串函数则应包含头文件“string.h”。详细情况请查阅书后附录D。下面介绍几个最常用的

24、字符串处理函数。1字符串输出函数字符串输出函数 puts格式:puts(字符数组);功能:输出字符数组中的字符串。2字符串输入函数字符串输入函数gets格式:gets(字符数组);功能:从键盘输入一个字符串,存入到指定的字符数组中。当输入的字符串中含有空格时,空格也作为有效字符,只以回车作为输入结束。这是与scanf函数不同的。3字符串连接函数字符串连接函数strcat格式:strcat(字符数组1,字符数组2);功能:把字符数组2中的字符串连接到字符数组1中字符串的后面,并删去字符串1后的串结束标志“0”,组成新的字符串。本函数返回值是字符数组1的首地址。应注意:字符数组1应定义得足够长,否

25、则不能全部装入被连接的字符串。4字符串拷贝函数字符串拷贝函数strcpy格式:strcpy(字符数组1,字符串2);功能:把字符串2拷贝到字符数组1中,字符串2可以是字符串,也可以是字符数组。串结束标志“0”也一同拷贝。在使用函数strcpy时应注意以下几点:(1)字符数组1必须定义得足够大,以便容纳被复制的字符串。字符数组1至少不应小于字符串2的长度,否则不能全部装入所拷贝的字符串。(2)字符数组1必须写成数组名形式,而字符串2可以是字符数组,也可以是字符串常量。(3)有时也可以只复制字符串2中的前若干个字符,其具体使用格式为strcpy(字符数组1,字符串2,m)表示将字符串2中的前m个字

26、符复制到字符数组1中,取代字符数组1中的前m个字符。5字符串比较函数字符串比较函数strcmp格式:strcmp(字符串1,字符串2);功能:对两个字符串字母逐个比较,比较对应字符的ASCII码值,函数返回比较结果。返回值情况如下:(1)字符串1=字符串2,返回值为0,表示两字符串每个字符都相同,字符个数也相同。(2)字符串1字符串2,返回大于0的正整数值,只要遇到串1的一个字符大于串2的字符,就是串1大于串2。(3)字符串1=A&c=a&c=A)&(c=a)&(cak,k就是要插入的位置。可用for循环来实现。挪开插入位置。从数组尾元素到插入位置元素ak,依次后移,即ai+1=ai。可用fo

27、r循环来实现。插入,即ak=n。2.调试运行程序(1)运行程序,输入一组无序数据,检测是否实现从小到大排序;在数组的不同位置拟定一个插入数据,检测插入是否正确。(2)修改程序,实现从大到小排序,并在数组中插入一个数,运行程序,检测结果是否正确。实训项目实训项目2 设计程序,实现以下功能:(1)输入学生成绩表,存入二维数组中,为避免繁琐的数据输入,可暂设5个学生、4门课成绩。(2)按格式输出学生成绩表。(3)查询大于等于90分的学生,按学生和课程序号输出成绩。(4)查询60分以下的学生,按学生和课程序号输出成绩。输入/输出界面可参照图6.4所示。图6.4 实训项目2界面式样实训指导实训指导1.设

28、计程序(1)根据学生数和课程门数定义二维数组。(2)为保持与成绩表一致的形式输入成绩,可用单循环,循环一次输入一个学生的各门课成绩,循环体中用格式输入语句“scanf(%f%f%f%f,&ai0.&ai0.&ai0.&ai0)”。(3)用格式输出语句输出成绩表表头,如“printf(学号 课程1 课程2 课程3 课程4n);”。(4)用双重循环和格式输出语句输出成绩。(5)查找大于等于90分的学生,用双重循环逐个学生每门课成绩与90比较,如果大于或等于90,则按该学生序号和课程序号输出成绩。学生序号按数组行标加1(i+1),课程序号按列标加1(j+1)。(6)查找低于60分学生的方法同查找大于

29、等于90分的学生。2调试运行程序(1)按5个学生、4门课成绩输入数据,测试运行结果是否满足要求。(2)修改程序,添加学生和课程数,测试运行结果是否满足要求。实训项目实训项目3 设计程序,输入一行电文,按下面规律译成密码,并统计电文长度(字符总数)、电文字母数、电文非字母数,输出加密电文及统计结果。输入/输出界面可参照图6.5所示。图6.5 实训项目3界面式样电文加密规律为 AZaz BYby CXcx 即第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。实训指导1.设计程序(1)输入一行电文(字符串),以字符的ASCII码存储在一维数组中,定义字符数组为a80

30、。字符的ASCII码与该字符在26个字母中的序号i的关系为aj=a+i或aj=A+i(其中:i=0,1,2,25;j为数组元素序号),即由字符ASCII码可求出该字符在26个字母中的序号i=aj-a或i=aj-A。按加密规律,26个字母中的第i个字符需转换成第(25-i)个字符,在程序中的实现语句可用“aj=a+(25-i);”或“aj=A+(25-i);”。(2)电文中的字母转换及统计可用循环来实现。在循环体中判断,是小写字母按小写字符转换并统计,是大写字母按大写字母转换并统计。2调试运行程序(1)输入一行电文,检测结果是否正确,记录加密电文。(2)输入加密电文,检测结果是否还原为原文。课外

31、练习课外练习1分析以下问题,从每小题的4个备选项中选择一个正确项。(1)如下程序的运行结果是()。(2)执行下列程序时,输入“123456789”,输出结果是()。(3)如下程序的输出结果是()。(4)当执行下面的程序时,如果输入ABC,则输出结果是()。(5)设有数组定义“char arrar=China;”,则数组array所占的空间为()个字节。A4个字节 B5个字节C6个字节D7个字节(6)下面程序运行后的输出结果是()。(7)以下程序的输出结果是()。2分析程序的执行结果,并上机运行程序进行验证。(1)下面程序的执行结果是 。(2)以下程序的输出结果是 。(3)下面程序的运行结果是 。3在下面不完整程序的下划线处填写适当的语句代码,使程序能够正确运行。(1)将字符数组a中下标值为偶数的元素从小到大排列,其他元素不变。(2)以下程序统计从终端输入的字符中大写字母的个数,用#号作为输入结束标志。4编写程序,删除一维数组中的指定元素。5编写程序,从键盘输入44矩阵数据,求对角线元素之和。6编写程序,把两个字符串连接成一个字符串,统计连接后的字符串中的字符个数。

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

当前位置:首页 > 大学
版权提示 | 免责声明

1,本文(《C语言程序设计基础》课件_第6章.pptx)为本站会员(kld)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|