C++程序设计:第1-7章_第1页
C++程序设计:第1-7章_第2页
C++程序设计:第1-7章_第3页
C++程序设计:第1-7章_第4页
C++程序设计:第1-7章_第5页
已阅读5页,还剩633页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C++程序设计课程目标进一步掌握程序设计,包括过程化程序设计和面向对象的程序设计掌握C++语言了解常用的算法及算法设计过程去年期末成绩的组成课堂表现及大作业:30%期中卷考:20%期末卷考:30%期末机考:20%备注:有可能根据具体情况而调整教材及参考教材C++程序设计思想与方法(第2版)人民邮电出版社翁惠玉C++PrimerPlus人民邮电出版社C++大学教程电子工业出版社程序设计程序设计语言程序设计方法程序设计过程程序的执行程序设计语言概述程序设计语言的基本组成过程单元程序设计语言的发展第一代:机器语言第二代:汇编语言第三代:过程化语言第四代:非过程化语言第五代:自然语言低级语言高级语言机器语言一组二进制数表示的指令每种计算机都有自己的机器语言用机器语言写程序是非常困难的,读机器语言写的程序也是非常困难的汇编语言用缩写和助记符代替0和1的比特串和机器语言一样,不同类的机器有不同的汇编语言汇编程序:将汇编语言写的程序翻译成机器语言的程序过程化语言类似于英语的语言编译器:将过程化语言写的程序(源代码)翻译成机器语言的程序(目标代码)解释器:逐句解释源程序并执行,不保存目标代码。第三代语言的特点具备了一定的机器独立性,使用户可以专注于解决问题的方法。但某些方面还是受到机器的限制为了解决移植性问题,ANSI制订了一系列的标准主要的过程化语言FORTRAN:FORmulaTRANslatorBASIC/VisualBASICCOBOL:COmmonBusiness-OrientedLanguageADAPASCALC/C++PythonJAVA非过程化语言也称为面向问题的语言用于解决特定问题如:SQL语言自然语言人类的语言还在研究之中程序设计语言概述程序设计语言的基本组成过程单元变量和数据类型变量(variable):为存储器中的地址取一个名字。变量的命名应符合规范。数据类型(datatype):数据的编码方式、值域和可执行的操作整型(integer):以补码形式存储,可执行传统的算术运算和比较运算实型(real):以浮点表示,操作类似于整型字符型(char):用编码表示。可执行比较、连接等运算布尔型(boolean):只有“真”、“假”两个值。可执行判断运算组合类型数组:一组同质数据记录:一组异质数据,在C语言中称为结构体常量和符号常量常量:值的直接表示。如1、3、1.57、‘A’等符号常量:为值指定一个描述性的文字,增加程序的可读性。在C++语言中,#define和const都能实现这个目的赋值语句把一个值赋给一个变量。如x=y+z;赋值语句的左边是变量,右边是表达式控制语句改变程序中语句的执行次序控制语句的类型分支语句两个分支多个分支循环语句for语句while语句注释注释是写给人看的,而不是写给机器看的。它不影响程序的执行每个程序单元的开头都应该有注释,一些重要的程序段、变量声明也应该有注释给程序添加注释是一种良好的程序设计习惯程序设计语言概述程序设计语言的基本组成过程单元过程单元过程单元是程序的基本单位。解决某一问题的过程描述。过程单元分为过程(procedure):无返回值函数(function):有返回值过程单元执行过程单元称为调用(calling),过程单元执行完后返回到调用者过程单元的组成名字参数(parameter或argument)形式参数实际参数局部变量(localvariable)全局变量(globalvariable)语句参数传递实际参数和形式参数之间的数据传递参数传递方式值传递引用传递程序设计程序设计语言程序设计方法程序设计过程程序的执行程序设计方法结构化程序设计方法面向对象程序设计方法程序设计就是教会计算机解决某个问题结构化程序设计方法结构化程序设计方法从程序要实现的功能的角度出发,一般按照自顶向下、逐步求精的方式,将程序分解成一个个能够直接用程序设计语言写出来的功能模块,然后象搭积木一样搭起来。所谓的功能可以理解为对数据的操作。在程序实现中,特定的功能或功能模块一般用函数来实现,它们要对特定的数据进行操作。该方法出现在上个世纪70年代。结构化设计方法的特点主要技术:自顶向下、逐步求精,采用单入口、单出口的控制结构。自顶向下:是一种分解问题的技术,逐步求精指结构化程序的连续分解,最终成为下面三种基本控制结构的组合三种基本控制结构:顺序、分支、循环。容易保证程序的正确性。分支结构语句1语句2语句3条件语句2语句1语句1语句2顺序结构循环结构面向对象程序设计面向对象的程序设计在解决问题时首先考虑需要哪些工具,以及如何用这些工具解决问题。如果所需要的工具不存在,程序员可以自己创建这个工具。所谓的工具就是一种数据类型。对象是某种程序员自己定义的类型的变量。面向对象方法的主要特点封装代码重用继承:类的层次关系多态:对不同的对象发出同一个指令有不同的行为程序设计程序设计语言程序设计方法程序设计过程程序的执行程序设计算法设计:设想计算机是如何一步一步完成这个任务编码:用计算机认识的语言,如C++语言,描述这个完成任务的过程编译与调试:检验程序是否正确,达到预期的目标程序设计就是教会计算机去完成某一特定的任务,即设计出完成某个任务的程序。程序设计包括以下几个阶段:算法计算机解决问题的步骤,算法的每一步都是都是程序设计语言能够完成的基本功能。算法必须是:表述清楚、明确,无二义性。有效性。即每一步骤都切实可行。有限性,即可在有限步骤后得到结果。算法的表示:有自然语言、传统的流程图、结构化流程图、伪代码和PAD图等方法编码用某种程序设计语言表示算法程序设计程序设计语言程序设计方法程序设计过程程序的执行语言的翻译将高级语言的程序翻译成机器语言解释执行编译执行编译执行main(){inti,s;i=1;s=0;Ccompiler0110001011101001SourceprogramObjectprogram将程序全部翻译成机器语言的程序,然后再执行。编译程序的结构词法分析语法分析中间代码生成优化目标代码生成源程序目标程序单词语法单位中间代码优化后的中间代码识别一个个单词,并转化为机内形式按语法规则识别语法单位,如表达式、语句等如四元组、三元组和逆波兰表达式对运行速度、存储空间方面进行优化中间代码转换为目标程序解释执行源程序

