1、项目项目4 学生通讯录管理系统学生通讯录管理系统课件目录4.1 项目情景14.2 知识准备24.3 项目解决34.4 知识拓展44.1 项目情景 一天小X找老师请假,在老师的办公室发现老师在为找不到某个同学的电话号码而愁眉苦脸,也没敢请假就直接回来了。郁闷之际,忽然来了灵感。为老师设计个“学生通讯录管理系统”吧,他迫不及待的找到小Z说了自己的想法,有着共同爱好的他们怎么能阻挡住这种冲动。回主目录回主目录4.1 项目情景 于是他们开始分析于是他们开始分析(1)通讯录里面放的是学生。我们需要学生是一种自己能够定义的类型。(2)学生有很多。我们需要有一个东西能够存放很多学生,而不是一个学生。(3)学
2、生有姓名、手机等信息。我们需要学生类型能够按照自己的需要添加信息。(4)存的学生数据要长期保存。我们需要将通讯录的数据保存到文件中,不是像以前在屏幕上显示一下没有保存。(5)通讯录要有的基本功能是记录的添加、删除与查询。使用前面的模块化方法,定义不同的函数完成不同的功能。回主目录回主目录4.2 知识准备4.2.1 结构体 4.2.2 一维数组 4.2.3 输入输出流 回主目录回主目录4.2.1 结构体 一条学生通讯录记录可能包括学生的姓名、性别、联系电话等信息。很明显,这些数据信息的类型是不同的,应该使用不同类型的变量来描述这些数据,例如姓名是字符串,性别是bool型等。但是,如果单独使用不同
3、的变量来定义这些属性,则难以体现出它们之间的内在联系,因此,我们需要把这几个数据存储在一起,作为一个整体来处理它们。C+提供了这样一种数据类型:结构体,它相当于数据库中的“记录”。回子目录回子目录4.2.1 结构体4.2.1.1 结构体定义 4.2.1.2 定义结构体变量 4.2.1.3 结构体类型变量的使用 4.2.1.4 结构体变量的初始化 回子目录回子目录4.2.1.1 结构体定义结构体类型的定义格式如下:struct 结构体类型名数据类型 成员名1;/结构体成员1数据类型 成员名2;/结构体成员2数据类型 成员名n;/结构体成员3;回子目录回子目录4.2.1.1 结构体定义说明:(1)
4、在声明结构体时,首先指定struct关键字和结构体类型名,然后使用一对大括号将若干个结构体成员的数据类型描述括起来,最后用分号结束。(2)必须在声明一种结构体的任何变量之前声明这种结构,否则,就会出现编译错误。回子目录回子目录4.2.1.1 结构体定义下面定义描述一个学生通讯录信息的结构体类型,包括:学生姓名、年龄、性别等信息。struct Student string Name;int Age;char Sex;string Tel;/分号不能省略小结:(1)结构体类型是用户自行构造的。(2)结构体由若干不同的基本数据类型的数据构成。(3)结构体属于C+语言的一种数据类型,与整型、实型相当。
5、因此,定义它时不分配空间,只有用它定义变量时才分配空间。回子目录回子目录4.2.1.2 定义结构体变量 C+语言中定义结构体类型变量的一般语法格式如下:struct 结构体名 成员表列表;struct 结构体名 变量名;例如,利用前面定义的学生结构体Student定义学生结构体的变量。Student student1;/定义一个结构体变量student1Student student2,student3;/同时定义两个结构体变量回子目录回子目录4.2.1.2 定义结构体变量 除了上面常用的定义格式,下面将介绍另外两种定义格式。1.在定义类型的同时定义变量 定义的一般形式如下:struct 结构
6、体名 成员表列;变量名;2.直接定义结构类型变量 定义的一般形式如下:struct /没有结构体名 成员表列;变量名;回子目录回子目录4.2.1.3 结构体类型变量的使用 结构体变量是不同数据类型的若干数据的集合体。在程序中使用结构体变量时,一般情况下不能把它作为一个整体参加数据处理,而参加各种运算和操作的是结构体变量的各个成员。结构体变量的成员用以下一般形式表示:结构体变量名.成员名 在定义了结构体变量后,就可以对结构体变量的每个成员赋值。例如,为前面定义的结构体变量student1赋值。student1.Name=孙奇振;student1.Age=16;student1.Sex=F;回子目
7、录回子目录4.2.1.4 结构体变量的初始化结构体变量的初始化 与其他类型变量一样,也可以给结构体的每个成员赋初值,这称为结构体变量的初始化。有两种初始化形式。1.在定义结构体变量时进行初始化。结构体名 变量名=初始数据表;2.在定义结构体类型时进行结构体变量的初始化。struct 结构体名 成员表列;变量名=初始数据表;例如,定义学生结构体变量并进行初始化。Student student1=李晓,18,F;回子目录回子目录4.2.1.4 结构体变量的初始化结构体变量的初始化#include#include using namespace std;struct Student string N
8、ame;int Age;char Sex;string Tel;void main()Student Stu1;Stu1.Name=张三;Stu1.Age=17;Stu1.Sex=f;Stu1.Tel=13800000000;cout“姓名:Stu1.Nameendl;cout年龄:Stu1.Ageendl;cout性别:Stu1.Sexendl;cout电话:Stu1.Telendl;例例4.1 4.1 结构体变量的使用。结构体变量的使用。回子目录回子目录4.2.1.4 结构体变量的初始化结构体变量的初始化运行结果如图所示:回子目录回子目录4.2.2 一维数组 在程序设计中,有时候要用到很多
9、的数据,而数据总是存放在变量中的。那么就需要很多的变量。然而,变量多了就变得难以管理了。对于很多数据,如果数据类型相同,且彼此间存在一定的顺序关系,为了便于处理,引入了数组类型。数组是一组有序数据的集合,数组中的每一个元素都属于同一个数据类型。用一个统一的数组名和下标来唯一的确定数组中的元素。数组中的元素在内存中存放顺序是连续的。数组名代表数组元素在内存中的起始地址,即第一个元素的地址。数组可以分为一维数组,二维数组和字符数组,下面介绍一维数组的基本内容。回子目录回子目录4.2.2 一维数组4.2.2.1 一维数组的定义 4.2.2.2 一维数组的访问 4.2.2.3 一维数组的初始化 4.2
10、.2.4 结构体数组 回子目录回子目录4.2.2.1 一维数组的定义一维数组的定义 一维数组的定义格式如下:类型标识符 数组名元素个数;说明:(1)类型标识符,可以是基本数据类型,也可以是用户自定义的数据类型。(2)其中元素个数为一个整型常量表达式,它表示数组元素的个数即数组的长度。例如,下面给出了常用数组的定义。char name20;/定义一个字符型的数组int num3;/定义一个整型的数组float x3,y4;/同时定义了两个浮点型数组 第2行,表示定义了一个一维整型数组,数组名为num,数组共有3个元素,它们是:a0、a1、a2。一定要切记,数组元素的下标是从0开始的,对于我们此处
11、声明的数组没有a3这个元素。回子目录回子目录4.2.2.2 一维数组的访问 使用数组时,只能分别对数组的各个元素进行操作。数组要先定义后使用,数组元素的访问格式如下:数组名下标例如:int num3;num0=100;/将整数100存入数组num的第1个单元中例例4.2 数组的定义与使用。数组的定义与使用。#includeusing namespace std;void main()int a5;int i;for(i=0;i=0;i-)coutai=aiendl;/遍历输出数组元素运行结果如图所示:回子目录回子目录4.2.2.3 一维数组的初始化 数组可以在声明时进行初始化。数组初始化时数组
12、元素初始化值放在“”,“”号中,各值之间用“,”号分开。如果“”,“”号中初始值的个数比所声明的数组元素少,则不够的部分系统自动补0。声明数组时“”,“”号中可以不写元素的个数,编译器会自动根据初始化表中元素的个数确定数组的长度。例如:int a3=0,1,2;/a0=0,a1=1,a2=2 int a5=1,2,3;/a0=1,a1=2,a2=3,a3=0,a4=0 int a=1,2,3;/a0=1,a1=2,a2=3回子目录回子目录4.2.2.3 一维数组的初始化例4.3 求5个学生的C+课程的总分和平均分。void main()int i;float score5;/定义数组score
13、 float s=0.0,avg;cout请输入5个学生的C+成绩:endl;for(i=0;iscorei;s+=scorei;avg=s/5;cout总分是:sendl;cout平均分是:avg”从流中提取数据。(3)流提取符从流中提取数据时通常跳过输入流中的空格、tab键、换行符等空白字符。2cout(1)cout是console output的缩写,意为“在控制台(终端显示器)的输出”。(2)程序中的变量通过流提取符“”从流中提取数据。(3)cout流在内存中对应开辟了一个缓冲区,用来存放流中的数据。回子目录回子目录4.2.3.1 标准输入输出流3.cerrcerr是无缓冲标准错误输出
14、流,cerr是console error的缩写,意为“在控制台(显示器)显示出错信息”。cerr与cout的区别:(1)cerr不能重定向,只能输出到显示器。(2)cerr不能被缓冲,直接输出到显示器。4.clogclog是缓冲标准错误输出流,是console log的缩写,意为“在控制台(显示器)显示日志信息”。clog 与 cerr区别:clog能被缓冲,缓冲区满时输出。cerr是不经过缓冲区,直接向显示器上输出有关信息,而clog中的信息存放在缓冲区中,缓冲区满后或遇endl时向显示器输出。回子目录回子目录4.2.3.1 标准输入输出流例4.4 求两个数的除法,如果除数为0,提示出错。i
15、nt main()int x,y;coutxy;if(y=0)cerr除数为零,出错!endl;/将出错信息插入cerr,屏幕输出 else coutx/yendl;回子目录回子目录4.2.3.2 文件流 在C+语言中,文件被看成是字符序列,即文件是由一个个的字符数据顺序组成的,是一个字符流。要对文件进行I/O,必须首先创建一个流,然后将这个流与文件相关联,即可在打开文件后,对文件进行读/写操作。操作完成后,再关闭这个文件。文件流是一个I/O中非常重要的一个内容,它的输入是指从磁盘文件流向内存,它的输出是指从内存流向磁盘。fstream.h头文件包括三个流类:输入文件流类ifstream、输出
16、文件流类ofstream和输入/输出文件流类fstream。其功能如表所示。流类名功能ifstream用于文件的输入ofstream用于文件的输出fstream用于文件的输入与输出回子目录回子目录4.2.3.2 文件流1.文件的打开 C+语言中,定义了成员函数open()用于打开文件。open()函数是上述三个流类的成员函数,其原型定义在fstream.h中。打开文件应先定义一个流类的对象,然后使用open()函数打开文件。open()函数原型为:void open(const unsigned char*,int mode,int access=filebuf:openprot);open(
17、)函数第一个参数用来传递文件名,第二个参数指定文件的打开方式,这些参数是定义在抽象类中,常用如表4-2所示:表4-2 文件打开模式方式含义ios:in打开一个文件进行读操作ios:out打开一个文件进行写操作ios:app使输出追加到文件尾部ios:ate文件打开时,文件指针位于文件尾ios:trunc如果文件存在,则清除该文件的内容,文件长度压缩为0ios:binary以二进制方式打开文件,默认方式是文本字节流回子目录回子目录4.2.3.2 文件流打开文件有两种方法:(1)首先建立流对象,然后调用open()函数连接外部文件。流类 对象名;对象名.open(文件名,打开方式);(2)调用流类
18、带参数的构造函数,建立流对象的同时连接外部文件。流类 对象名(文件名,打开方式);回子目录回子目录4.2.3.2 文件流例4.5 打开D盘下的文件txl.txt。(1)打开一个已有文件txl.txt,准备读:ifstream infile;/建立输入文件流对象 infile.open(d:txl.txt,ios:in);/连接文件,指定打开方式(2)打开(创建)一个文件txl.txt,准备写:ofstream outfile;/建立输出文件流对象 outfile.open(d:txl.txt,ios:out);/连接文件,指定打开方式(3)打开一个文件txl.txt,进行读写操作:fstrea
19、m rwfile;rwfile.open(d:txl.txt ,ios:in|ios:out);小结:(1)打开一个输入文件流,必须说明类型为 ifstream 的对象。(2)打开一个输出文件流,必须说明类型为ofstream 的对象。(3)要建立输入和输出的文件流,必须说明类型为 fstream 的对象。(4)可以用或运算符“|”连接两个表示打开方式的标识常量。回子目录回子目录4.2.3.2 文件流2.文件的关闭 函数close()的作用是关闭一个文件与输入/输出文件流的联系。使用完一个文件后,应该把它关闭。close()函数是流类中的成员函数,它不带参数,没有返回值。调用close()函数
20、的格式如下:流对象名.close();例如:关闭例4.5中(1)的文件。infile.close();/关闭与流in相联接的文件 说明:close()函数一次只能关闭一个文件,文件使用完后应及时关闭。回子目录回子目录4.2.3.2 文件流3.ofstream ofstream类用于执行文件的输出操作,使用时的一般过程如下:(1)打开文件:创建ofstream流类的对象,建立流对象与指定文件的关联。(2)从文件读入:用ofstream的“”以及其他的输入函数读文件中的数据。(3)关闭文件:用ofstream的成员函数close关闭流对象,取消流对象与文件的关联。回子目录回子目录4.2.3.2 文
21、件流例4.6 向D盘文件my1.txt保存数据。void main()ofstream ost;/创建输出流对象 ost.open(D:my1.txt);/建立文件关联,缺省为文本模式 ost12endl;/向流插入数据 ost30”以及其他的输入函数读文件中的数据。关闭文件:用ifstream的成员函数close关闭流对象,取消流对象与文件的关联。在进行输入操作前要判断文件是否正确打开。代码如下:if(!in_file)/或if(in_file.fail()./处理打开失败回子目录回子目录4.2.3.2 文件流例4.7 将例4.6存入D盘文件my1.txt中的数据读取并显示。void mai
22、n()ifstream ist(d:my1.txt);/创建输入流对象并建立关联 if(!ist)/或if(ist.fail()cerr x y;/从流提取数据 cout “x“t”y“endl;cout x “t”y endl;/向显示器输出数据回子目录回子目录4.2.3.2 文件流5.fstream fstream类用于对某个文件同时执行读写操作,使用时的一般过程如下:(1)打开文件:创建fstream流类的对象,建立流对象与指定文件的关联。(2)从文件读入:用fstream的“”以及其他的输入输出函数读文件中的数据。(3)关闭文件:用fstream的成员函数close关闭流对象,取消流对
23、象与文件的关联。回子目录回子目录4.2.3.2 文件流文件流例4.8 定义一个学生结构体,将结构体数组的信息输出到文件,再从文件中读取数据做为输入到结构体数组。struct Student/结构体的定义也可以写在stdafx.h文件中char name20;int age;void main()fstream f;Student st1N;Student st23;int i;cout 请输入 2 个人的姓名和年龄:endl;/通过键盘输入for(i=0;i st1i.name st1i.age;f.open(D:1.txt,ios:out|ios:app);4.2.3.2 文件流文件流/将数
24、组中数据输出到文件for(i=0;i2;i+)f st1i.name t st1i.age st2i.name st2i.age;i+;f.close();4.3 项目解决项目解决 根据前面的分析,该项目-通讯录管理系统主要应具备以下功能:输入学生信息,输出学生信息,查询学生信息,添加学生信息,删除学生信息以及关闭通讯录等功能。回主目录回主目录4.3 项目解决项目解决 根据功能模块图,我们可以做出系统程序流程图。开始列出一个操作目录,选择要操作的编号选择要操作的编号一 输入学生信息二 输出学生信息四 追加记录五 删除记录六 退出系统列出一个操作目录选择要操作的编号结 束三 查询学生信息回主目录
25、回主目录4.3 项目解决项目解决1.定义学生类型及存放通讯录的学生数组 根据前面所学的结构体的知识,定义一个学生结构体类型和部分项目所需要的全局变量。/定义学生类型struct Student char Name20;int Age;char Sex;char Tel13;/定义学生数组struct Student st100;/最多可以存100个学生int Num=0;/保存现有系统中实际存在的人数fstream ftxl;/公共的文件int fNum=0;/保存文件中已经存在的记录数 回主目录回主目录4.3 项目解决项目解决2.定义输入函数,完成最初学生记录的输入(1)函数原型:InStu
26、()(2)功能:该函数用来录入学生信息,Name 是姓名,Age是年龄,Sex是性别,Tel是手机号。(3)流程图:如图所示。开始输入联系人姓名输入联系人年龄输入联系人性别输入联系人的手机号结束输入需要录入的学生人数回主目录回主目录4.3 项目解决项目解决(4)参考代码void InStu()int n,i,be;be=Num;coutn;for(i=be;ibe+n;i+)/循环cout请输入第i+1个学生的信息endl;coutsti.Name;coutsti.Age;coutsti.Sex;coutsti.Tel;Num+;回主目录回主目录4.3 项目解决项目解决3定义输出函数,完成通讯
27、录所有学生信息的输出(1)原型:void OutStu()(2)功能:该函数用来输出通讯录中所有学生的信息。void OutStu()cout以下是通讯录中所有学生信息endl;cout姓名t年龄t性别t手机endl;for(int i=0;iNum;i+)coutsti.Nametsti.Agetsti.Sextsti.Telendl;回主目录回主目录4.3 项目解决项目解决4.定义查询函数,完成指定姓名的学生信息查询(1)原型:void SelStu()(2)功能:该函数用来查找指定姓名学生的基本信息。(3)流程图:如图所示。是否输入要查找的联系人姓名判断是否存在输出该联系人信息结束开始回
28、主目录回主目录4.3 项目解决项目解决(4)参考代码/SelStu()完成通讯录按姓名查找void SelStu()/按姓名查询char tmpName20;/要查询的姓名couttmpName;回主目录回主目录4.3 项目解决项目解决for(int i=0;iNum;i+)if(strcmp(sti.Name,tmpName)=0)coutsti.Nametsti.Agesti.Sextsti.Telendl;break;if(i=Num)cout没有要查询的学生!endl;回主目录回主目录4.3 项目解决项目解决5.定义添加新的成员函数,完成添加新成员的功能(1)函数原型:AppStu()
29、(2)功能:该函数用来录入联系人信息,Name 是姓名,Age是年龄,Sex是性别,Tel是手机号。(3)流程图:如图所示。开始输入联系人姓名输入联系人年龄输入联系人性别输入联系人的手机号结束输入需要录入的学生人数回主目录回主目录4.3 项目解决项目解决(4)参考代码:/AppStu()完成在通讯录中添加新的成员 void AppStu()int n,i;coutn;int end=Num+n;for(i=Num;iend;i+)/循环cout请输入第i+1个学生的信息endl;回主目录回主目录4.3 项目解决项目解决coutsti.Name;coutsti.Age;coutsti.Sex;c
30、outsti.Tel;Num+;回主目录回主目录4.3 项目解决项目解决6.定义删除函数,完成指定成员的删除(1)原型:DelStu()(2)功能:该函数用来删除某联系人信息。(3)流程图:如图所示。否是开 始输入要删除的联系人姓名或号码判断是否存在删除联系人信息结 束回主目录回主目录4.3 项目解决项目解决(4)参考代码/DelStu()完成指定成员的删除void DelStu()char tmpName20;/要查询的姓名int index;couttmpName;for(int i=0;iNum;i+)if(strcmp(sti.Name,tmpName)=0)index=i;break
31、;if(i=Num)cout没有要删除的学生!endl;elsefor(i=index;iNum-1;i+)sti=sti+1;cout删除成功!endl;Num=Num-1;回主目录回主目录4.3 项目解决项目解决7.定义读取文件函数,完成文件中的数据输入到数组(1)原型:void finput()(2)功能:该函数用来完成文件中读取数据到数组。(3)流程图:如图所示。失败成功开 始以输入方式打开文件将文件中的信息读入到结构体数组中结 束关闭文件回主目录回主目录4.3 项目解决项目解决(4)参考代码/finput()完成文件中读取数据到数组void finput()int i=0;ftxl.
32、open(d:txl.txt,ios:in);/以输入方式打开文件if(ftxl.fail()/文件打开失败:返回0 cout输入文件打开失败!sti.Name;ftxlsti.Age;ftxlsti.Sex;ftxlsti.Tel;fNum+;i+;Num=fNum-1;ftxl.clear();/在关闭文件之前调用clear()清除文件流的状态ftxl.close();回主目录回主目录4.3 项目解决项目解决8.定义数据保存函数,完成将数组中的数据保存到文件(1)原型:void foutput()(2)功能:该函数用来完成将数组中的数据保存到文件。(3)流程图:如图所示。失败成功开 始以输
33、出方式打开文件将数组中的数据保存到文件结束关闭文件回主目录回主目录4.3 项目解决项目解决(4)参考代码/foutput()完成将数组中的数据保存到文件void foutput()ftxl.open(d:txl.txt,ios:out|ios:app);if(ftxl.fail()cout输出文件打开失败!endl;for(int i=0;iNum;i+)ftxlsti.Nametsti.Agetsti.Sextsti.Telendl;coutsti.Nametsti.Agetsti.Sextsti.Telendl;ftxl.close();回主目录回主目录4.3 项目解决项目解决9.定义功能
34、选择菜单,提示用户可以进行的操作(1)原型:void Menu()(2)功能:该函数用来显示用户可以尽心的操作。(3)参考代码void Menu()coutendlendl;/换两行cout*欢迎使用通讯录管理系统*endl;回主目录回主目录4.3 项目解决项目解决couttt输入学生-1endl;couttt输出学生-2endl;couttt查询学生-3endl;couttt追加记录-4endl;couttt删除记录-5endl;couttt退出系统-0endl;coutendl;/换一行回主目录回主目录4.3 项目解决项目解决10.定义主函数,完成调用各个子函数(1)原型:void mai
35、n()(2)功能:该函数用来实现调用各个子函数的功能。(3)参考代码void main()int sel;finput();while(1)Menu();coutsel;switch(sel)case 1:InStu();break;case 2:OutStu();break;case 3:SelStu();break;case 4:AppStu();break;case 5:DelStu();break;case 0:foutput();exit(1);回主目录回主目录4.4 知识拓展知识拓展 4.4.1 二维数组 4.4.2 字符数组 4.4.3 共用体 回主目录回主目录4.4.1 二维数
36、组二维数组 一维数组是最基本的数组,一维数组又可以作为元素构成更复杂的数组,也就是说可以声明“数组的数组”。例如,一个由行列组成的二维数组就是由一维数组组成的。二维数组可用于存储矩阵或二维表格的数据,其中的数据也必须是相同类型的。回子目录回子目录4.4.1 二维数组4.4.1.1 二维数组的定义 4.4.1.2 二维数组的访问 4.4.1.3 二维数组的初始化 回主目录回主目录二维数组的定义格式如下:数据类型 数组名常量表达式1常量表达式2;说明:(1)常量表达式称为下标表达式,必须为整常数,常量表达式1表示第一维的下标个数,常量表达式2表示第二维的下标个数。(2)常量表达式1也可以称为数组中
37、包含的元素的行数,常量表达式2指定了数组中包含的元素的列数,数组的下标从0开始。例如:int a33;/表示a为整型二维数组,有3x3个元素 4.4.1.1 二维数组的定义回子目录回子目录4.4.1.1 二维数组的定义二维数组的定义4.4.1.1 二维数组的定义第一行:a00,a01,a02第二行:a10,a11,a12第三行:a20,a21,a22二维数组a在内存中的存放顺序,如图4-31所示:a00a01a02a10a11a12.a22回子目录回子目录4.4.1.1 二维数组的定义 从逻辑上来说,二维数组像一个方阵。但在内存中,要把其排成一个“方阵”,这是不可能的。内存的地址是固定的线性结
38、构,所以二维数组存放在内存中,仍然是线性结构的。二维数组在内存中是以行优先的方式按照一维顺序关系存放的,因此可以这样理解,对于二维数组,相当于一个一维数组。回子目录回子目录4.4.1.2 二维数组的访问 访问二维数组元素的形式为:数组名下标1 下标2例如:int num 23;/声明二维数组num12=3;/将3存入数组num的第2行第3列说明:若数组是由m行n列组成,下标1的取值范围是大于等于0并且小于m,下标2的取值范围是大于等于0并且小于n。回子目录回子目录4.4.1.2 二维数组的访问例4.9 输入一个二维数组并输出。int num34;int i,j;cout请输入12个数:endl
39、;for(i=0;i3;i+)for(j=0;jnumij;for(i=0;i3;i+)for(j=0;j4;j+)coutnumij=numijt;coutendl;回子目录回子目录控制行标控制列标4.4.1.3 二维数组的初始化 二维数组的初始化类似于一维数组。此外,如果给出全部元素的初值,第一维的下标个数可以不用显式说明,每一行也可用花括号括起来。例如:int a23=0,1,2,3,4,5;int a 3=0,1,2,3,4,5;int a23=0,1,2,3,4,5;以上三种情况是等价的,初始化后结果如下:a00=0,a01=1,a02=2,a10=3,a11=4,a12=5。回子目
40、录回子目录4.4.1.3 二维数组的初始化 例4.10 计算二维数组各列之和。int num34,i,j,s;for(i=0;i3;i+)cout第i行的4个数:endl;for(j=0;jnumij;for(i=0;i4;i+)s=0;for(j=0;j3;j+)s+=numji;cout第i列之和:sendl;回子目录回子目录4.4.1.3 二维数组的初始化 int a34;int max,row,colum,i,j;for(i=0;i=2;i+)cout请输入i行上的4个数:endl;for(j=0;jaij;max=a00;例4.11 输入一个3*4的矩阵,编程求出其中值最 大的那个元
41、素的值,以及该值所在的行标和列标。4.4.1.3 二维数组的初始化for(i=0;i=2;i+)for(j=0;jmax)/如果这个数大于max max=aij;/将该数赋给max row=i;/记录该数的行标i colum=j;/记录该数的列标j cout最大数:maxendl;cout该数所在行标:rowendl;cout该数所在列标:columendl;4.4.1.3 二维数组的初始化试一试:定义二维数组,输入四个学生三门课的成绩,计算每个学生的平均成绩后,存放在该数组最后一列的对应行上。回子目录回子目录4.4.2 字符数组 由若干个字符组成的序列称为字符串。字符串常量是用一对双引号括起
42、来的字符序列,其在内存中按字符的排列次序顺序存放,每一个字符占一个字节,并在末尾添加0作为结束标记。在C+的基本数据类型变量中没有字符串变量,C+用字符数组和string类对字符串进行处理。回子目录回子目录4.4.2 字符数组4.4.2.1 字符数组 4.4.2.2 字符处理函数 回子目录回子目录4.4.2.1 字符数组当数组中的元素都是由一个个字符组成时,则称为字符数组。在C+中,可以用一个一维的字符数组表示字符串。数组的每一个元素保存字符串的一个字符,并附加一个空字符,表示为0,添加在字符串的末尾,以识别字符串的结束。在C+中,字符串看作以0字符(空字符)结束的字符数组。字符数组的声明和引
43、用方法与其它类型的数组相同。如果对数组进行初始化时,在结尾放置一个0字符,则构成了字符串。所以,如果一个字符串有n个字符,则至少需要n+1个元素的字符数组来保存它。字符串的长度并不包括结束符0。回子目录回子目录4.4.2.1 字符数组1.字符数组初始化 存放字符串的数组元素个数应大于字符串的长度,对字符数组进行初始化赋值时,初值的形式可以是以逗号分隔的ASCII码或字符常量,也可以是整体的以双引号括起来的字符串常量,此时,系统自动在最后一个字符后加一个0 作为结束符。初始化字符数组可用下列形式:char str16=h,e,l,l,o;/hello char str26=h,e,l,l,o,0
44、;char str36=hello;char str46=hello;回子目录回子目录4.4.2.1 字符数组 初始化字符数组时,根据字符串的长度,编译器会自动确定数组的长度,下面两种方法等价。char str=China;char str6=China;小结:(1)字符串常量和字符常量是有区别的,字符串常量是用双引号括起来的字符序列,而字符常量是用单引号括起来的单个字符。(2)它们所占的内存空间也不同。例如:a是字符串常量,而a则是字符常量,在内存中字符串a占2个字节,而字符a仅占一个字节。回子目录回子目录4.4.2.1 字符数组2.字符数组的输入和输出 用于存储字符串的字符数组,其元素可以
45、通过下标运算符访问。这与一般字符数组和其他任何类型的数组是相同的。字符串输出时,可以逐个字符输出,也可以整体输出,输出字符串不包括0,字符串整体输出时,输出项是字符数组名,输出遇到“0”结束。回子目录回子目录4.4.2.2 字符处理函数字符处理函数1.求字符串长度函数函数原型:strlen(const char str);函数功能:测试字符串的长度,即统计字符串str中字符的个数,不包括字符串结束标志0在内。该函数的返回值为字符的个数。例4.12 求字符串长度。char str100;cout str;cout 你输入的字符串长度为:strlen(str)个。endl;回子目录回子目录4.4.
46、2.2 字符处理函数字符处理函数2.字符串拷贝函数函数原型:strcpy(char str1,const char str2);函数功能:把将字符数组str2拷贝到字符数组str1中。说明:(1)串结束标志0也一同拷贝。(2)字符数组str2,也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。回子目录回子目录4.4.2.2 字符处理函数字符处理函数例4.13 字符串复制。char str110;char str26=hello;coutstrcpy(str1,str2)endl;小结:(1)第二个字符串将覆盖掉第一个字符串的所有内容。(2)在定义数组时,str1的字符串长度必须大
47、于或等于str2的字符串长度。(3)str1必须写成数组名形式(如s1),str2可以是字符数组名,也可以是字符串常量。(4)不能直接对字符数组采用赋值运算符(=)进行赋值。回子目录回子目录4.4.2.2 字符处理函数字符处理函数3.字符串连接函数函数原型:strcat(char str1,const char str2);函数功能:将字符串str2接到字符串str1的后面。回子目录回子目录4.4.2.2 字符处理函数字符处理函数例4.14 字符串连接。char str1=hello;char str2=world!;coutstrcat(str1,str2)endl;小结:(1)在定义str
48、1的长度时应该考虑str2的长度,因为连接后新字符串的长度为两个字符串长度之和。(2)进行字符串连接后,str1的结束符将自动被去掉,在结束串末尾保留新字符串后面一个结束符。回子目录回子目录4.4.2.2 字符处理函数字符处理函数4.字符串比较函数函数原型:int strcmp(const char str1,const char str2);函数功能:比较两个字符串str1和str2。说明:如果比较两个字符串,则比较的原则为:(1)依次比较两个字符串同一位置的一对字符,若它们的ASCII码相同,则继续比较下一对字符。若它们的ASCII码不同,则ASCII码大的字符串大。(2)若所有字符串均相
49、同,则两个字符串相等。(3)若一个字符串中的字符比较完了,而另一个字符串中还有字符,则还有字符的那个字符串大。回子目录回子目录4.4.2.2 字符处理函数字符处理函数例4.15 字符串比较。char s1=hello;char s250;cout字符串s1是s1endl;couts2;int ptr;ptr=strcmp(s1,s2);cout比较结果:0)cout字符串s1比字符串s2大!endl;else if(ptr0)cout字符串s1比字符串s2小!endl;else cout字符串s1和字符串s2相等!endl;回子目录回子目录4.4.2.2 字符处理函数字符处理函数小结:(1)s
50、trcmp的返回值表示两个字符串之间的关系。(2)返回大于0,表示字符串s1大于字符串s2。(3)返回小于0,表示字符串s1小于字符串s2。(4)返回等于0,表示字符串s1等于字符串s2。回子目录回子目录4.4.3 共用体4.4.3.1 共用体的概念 4.4.3.2 共用体类型的定义 4.4.3.3 共用体变量的使用 回子目录回子目录4.4.3.1共用体的概念 程序设计有时候需要将几种不同类型的变量存放到同一段内存单元中。例如把一个整型变量、一个字符型变量、一个实型变量放在一个起始地址相同的内存单元中。几个不同类型的变量共占同一段内存空间。可以使用“共用体(union)”。这几个变量在内存中占
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。