《C++备课笔记_钱能》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
“C++程序设计”笔记(课程名:计算引论)(教材:钱能清华大学出版社)(本笔记中的例题均在VC++6.0环境下通过)刘军荣:liujr@cs.sjtu.edu.cn1C++入门学习目标:1.对C++语言有一个大致的了解2.能够编写简单的C++程序1.1从C到C++1972年:贝尔实验室开发出了C语言,ー经出现就以其独有的特点风靡了全世界:1.(1)语言简洁、紧凑,使用方便、灵活。C语言只有32个关键字,程序书写形式自由。2.(2)丰富的运算符和数据类型。3.(3)可以直接访问内存地址,能进行位操作,使其能够胜任开发操作系统的工作。但C语言在盛行的同时,也暴露出它的局限:1.c类型检査机制相对较弱,使得程序中的一些错误不能在编译时发现;2.C本身几乎没有支持代码重用的语言结构,因此ー个程序员精心设计的程序,很难为其他程序所用;3.当程序れ规模达到一定的程度时,程序员很难控制程序的复杂性。1980年,贝尔实验室的BjarneStroustrup开始对C进行改进和扩充。1983年正式命名为C++。在经历了3次C++修订后,1994年制定了ANSIC++标准的草案。以后又经过不断完善,成为目前的C++。C++仍在不断发展中。美国微软公司现已推出C#(CSharp)语言,来代替C++语言。
1C++:包括了整个C:C的全部特征、属性、优点支持面向对象编程(OOP)包括过程性语言部分和类部分过程性语言部分:与C无本质上的区别类部分:面向对象程序设计的主体1.2程序与语言程序:是任何有目的的、预想好的动作序列,是ー种软件。对机器而言:按硬件设计规范编制的动作序列(即:机器指令序列)对人而言:用语言(髙、低级语言)编写的语句序列;源文件、源程序、源代码程序语言的发展:低级语言ー髙级语言程序设计首要目标:可读性、易维护性、可移植性可读:就是在使用的书写风格和易懂的语句编写程序。易维护:是指当业务需求发生变化时,不需要太多的开销就可以扩展和增强程序的功能。可移植:是指编写的程序在各种计算机和操作系统上都能运行,并且运行结果ー样。1.3结构化程序设计是面向过程的程序设计主要思想:功能分解、逐步求精例:计算ー个公司职员的平均エ资将其拆分为以下子任务:1)找出ー个人的收入2)计算总共有多少职员3)计算工资总额4)用职员人数去除工资总额计算工资总额又可分为ー系列子任务1)找出每个职员的档案2)读出エ资数额3)把エ资加到部分和上4)读出下个职员的档案缺点:可重用性极差1.4面向对象程序设计面向对象是一种思考方法;世界上的任何东西都是一个对象;例如花,树,动物。任何系统都是由对象构成的(当然系统也是ー个对象);例如法律系统,文化系统,教育系统。基本思想:把信息和对这些信息的处理作为ー个整体一对象,类是对象的数据类型C++:是支持面向对象程序设计的语言C++的三大特性:封装性(数据隐藏):目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只需要通过外部接口,以特定的访问权限,来使用类的成员。classWatchpublic:voidSetTime(intNewH,intNewM,intNewS);voidShowTime();private:intHour,Minute,Second;
2);继承性(软件重用):C++采用继承支持重用的思想,程序可以在扩展现有类型的基础上声明新类型。新子类是从现有类型派生出来的,称为派生类或子类,而原有类称为父类或基类或超类。classStopWatch::Watch(public:voidStart();voidStop();}多态性:通过继承的方法构造类,采用多态性为每个类指定表现行为。学生类大学生类:髙等数学、计算机、普通物理、英语中学生类:语文、数学、物理1.4程序开发过程build:compile+link1.5最简单的程序程序体:程序体由声明语句和函数组成例:〃文件名:abc.cpp/・该程序的功能是:输出:Iamastudent.*/
3#include
4";}说明:1.大小写区分(即:abc与Abe不同)2.C++系统是函数驱动的,ー个可执行程序必须有、且只能有一个主函数:main(),作为程序的人口3.C++语句以分号(;)结束,一行可以写多条语句,一条语句可以分多行写4.所有的对象(变量)必须先定义,或先声明、后使用5.以双引号括起的为字符串常量,里边的"\"为转义字符例:^include
5:::::::::::::::::
6”;}/・执行结果:y=x*x=25y=X*X=100:::::::::::::::::*/*注释:/**ノ和//C++程序结构〈编译预处理:#、程序体1.7函数函数的组成:「函数属性[内部函数।外部函数]函数返回类型小明部分《函数名函数形参名、函数形参类型说明函数Y对象定义或声明语句I函数体\「语句〔执行部分イ...【语句函数格式:函数属性标识符函数返回类型标识符函数名(形参说明列表))其中形参说明列表:如果有多个形参,各形参之间用逗号(,)分隔说明:1.ー个函数如果没有返回值,则函数的返回类型标识符用“void”代替,函数体中不必有return
7语句(如果有return语句,仅仅起提前返回的作用);否则用返回值的类型标识符,函数体中必须有return语句。1.函数与函数之间的关系是调用与被调用的关系,main。函数只能是调用函数,不可以被调用。2.函数只有定义或被声明后,オ可以被调用。函数声明:由函数原型加分号组成。例:intmax(int,int);函数原型:返回类型函数名(形参类型,…,形参类型)例:Sinclude 8变量:存储信息的单元,每个变量对应一段连续的内存空间,基本类型整型:int字符型:char实型(浮点型){单精度型:float双精度型:doubletype[]C++的数据类型/构造类型结构:联合:枚举:structunionenumclass指针类型:type,空类型:void内存空间的最小单位:字节数据类型的作用:编译器预算对象分配的内存空间大小注意:数据无“void”类型,指针有“void”类型不同的计算机,各类型的变量所占内存空间有所不同bool型:在ANSIC++中具有ANSI:美国国家标准协会(AmericanNationalStandardsInstitute)求某个类型的变量所占内存长度:利用运算符sizeof例:^includeくiostream.h>voidmain(){shortintxl;intx2;chary;//longdoublez;cout«sizeof(xl)«**«sizeof(x2)«**〈(sizeof(y)くぐ"«sizeof(float)«""«sizeof(double)«*"«sizeof(longdouble)«endl;レ/执行结果:2414881.1变量定义变量:在程序的运行期间,值会变、或值可变的数据量。变量名:每个变量必须有名,即:变量标识符。1.命名变量名规定:1不能与C++的保留字、库函数名、类名、对象名同名2只能由26个大小写字母、数字和下划线组成3只能以字母或下划线开头way__cool,RightOn,Bits32,Case,iPtr,MyCarcase,52Select,Alot,-Wsin,cout,string命名规则和程序书写风格:p/15〜16 91.变量定义变量定义:每个变量必须被确定类型、变量名。例如:intx,y;注意:一条语句中只能定义同一类型的ー个或多个变量规定:变量必须“先定义、后使用”。程序编译时将分配存储单元,及进行语法检査。唯一性:ー个变量一个名,不同的名表示不同的变量。2.变量赋值与初始化变量初始化:在定义变量的同时进行赋值例:intx=5,y,z=9;变量赋值:利用赋值运算符进行值的更新例:intx=5;//x初始化为5x=100I〃把100赋给xx=x/2+7;〃把x/2+7的计算结果赋给x,即:x=573.给类型起“别名”:typedef例:ttinclude 10-0x123:表示八进制的负数123,为十进制的-291。例:#includeくiostream.h>voidmain(){cout«123«**«0123«*"くく・〇123くぐ"«0xl5«""«-0xl5«""«0xl23«*"«"0xl23«endl;}〃执行结果:12383-8321-21291-291整型常量的类型:整型常量有类型,系统自动识别在整型常量的后面加字母“L”或“1”(小写),表示该常量是长整型的。注意:常量无unsigned型2.实型常量C++提供2种实型常量的表示形式:十进制:由数字和小数点组成。必须带小数点例如:12.123、0.0、.0、〇.、9453.13124指数形式:蛙E(或e)整数。E前必须有数字,E后必须是整数例如:123E3(或:123e3)即:123x10,1.234e5即:1.234x1()5有效位:单精度(float)7位双精度(double)15位实型常量在内存中所占字节数:以double型进行存储,占8字节。但是,在后面加f,则以float型存储,占4字节34.5f//float34.5//double34.5e23L//longdouble34.5e231//longdouble例:itinclude 11','\t','\\'a二'a';a='A';a='\101';8进制的101等于10进制的65,ASCH值为65的字符是:A所以,实际上:a='A';注意:在内存中,字符以ASCII码存储,是以整数表示的所以,字符和整数之间可以互相赋值例:ttinclude 12voidmainO{intxl二'A',x2='0',x3=0;charc=97;cout«xl«"〃くくx2くく“"«x3«""«c«endl;レ/执行结果:65480a4.字符串常量用双引号括起的字符序列例如:"abc.|*88住宅ok”""S空字符串"":只有一个空字符的字符串"a":只有一个字符a的字符串字符串结束标志:‘、〇’(由系统自动添加)注意:①"a"与‘a’不同!(输出结果相同)②C++语言中无字符串变量!③不能把字符串常量赋值给字符变量!例如:charc;c="a";X④统计字符串长度时,不计字符串结束标志。例如:"abed”的长度为4,而在内存中实际存放是:abcd\Op/195.枚举常量把变量的值ーー列举,变量的值只能取其中之一枚举类型的定义:形式1:enum枚举类型名{元素1,元素2,…,元素n};enum枚举类型名枚举变量名1«枚举变量名2,•••;例:enumcity{上海,北京,南京,广州,天津};//city为枚举类型名enumcitycityl,city2;//cityl,city2为city枚举类型的变量名形式2:emim枚举类型名{元素1,元素2,…,元素n}枚举变量名L枚举变量名2,…;例:enumcity{上海,北京,南京,广州,天津}city1,cyty2,city3;形式3:可以直接定义枚举变量,而不定义枚举类型名例:enum{上海,北京,南京,广州,天津}cityl;枚举类型的使即例:#include*iostream.h*enumcity{Shanghai,Beijing,Nanjing,Tianjin=5,Guangzhou};voidff(enumcityx){switch(x){case0:coutく、Shanghai 13";break;case1:coutくく“Beijing 14";break;case2:cout«"Nanjing 15";break;case5:cout«"Tianjin 16";break;case6:coutくく“Guangzhou 17";break;default:coutくく"非法城市! 18”;voidmainO{enumcitycl,c2,c3,c4;inti=7;cl=(enumcity)i!〃不能:cl=i; 19c2=Nanjing;c3=(enumcity)5;c4=Shanghai;/・枚举变量的赋值:只能为列举元素之一・/ff(cl);ff(c2);ff(c3);ff(c4);cout«cl«*"«c2くぐ・«c3«**«c4«endl;}/・执行结果:非法城市!NanjingTianjingShanghai7250*/枚举变量的使用说明:1.先定义枚举类型,再定义枚举变量,然后使用变量2.枚举元素是常量,不是变量,故也称枚举常量;所以不能对枚举元素进行赋值上例中,不能:Shanghai=Beijing;3.枚举元素是常量,其常量值不是列举的“内容”,而是定义时的次序号:0,1,…,n4.枚举元素值在定义时可以“人为”指定,上例中:Tianjin=5.此后的元素均为6,7,…上例中:枚举元素Shanghai的值为0,Beijing为1,Nanjing为2,Tianjin为5,Guangzhou为65.枚举变量的值只能取定义枚举类型时所列举的元素之一:例:c2=Nanjing;6.尽管枚举元素有值,但此值并不是整型值,所以不能把整型数赋值给枚举变量:不能:cl=5;只能:cl=(enumcity)5:/・强制类型转换・/7.枚举值(枚举元素)不是字符串8.枚举值可进行逻辑判断比较运算:上例中,if(cityl=Shanghai)if(city2>Nanjing):以序号值进行判断比较2.5常量定义(const常量)符号常量:用ー个标识符代表的常量,即:在程序中用#define命令定义某个符号所代表的常量。例如:^defineW“女,,SdefineM“男”#definePRICE123.789注意:①一旦定义了某个符号代表一个常量,则该符号在其作用域内就表示这个常量。例如:x=PRICE*0.8;②符号常量不是变量,所以,在其作用域内不能被赋值!例如:PRICE=123.012;X③为提髙程序的可读性,符号常量一般用大写表示。const常量:冻结变量例:constdoublepi=3.14159265;注意:变量一旦被const限定,就变成不能改变值的常量了;因此,const常量必须在定义时赋初值,并且const常量不能作左值!符号常量和const常量的区别:符号常量并不是变量,仅仅通过预编译命令进行“替换”,而const常量是占有内存的被“冻结”了的变量,C++中使用const常量而不提倡用符号常量。2.6I/O流控制头文件:^include*iostream,h* 201.I/O控制流的书写格式I/O控制流:输入或输出的字节序列(字符序列)操作符:《向输出流"cout"中插入字符»向输入流"cin”中抽取字符实际上,くく、>>是重载操作符cout:C++预定义的标准输出设备cin:C++预定义的标准输入设备作用:》:用从标准输入设备上所接收到的数据去更新操作符つ〉”右边的对象«:用操作符"«"右边的内容输出到标准输出设备上例:以默认的格式进行输入输出:coutくく“Howareyou!*;cout«a[0]«"*«a[l]«endl;〃或者:cout«a[0]«""«a[l]«,Xn*;cin»x;cin»a»b»c;2.使用控制符进行输入输出控制符P/23使用控制符:p/23〜p/27例:#include 21voidmainO(intnumber=1001;coutくく“Decimal:"«dec«number«endlくぐHexadecimal:"«hex«number«endl«"0ctal:"«oct«number«endl;)1.设置填充字符setfillC填充字符’)^include 22♦♦include 23④如果要输出字符’%',则在格式串中的对应位置处写:%%⑤不同的系统在执行格式输出时,可能会小有差别⑥1用于长整型输出,如果应该长整型数用%d格式输出而不用%Id格式,则编译通过,执行时输出的数出错,且在其后面的参数值均错⑦缺省情况下,输出是右对齐、前补空格,但用附加格式说明符,将左对齐、后补空格2.7.2.格式输入函数:scanf()一般形式:scanf(格式控制串,地址列表)功能:从标准输入设备接受输入的任何类型的多个数据其中格式控制串与printfO函数的格式控制串类似格式符:P/31注意:①变量的地址列表,而不是变量名②数组变量的名就是该数组的地址,不必加’&,③格式控制串中,除格式说明外的所有字符,在输入时必须对应地输入@%lf:double型输入⑤用格式%c时,空格、转义字符均有效;用格式%s时,接受的字符以输入的非空字符开始至空字符或回车符止;以回车符开始执行接受输入的操作 24⑥输入数值时不能规定精度⑦输入数值时,遇非数值字符自动认为输入结束,遇宽度结束⑧如果定义输入的宽度,则输入时必须小于等于宽度;否则,如果后面有其他输出数据,这些数据值将全部出错:例:^include"stdio.h"voidmainO{intxl,x2,x3;chara[10];scanf("%2d,%3d,%d”,&xl,&x2,&x3);printf("xl=%dx2=%dx3=%d 25”,xl,x2,x3);scanfa);printf("a[10]=%s”,a);}/・文件名:scanf函数.exe如果输入:111,2,34567则输出:xl=Ux2和x3的值出错而a[10]=l,2,34567*/例:#include*stdio.h*voidmainO{inta[10],i;printf(”请输入10个整数:'n");for(i=0;i<10;i++)scanf("%d”,&a[i]);for(i=0;i<10;i++)printf(" 26a[%d]=%d”,i,a[i]);)/*执行1:输入:1234567890执行正确执行2:输入:1,2,3,4,5,6,7,8,9,0执行不正确・/说明:对于用循环进行输入,之间用空格分隔例:#include"stdio'h”voidmainO{doublea;printf("请输入1个数:");scanf("%lf",&a);printf(" 27a=%f 28",a);)说明:对于double型,输入时应用%If;如果用%f则出错对于double型,输出时用%f即可,系统会自动判断3表达式和语句学习目标:1.理解表达式和语句的概念2.掌握表达式中各种运算符的功能与特点3.明白产生副作用的原因 291.1表达式1.表达式概述表达式:操作符、操作对象组成的符号序列例如:2+3+(5*§izeof(iiK))/3452.左值和右值p/34左值:左值表达式简称左值,能出现在赋值运算符左边的表达式即,表示一个对象标识(有确定地址的对象)的表达式称为左值表达式右值:只能出现在赋值表达式右边的表达式(例,常量只能作右值)说明:左值既可以出现在赋值运算符的右边,又可以出现在左边。inta=3;//a是变量,所以a是左值constintb=4;//b是常量,所以b不是左值表达式可产生左值、右值或不产生值inta;(a=4)=28;//a=4是在值voidf(){return;}〃函数声明,函数声明本身不是表达式,对函数的调用是表达式,它不返回任何值,即不产生任何值。3.操作符的优先级和结合性p/35第一次出现的是单目运算符,第二次出现的是双目运算符4.语句与块C++语言中,除了控制语句、函数调用语句外,几乎所有的操作都是通过表达式进行的。语句以分号(;)结束 30C++语句分成6大类:(声明语句控制语句《r1if()〜else〜for()〜while()〜do〜while()continuebreakswitchgotoreturn(条件语句)(循环语句)(循环语句)(循环语句)(结束本次循环的执行)(终止switch或循环语句的执行)(多分支选择语句)(无条件转向语句)(从函数内返回语句)函数调用语句函数:例:printf("ok”);表达式语句空语句:;:表达式:例:a=3;x+3;5+5;7;1复合语句:用・对花括号把若干条语句括起来成为一条语句(语句块)说明:ー对花括号后面的分号可以不写,但是复合语句内的最后・条语句的分号必须!例:合法语句:4;a;a+l-7;a=l;非法语句:如果a=l3=a+2;5(7+a);a+6=7;a-a=O;C++程序书写规定:一行可写多条语句,一条语句可写多行(行尾加转移字符:'V,表示连行)注意:输入源程序时中、英文要及时切换,例如,中文的分号与英文的分号不是同一个字符说明:C++程序中的注释部分不是语句,两种注释方法:①用/**/括起的内容,不管是否换行,均是注释②用〃开头,至本行尾的内容是注释1.2算术运算和赋值1.基本运算符:+:加法或正号-S减法或负号*:乘法/,除法%:模(整除取余,操作符两边的操作数必须为整型数)说明:两个整数相除,结果为舍去小数部分、截取整数部分;但是,如果有一个操作数是负数,则不同的机器可能有所不同,大多数采用“向零取整”法。 311.复合运算符+=-=♦=/=%=a=a+6与:a+=6等价注意:a*=b+c应:a=a*(b+c)(x=max(5,7))+=3;2.算术表达式、运算符的优先级和结合性1.算术表达式由算术运算符、括号、操作数按语法规则相连接的式子操作数即操作对象:常量、变量、函数等例:a*b/c-25+'a'-(18*c+b)+max(a,b)2.算术运算符的优先级和结合性P/35规定:优先级先括号,再先乘除、模,后加减结合性从左到右结合性即结合方向:当ー个运算对象二侧的运算符级别相同时,规定的处理原则例如:c-a+b操作数a的两边的运算符相同,则先进行c-a操作除1目、3目、赋值运算符外的操作符的结合性均是从左到右3.溢出进行算术运算时,很可能溢出结果。发生溢出是由于ー个变量被赋予一个超出其数据类型表示范围的数值。shortintweight=42896;//weight=-226404.3算术类型转换1.自动转换C++遇到两种不同数据类型的数值进行运算时,会将两个数作适当的类型转换,然后再进行运算。1.字符型、整型、实型之间可以进行混合运算其中字符型数据以ASCH码的十进制数参与运算2.运算时,不同类型的数据要先转换成同一类型,然后进行运算3.转换规则:P/38的图3-1类型转换由系统自动完成例如:如果:inti=9,ii;long1=123;floatf=9.9;doubled=9.9;则:l+'a'+i*f-d/5运算结果为double型注意:①char、short型数据参加运算,系统自动将其转换成int型,然后进行运算②float型数据参加运算,系统自动将其转换成double型,然后进行运算③如果负的int型数据与无符号数进行运算,则负数作为无符号数进行运算:#include*stdio.h"voidmain(){inta=-l; 32unsignedb=0;printf("%d%u 33*,a+b,a+b);}/・输出:-14294967295*/说明:-1的补码为:1111111111111111该码的无符号的十进制值为42949672951.强制转换强制类型转换符:(类型)将一个表达式的值转换成某个类型格式:(类型名)(表达式)说明:①括号必须,但是,如果表达式是单个操作数,其括号可以省例如(int)x(int)(x+y)②一般,系统对操作数自动进行类型转换,但如果:a%b要求a和b都是整型,如果不是,必须先进行转换:(int)a%b(int)a%(int)b③转换后只得到ー个中间变量,被转换的变量的类型不变2.4増量和减量自增自减运算符3.自增:++++i:先加1后使用i++:先使用后加1例:i=3;jl=++i;jl=4相当于执行:i=i+l;jl=i;j2=i++;j2=3相当于执行:j2=i;i=i+l;2,自减:一—i:先减1后使用i一:先使用后减1例:i=3;jl=-i;jl=2相当于执行:i=i-l;jl=i;j2=i—;j2=3相当于执行:j2=i;i=i-l;注意:①自增自减只能用于变量②结合方向:自右至左例如:a=-i++;如果i=6,则a=-6,该语句执行完毕,i=7;③常用于循环语句中的循环变量和指针变量中有关表达式使用的说明C++语言的表达式使用相当灵活,所以经常会出现ー些问题1.表达式中含有自增自减运算符例:如果i=3;表达式(i++)+(i++)+(i++)的值为9,该表达式运算毕,i的值为6所以:a=(i++)+(i++)+(i++);b=i;a的值为9,b的值为62.C中有单目运算符和双目运算符,当难以确定时,编译时C++尽可能多地按自左而右地组织运算符例:i+++j;编译时认为:(i++)+j; 342.在调用函数时,实参的求值顺序视机器系统而定,大多数的系统是右一左例如:i=3;cout«iくぐ・«(i++);左f右:输出:3,3右f左:输出:4,33.5关系与逻辑运算1.关系运算符和关系表达式关系运算符和优先级6种关系运算符:<<=>>===!=I檄(7级)同级(8级)关系表达式:用关系运算符把操作对象按语法要求联系起来的式子被连接的对象可以是常量、变量、表达式。其中表达式可以是逻辑、赋值、关系表达式关系表达式的值{:ニニニ麒:聚关系表达式的值为逻辑值(真/假),可以参加运算例:如果:a=lb=2c=3①d=a>b==c>a+5Id=(a>b)——(c>(a+5))结果:关系表达式(a>b)=(c>(a+5))的值为“真",所以:d=l②d=7/2+a>c+l=b>c-5Id=((7/2+a)>(c+1))=(c>(a-5))结果:关系表达式((7/2+a)>b)=(c>(a+5))的值为“假",所以:d=02.逻辑运算符和逻辑表达式逻辑运算ーf逻辑判断3种逻辑运算符:&&逻辑表达式:用逻辑运算符把关系表达式或逻辑量连接起来的式子逻辑量:常量、变量、及算术、逻辑、赋值表达式逻辑判断真非〇:逻辑表达式的值为1假0:逻辑表达式的值为〇a&&b:a和b都为“真”时,表达式逊殳的值为“真”,否则为“假”a||b:a和b都为“假”时,表达式allb的值为“假”,否则为“真“ 35!a:a为“真”时,表达式里的值为“假”,否则为“真”例:①a=5>3&&28<4-!0Ia=((5〉3)&&2)II(8〈(4-(!〇)))1&&2II8C(4T)1II0表达式a=5>3&&2||8<4T0逻辑判断结果为“真”,所以该表达式的值为1,所以a=l。②如果:a-1b=96c=3d=a='a*>b+!'O"<1&&c==3||c>a&&!b==b++Id=a=((('a'>(b+(!‘0')))〈1)&&(c==3))||((c>a)&&((!b)==(b++)))(97>96<1)&&1II1&&(0==96)〇&&1II1&&〇该逻辑表达式的判断结果为“假”,其值为:0,所以:d=a=O。3.6if语句逻辑判断语句1.3种形式①if(表达式)语句②if(表达式)语句1else语句2③if(表达式D语句11elseif(表达式2)语句2'[if(表达式)语句•elseif语句elseif(表达式n)语句nelse语句n+1丿注意:①表达式左右括号必须要②凡是“语句”,后面必须有分号”;③第3种形式可以理解成是第2种形式的嵌套2.if语句的嵌套即:上述3种形式中的“语句”之一是if语句,就是if语句嵌套例1:某商场优惠顾客:购买金额大于等于500元的8折,大于等于300元及500元以下的9折,300元以下的全部9.5折;编写计算实际应付金额的程序:程序:#include*stdio.h"voidmain(){floatx;printf("请输入总金额:つ;scanf&x);/*如果输入500*/if(x>=500)x=x*0.8;/・符合条件,执行结果:x=400♦/if((x>=300)&&(x<500))x=x*0.9;/・此时x=400,符合条件,执行结果:x=360*/if(x<300)x=x*0.95;printf(" 36应付金额:%f 37",x);/・输出:360*/getchar();getchar();)/・文件名:if语句一例1ー错误 38注意:此程序有毛病:①应付金额变量名不应与x同名!②输入300,则输出:256.5原因:变量x的值被改变和比较时的精度误差・/改进后的程序:#include*stdio.h"voidmain(){floatx,y;printf("请输入总金额:つ;scanf&x);if(x>=500)y=x*0.8;if((x>=300)&&(x<500))y=x*0.9;if(x<300)y=x*0.95;printf(" 39应付金额:%f 40',y);getchar();getchar();)/・缺点:一旦执行了,后面的if语句就不应再判断了,再次改进:*/再次改进后的程序:#include*stdio.h"voidmain(){floatx,y;printf("请输入总金额:つ;scanf("%f",&x);if(x>=500.0)y=x*0.8;〃对于两个浮点数,无法精确判断是否相等elseif((x>=300.0)&&(x<500.0))y=x*0.9;elsey=x*0.95;printf(" 41应付金额:%f 42',y);getchar();getchar();}/・文件名:if语句一例1♦/例1.对任意输入的3个数,按大小顺序输出:程序:#include"stdio.h"voidmain(){floatxl,x2,x3,x;printf(“请输入3个数,之间用逗号分隔:つ;scanf(〃%f,%f,%f”,&xl,&x2,&x3);if(xl 43”,xl,x2,x3);3.6条件运算符格式:表达式1?表达式2:表达式3运算规则:如果表达式1为“真”,整个表达式的值取表达式2的值,否则取表达式3的值例:①x=3>4?4:5/2x=((3>4)?4:(5/2))x=2 44②如果a=4:a=a*5,a*4,a==4?a/2:++aIa=a*5,a*4,(a=4?a/2:卄a)执行结果:表达式a=果5,a*4,a=4?a/2:++a的值为:21,a的值也是21如果:表达式是a=a*5,是4,a=4?a/2:++a,则执行结果为10,a的值是10③如果a=4:b=(a*5,a*4,a=4?a/2:++a)执行结果:表达式b=(a*5,a*4,a=4?a/2:++a)的值为:2,a的值是4b的值是:23.6逗号表达式1.逗号运算符,:也称:顺序求值运算符作用:连接表达式2.逗号表达式格式:表达式1,表达式2表达式n求解过程:先求表达式1,再求表达式2,…,最后求表达式n整个表达式的值为表达式n的值例:如果a=5:表达式a=3*5,a*4的值为60即:a=3*5,a*4注意:表达式a=3*5,a*4与a=(3*5,a*4)的区别例:如果a=5:表达式3*5,a*4的值为20逗号表达式可以嵌套:例:如果a=5:表达式(a=3*5,a*4),a+5的值为20即:a=3*5,a*4这时的a=15所以:a+5就等于203.9求值次序与副作用不同的编译器求值顺序不同p/49消除副作用:将一个表达式分解成多个表达式,或加括号4过程化语句即流程控制语句4.1while语句(“当”型循环结构)一般形式:while(表达式)语句P/54说明:L先判再执行 452.表达式必须有;表达式可以是常量或常量表达式,但出现“死循环”例:…while(5){…)例:求1加到100的和#include“stdio.h"voidmain(){inti=l,sum=0;while(i<101){sum=sum+i;++i;}cout«*sum=*«sum«endl;)4.2do〜while语句一般形式:do语句while(表达式);说明:先执行、后判断注意:该语句后面的分号必须要有!例:求1加到100的和^include"stdio.h"voidmainO{inti=1,sumニ〇;do{sum=sum+i;++i;}while(i<101);coutくく“sum二r«sum«endl;4.3for语句一般形式:for(表达式1;表达式2;表达式3)语句ュ可理解为:for(循环变量赋初值:循环条件;循环变量增值)语句例:求1加到100的和^include“stdio.h"voidmain(){for(inti=l,sum=0;i<101;++i)sum=sum+i;cout«"sum="«sum«endl;)说明:1.for语句中的3个表达式之间用“;”分隔2.执行过程:P/57的图5.63.3个表达式都可以省,但是分号不能省表达式1省:循环变量的初值在for语句前已赋过表达式2省:不判断循环条件出现“死循环”表达式3省:循环变量的“增值”操作在循环体中进行,否则,如果终止条件不出现,则出现“死循环” 462.表达式1在for中只执行ー次3.在表达式1中可以对循环变量赋初值,也可以利用逗号表达式对无关的变量赋初值例:for(sum=0,j=0,i=l;i<101;++i)4.表达式2一ー判断用,所以常常是关系、逻辑表达式,但也可以出现其他表达式例:for(x=l,i=0;y=x*x,x<=5;++i,++x)4.4switch语句(多分支选择语句)一般格式:switch(表达式){case常量表达式1:语句段1case常量表达式2:语句段2case常量表达式n:语句段ndefault:语句}例:ttinclude"stdio.h"voidmainO{intx;coutくぐ请输入ー个整数(可以是负数):〃;cin»x;switch(x){case1:cout«*l: 47”;coutくく"上海交通大学 48〃;case2:coutくく"2 49";case3:cout«"3 50";case4:cout«"4 51";case'5':coutくく"字符5 52";/・字符‘5’的ASCII码:53*/default:cout«"default 53";))/・执行:分别输入1、3、5、53、-1,讲解:应使用break语句・/改进后的程序:#include"stdio.h"voidmain(){intx;printf(〃请输入ー个整数(可以是负数):");scanf("%d",&x);switch(x){case5-4:cout«"l: 54";cout«"上海交通大学 55”;break;case2:cout«"2: 56";break;case3:cout«"3: 57";break;case4:cout«"4: 58";break;case'5':coutくく"字符5 59";break;/・字符’5'的ASC码:53*/default:coutくく“default 60";break;}/Z执行:分别输入1、3、5、53、-1说明:①每个语句段可以由多条语句组成,而不必加花括号②switch(表达式),括号不可以省:表达式可以是:常量,变量,关系、逻辑、算术、赋值表达式,但是表达式的值必须是整型或字符型③default可以不写:都不符合,就什么也不做④switch语句只判断一次,作为寻找执行该语句的入口点⑤case常量表达式:的作用:仅仅作为语句标号⑥利用break语句可以跳出switch语句⑦多个case可以共用ー组执行程序段,例: 61case1:case7:case9:a=a+b;coutくく"a="くくa;break;caseI'+'p':case100:max(a,b);break;即:符合1、7、9的情况,均执行同一段语句:符合‘a'+'p'和100,均执行同一段语句4.5转向语句1.break语句作用:1.中止switch语句的执行,并跳出switch语句2.从循环体中跳出,转而执行循环体的下一条语句注意:只能用于switch和循环语句中!2.countinue语句作用:结束本次循环注意:并不从循环体中跳出,除非已处于循环结束点例:…for(j=0;j<100;++j){a=a+j*j;if(j==50)coutinue;/*如果j等于50就不执行下面的语句,直接进行下ー轮循环・/cout«*a=*«a;)3.goto语句一般形式:goto语句标号;说明:①goto为无条件转向语句,只有与if语句ー起使用方可构成循环例:求1加到100的和#includeMstdio.h"voidmain(){inti=l,sum=0;loop:sum=sum+i;++i;if(i<101)gotoloop;coutくくsum="くくsum;}③应该禁用goto语句(不符合结构化原则)4.6实例例1:P/66用公式:旦=iー丄+丄_丄4357求n的近似值,直到最后一项的绝对值小于:10-6 62ハ垢n111111TjVT:=11规律:①可以看作:4a„a,a2a3a4a,a.=5x(a1+2)当i二偶数时,s取1;i二奇数时,s取T(s=l或s=-l)②特殊情况:〃_)以。ー丄程序:#include"stdio.h"voidmain(){ints;floata,pi;for(s=l,a=l,pi=0;;a=a+2){pi=pi+s/a;s=~s;if(l/a 63请输入年数(大于3、小于30):";do{cin»n;if(n<411n>29)coutくく"必须输入大于3、小于30的数,请重新输入:";}while(n<4||n>29);for(i=4;i<=n;i++)num[i]=num[i-l]+num[i-3];coutくく" 64第"くくnくく"年共有"«num[n]«"头母牛、n";coutくく"、n继续?(Y/N):cin»c;}while(c=yIIc=,Y,);)//2:用递归实现#include 65请输入年数(大于3、小于30):";do{cin»n;if(n<4||n>29)coutくく"必须输入大于3、小于30的数,请重新输入:}while(n<4||n>29);coutくく"、n第"くくnくく"年共有"«produce(n)«"头母牛、n";coutくく"、n继续?(Y/N):";cin»c;}while(c='y'||c='Y'); 66} 675函数5.1函数概述程序功能模块程序子程序C++语言:程序函数程序结构:例:编写ー个对某个正整数有关的处理程序注意:层次结构、函数调用关系、函数返回值说明:1.源程序文件:ー个源文件是一个编译单位,不是以函数为单位进行编译的2.C++程序由一个或多个源文件组成;分多个文件可以提髙编译和调试的效率3.主程序只能有一个,程序执行自主程序开始,由主程序结束而结束4.函数必须定义,定义时各函数相互独立:不能嵌套定义:除主函数外,函数间可以相互调用5.函数分类:从用户角度:库函数、自定义函数从形式:无参函数、有参函数5.2函数原型p/78函数声明就是函数原型函数的声明和函数的定义,在返回类型、函数名、参数个数、参数类型、及参数顺序上必须完全一致,否则编译时出错C:函数抽象用于表达问题求解中的一个过程C++:函数抽象主要用于定义类上的操作接口5.3全局变量与局部变量1.程序的内存区域P/81图5-2S代码区、全局区、堆区、栈区2,全局变量在函数外部定义的变量称全局变量作用域:从被定义的位置起,至文件结束处止说明:全局变量在程序执行的整个过程中,占用固定的内存单元具有初始值可以被在其定义后的所有函数共同使用(解决“一个函数只能返回一个值”的问题)在同一源文件中,如果外部变量与局部变量同名,贝リ:在局部变量的作用域内,同名的全局变量不起作用 683.局部变量只在某ー函数内部定义的变量称局部变量,局部变量存放在栈区作用域:只局限于本函数内说明:不同函数的局部变量可以同名形参是局部变量除本函数外,其他函数一概不能使用复合语句中的局部变量:复合语句可以看成是“程序块”,在其内部可另行定义变量分程序局部变量这种变量出了该复合语句就无效一般:在复合语句中的循环变量可以在复合语句中定义例:#include*stdio.h*voidmainO{inti=0,j=9;{intj=0;//j的作用域:自此起,到本复合语句结束处止printf("复合语句j=%d 69”,j);)printf(*j=%d 70*,j);for(intk=0;k<5;++k)〃k的作用域:自此起,到本函数结束止printf("k=%d",k);printf(* 71k=%d 72*,k);}/・执行输出结果:复合语句j=0j=9k=0k=lk=2k=3k=4k=5*/5.4函数调用机制栈函数的整个过程就是栈空间操作的过程:保护调用函数的运行:入栈建立被调用函数的栈空间传递参数将控制转给被调用函数……P/835.5静态局部变量静态局部变量:局部变量定义时,前面冠以static注意:静态局部变量只在函数第一次被调用时进行初始化可见性:本函数内存储类型:auto自动(动态,局部变量)static静态(可以全局,也可局部变量)\用作定义register寄存器(形参,局部变量)Jexternーー外部的全局变量仅作说明C++规定:①每个变量和函数有两个属性:存储类型和数据类型,并必须加以定义:存储类型数据类型变量名列表;②局部变量的存储类型缺省,默认为:auto型③外部变量:指本文件外的全局变量如果外部变量的定义出现在本源文件、且在引用前,则引用时可以不说明,否则必须说明外部变量的定义:只定义一次,且在函数外定义5.6递归函数递归调用:直接或间接地调用自己直接递归调用:在函数f中调用函数f例如:…voidf() 73{…f();),间接递归调用:函数f调用函数ff,而函数ff调用函数f注意:要有终止递归调用的条件!例“汉诺”问题汉诺问题:a针上有从小到大排列的n个盘,要求把这些盘全部搬到c盘上,可以利用空的B针;但是:每次只能搬动ー个盘,且在搬动时每个针上必须保持盘从小到大的排列次序。分析:设子函数:voidmove(源针,目标针):把ー个盘由源针搬到目标针voidhanoi(盘数,源针,借助针,目标针):把参数“盘数”指定的这些盘,通过借助针,由源针搬到目标针分析:I输入盘子数:nI调用hanoi()函数I结束hanoi()函数:(借助b针,把a针上的所有盘子ーc针上)其中:①可以把(n-1)个盘子再当作n个盘子:再分成最大的1个盘子和(n-1)个进行上述的移动,直至n=l个(递归)②完成“移动”操作的函数:voidmove(源针,目标针)“汉诺”函数:hanoi(盘子数,源针,借助针,目标针)③(nT)个盘子:借助a,bc程序:#includeiostream,h”voidmove(chara,charc){staticinti;i++;cout«i«*:"くくaくく"f"«c«endl;}voidhanoi(intn,chara,charb,charc){if(n=l)move(a,c);else{hanoi(n-1,a,c,b);move(a,c);hanoi(n-1,b,a,c):)voidmainO{intnum;coutくぐ请输入盘子数:“;cin»num;coutくく“按、"汉诺塔ぐ的规则,把"くくnumくく"个盘子从a针搬到c针的步骤是: 74";hanoi(num,'a','b','c);}/・如果输入4:(如果输入5,则执行31步)按“汉诺塔”的规则,把4个盘子从a针搬到c针的步骤是:1:a-b 751:a—c2:bc3:a—b4:c-a5:c-b6:a-b7:afc8:b~c9:b—a10:c—a11:b—c12:ab13:a—c14:b-c*/5.7内联函数inline:也称内置函数、内嵌函数目的:减少开销、提髙效率在编译时,象对待“宏”一样进行替换,程序运行时没有函数调用过程和函数返回定义、声明时:在前面冠以“inline”即可说明:⑴如果被调用函数定义在被调用之前,且定义时冠以inline,则以后每次被调用均作内联函数处理。如果被调用函数定义在被调用之后:①定义时没有冠以inline:如果在被调用前声明过该函数,且声明时冠以inline,则以后每次被调用均作内联函数处理②定义时冠以inline:如果在被调用前声明过该函数,但声明时没有冠以inline,则被调用均不作内联函数处理即:必须声明成“内联”的,或无声明、但定义成“内联”的⑵内联函数内不能出现switch、循环语句,否则报错,作普通函数进行调用。例:#include 76希望:由系统自动判断,用户只要记住函数名即可重载:写多个同名函数,由系统根据操作数自动判断究竟调用哪个函数1.匹配重载函数的顺序P/93的原则:按如下先后顺序:1寻找ー个完全匹配,找到就调用2通过内部转换、然后寻找严格匹配,只要找到就调用3通过用户自己定义的转换寻找严格匹配,找到就调用例:/93〜942.使用说明1.重载函数至少在参数个数,参数类型、或参数顺序上有所不同,仅返回类型不同不行2.不能用typedef定义的类型名来区别重载函数中的参数类型,因为“编译”时不区分其差别3.同名函数应具有相同的功能例:〃5.8节一般函数名重载p/78#include 776程序结构多文件结构6.1外部存储类型extem声明:仅声明是本文件外的变量或函数,不是定义外部变量或函数外部变量的定义:只定义一次,且在函数外定义:定义格式:与全局变量的定义格式同外部变量的说明:可以说明多次说明格式:extern外部变量类型变量名列表;例:externinta,b;externcharx,y;6.2静态存储类型1.静态全局变量全局变量定义时,前面冠以static作用:全局变量的作用域是整个程序,对于多文件程序结构,ー个文件的全局变量可以被另一个文件使用,但静态全局变量的作用域被限定在本文件内,别的文件不能使用2.静态函数函数定义时,前面冠以static作用:函数的作用域是整个程序,对于多文件程序结构,ー个函数可以被另ー个文件使用,但静态函数的作用域被限定在本文件内,别的文件不能使用。3.3作用域作用域:标识符在程序中的有效范围1.局部作用域局部作用域:自定义的位置起,至所在的语句块尾或函数尾止例:#include 78cout«i«endl;〃合法cout«z«endl;//error:z没有定义1.函数作用域ー个标识符不管在函数的什么地方定义,自函数的起始点起,至函数的终止点都有效,则此标识符具有函数作用域。语句标号是唯一具有函数作用域的标识符p/108例题:可以使用出现在后面的语句标号标识符2.函数原型作用域指:函数声明(不是定义)中的形参标识符的作用域仅仅在函数原型中例:intmax(intx,inty);x=100;//error:x没有定义3.文件作用域文件作用域:本文件内有效,也称全局作用域全局变量(包括静态全局变量)、静态函数具有文件作用域4.4可见性可见即可用,可见性与作用域相一致注意:内部标识符“支配”外部同名标识符局部标识符“支配”全局同名标识符(解决办法:加域限定符S!进行引用)5.5生命期1.静态生命期与程序运行期同函数、全局变量、静态局部变量都具有静态生命期2.局部生命期非静态的局部变量具有局部生命期如果不进行初始化,其值不确定 791.动态生命期动态分配的对象具有动态生命期:如果不释放(即收回),则直到程序运行结束,生命期オ结束2.6头文件以.h为扩展名的文件,用»include命令包含进来适宜放在头文件中的信息:p/1133.7多文件结构ー个大程序可以由多个源文件组成,每个源文件可以进行独立编译p/116图6-24.8预编译处理编译预处理:C++的主要功能在程序中通过预处理命令实现,不是C++的语句C++编译系统:先对程序中的特殊命令进行预处理,然后把预处理结果和源程序ー起进行常规编译处理(词法、语法分析,代码生成,优化等)提供3种预处理功能:宏定义]文件包含卜均以“が’开头条件编译J1.#include命令P/116作用:把指定的源文件(或:头文件)的全部内容包含到当前文件中一般形式:includeく文件名〉include”文件名”形式1:直接按系统标准方式检索文件目录形式2:在当前源文件的目录中寻找,找不到再按系统标准方式检索其它文件目录说明:①一条命令只能包含进ー个文件②被包含进来的文件的次序,就是该条包含命令的次序③如果嵌套包含文件,则涉及到的全部文件均应包含进来,且最深ー层被包含的文件所对应的包含命令应在最前面例如:文件3中包含文件2,文件2中又包含文件1,应该:^includettincludettinclude④被包含的文件的扩展名:.h.c.cpp⑤被包含后的所有文件均成为ー个文件,并作为一个文件进行编译、连接,得到一个目标文件、ー个可执行文件;但是:♦作为源文件,依旧相互独立存在•原各文件中的全局静态变量就成为整个文件的全局静态变量了(不必冠以extern) 801.#define命令注意:在C++中已经被const定义所代替#define、ttundef命令宏定义:宏代换作用域:自#define起,加ndef或文件结束止注意:一次命令定义ー个宏;是命令,不是语句;但可以出现在函数中不带参数的宏定义:作用:用指定的宏名(符号常量)代替ー个字符串形式:#define宏名字符串例:#define^define例:…#defineftdefineName上海交通大学Namel“上海交通大学”Name上海交通大学Namel“上海交通づ注意:两者不同!voidmain(){charn[20]=Name;charm[20]=Namel;…)预处理后为:voidmain(){charn[20]=上海交通大学;非法语句charm[20]=“上海交通大学”;合法语句)说明:①一般用大写标识宏名②宏名代表ー个字符序列,预处理时不检査其合法性,在编译被宏展开后的源程序时进行合法检査③宏定义不是语句,行末不必加分号,如果加了,则一起转换④在宏定义中,可以利用已定义的宏⑤用双引号括起的为字符串常量,在双引号中出现的宏名一概不替换带参数的宏定义:作用:除进行字符序列替换外,再进行参数替换一般形式:4define宏名(参数列表)字符序列宏替换过程:用指定的字符序列替换宏名,然后用实参替换参数列表中的形参例:#defineS(a,b)a*b+a/bx=S(5,7);I2>例:例efinePi3.1415926^defineS(r)Pi*r*rx=S(a+b)*x;第一步:x=a*b+a/b;第二步:x=5*7+5/7;ftdefinePi3.1415926ftdefineS(r)Pi*(r)*(r)x=S(a+b)・シVx=3.1415926*(a+b)*(a+b)*x;x=3.1415926*a+b*a+b*x;说明:①在宏名与参数列表的括号之间不能有空格,否则被理解为不带参数的宏替换 81②“实参”与“形参”应ーー对应,无类型而言,仅替换;“实参”如果是表达式,并不进行运算③与函数的形参和实参有本质上的区别:不分配内存、参数无类型、表达式不求值、宏展开在预编译时进行(函数调用在运行时进行)④宏替换不占运行时间,只占编译时间3.条件编译命令作用:对满足条件的部分程序内容进行编译,否则不参与编译功能:便于调试判断符号常量,进行条件编译:形式1:#ifdef标识符程序段#endif作用:如果标识符被定义过(一般用#define命令定义),则编译程序段,否则不编译形式2:#ifdef标识符程序段1#else程序段2#endif作用:如果标识符被定义过,则编译程序段1,否则编译程序段2形式3:#ifndef标识符程序段#endif作用:如果标识符没有被定义过,则编译程序段,否则不编译形式4:#ifndef标识符程序段1#else程序段2#endif作用:如果标识符没有被定义过,则编译程序段1,否则编译程序段2判断表达式,进行条件编译:形式1:#if(表达式)程序段#endif作用:如果表达式成立(表达式为“真”)则编译程序段,否则不编译形式2:#if(表达式)程序段1ttel.se程序段2#endif作用:如果表达式成立则编译程序段1,否则编译程序段2说明:①只对在判断范围内的程序段进行条件编译,其它的程序部分均编译②不编译——不可能执行③省编译时间,减少目标程序的长度,便于程序移植例:#include*stdio.h*ttdefineStudent0voidmainO(ttifdefStudentprintf("处理学生信息... 82");(#if(Student)printfC处理小学生信息... 83");#elseprintfC处理大学生信息..・'n");Aendif)#elseprintf("处理教师信息.•.、n”);#endif 84)/・改成:#defineStudent1再执行一次然后,把#defineStudent1用注释括起再执行ー次・/7数组数组:有序的同一类型的数据的集合说明和规定:①数组属于构造类型,数组中的所有元素必须属于同一类型②数组元素的表示:数组名[数组下标],例如:a[0],a[l],a[i],a[i+9]下标:数组元素到数组起始位置的偏移量p/120③先说明后使用④只能引用数组元素,而不能引用数组。例如:intj,a[100];j=a[5]+a[0];j=a;X⑤数组元素可以被赋值,也可以作为操作数出现在表达式中:a[O]=a[l+j]%j;⑥定义数组时,元素的个数必须是整型常量或常量表达式。例如:charc[50];charc[j];X⑦C++不提供数组下标越界保护⑧下标编号从〇开始7.1数组定义和使用1.定义格式:类型说明数组名[数组长度表达式]例:UdefineN200;floatf[50];inta[N*2];说明:①数组长度即数组元素的个数,数组长度表达式中不能出现变量,表达式的值必须是正整型②必须是方括号,不能是圆括号2.访问数组元素数组元素作为操作数可以参加各类操作(表达式、函数调用)注意:在使用时,方括号中可以是常量、含有变量的表达式,因为其值(必须是不超过长度的整数值)是数组下标。例:inta[10],b[7];a[0]=a[0]+b[7];Xb[6]=max(a[7],b[0]);b[7]=max(a[7],b[0]);每个元素存放ー个字符凡是字符数组均可以用整型数组来实现 851.2初始化数组在定义数组的同时进行赋初值:inta[10]={l,2,3};说明:①数组定义时不初始化,各元素的值不确定②初始值依次写在花括号中,之间用逗号分隔③初始化时可以省略长度定义,系统自动取花括号内的数据个数作为数组长度例如:inta口={0,1,2,3,4};长度为5④定义数组时可以对前面的部分元素进行初始化,但是数组的长度不能省略例如:inta[100]={ll,22,33};⑤初值可以是已赋过值的变量、含有赋过值的变量的表达式、常量表达式,例如:#include*stdio.h*voidmain(){inty=123,a[100]={y,y+5,5+55};printf(*%d%d%d 86*,a[0],a[l],a[2]);}〃执行结果:12312860说明:如果y不赋初值,编译时会警告!注意:不可以:inta[10]={l,,2,3};p/1252.3字符数组每个元素存放ー个字符凡是字符数组均可以用整型数组来实现1.字符数组定义:charc0[10],cl[2][10];2.初始化1.chara[10]={匕','k'};即:a[0]='a';a[l]='b';a[2]〜a[9]:没有初始化或者:chara[10]={uab"};BP:a[0]='a';a[l]='b';a[2]='\0';a[3]〜a[9]:没有初始化2.staticchara[10]={'a','b'};即:a[O]=,a,;a[l]=,b,:a[2]~a[9];初始化成"空"数组a是静态变量3.缺省长度定义:chara[]={匕,,,b,};系统自动判断数组a的长度为2,即:a[2]chara[]={"abw);系统自动判断数组a的长度为3,即:a[3]5因为字符串有结束标志へ(F,由系统自动加上4,初始化的元素个数大于长度,则语法出错(编译通不过):chara[2]={匕’,'b','c'};5.对于二维数组,初始化的元素先分配给〇行的各列,然后分配给1行的各列,…可以全部罗列,以逗号分隔;也可以按行进行初始化,各行用一对花括号括起,各行用逗号分隔 87例:chara[5][10]={ 88",a,strlen(a));}/・如果输入"abed",输出:abed1=4*/如果用数组来存放字符串,则数组长度应定义成:字符串可能的最大实际长度+15.字符数组的输入输出ヘ〇'只作判断用,不会输出!C!利用输入输出函数以及格式符进行输入和输出:%c、%s例:#include*stdio.h*voidmain(){chara[20];scanf(.%s”,a);printf("%s 89",a);puts(a);getchar();gets(a);printf(" 90 91%s 92”,a);puts(a);getchar();)/・执行3次,分别输入字符串:“123456”/“123456”/“123”"456789"/*/关于%s字符串格式输入输出的说明:①输出字符不包括へ〇,,遇第一个へ〇,结束②输入时,以非空字符起,遇空格止,以“回车”为"写入”③输入时,写数组名即可,可以不加地址符,&,(对于数组)④输出时,写数组名而不是数组元素名(对于数组:用%s格式输出) 93⑤如果一次输入(以回车符为标志),自动以空格分隔,例:chara[10],b[10],c[10],d[10];scanf('%s%s%s%s',,a,b,c,d);如果输入:Iamastudent.则"I”f数组a,"am”f数组b,a-数组c,student.ー数组d⑥输入的字符个数超过数组的长度,取等于长度数的字符数,无字符串结束标志C++:输入输出流对象cin、cout3.有关处理字符串的函数的介绍分别包含在"stdio.h”、"string』”、"ctype.h"中P/313①字符串输出函数:puts(字符数组名)例:chars[]={4tChina 94Beijing,5};/Z花括号可省:charsロ='4china 95Beijing”;puts(s);输出:ChinaBeijing注意:一次只能输出ー个字符串,不能:puts(sl,s2);X②字符串输入函数:gets(字符数组名)说明:一次只能输入一个字符串输入什么接受什么输入超过长度,则根据长度自动截止;小于长度,后面的元素补,、〇,字符数组名前不必加地址符,&,,因为数组名本身就是该数组的地址③字符串连接函数:strcat(字符数组名1,字符数组名2)//strncat(char*,char*,intn)作用:把字符数组2接在字符数组1的后面,然后赋值给字符数组1;该函数被调用结束,返回字符数组1的地址说明:数组1的长度要足够大,如果长度不够,可以执行,但运算结果出错原来数组1后面的,'0,自动取消,在连接后的字符串后自动加,'0,(如果长度够的话)④字符串拷贝函数:strcpy(字符数组1,字符数组2或字符串常量)//strncpy(char*,char*,intn)作用:把字符数组2或字符串常量拷贝至字符数组1中例:strcpy(al,a2);strcpy(a,"asdfdfhjdskhg”);注意:字符串不能直接进行赋值,例如:chara[10],b[10]={<423456789,,}:a=b:X数组1的长度必须>=数组2或字符串常量的长度拷贝时,连同字符串结束符一起拷贝至字符串数组1中例:#include*stdio.h*#include*string.h"voidmainO{chara[10]={*abcdefghi*},b[5];printf(*a:%s 96b:%s 97*,a,b);strcpy(b,a):printf(*a:%s 98b:%sl=%d 99*,a,b,strlen(b));printf(*b[4]=%cb[5]=%cb[8]=%c 100*,b[4],b[5],b[8]);getchar();J/・先执行该程序,然后把数组b的长度改成10,再执行,比较有何区别・/⑤字符串比较函数:strcmp(字符串常量1或字符数组名1,字符串常量2或字符数组名2)//strncmp(char*,char*,intn)作用:对两个字符串进行比较,然后返回比较结果:返回〇两串相等>0的整数串1>串2 101<0的整数串1〈串2说明:•从第0个元素起,逐个往后进行比较,自首次出现不同的字符就比较该字符的大小,后面的字符不予比较(不必长度一定要大)例:"abcde"和”ac",串"ac”大•比较两个串的大小,只能用函数进行,不能:串1=串2⑥求字符串长度的函数:strlen(字符数组名或字符串常量)例:strlen(a);strlen(ugfhfjgjfgjdfg^^);说明:长度不包括字符串结束标志:へ0'⑦大小写转换函数:strlwr(字符数组名或字符串常量):大写ー小写strupr(字符数组名或字符串常量):小写一大写说明:串中的非字母字符不转换注意:不同的系统所提供的库函数的函数名和功能有所不同!因为库函数本身不是C的组成部分。7.4向函数传递数组如果实参是数组,则形参不管是指针形式还是数组形式,传递的都是数组的首地址。把实参(数组首地址)拷贝给形参(数组首地址),而不是把整个数组拷贝给形参。数组元素、数组名都可以作函数的参数其中:数组名既可以作形参、也可以作实参,进行整个数组的传递而数组元素只能作实参,不能作形参(即,这时形参只能写成单变量形式,不能写成数组元素形式)例:…//error:intmax(intx[],inty[]){return(x>=y?x:y);}intmax(intx,inty){return(x>=y?x:y);}voidmain(){inta[10]={l,2,3,4,5,6,7,8,9);coutくくmax(a[7],a[9])くく“"«max(a[8],a[0])<,endl;}1.数组元素作函数的参数与变量ー样,进行“值传递”例:max_num=max(a[j],b[j]);2.数组名作函数参数不是进行“值传递”,是把数组的首地址传递给被调用函数数组名作参数时,调用函数和被调用函数的该参数都应说明成是数组,而且实参与形参都是数组名例1:求整数数组中,的最大数:ttinclude*iostream,h#defineN10voidmainO{inta[N]={l,2,3,4,5,66,7,8,9};intmax(inta[],int);cout«max(a,N);}intmax(inta[],intn){for(intm=0,i=0;i 102voidmain(){floatarray[N];inti;coutくく”请输入该学生的“くくNくく“门课的成绩:
此文档下载收益归作者所有