解释系统(逐句解释、执行)原始数据结果连接与加载连接(link):将目标程序与已有的其它目标程序连接起来,产生一个可执行的程序加载(load):为程序在内存中定位程序执行过程程序的调试语法错误和词法错误:由编译器检查,指出错误。程序员根据编译器输出的信息修改程序逻辑错误bug:通过分段观察程序的阶段性结果来找出错误的位置和原因。程序的调试及测试只能发现程序中的错误,而不能证明程序是正确的!!!第1章计算机简介计算机的发展计算机的组成信息的表示程序设计C和C++上机准备C和C++C++是从C发展而来,而C又是从B语言发展而来C语言是由贝尔实验室在B语言的基础上开发的,并有美国国家标准组织和国际标准化组织进行了标准化C++是C的扩展,主要是提供了面向对象的功能第1章计算机简介计算机的发展计算机的组成信息的表示程序设计语言C和C++上机准备编译环境往年MicrosoftVisualStudio6.0/200XCodeBlocks程序的调试程序中的错误语法错误:由编译器找出这些错误逻辑错误:可以利用调试工具支持各种调试工具,包括断点设置单步执行变量跟踪第二章通过例子学习第一个程序第二个程序变量定义数据类型符号常量算术表达式赋值表达式自增自减运算符强制类型转换数据的输入输出C++程序的基本组成基本的C++程序结构//File:hello.cpp//thisprogramprintsthemessage//“helloeveryone”onthescreen#include<iostream>intmain(){std::cout<<“helloeveryone”<<std::endl;return0;}程序注释预处理命令主程序注释//……..//……..//……../*…..……*/注释是写给人看的,而不是写给计算机的。注释作用:从整体描述程序操作过程;注释也可以出现在主程序中,解释主程序中一些比较难理解的部分。给程序添加注释是良好的程序设计风格。C程序的基本组成基本的C程序结构//File:hello.cpp//thisprogramprintsthemessage//“helloeveryone”onthescreen#include<iostream>intmain(){std::cout<<“helloeveryone”<<std::endl;return0;}程序注释预处理命令主程序编译预处理C++的编译分成两个阶段:预编译和编译预编译处理程序中的预编译命令,即那些以#开头的指令编译预处理主要有:库包含:用#include实现,表示程序使用了某个库宏定义:用#define实现。宏包括不带参数的宏和带参数的宏。不带参数的宏通常用来定义符号常量。带参数的宏用来定义一些较为复杂的操作。库包含的格式库是预先做好的一些工具程序。每个库要提供一个接口,告诉库的用户如何使用库提供的功能。库包含就是把库的接口文件放入源文件,以便编译器检查程序中对库的调用是否正确。库包含格式:#include<filename>:包含了一个系统库

#include“filename”:包含了一个用户自定义的库宏定义宏定义有两类:不带参数的宏带参数的宏宏定义不带参数的宏定义通常用于为程序中的常量取一个名字,称为符号常量。格式:

#define标识符替换文本如:#defineRADIUS5#definePI3.14159#defineAREAPI*RADIUS*RADIUS用define定义宏是C语言的习惯,在C++中有更好的解决方案带参数的宏定义带参数的宏用于定义一些较为复杂的操作格式:

#define宏名(参数表)替换文本如:#defineCIRCLE_AREA(x)(PI*(x)*(x))

当程序中出现语句area=CIRCLE_AREA(4),就会被替换成area=(3.14159*(4)*(4))带参数的宏是C语言的习惯,它有很多缺陷,在C++中有更好的解决方案使用符号常量的好处含义清楚,提高了程序的可读性。在需要改变一个常量时能做到“一改全改”C程序的基本组成基本的C程序结构//File:hello.cpp//thisprogramprintsthemessage//“helloeveryone”onthescreen#include<iostream>intmain(){std::cout<<“helloeveryone”<<std::endl;return0;}程序注释预处理命令主程序主程序主程序由一个或多个函数组成每个程序都必须有一个名为main的函数,它是程序的入口。函数的构成intmain()函数头{std::cout<<“helloeveryone”<<std::endl;return0;}函数体与PYTHON不同,C++的函数体必须用一对花括号括起来。事实上,PYTHON中所有必须缩进的语句,在C++中都必须用花括号括起来。输出流对象std::cout“流”指的是设备之间传递的数据流输出流是传给输出设备的数据流cout代表显示器格式将hello显示在屏幕上:std::cout<<“hello”;std::cout<<“hello,everyone”<<std::endl;std::endl表示换行名字空间在大型的程序时,每个源文件可能由不同的开发者开发。不同的源文件中可能有同样的名字。当这些源文件连接起来形成一个可执行文件时,就会造成重名。名字空间是把一组程序实体组合在一起,构成的一个作用域。一个名字空间中不能有重名,不同的名字空间中可以定义相同的实体名。当引用某个实体时,需要加上名字空间的限定程序中的std是C++中所有标准库的名字空间名。名字空间myprogram intf(int);yourprogram

