C语言程序设计实践第四章.pptx
第四章 数组的应用,huy,本章中的知识点主要涵盖了数组的定义和使用以及数组的常用算法。应熟练掌握一维数组和多维数组的定义、初始化和引用。熟练掌握字符串与字符数组的定义和使用。本章知识体系 重点一维数组和二维数组、字符数组的定义、初始化和引用及常用算法。 难点数组的排序、查找、插入、删除等算法。,任务4.1 一维数组编程,【知识点】 1、 数组的相关概念数组是由具有相同类型的固定个数的元素集合。数组元素在数组中的位置序号称下标,下标从0开始,每一个数组元素都是一个变量,为了与一般的变量相区别,称数组元素为下标变量。 2、一维数组定义格式 类型标识符 数组名常量表达式; 其中数组名是用户定义的标识符,整个数组占用一段连续的内存单元,各元素按下标顺序存放,数组名表示了这段存储单元的首地址,即第一个数组元素的地址。常量表达式表示数组长度,即该数组有多少个数组元素。 例如int a5; 说明有5个元素,其元素分别是a0、a1、a2、a3、a4。下标从0开始,不能大于等于5。3、 一维数组初始化的几种方式 1 在定义数组时对全部数组元素赋初值。 例如int a5 1, 2, 3, 4, 5; 2 只给部分数组元素赋初值,系统自动对其余元素赋缺省值。 例如int a51, 3, 5,; 等价于int a51, 3, 5, 0, 0; 3 使数组中全部元素初值都为 0。 例如int a50; 4 对全部数组元素赋初值时,可以不指定数组长度,其长度由初值个数自动确定。 例如int a 1, 2, 3, 4, 5; 4、一维数组元素的输入、输出一般采用循环语句实现。 例如 int a10, i; fori0; i10; i scanf“d”, ,【任务要求】 1、掌握一维数组的定义、初始化与使用。 2、掌握一维数组的输入、输出方法。 3、学会应用一维数组编程求解问题。,【任务内容】 1、先阅读以下程序,分析程序的运行结果,再创建一个文件名为4-1.cpp的文件,编写程序,上机验证。1 include 2 define M 10 3 void main 4 5 int sM, i, k1; 6 fori0;i0;i /*下标值从大到小*/ 16 17 printf“4d“,si;/*利用条件表达式来决定输出换行符还是输出空格*/ 18 ifi50 printf“n“; 19 20 printf“n“; 21 2.先阅读以下程序,分析程序的运行结果,再创建一个文件名为4-2.cpp的文件,编写程序,上机验证。 include void main int a 113, 5, 8, 10, 12, 16, 19, 24, 28, 37; int n, i, j, pos; printf“ n“; scanf“d“, ,3.创建一个文件名为4-3.cpp的文件,编写程序,实现把数组中的值逆序输出。 include void main int a5 , n , m ,t; forn0 ; n5 ; n 通过用户输入,获取数组的值 scanf“d“, ,4.创建一个文件名为4-4.cpp的文件,编写程序,利用假设法求一维数组中的最大、小值。 include void main int a10 , min , max ,n ; forn0 ; nmax 找到较大的数用max来保存 maxan; else if anmin 找到较小的数用min来保存 minan; printf“最大值为d,最小值为dn“,max,min; 打印出最大、最小数 ,任务4.2 二维数组编程 【知识点】 1.二维数组定义格式 类型标识符 数组名常量表达式1常量表达式2; 常量表达式1表示二维数组第一维的长度,常量表达式2表示第二维的长度,二维数组的总元素个数为两维长度的乘积。 从本质上来说,二维数组可以理解为一维数组的一维数组,即二维数组也是一个特殊的一维数组,这个数组的每一个元素都是一个一维数组。 二维数组在内存中的存储空间也是连续的线性空间,其存放顺序是按行存储,即先存放第一行的元素,再存放第二行元素,依次类推。二维数组的数组名表示数组在内存中的首地址。 2.二维数组初始化的几种方式 1 分行初始化,每行数据用一对花括号括起来。例如 int a231,2,3, 4,5,6; 2 按数组存储顺序依次给各元素赋初值。例如 int a231,2,3,4,5,6; 注意 此方法数据没有明显的界限, 当数据较多时容易出错 3 对部分元素赋初值,其余元素赋缺省值。例如 int a341, 0, 5, 9;4 对数组中前面几行赋初值,后面各行的元素自动赋缺省值。例如 int a431, 3,5; 5 当对全部数组元素赋初值时,第一维的长度可以省略,但第二维长度不能省略。例如 int a 31,2,3,4,5,6,7,8,9; 6 分行初始化时,也可以省略第一维的长度说明。例如 int a 31,3, 0,2, 4; 3.二维数组元素的输入、输出一般采用双层循环语句实现。例如 int a34, i, j; fori0; i3; i forj0; j4; j scanf“d”, 【任务要求】 1、掌握二维数组的定义、初始化与使用。 2、掌握二维数组的输入、输出方法。 3、学会应用二维数组编程求解问题。 【任务内容】 1、阅读以下程序,先分析程序的运行结果,再创建一个文件名为4-5.cpp的文件,编写程序,上机验证。 1 include 2 void main 3 4 int a33, i, j; 5 fori0; i3; i 数组的行 6 forj0; j3; j 数组的列 7 aijij; 给数组赋值 8 fori0; i3; i 数组的行 9 10 forj0; j3; j 数组的列 11 printf“3d“, aij; 打印数组赋值 12 printf“n“; 对数组每行进行换行一次 13 14 ,2.创建一个文件名为4-6.cpp的文件,编写程序,实现把二维数组中每个元素的行和列互换后,再存到另一个数组中。 1 include 2 void main 3 4 int a23 , b32 , n , m ; 5 for n0 ; n2 ; n 控制数组的行 6 for m0 ; m3 ; m 控制数组的列 7 scanf“d“, 24 25 ,2 字符串的输入、输出。 char a10; scanf“s”, a; printf“s”, a; getsa; putsa; 注意 输入、输出字符串时,都是使用字符数组名 用s输入字符串时,遇到空格、回车符都会作为字符串的分隔符,即s格式不能用来输入包含有空格的字符串。 要使用gets和puts函数,需要在程序的开头添加“include ”来进行说明。 使用gets函数可以读入包括空格在内的全部字符直到遇到回车符为止;用gets输入字符串时,若输入字符数大于字符数组的长度,则多出的字符会存放在数组的存储空间之外。 puts函数一次只能输出一个字符串,输出时将0自动转换成换行符,4、字符串处理函数,这些函数都包含在头文件“string.h”中,在使用这些函数时必须在程序的开头添加“include ”来进行说明。 1 字符串拷贝函数strcpy ,格式如下 char *strcpy字符数组名1,字符数组名2 功能将字符数组2的字符复制到字符数组1中。 2 字符串连接函数strcat ,格式如下 char *strcat字符数组名1,字符数组名2 功能把字符数组2的字符连接到字符数组1的后面,仍存放在字符数组1中。 3 字符串比较函数strcmp ,格式如下 int strcmp字符数组名1, 字符数组名2 功能比较字符数组1和字符数组2的字符,从左到右逐个字符比较ASCII值的大小,直到出现的字符不一样或遇到0为止,比较结果由函数返回。 若字符数组1中的字符字符数组2中的字符,函数的返回值为0; 若字符数组1中的字符字符数组2中的字符,函数的返回值为一正整数; 若字符数组1中的字符字符数组2中的字符,函数的返回值为一负整数。 4 测试字符串长度函数strlen ,格式如下 int strlen字符数组名 功能测试字符数组长度,函数返回值为字符串的实际长度,不包括0在内。,【任务要求】 1.掌握字符数组的定义、初始化与使用。 2.掌握字符数组及字符串的输入、输出方法。 3.掌握字符串处理函数的使用。 4.学会应用字符数组编程求解问题。 【任务内容】 1.阅读以下程序,先分析程序的运行结果,再创建一个文件名为4-7.cpp的文件,编写程序,上机验证。 1 include 2 void main 3 4 char a10 ; 5 int i ; 6 printf“请给一维字符型数组输入字符型常量n“; 7 for i0 ; i10 ; i 8 scanf“c“, 12 ,2.阅读以下程序,先分析程序的运行结果,再创建一个文件名为4-8.cpp的文件,编写程序,上机验证。 1 include 2 void main 3 4 char s80; 5 int i, j; 6 getss; 7 fori0, j0; si0a 9 sjsi; 10 j; 11 12 sj0 14 ,3.阅读以下程序,先分析程序的运行结果,再创建一个文件名为4-9.cpp的文件,编写程序,上机验证。 1 include 2 include 3 void main 4 5 char st130“My name is “; 6 char st210; 7 printf“ your namen“; 8 getsst2; 9 strcatst1,st2; 10 putsst1; 11 ,4.阅读以下程序,先分析程序的运行结果,再创建一个文件名为4-10.cpp的文件,编写程序,上机验证。 1 include 2 include 3 void main 4 5 static char st115,st2“C Language“; 6 strcpyst1,st2; 7 putsst1; 8 printf“n“; 9 【运行结果】 【说明】 字符串复制(拷贝)函数strcpy,调用形式如下 strcpys1,s2 此函数用来把s2所指字符串(源)的内容复制到s1所指存储空间(目的)中,函数返回s1的值,即目的串的首地址。 注意为保证复制的合法性,s1必须指向一个足够容纳s2串的存储空间。,5.阅读以下程序,先分析程序的运行结果,再创建一个文件名为4-11.cpp的文件,编写程序,上机验证。 1 include 2 include 3 void main 4 5 int k; 6 static char st115,st2“C Language“; 7 printf“ a stringn“; 8 getsst1; 9 kstrcmpst1,st2; 10 ifk0 printf“st1st2n“; 11 ifk0 printf“st1st2n“; 12 ifk0 printf“st1st2n“; 13 输入B Language 【运行结果】,【说明】 字符串比较函数strcmp,strcmp函数的调用形式如下 strcmps1,s2 该函数用来比较s1和s2所指字符串的大小。 若串s1串s2,函数值大于(正数); 若串s1 串s2,函数值等于; 若若串s1串s2,函数值小于(负数)。 字符串比较的方法是依次对s1和s2所指字符串对应位置上的字符两两进行比较,当出现第一对不相同的字符时,即由这两个字符决定所在串的大小(字符大小的依据是其ASC码值)。 本函数也可用于比较两个字符串常量,或比较数组和字符串常量。,6.阅读以下程序,先分析程序的运行结果,再创建一个文件名为4-12.cpp的文件,编写程序,上机验证。 1 include 2 include 3 void main 4 5 int k; 6 static char st“C language“; 7 kstrlenst; 8 printf“The lenth of the string is dn“,k; 9 输入B Language 【运行结果】 【说明】 求字符串长度strlen。strlen函数的调用形式如下 strlens 此函数计算出以s为起始地址的字符串的长度,并作为函数值返回。这一长度不包括串尾的结束标志0。,3几种常见的定义、赋值形式 1 int a331,2,3,4,5,6,7,8,9; 说明左侧是一个3行3列的二维数组,数组中共有9个整型存储空间,把右侧集合中从左往右的整型常量值一个一个的存放到数组中。 2 int b112*11,2,3,5 ; 说明左侧是一个2行2列的二维数组,数组中共有4个整型存储空间,把右侧集合中按大括号从左往右的整型常量值一个一个的存放到数组中。 3 double c 31.2,2.5,5.32,6.32,1.25,0.241,12.36 ; 说明在二维数组的边定义边初始化过程中,只有行的长度可以省略,行长度值(右侧集合中要赋的常量值的个数)/(列长度)注意所有的小数都要进位。 4要给3行3列的二维数组中,第一行只给第二列放5,第二行给只第三列放10,第三行只给第二列放100。long d330,5,0,0,100;注意不存数据的空间中可以放0,或不用赋值的空间中可以把0省略掉。 错误的形式 1 int e22; e221,2,3,4; 错误1 在非定义语句中,方括号中的数据叫下标,下标是从0开始计算的,所以数组e中就没有行下标和列下标都为2的存储单元格。 错误2 左侧只有一个存储空间,能放一个整型常量值,而右侧有4个整型常量数值需要空间来存放。,