版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第4章 数组,目的与要求 4.1 数组的定义与使用 4.2 字符数组的定义和使用 4.3 数组应用举例(习题课) 本章小结,目的与要求,通过本章学习,应掌握一维数组和二维数组的定义、初始化赋值和使用方法,掌握字符数组的定义、初始化赋值和使用方法,掌握字符串处理函数的使用方法。掌握利用数组编写程序的基本方法。,4.1 数组的定义与使用,4.1.1 一维数组的定义和使用 1.一维数组的定义与初始化赋值 (1)一维数组的定义 定义格式为: 存储类型 ; 例:int a10; 表示定义一个名为a的整型数组,有10个元素,分别为a0、a1、a2、a3、a4、a5、a6、a7、a8、a9 。,(2)一维数
2、组的初始化赋值,初始化格式: 数据类型 数组名常量表达式初值表 方法 : 给数组的所有元素赋初值 例如:int a10=1,2,3,4,5,6,7,8,9,10; 例如:int b =1,2,3,4,5; 给数组的部分元素赋初值 例如:int a10=1,2,3,4,5; 当把数组定义为全局变量或静态变量时,所有数组元素的初值均为0;当把数组定义为其他存储类型的局部变量时,数组元素没有确定的值,即其值是随机的。,2.一维数组在内存中的存储方式,一维数组的存储方式,定义数组后,系统为数组分配一串连续的存储单元,依次存放各个数组元素。 例如,定义 int a10=1,2,3,4,5,6,7,8,9
3、,10; 系统将为a数组分配10个元素的存储空间,每个元素占有4个字节,其存储空间的分配情况如图所示。,3.一维数组元素的访问,一维数组元素的访问形式为: 说明:下标表达式的值就是被访问的数组元素的下标,其数据类型必须为整型。 【例4.1】 通过键盘将10个整数依次输入到一个数组中,然后按倒序输出。 例程,4.一维数组应用举例,【例4.2】 某小组有10个学生,进行了数学考试,求他们数学成绩的平均分、最高分和最低分。 例程 【例4.3】 将一个数组的内容按颠倒的次序重新存放。例如数组中数组元素原来的值依次为:8、3、5、1、9、7、2,要求改为:2、7、9、1、5、3、8。 例程 【例4.4】
4、 某班有10个学生,进行了数学考试,现要求将数学成绩按由低到高的顺序排序。 (1)冒泡法 (2)选择法,4.1.2 二维数组的定义使用,1.二维数组的定义与初始化赋 (1)二维数组的定义 定义格式为: 存储类型 ; 说明: 常量表达式1指明二维数组的行数;常量表达式2则指明二维数组的列数。 例如:int a34; 表示定义了一个二维数组a,其元素的数据类型为整型,它有3行4列共12个元素。 a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23,(2)二维数组的初始化赋值, 给数组的所有元素赋初值 方法一:每行一个花括号,花括号间用逗号分隔,全部初值再用
5、一个花括号。例如: int a34=1,2,3,4,5,6,7,8,9,10,11,12; 方法二:所有初值放在一个花括号中,按数组排列的顺序给各元素赋初值。例如: int a34=1,2,3,4,5,6,7,8,9,10,11,12; 注意:若对所有元素都赋初值,则定义数组时行数可不指定,而列数必须指定。例如: int a 4=1,2,3,4,5,6,7,8,9,10,11,12; 或: int a 4=1,2,3,4,5,6,7,8,9,10,11,12;,二维数组的初始化赋值, 给数组的部分元素赋初值 给数组的部分元素赋初值的方法与给数组的所有元素赋初值的方法类似。 例如: int a3
6、4=1,2,5,9,10,11; 表示二维数组a的元素a00、a01、a10、a20、a21、a22赋了初值,其余元素的初值为0。,2.二维数组在内存中的存储方式,二维数组的存储方式,C+中,按行顺序存放二维数组各数组元素,即先存放第一行上的元素,再存放第二行上的元素,依次把各行上的元素存入一串连续的存储单元中。 例如上节中所定义的a数组存储在内存中时各数组元素的排列顺序如图所示。,3.二维数组元素的访问,格式: 下标表达式1和下标表达式2的值就是被访问的数组元素的两个下标,其数据类型必须为整型或符号常量。 下标表达式1和下标表达式2的值,都应在已定义数组大小的范围内。假设有数组a34,则可用
7、的行下标范围为02,列下标范围为03。 【例4.5】 通过键盘给一个3行4列的二维数组输入整型数值,并按表格形式输出此数组的所有元素。 例程,4.二维数组应用举例,【例4.6】 某小组有5个学生,考了3门课程,他们的学号及成绩如书中表4.1所示,试编程求每个学生的平均成绩,并按表格形式输出每个学生的学号、3门课程成绩和平均成绩。 【例4.7】 将一个二维数组的行和列元素互换,形成另一个二维数组,即数组的转置运算。,例程,例程,4.2 字符数组的定义和使用,4.2.1 字符数组和字符串 1.字符串常量及其结束标志 (1)字符串常量(简称字符串)用一对双引号将字符序列括起来。 (2)为了判断字符串
8、是否结束,系统自动在字符串的末尾加上一个字符0 作为字符串的结束标志 。 (3)字符串常量和字符常量的区别,2.字符数组与字符串,(1)字符数组的定义 格式 :存储类型 char ; (2)字符数组的初始化赋值 给字符数组的各个元素逐个赋初值 例如:char str12=C,+,+, ,p,r,o,g,r,a,m,0; 注意:用这种方法对字符数组进行初始化时,可以不指定字符数组的长度。 给字符数组指定一个字符串初值,系统将自动在最后一个字符后面加一个字符0 。 例如:char str=C+ program; 注意:字符数组的长度为12,而不是11。,3.字符数组的输入与输出,(1)把字符数组中
9、的元素逐个输入/输出。这种输入/输出方法通常采用循环语句来实现。 【例4.8】 将从键盘输入的10个字符依次送给数组str中的各个元素,并将数组str中的元素按倒序输出。 例程 (2)把字符数组作为字符串进行整体的输入/输出。采用这种方法输入时,在cin中仅给出字符数组名;输出时,在cout中也仅给出字符数组名。 【例4.9】 将两个字符串分别输入到两个字符数组中,并把这两个数组中的字符串输出。 例程,4.2.2 字符串处理函数,1.求字符串长度函数strlen() 格式:strlen() 功能:求字符串的长度。 例如: char str=C+ program; coutstrlen(str)
10、endl; 则屏幕输出字符串长度为11。 说明: (1)字符串可以是字符数组名,也可以是字符串常量。 (2)函数值为字符串的实际长度,不包括最后的0在内。,2.字符串复制函数strcpy(),格式:strcpy(,) 功能:将字符串2复制到字符数组1中。 例如:char str112,str2=C+ program; strcpy(str1,str2); 则字符数组str1的内容为C+ program。 说明: (1)字符数组1必须是字符数组名,字符串2可以是字符数组名,也可以是字符串常量; (2)字符数组1必须足够大,以便容纳被复制的字符串; (3)字符串2后的0也一起复制到字符数组1中;
11、(4)在赋值运算符“=”没有重载之前,不能用赋值语句将一个字符串常量或字符数组赋给另一个字符数组,只能用字符串复制函数来处理。例如下面操作是非法的: str2=C+ program; str1=str2;,3.字符串连接函数strcat(),格式:strcat(,) 功能:将字符串2连接到字符数组1中的字符串后,其结果存放在字符数组1中。 例如: char str130=I am a ; char str2=student.; strcat(str1,str2); 则字符数组1的内容为I am a student.。 说明: (1)字符数组1必须是字符数组名,字符串2可以是字符数组名,也可以是
12、字符串常量; (2)字符数组1必须足够大,以便容纳连接后的新字符串; (3)连接时字符串1之后的0取消,只在新字符串最后保留一个0。,4.字符串比较函数strcmp(),格式:strcmp(,) 功能:将两个字符串从左到右逐个字符进行比较(按ASCII码的大小比较),直到出现不同的字符或遇到0为止。如果所有字符相同,则认为两个字符串相等;若出现不相同的字符,则以第一个不相同的字符的比较结果作为两个字符串的比较结果。比较结果由函数值带回。 (1)如果字符串1=字符串2,则函数值为0; (2)如果字符串1字符串2,则函数值为一个正整数; (3)如果字符串1字符串2,则函数值为一个负整数。,字符串比
13、较函数strcmp(),说明: (1)字符串1和字符串2都可以是字符数组名,也可以是字符串常量; (2)在比较运算符(如“=”)没有重载之前,两个字符串间不能用关系运算符进行比较,而只能用字符串比较函数来处理。例如下面的操作是非法的: if (str1=str2) coutTrue; else coutFalse;,5.字符串中大写字母变换成小写字母函数strlwr(),格式:strlwr() 功能:将字符数组中的所有大写字母均换成小写字母。 例如: char str=CHINA; strlwr(str); 则str中的内容变换成:china ;,6.字符串中小写字母变换成大写字母函数stru
14、pr(),格式:strupr() 功能:将字符数组中的所有小写字母均换成大写字母。 例如: char str=china; strupr(str); 则str中的内容变换成:CHINA“。,4.2.3 字符数组应用举例,【例4.10】从键盘输入两个字符串,将它们连接成一个字符串。 方法一:使用字符串连接函数strcat连接两个字符串。 方法二:不使用字符串连接函数strcat连接两个字符串。 方法三:在方法二中,使用字符串结束标志0来判断字符串的结束位置。事实上也可以用求字符串长度函数strlen确定字符串结束位置。,例程,例程,例程,4.3 数组应用举例(习题课),4.3.1一维数组应用举例
15、 1. 一维数组内容小结 (1)定义格式:存储类型长度=初值; (2)元素引用:下标表达式 (3)输入/输出:一维数组元素只允许单个元素的输入输出; 2一维数组应用举例 (1)求数组的最大值与最小值 (2)求数组的和与平均值 (3)对数组排序 对一维数组排序共有三种方法,即冒泡法、选择法与擂台法。 【例4.11】已有一按从小到大次序排序好的数组,现输入一数,要求按原来排序的规律将它插入到数组中。,例程,4.3.2 二维数组应用举例,(1)格式: 存储类型行长列长=初值 (2)元素引用:行下标表达式 列下标表达式 (3)输入/输出:二维数组元素只允许单个元素的输入输出,而不允许用数组名a进行输入
16、或输出。 【例4.12】 某小组有5个学生,考了3门课程,他们的学号及成绩如书中表4.2所示,试编程求每个学生的总成绩及每门课的平均成绩,并按表格形式输出每个学生的学号、3门课程成绩、总成绩及各门课程的平均成绩。要求用一个6行5列的数组完成上述操作。对学生成绩表按总成绩排序后输出。 【例4.13】)设计一个程序,打印杨辉三角形。,例程,例程,4.3.3 字符数组应用举例,(1)格式:存储类型 char 长度=“字符串”; (2)数组引用:下标 (3)输入输出:可以整体赋初值、整体输入和输出。 (4)字符串处理函数 C+提供的字符串处理函数包含在头文件string.h中。 常用的字符串处理函数有
17、: 求字符串长度函数:strlen(str); /返回字符串str长度 字符串复制函数:strcpy(s1,s2);/s1s2 字符串连接函数:strcat(s1,s2);/s1s1+s2 字符串比较函数:strcmp(s1,s2);/当s1s2时函数值0 /当s1=s2时函数值=0,当s1s2时函数值0 【例4.14】 从键盘输入三个字符串,找出其中的最大者。,例程,本章小结,1.一维数组 (1)定义格式: 存储类型 ; (2)访问形式: 2.二维数组 (1)定义格式: 存储类型 ; (2)访问形式: 注意:不论一维数组和二维数组,都必须先定义后使用;数组元素的下标从0开始,且不能超出范围。
18、,3.字符数组和字符串,(1)字符串:用一对双引号括起来的字符序列,在字符串的末尾有一个结束标志0。 (2)字符数组定义格式: 存储类型 char ; (3)字符串处理函数,(1)冒泡法,冒泡法(续),外循环用变量i控制轮次,i的值从0到3(3=N-2),共进行N-1轮。 用循环语句表示为:for(i=0;iaj+1) temp=aj; aj =aj+1; aj+1=temp; 因此排序程序的主体结构为: for (i=0;iaj+1) temp=aj; aj =aj+1; aj+1=temp; ,例程,(2)选择法,选择法(续),外循环用变量i控制轮次,i的值从0到3(3=N-2),共进行N
19、-1轮。 用循环语句表示为:for(i=0;iaj) temp=ai; ai =aj; aj=temp; 因此排序程序的主体结构为: for (i=0;iaj) temp=ai; ai =aj; aj=temp; ,例程,例4.1,#include void main(void) int a10,i; coutai; for (i=9;i=0;i-) coutait; coutendl; 程序执行后提示: Input ten integers: 0 1 2 3 4 5 6 7 8 9 9 8 7 6 5 4 3 2 1 0 返回,例4.2,#include #define N 10 void
20、main(void) float aN,sum,ave,max,min; int i; coutai; sum=0; max=a0; min=a0; for (i=0;imax) max=ai; if (aimin) min=ai; ave=sum/N; coutave=ave,max=max,min=min; coutendl; 程序运行后,提示: Input integers:90 87 68 92 56 78 85 90 98 64 输出: ave=80.8,max=98,min=56,返回,例4.3,#include #include #define N 7 void main(voi
21、d) int aN,i,temp; coutai; for (i=0;iN;i+) coutsetw(4)ai; coutendl; for (i=0;iN/2;i+) temp=ai; ai=aN-i-1; aN-i-1=temp; for (i=0;iN;i+) coutsetw(4)ai; coutendl; 程序执行后提示: Input 7 integers:8 3 5 1 9 7 2 2 7 9 1 5 3 8,分析:设a数组有n个元素,将a数组中的内容按颠倒的次序重新存放,只需将元素a0的内容与元素an-1的内容交换,将元素a1的内容与元素an-2的内容交换,将元素ai的内容与元素
22、an-i-1的内容交换即可;i的取值范围为0到(取整)(n/2)-1。 返回,例4.4 冒泡法,#include #include #define N 10 void main(void) float aN,temp; int i,j; coutai; for (i=0;iaj+1) temp=aj; aj=aj+1; aj+1=temp; for (i=0;iN;i+) coutsetw(7)ai; coutendl; ,升序排序冒泡法归结口诀: 相邻两数两两相比,上大下小则交换,共进行N-1轮,每轮进行N-1-i次。 返回,例4.4 选择法,#include #include #defin
23、e N 10 void main(void) float aN,temp; int i,j; coutai; for (i=0;iaj) temp=ai; ai=aj; aj=temp; for (i=0;iN;i+) coutsetw(5)ai; coutendl; ,升序排序选择法归结口诀: 首数与后数两两相比,首大后小则交换,共进行N-1轮,每轮进行从i+1开始N-1为止。 返回,例4.5,#include #include void main(void) int a34,i,j; coutaij;,for (i=0;i3;i+) for (j=0;j4;j+) coutsetw(4)a
24、ij; coutendl; 程序执行后提示: Input twelve integers: 1 2 3 4 5 6 7 8 9 10 11 12 1 2 3 4 5 6 7 8 9 10 11 12,返回,例4.6(1),#include #include #define N 5 #define M 5 void main(void) int sNM,numN; float sum; int i,j; coutsij;,例4.6(2),for (i=0;iN;i+)/处理数据 sum=0.0; for (j=1;jM-1;j+)/计算每个学生的总成绩 sum=sum+sij; sij=sum/
25、(M-2); /计算每个学生的平均成绩 coutsetw(5) Num. Math. Chin. Engl. Ave.endl;/输出数据 cout-n; for (i=0;iN;i+) for (j=0;jM;j+)/输出每个学生的学号与成绩 coutsetw(6)sij; coutendl; cout-n; ,例4.6(3),程序运行后,提示: Input data: 100190 80 85 100270 75 80 100365 70 75 100485 50 60 100580 90 70 输出: Num. Math. Chin. Engl. Ave. - 1001 90 80 85
26、 85 1002 70 75 80 75 1003 65 70 75 70 1004 85 50 60 65 1005 80 90 70 80 -,返回,例4.7(1),#include #include void main(void) int a34=1,2,3,4,5,6,7,8,9,10,11,12; int b43; int i,j; coutArray a:n; for (i=0;i3;i+)/输出a数组 for (j=0;j4;j+) coutsetw(5)aij; coutendl; ,例4.7(2),for (i=0;i3;i+)/将a数组转置成b数组 for (j=0;j4;
27、j+) bji=aij; coutArray b:n; for (i=0;i4;i+)/输出b数组 for (j=0;j3;j+) coutsetw(5)bij; coutendl; ,例4.7(3),程序运行后,输出: Array a: 1 2 3 4 5 6 7 8 9 10 11 12 Array b: 1 5 9 2 6 10 3 7 11 4 8 12,返回,例 4.8,#include void main(void) int i; char str10; coutstri; for (i=9;i=0;i-) coutstri; coutendl; 程序执行后提示: Input te
28、n character: ABCDEFGHIJ JIHGFEDCBA,返回,例4.9,#include void main(void) char s140,s240; couts1s2; couts1=s1ts2=s2endl; 输出为: s1=verys2=good, 输入字符串时,遇到空格字符或换行字符(Enter健),认为一个字符串结束,接着的非空格字符作为一个新的字符串开始;并且系统自动会在每一个字符串后加一个0。 当要把输入的一行(包括空格字符)作为一个字符串送到字符数组中时,则要使用函数cin.getline(str,n),该函数的第一个参数str为字符数组名,第二个参数n为允许输
29、入的最大字符个数。例如: char s12; cin.getline(s,12); 一个字符数组作为一个字符串输出时,必须保证在数组中包含字符串结束符0;当遇到0时,输出自动结束,0不输出。,返回,例4.10 (方法一),#include #include void main(void) char str140,str220; /定义字符数组str1、str2 coutInput two strings:n; cin.getline(str1,20); /输入字符串1到str1中 cin.getline(str2,20); /输入字符串2到str2中 strcat(str1,str2);/将s
30、tr1、str2连接后存入str1 coutstr1endl; /输出str1 返回,例4.10 (方法二),void main(void) #include char str140,str220; /定义字符数组str1、str2 int i,j; coutInput two string:n; /输入字符串1到str1中 cin.getline(str2,20); /输入字符串2到str2中 i=0;/使i指向str1的第一个元素 while (str1i!=0) /判断str1是否结束 i+; /str1没有结束,使i指向下一个元素 j=0; /使j指向str2的第一个元素 while
31、(str2j!=0)/判断str2是否结束 str1i=str2j;/str2没有结束,将str2j赋给;str1i i+; /使i指向str1的下一个元素 j+; /使j指向str2 的下一个元素 str1i=0; /在str1末尾添加结束标志0 coutstr1endl; /输出str1 ,返回,例4.10(方法三),#include #include void main(void) char str140,str220;/定义字符数组str1、str2 int i,j; coutInput two string:n; cin.getline(str1,20);/输入字符串1到str1中
32、cin.getline(str2,20);/输入字符串2到str2中 i=strlen(str1); /使i指向str1的结束位置0 for (j=0;j=strlen(str2);i+,j+)/j从0到str2的结束位置0依次循环 str1i=str2j;/将str2j赋给str1i coutstr1endl;/输出str1 ,返回,例4.11(1),#include #include #define N 10 void main(void) float aN; int i,b,j; coutai; coutb;,例4.11(2),i=0; while (aii;j-) aj=aj-1; a
33、i=b; for (i=0;iN;i+) coutsetw(6)aiendl; 输入:1 2 3 4 5 6 7 8 10 插入:9 输出 :1 2 3 4 5 6 7 8 9 10,返回,例4.12(1),#include #include #define M 6 #define N 5 void main(void) float sMN,sum,ave,temp; int i,j,k; coutsij; ,例4.12(2),for (i=0;iM;i+) /处理数据 sum=0.0; for (j=1;jN-1;j+) /计算每个学生的总成绩 sum=sum+sij; siN-1=sum; /存放每个学生的总分 for (j=1;jN;j+) /处理数据 sum=0.0; for (i=0;iM-1;i+) /计算每门课的总成绩 sum=sum+sij; sM-1j=sum/(M-1); /计算每门课程的平均分 ,例4.12(3),for (i=0;iM-2;i+) /按总成绩排序 k=i; for(j=i+1;jM-1;j+) if (skN-1sjN-1) k=j; if (k!=i) for (j=0;jN;j+) temp=sij;sij=skj;skj=temp; ,例4.12(4)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026浙江台州市温岭市第一人民医院派遣员工招聘9人笔试备考题库及答案详解
- 2026年南阳市专项计划招聘社区网格事务协理员710人笔试备考试题及答案详解
- 洗浴中心员工劳动合同签订协议2026
- 职业道德与职业操守培训协议书
- 蒙特卡洛模拟在物流配送合同协议
- 线上手机通讯设备售后服务协议
- 线上数据标注举报制度执行合同
- 2026云南德宏州盈江县苏典乡专职联防员招聘1人(第三批)笔试备考试题及答案详解
- 2026浙江宁波市鄞州区福明街道编外人员招聘1人笔试参考题库及答案详解
- 教案嵌入式应用基础(项目6第14周)
- 2026年招标采购从业人员《招标采购专业实务(初级)》考试真题(附答案解析)
- 2026年上海市黄浦区中考数学二模试卷(含解析)
- DB31∕T 1676-2026 地震预警信息发布要求
- 2025年《银行业保险业消费投诉处理管理办法》培训试题及答案
- 眼部刮痧培训
- 桥梁工程安全技术交底
- 下水道科普教学课件
- 2024年福建省龙岩市新罗区小升初科学试卷(含解析)
- 涉密测绘成果安全管理细则
- 生猪屠宰兽医卫生检验人员考试题库(含答案)
- 中国当代政治制度
评论
0/150
提交评论