intf(int);namespacemy{ intf(int);}namesapceyour{

intf(int);}第三方很难同时使用my和your函数fmy::f(1)

your::f(1)使用名字空间的指令格式:

usingnamespace名字空间名;一旦用了使用名字空间的指令,该名字空间中的所有的实体在引用时就不需要再加名字空间的限定了。第一个程序可以改写为://file:hello.cpp//Thisprogramprintsthemessage“Helloworld.”//Onthescreen#include<iostream>usingnamespacestd;intmain(){std::cout<<“Helloworld.”<<std::endl;return0;}cout<<“Helloworld.”<<endl;第二章通过例子学习第一个程序第二个程序变量定义数据类型符号常量算术表达式赋值表达式自增自减运算符强制类型转换数据的输入输出计算园的面积和周长//file:circle.cpp//该程序用于计算园的面积和周长#definePI3.14159//定义符号常量#include<iostream>usingnamespacestd;intmain(){doubleradius,area,circum;cout<<"请输入圆的半径:";cin>>radius;area=PI*radius*radius;circum=2*PI*radius;cout<<endl;cout<<"园的面积为:"<<area<<endl;cout<<"园的周长为:"<<circum<<endl;return0;}变量定义输入阶段计算阶段输出阶段程序的组成变量定义:C++中的变量在使用前都必须被定义。变量定义严格指出变量中可以存放的数据类型。输入阶段:获取执行时才能确定的用户数据。输入过程一般包括两步:显示提示信息读取数据计算阶段:由输入推导出输出的过程。通常通过各种计算得到。输出阶段:显示程序执行的结果第二章通过例子学习第一个程序第二个程序变量定义数据类型符号常量算术表达式赋值表达式自增自减运算符强制类型转换数据的输入输出变量定义变量对应于内存中的一块存储区域,每个变量都有名字、类型和值;变量名是变量的唯一标识;类型指出该变量中可以存放什么样的数据,是整型数、实型数或字符;值是该内存区域中真正存放的数据。变量定义变量定义的格式:

类型名变量名1,变量名2,…,变量名n;如:

intnum1,num2;doublearea;变量命名名称必须以字母或下划线的字符开头。名称中的其它字符必须是字母、数字或下划线。名称不可以是系统的保留词,如:int,double,for,return等。C++语言中,变量名中出现的大写和小写字母被看作是不同的字符,因此ABC,Abc,abc是三个独立的变量名。变量命名C++语言没有规定过名字的长度,但各个编译系统都有自己规定。名字应使读者易于明白其存储的值是什么,做到“见名知意”。第二章通过例子学习第一个程序第二个程序变量定义数据类型符号常量算术表达式赋值表达式自增自减运算符强制类型转换数据的输入输出数据类型数据类型包括两个方面:数据的取值范围可用的操作C/C++中的数据类型分为两大类:基本数据类型:整型、浮点型、字符型和布尔型构造数据类型:数组、结构、联合和枚举数据类型整型实型字符型布尔型枚举类型变量赋初值了解占用的内存量数据类型—整型整型数的表示范围:由各个编译器指定。整型数有三种存储方式,在VC中占用的空间如下所示基本型int:4byte(PC)–231~(231-1)

长整型long:long/longint4byte(PC)

–231~(231-1)

短整型

short:2byte(PC)-215~(215-1)允许的操作:算术运算、比较大小等整型数的表示—码制讨论如何将符号位数字化。0表示正数,1表示负数。数字的三种编码方式为:原码反码补码原码用符号位和数值表示带符号数。正数的符号位为0,负数的符号位为1。数值部分用二进制表示。如用一个字节表示数值:

[62]原=00111110[-62]原=10111110反码正数的反码与原码相同,负数的反码为该数的绝对值的原码取反。如:

[62]反=00111110[-62]反=11000001补码正数的补码与原码相同,负数的补码为该数的反码加1。如:

[62]补=00111110[-62]补=11000010大多数计算机系统都用补码表示整数整数的内部表示整数在计算机内部通常用补码表示,在VC中也是如此。整数运算时要注意数据的表示范围。如整数用两个字节表示时,正整数32767加1的结果为-32768。这称为整数运算的溢出,系统不检查这样的错误,程序员必须自己保证程序中不出现这样的错误。无符号整数在某些应用中,不可能出现负数,则整型数中有一半的数值范围是被浪费的。因此在C/C++中可以将所有的数都看成正整数,称为无符号数无符号数的定义:在各种整数类型前加上关键词unsigned,变成unsignedint,unsignedshort,unsignedlongunsignedint0~232-1unsignedshort0~65535unsignedlong0~232-1整型常量整型常量可用十进制、八进制和十六进制表示十进制:123,-234八进制:0123十六进制:0x123,0x3a2f一旦定义了一个整型变量,可以将一个整型常量赋给该整型变量。如

inta;a=123;或a=0x123;都是正确的数据类型整型实型字符型布尔型枚举类型变量赋初值了解占用的内存量数据类型—浮点数VC中,实型数以浮点形式表示一个浮点数分成尾数和阶码两部分。阶码表示小数点在该数中的位数,尾数表示数的有效数值。浮点类型的分类单精度float:占用4字节,3字节尾数,1字节指数,精确度7位,范围10-38~1038

双精度double:占用8字节,5字节尾数,3字节指数,精确度15~16位,范围10-307~10308

浮点数无法精确表示浮点数常量浮点数常量有两种表示法:十进制表示:1.233.14-5.988科学计数法:尾数*10指数尾数e指数

123e2=123002.25e-3=0.00225

注意:尾数不能为空e31e3

指数必须为整数2.5e2.3是非法的数据类型整型实型字符型布尔型枚举类型变量赋初值了解占用的内存量数据类型—字符类型字符类型:存放一个字母或符号,占一个字节,存放的是字符的内码。字符类型名:char字符的机内表示字符的机内表示用字符编码表示。常用的有ASCII,BCD,EBCDIC等。PC机中都用ASCII.ASCII码的重要特性数字‘0’到‘9’是顺序存放的字母被分成二段:大写的和小写的。大写字母是连续的,小写字母也是连续的可打印字符和非打印字符可打印字符:小写字母、大写字母、数字、标点符号、空格等非打印字符:换行和报警字符或响铃等控制字符可打印字符的使用字符常量‘a’,‘S’,‘2’等用一对单引号括起来的数据称为字符常量与PYTHON不同,C++中的单引号和双引号有不同的用处。单引号括起来的是一个字符,双引号括起来的是字符串可打印字符的使用赋值

charc1,c2;c1=’a’;c2=’b’;

c1=97;c2=98;

比较c1=9和c1=’9’?运算如:c1=’a’;c1=c1+2;c1

的值应为?如c1中存放的是小写字母,则c1-‘a’

+1表示什么?

如c1中存放的是数字(‘0’~‘9’),则c1-‘0’表示什么?如c1,c2存放的是小写字母,则c2-c1表示什么?

转义字符一些非打印和难以打印的字符需要用转义序列表示 换行符写为’\n’,虽然它由两个字符\和n来描述,但它表示一个ASCII字符。反斜杠符号\称为转义字符。双引号和单引号的转义 如果在一个串中把双引号”用作一个字符,必须要对它转义,否则它会终结该字符串。

cout<<“\”abc\””;输出“abc”

双引号的单字符表示:可以写’”’,也可以写’\”’。八进制数转义序列

警告字符\a可以表示成:’\007’,’\07’,’\7’字符形式含义\n换行\t水平制表\b退一格\r回车\f换页\\\\’‘\”“\ddd1到3位八进制数代表的字符\xhh1到2位十六进制数代表的字符常用的转义字符数据类型整型实型字符型布尔型枚举类型变量赋初值了解占用的内存量数据类型—布尔类型布尔型(bool):标准C中没有布尔型数据,这是C++中新增的数据类型。占一个字节。它的值为:true,false布尔型数据可以进行逻辑运算布尔型数据的内部表示:true为1,false为0数据类型整型实型字符型布尔型枚举类型变量赋初值了解占用的内存量枚举类型有时在设计程序时会用到一些特殊的对象,这些对象的取值范围是有限可数的。如在一个生成日历的程序中很可能用到一个表示一个星期中的每一天的对象。该对象可能取值的范围就是星期日到星期六。解决方法采用编码:假设0表示星期日,1表示星期一,…,6表示星期六。然后用一个整型变量如weekday表示这个对象。缺点是可读性差。符号常量:用#define功能将这些数字定义为符号常量定义一个新类型定义新的枚举类型格式:enum枚举类型名{元素表};定义一个表示一周中每天的名字的枚举类型:

enumweekdayT{Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday};枚举类型变量的定义:

weekdayTweekday;枚举类型变量的使用:赋值:weekday=Friday;比较:Monday<Friday比较这两个值的内部表示枚举类型不能直接输入输出枚举类型的内部表示在内部,枚举类型采用编码表示。当定义

enumweekdayT{Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday};

时,默认用0代表Sunday,1代表Monday,…,6表示SaturdayC++语言的编译器也允许明确指出枚举类型的元素的内部表示。例如,希望从1而不是0开始编号,可以这样定义

enumweekdayT{Sunday=1,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday};也可以从中间某一个开始重新指定,如

enumweekdayT{Sunday,Monday,Tuesday=5,Wednesday,Thursday,Friday,Saturday};数据类型整型实型字符型布尔型枚举类型变量赋初值了解占用的内存量变量赋初值在C++中,变量定义只是给变量分配相应的空间C++允许在定义变量的同时给变量赋初值格式:类型名变量名=初值;类型名变量名(初值);如:intcount=0;或intcount(0);都是定义整型变量count,并为它赋初值0。可以给被定义的变量中的一部分变量赋初值,如:

intsum=0,count=0,num;定义变量时没有赋初值,然后直接引用该变量是危险的!!!数据类型整型实型字符型布尔型枚举类型变量赋初值了解占用的内存量了解占用的内存量sizeof运算符用来了解某一类型或某一表达式占用的内存量。sizeof运算符的用法:

sizeof(类型名)或sizeof(表达式)如:

sizeof(float):float类型的变量占用的内存量

sizeof(’a’+15):表达式’a’+15的计算结果所占的内存量第二章通过例子学习第一个程序第二个程序变量定义数据类型符号常量算术表达式赋值表达式自增自减运算符强制类型转换数据的输入输出符号常量用#define定义符号常量的问题所定义的符号常量无法进行类型检查#define的处理只是简单的字符串的替换,可能会引起一些意想不到的错误C++建议用const定义符号常量const<类型名><常量名>=<值>;如:constdoublePI=3.1415926;第二章通过例子学习第一个程序第二个程序变量定义数据类型符号常量算术表达式赋值表达式自增自减运算符强制类型转换数据的输入输出算术表达式算术表达式由运算符和运算对象组成算术运算符:+-*/%出“-”外,所有的算术运算符都是二元运算符。“-”可为二元运算,也可为一元运算优先级:高*/%,低+-结合性:左结合运算对象可以是整型、浮点型、字符型和布尔型各种类型的数据的混合运算在进行运算前,将运算数转为同一类型转换规则bool、char和short这些非标准的整数在运算前都必须转换为int。int和float运算时,将int转换成float。int和long运算时,将int转换成long。int和double运算时,将int转换成double。float和double运算时,将float转换成double。应用算术表达式的注意事项乘号不能省略出现除法时注意括号的应用。如应写为:(a+b)/(c*d)或(a+b)/c/d

但不能写成:(a+b)/c*d或a+b/c*d在写算术表达式时,为使表达式更加清晰,一般在运算符前后各插一个空格各种类型的数据的混合运算整型与整型数运算,结果为整型,如5/2=2

整型与浮点数运算,结果为浮点数,如5/2.0=2.5字符或布尔型与整型数运算,结果为整型。字符或布尔型与浮点数运算,结果为浮点数。浮点数与浮点数运算,结果为浮点数。各类数值型数据间的混合运算

3.5*2+’a’

-‘b’

/4

自动类型转换规则:

数学函数库在C++语言中,其他的数学运算都是通过函数的形式来实现。所有的数学函数都在cmath中。要使用这些数学函数,必须在程序头上写上编译预处理命令:

#include<cmath>cmath的主要内容绝对值函数intabs(intx);doublefabs(doublex)exdoubleexp(doublex)xydoublepow(doublex,doubley)doublesqrt(doublex)lnxdoublelog(doublex)log10xdoublelog10(doublex)三角函数doublesin(doublex)doublecos(doublex)doubletan(doublex)反三角函数doubleasin(doublex)doubleacos(doublex)doubleatan(doublex)第二章通过例子学习第一个程序第二个程序变量定义数据类型符号常量算术表达式赋值表达式自增自减运算符强制类型转换数据的输入输出变量赋值变量赋值是通过赋值表达式实现,赋值表达式格式<变量>=<表达式>作用:将右边的表达式的值存入左边的变量,整个表达式的值是右边的表达式的结果。注意:x=x+2是正确的表达式赋值运算符是右结合的左值(lvalue):在C++中,能出现在赋值运算符左边的表达式称为左值赋值语句:赋值表达式后面加上分号。赋值时的自动类型转换当表达式的结果类型和变量类型不一致时,系统会将右边的表达式的结果转换成左边的变量的类型,再赋给左边的变量。转换规则:实型数->整型:舍弃小数部分。整型数->实型数:数值不变,但以浮点的形式保存在相应的变量中double->float:截取前面七位有效数字存放到float变量中float->double:将有效位扩展到16位字符型->整型变量:将字符型数据放入整型变量的最后一个字节。如果所用系统将字符处理成无符号量,则前面补0。如果所用系统将字符处理成有符号量,则扩展符号。整型->字符类型:直接将整型数据的最低八位赋给字符变量。赋值的嵌套将赋值表达式作为更大的表达式的一部分。如:a=(x=6)+(y=7)等价于分别将x和y的值设为6和7,并将6和7相加,结果存于变量a赋值运算符=的优先级比算术运算符低多重赋值a=b=c=5

给a,b,c均赋值5

当用到多重赋值时,要保证所有的变量都是同类型的,以避免在自动类型转换时出现与预期不相符的结果的可能性。如变量d定义为double,变量i定义为int,语句

d=i=1.5; 的结果是:i等于1,d等于1.0

复合赋值运算其他运算符与赋值运算符结合的运算符称为复合赋值运算符常用的复合赋值运算符有:+=,-=,*=,/=,%=变量op=表达式;

等价于:变量=变量op表达式;如:

balance+=deposit;balance-=surcharge;x/=10;salary*=2;第二章通过例子学习第一个程序第二个程序变量定义数据类型符号常量算术表达式赋值表达式自增自减运算符强制类型转换数据的输入输出自增、自减运算符自增、自减运算符:++,--

相当于+=1和-=1,它有前缀和后缀两种用法

++k,k++,--k,k--,但含义有所不同。如:i=3

j=i++

i=4j=3

j=++i

i=4j=4j=i--

i=2j=3

j=--i

i=2j=2

第二章通过例子学习第一个程序第二个程序变量定义数据类型符号常量算术表达式赋值表达式自增自减运算符强制类型转换数据的输入输出强制类型转换赋值和算术运算时会执行自动类型转换如要想使4/5的结果是0.8,而不是0,该怎么办?可以将其中一个写成浮点数。例如:4.0/5或4/5.0intx=4,y=5;要想使x/y的结果为0.8而不是0,该怎么办?答案是:用强制类型转换强制类型转换强制类型转换格式:(类型名)(表达式)类型名(表达式)例如,要想使两个整型变量x和y出的结果为double型,可以用下列语句doublez;z=(double)x/y;

转换类型强制类型转换在C++类型系统中引入了一个漏洞为了方便查找这些错误,C++提供了在强制类型转换时指明转换的性质。转换的性质有四种:静态转换(static_cast):用于编译器隐式执行的任何类型转换重解释转换(reinterpret_cast)常量转换(const_cast)动态转换(dynamic_cast)格式转换类型<类型名>(表达式)z=static_cast<double>(x)/y;第二章通过例子学习第一个程序第二个程序变量定义数据类型符号常量算术表达式赋值表达式自增自减运算符强制类型转换数据的输入输出输入流对象cin键盘流入的数据流,将键盘输入的数据存入变量格式:cin>>变量cin>>变量1>>变量2>>…>>变量n用户的响应当程序执行到这个语句时会停下来等待用户的输入用户可以输入数据,用回车(↙)结束。当有多个输入数据时,一般用空白字符(空格、制表符和回车)分隔。如:a为整型,d为double,则对应于cin>>a>>d,用户的输入可以为1213.2↙12(tab键)13.2↙12↙13.2↙33cin.get作用:从键盘接受一个字符用法:cin.get(ch);或ch=cin.get(),都是从键盘输入一个字符并存放到变量ch中对应的用户输入:cin.get()可以接收任意的字符,包括空白字符。如c1,c2,c3为字符型变量,对应语句c1=cin.get();c2=cin.get();c3=cin.get();如果输入abc↙,则c1的值是’a’,c2的值是空格,c3的值是’b’。如果将这个输入用于语句:cin>>c1>>c2>>c3,那么变量c1、c2、c3的内容分别为‘a’、‘b’、‘c’,因为空格被作为输入值之间的分隔符。

输出流对象cout将变量或表达式的内容显示在显示器上格式输出一个变量的值:cout<<a;输出多个变量的值:cout<<a<<b<<c;输出表达式的结果:cout<<“Helloworld”上述情况的组合:

cout<<a<<‘+’<<b<<‘=’<<a+b<<endl;总结本章介绍了C++程序的总体结构及工作方式。具体包括:如何保存用户的数据读取用户提供的数值数据;在屏幕上显示文本和数据;对现有数据进行算术运算得到新的结果问题:上地理课时,四个学生回答我国四大湖大小时分别说:

A:洞庭最大,洪泽最小,鄱阳第三

B:洪泽最大,洞庭最小,鄱阳第二,太湖第三

C:洪泽最小,洞庭第三

D:鄱阳最大,太湖最小,洪泽第二,洞庭第三对于每个湖的大小,每个人仅答对一个,试判断四个湖的大小。第3章逻辑思维及分支程序设计如何编程序解决这个问题?需要计算机模拟人的思维过程最基本的工具是判断对与错对与错的判断用关系表达式和逻辑表达式实现如何根据判断去决定下一步的动作由条件语句实现第3章分支程序设计关系表达式逻辑表达式if语句switch语句运算符汇总算术运算符++--关系运算符逻辑运算符相等(==)与赋值(=)关系运算符关系运算符:(<<=>>===!=)结果:

真(true) 假(false)关系运算符a-ba<ba>ba<=ba>=b正数falsetruefalsetrue零falsefalsetruetrue负数truefalsetruefalse关系运算符等式运算符(!===)a-ba==ba!=b零truefalse非零falsetrue关系表达式

表达式

关系运算符

表达式

结果是:true或falsea>b(a+b)>(c–3)(a=b)<5(a>b)==(c<d)优先级:高于赋值运算符,低于算术运算符。关系运算符内部:==和!=较低结合性:左结合关系表达式续算术运算符的优先级比关系运算符高5+3>6-2

(5+3)>(6–2)

常见编程错误-2<-1<0与PYTHON中的含义不一样=与==

用=运算符表示相等(初学者经常犯的错误)

用==运算符进行赋值这种错误的破坏性在于它们通常不会导致语法错误,而是能够顺利编译,程序运行完后,因为运行时的逻辑错误而得到错误结果。第3章逻辑思维及分支程序设计关系表达式逻辑表达式if语句switch语句逻辑运算符逻辑运算符(!&&||)结果是:true或falseexpr1expr2!expr1expr1&&expr2expr1||expr2零零truefalsefalse零非零truefalsetrue非零零falsefalsetrue非零非零falsetruetrue逻辑表达式须注意C++中,参加逻辑运算的对象可为任意类型的数据,0为假,非0为真。

5%2&&pp5>3&&2||8<4-!01逻辑运算符&&和||是两元运算符,而!是一元运算符;&&优先级高于||,都是从左向右结合。!优先级最高,从右向左结合;举例1.检查字符变量ch的内容是否为字母

ch>=’a’&&ch<=’z’||ch>=’A’&&ch<=’Z’

2.整型变量m的内容是否为偶数

m%2==0

注意,不能写成’a’<=ch<=’z’||’A’<=ch<=’Z’

逻辑运算常见错误

尽管3<x<7条件在数学上是正确的,但在C++中无法正确求值,应改成: (3<x&&x<7)

(3<x)&&(x<7)

(x>3)&&(x<7)逻辑运算常见错误表达x既不等于2也不等于3,若写成:

x!=2||x!=3 //错误! 正确形式为:

x!=2&&x!=3

或者

!(x==2||x==3)

逻辑表达式须注意尽量避免在一个逻辑表达式中完成多项任务(m=a>b)&&(n=c>d)a=1,b=2,c=2,d=4,m=1,n=1.

问执行后m,n的值分别为多少?

m=0,n=1

?????短路求值计算含有&&和||的运算符的表达式时,只要得到了结果为假或真,求值的过程就停止。expr1和expr2为两个表达式expr1的值为0,对expr1&&expr2求值时,就不会对expr2进行求值,为什么?如果expr1的值为不为0,对expr1||expr2求值时,就不会对expr2进行求值,为什么?性能提示

在使用&&逻辑运算符的表达式中,如果两个条件是相互独立的,则应把false可能性较大的条件放在左边;在使用||逻辑运算符的表达式中,应把true可能性较大的条件放在左边。这样可以减少程序执行时间。将关系写成表达式A:洞庭最大,洪泽最小,鄱阳第三B:洪泽最大,洞庭最小,鄱阳第二,太湖第三C:洪泽最小,洞庭第三D:鄱阳最大,太湖最小,洪泽第二,洞庭第三用dongTing表示洞庭,hongZe表示洪泽,boYang表示鄱阳,taiHu表示太湖。A学生的回答可表示为:dongTing==1&&hongZe==4&&boYang==3B学生的回答可表示为:

hongZe==1&&dongTing==4&&boYang==2&&taiHu==3C学生的回答可表示为:hongZe==4&&dongTing==3D学生的回答可表示为:

boYang==1&&taiHu==4&&hongZe==2&&dongTing==3C++的一个重要的特点是可以将各种类型的数据混合使用。可以把一个逻辑类型的值用于算术表达式。此时,true代表1,false代表0。由于每位学生都只说对了一个,即每位同学的若干个关系表达式中只有一个为真,其余都为假。因此,对A同学:((dongTing==1)+(hongZe==4)+(boYang==3))==1对B同学:((hongZe==1)+(dongTing==4)+(boYang==2)+(taiHu==3))==1对C同学:((hongZe==4)+(dongTing==3))==1对D同学:

((boYang==1)+(taiHu==4)+(hongZe==2)+(dongTing==3))==1本题的答案就是找同时满足上面四个条件的答案第3章逻辑思维及分支程序设计关系表达式逻辑表达式if语句switch语句表达式a+ba+23+4(a+3)+(a*b)(a>b)&&(c>d)a==ba=b语句单语句:后跟一个分号的语句。

a=b+c;空语句:一个单分号。语句块(复合语句)语句块(复合语句):一系列用花括号{}括起来的声明和语句。语法上本身表示单语句。{ a=b+c;c=a–b;}if选择语句

if(表达式

)语句

执行过程:如果表达式是非零,执行语句;否则跳过语句,控制转到下一个语句。if(grade>=60) cout<<“Passed\n”;cout<<“Yourgradeis”<<grade<<endl;语句可以是单语句、复合语句if-else双路选择语句

if(表达式)

语句1 else

语句2例if(x<y) min=x;else min=y;cout<<“Minvalue=”<<min;如果表达式非零,执行语句1,然后跳过语句2;如果表达式为零,跳过语句1,执行语句2。无论怎样,if语句执行后控制都转到下一语句。if-else语句的一般形式if-else语句的执行过程注:下面代码不是if-else语句If(a!=b){ a=a+1; b=a+2;

};else c=c*3;使用注意true与非0false与0if(表达式)

编一程序解一元二次方程

intmain(){floata,b,c,x1,x2,dlt;cout<<“input3parameters:”;cout<<“inputa:”;cin>>a;cout<<“inputb:”;cin>>b;cout<<“inputc:”;cin>>c;dlt=b*b–4*a*c;if(dlt>=0){x1=(-b+sqrt(dlt))/2/a;

x2=(-b-sqrt(dlt))/2/a;

cout<<x1<<x2;

}else{cout<<“noroot”;}return0;}判断闰年的程序#include<iostream>usingnamespacestd;intmain(){intyear;boolresult;cout<<"请输入所要验证的年份:";cin>>year;result=(year%4==0&&year%100!=0)||year%400==0;if(result)cout<<year<<"是闰年"<<endl;elsecout<<year<<"不是闰年"<<endl;return0;}result==true//冗余,不好嵌套的if,if-else语句if(a==1) if(b==2) cout<<“***\n”);if(a==1) statementif(b==2)cout<<“***\n”;if(a==1) if(b==2) cout<<“***\n”; else cout<<“###\n”;if(a==1) statementif(b==2)cout<<“***\n”;elsecout<<“###\n”;注:else属于离它最近的ifif语句的嵌套if(x<100)if(x>=90)cout<<“[99-90]";elseif(x>=80)cout<<“[89-80]";elsecout<<“[79-0]";elsecout<<"=100";缩进对齐配对原则:每个else子句是和在它之前最近的一个没有else子句的if语句配对。if(x<100)if(x>=90)cout<<“[99-90]";elseif(x>=80)cout<<“[89-80]";elsecout<<“[79-0]";elsecout<<"=100";

else的摇摆问题else同与它最近的if联系在一起,可通过放置花括号对({})的方法来告诉编译器做不同的处理。1原意:if(x>5)if(y>5)cout<<“xandyare>=5”;elsecout<<“xis<=5”;2编译器理解:if(x>5)if(y>5)cout<<“xandyare>=5”;elsecout<<“xis<=5”;3正确表示:if(x>5){if(y>5)cout<<“xandyare>=5”;}elsecout<<“xis<=5”;条件运算符?:唯一的三元运算符

表达式:expr1?expr2:expr3

计算过程:1先计算expr1:2如果expr1的值为非零,计算expr2,expr2的值是该表达式的值。3如果expr1的值为零,计算expr3,expr3的值是该表达式的值。实例1将x和y中值较大的一个赋值给max: max=(x>y)?x:y;if(flag)cout<<“trueelsecout<<“false”;

但如果用?:运算符只需要一行

cout<<(flag?"true":"flase");第3章逻辑思维及分支程序设计关系表达式逻辑表达式if语句switch语句switch语句--多路选择

有时算法中包含一系列判断,用一个变量或表达式测试每个可能的常量值,并相应采取不同操作。C++提供的switch多项选择结构可以进行这种判断。

switch结构包括一系列case标记和一个可选default情况。

嵌套的if…else语句if(rank==1) cout<<“GoldMedal”<<endl;elseif(rank==2) cout<<“SilverMedal”<<endl;elseif(rank==3) cout<<“BronzeMedal”<<endl;else cout<<“ConsolationPrize”<<endl;

用switch语句来选择switch(rank){ case1: cout<<“GoldMedal”<<endl; break; case2:cout<<“SilverMedal”<<endl; break;case3: cout<<“BronzeMedal”<<endl; break;default:cout<<“ConsolationPrize”<<endl; break;}用switch语句来选择switch(rank){ case1: cout<<“GoldMedal”<<endl; break; case2:cout<<“SilverMedal”<<endl; break;case3: cout<<“BronzeMedal”<<endl; break;default:cout<<“ConsolationPrize”<<endl; break;}整数常量表达式结果必须为整数switch语句--多路选择switch(expr)expr必须是一个常整数表达式—字符常量和整数常量的任意组合。字符常量:一对单引号括起来的特定字符,例’A‘,’a’如果提供同样的case标签,则会产生错误。break语句作用:跳出当前的switch语句switch(表达式)

{case常量表达式1:语句1;break;

case常量表达式2:语句2;break;

…………case常量表达式n:语句n;break;

default:语句n+1}执行过程:当表达式值为常量表达式1时,执行语句1;当表达式值为常量表达式2时,执行语句2;

……

……当表达式值为常量表达式n时,执行语句n;否则,执行语句n+1switch语句续default子句可以省略default子句省略时,当表达式的值不等于表达式1到表达式n的值时,直接跳出switch语句,执行switch语句的下一语句例1:按下表将百分制成绩转换成5级记分制。

score>=90A90>score>=80B80>score>=70C70>score>=60Dscore<60Eswitch(score){casescore>=90:cout<<"A";break;casescore>=80:cout<<"B";break;casescore>=70:cout<<"C";break;casescore>=60:cout<<"D";break;default:cout<<"E";}

score>=90A90>score>=80B80>score>=70C70>score>=60Dscore<60E表达式=成绩/10

switch(score/10){case10:case9:cout<<"A";break;case8:cout<<"B";break;case7:cout<<"C";break;case6:cout<<"D";break;default:cout<<"E";}

switch语句格式:

switch(表达式)

{case常量表达式1:语句1case常量表达式2:语句2..case常量表达式n:语句ndefault:语句n+1}执行过程:当表达式值为常量表达式1时,执行语句1到语句n+1;当表达式值为常量表达式2时,执行语句2到语句n+1;。。当表达式值为常量表达式n时,执行语句n到语句n+1;否则,执行语句n+1用于多分支的情况switch语句续default子句可以省略default子句省略时,当表达式的值不等于表达式1到表达式n的值时,直接跳出switch语句,执行switch语句的下一语句计算机自动出四则运算计算题生成题目switch(题目类型){case加法:显示题目,输入和的值,判断正确与否

case减法:显示题目,输入差的值,判断正确与否

case乘法:显示题目,输入积的值,判断正确与否

case除法:显示题目,输入商和余数的值,判断正确与否}要求自动出0-9之间的四则运算题,并批改结果关键问题如何让程序每次执行的时候都出不同的题目?随机数生成器rand():能随机生成0到RAND_MAX之间的整型数运算符的生成:用编码0-3表示四个运算符。因此题目的生成就是生成0-3之间的随机数。产生一个随机整数#include<cstdlib>rand():产生一个0--RAND_MAX之间的整数(RAND_MAX的值至少应为32767)产生1-n之间的随机数rand()%n0~(n-1)rand()*n/(RAND_MAX+1)1+rand()%n1~nn:比例因子(scalingfactor)随机数生成和应用

#include<iostream>#include<cstdlib>usingnamespacestd;

intmain(){cout<<rand()<<““;cout<<rand()<<““;cout<<rand()<<““;cout<<rand()<<““;cout<<endl;

return0;}

伪随机数随机数的种子计算机产生的随机数称为伪随机数,它是根据一个算法计算出来的。系统为每个程序、每次执行指定的随机数的种子都是相同的,因此程序每次执行生成的随机数序列都是相同的。rand()种子1234812348随机化#include<cstdlib>srand(unsignedint):可以在每次执行程序时产生不同的随机数系列。种子(seed)随机数生成和应用intmain(){unsignedseed;cout<<"Enterseed:";

cin>>seed;srand(seed);

cout<<rand()<<““;cout<<rand()<<““;cout<<rand()<<““;cout<<rand()<<““;cout<<endl;

return0;}

改变随机数的种子设置种子的函数srand:srand(种子)如何让程序每次执行时选择的种子都不一样呢?

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论