版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1 C/C+程序设计教程第一章 C/C+概述第二章 基本数据类型、运算符和表达式第三章 结构化程序设计第四章 数组和指针第五章 函数第六章 结构和链表第七章 文件第八章 面向对象程序设计基础 2第一章 C/C+概述1.1 C/C+发展简史1.2 简单的C/C+程序实例 1.3 基本语法成分1.4 数据的输入和输出1.5 编译预处理1.6 Visual C+简介31.1 C/C+发展简史C+: Bell实验室的Bjarne StroustrupCSimula 67带类的C类基础1979年Cpre预处理器C+ 1.01985年C+程序设计语言C+ 2.01989年C+ 3.01993年类及派生类公
2、有和私有构造函数,析构函数友元内联函数赋值运算符的重载虚函数函数和运算符的重载引用常量Const多重要继承保护成员对象的初始化与赋值的机制抽象类静态成员函数CONST成员函数模板C语言:Bell实验室的D.M.Ritchie 1972年,为了编写UNIX设计的。 两个重要的标准: 老标准:1978年,The C Programming Language B.W.Kernighan和D.M.Ritchie合著 新标准;1983年,ANSI制定,称为ANSI C4C+的组成C语言面向对象设计(OOP)Visual C+环境C+程序设计C语言程序MFC应用程序向导51.2 简单的C/C+程序实例例1
3、.1 输入圆的半径,求面积注释:以/开始 #include是编译预处理命令 把头文件的内容插入该处使用cin、cout函数必须有该命令main函数的函数体main函数的函数头void表示无返回值6例1.2 求两个数之和。 #include iostream.h int add(int x, int y)/定义add()函数,求两个数之和int z;/说明z为int类型的变量 z=x+y;/将x+y的值赋值给z return z;/结束add()函数的执行,并将z的值返回给主函数void main( )/定义主函数int a, b, c;/说明a、b、c为int类型的变量cinab;/从键盘输入
4、两个数据送到a和b中c=add(a,b) ;/调用add()函数,计算a+b,并把结果赋给ccoutcendl;/ 先输出c的值,再输出换行符7总结:(1) C/C+程序是一个或多个函数构成的,main函数一定要有。 不管有多少个函数,执行从main函数开始。 在一个函数内,执行从上到下开始的。(3) 注释从/开始的,只有增加可读性的作用。(4) 书写形式自由 一行内可以写多条语句,一条语句也可以分写在不同行上。(5) C语言中大小写字母是不同的81.3 基本语法成分1. 基本符号: (1) 字母:52个 AZ az (2) 数字字符:10个0 9 (3) 下划线 _ 。 (4) 特殊符号:一
5、般作运算符,如+、-、*、/、&2关键字 有特定含义的、专用的单词。 如int、char、break、for、define等。 不能作变量名、符号常量名、函数名、类名等。93. 标识符:由字母、数字和下划线三种字符组成 必须以字母或下划线开头合法标识符。A2 student area_of_circle num _dd Int不合法标识符2A A-B area of circle M.D int 大小写字母不等价 习惯上,变量名小写,符号常量大写。 关键字不能作标识符用。例如,int、define等关键字不 能作为标识符用。 定义标识符时最好能简洁且“见名知义”,以提高程序的可读性。如min表
6、示最小值,average表示平均值,day表示日期。 在Visual C+中,标识符中不能有汉字但是字符串和注释中可以有汉字。101.4 数据的输入和输出#include iostream.h或#include 1. coutcout表达式1表达式2表达式n;说明: 数据的输出格式由系统自动决定。各表达式可以是任意类型的。#include iostream.hvoid main()int a=2;double b=3.32;char c=A;couta bendl; coutc abcdendl; 11格式控制符(自学)格式控制符说 明示 例语 句结 果endl输出换行符cout123endl
7、123123123dec十进制表示coutdec123;123hex十六进制表示couthex123;7boct八进制表示coutoct123;173setw(int n)设置数据输出的宽度coutasetw(4)b;a b(中间有3个空格)setfill(int n)设置填充字符coutsetfill(*)setw(6)123;*123setprecision(int n)设置浮点数输出的有效数字位数coutsetprecision(5)123.456123.4612使用格式控制符输出数据(使用示例)#include iostream.h#include iomanip.hvoid main
8、()int x=65;double f=123.456;cout123456789012345endl;coutdecx hexx octxendl;coutxendsxendl;coutfendl;coutsetprecision(4)fendl;coutsetw(12)fendl;coutsetw(12)setfill(#)f变量变量2变量n;说明:数据之间用空格、TAB键或回车分隔 #include iostream.hvoid main()int a;float b;coutab;couta+b=a+bendl;141.5 编译预处理1.5.1文件包含 头文件:.h如stdio.h、i
9、ostream.h 函数说明、常量定义作用:头文件的内容插入到源文件(.CPP)文件中。(1)#include 从系统指定的文件夹中找 (2)#include 文件名从当前文件夹中找,现到系统指定的文件夹中找注意:一条文件包含命令只能包含一个文件编写源程序预处理编译连接执行预处理程序编译程序151.5.2 宏定义主要用来定义符号常数#define 标识符 常量例如:#define FALSE 0#define TRUE 1#define PI 3.1415926#define EPS 1.0e-6注意:符号常量一般大写行末一般不加分号不能对符号常量进行赋值。161.6 Visual C+简介
10、项目工作区输出窗口代码窗口17简单C/C+程序的编写、运行过程1创建一个空工程;Win32 Console Application C+ Source File 2创建一个C+源文件,输入源程序;3进行编译、连接、运行。编译|编译TEST.cpp CTRL+F7编译|构建TEST.exe F7编译|执行TEST.exe CTRL+F518编译连接后生成的主要文件D:TESTTEST.dspTEST.dswTEST.cppDebugTEST.objTEST.exe程序调试1语法错误 错误信息D:TESTTEST.CPP(6) : error C2146: syntax error : missi
11、ng ; before identifier cin 警告信息 D:TESTTEST.CPP(6) : warning C4244: = : conversion from const double to int, possible loss of data2逻辑错误 3调试设置断点:Insert/Remove Breakpoint F9运行到断点:编译|开始调试|去 F519Variables窗口Watch窗口Restart 终止当前调试,重新运行,停在第一条语句Stop Debugging 结束当前调试和运行Step Over 单步运行,不进入函数体内Step Out 从函数体运行到外面2
12、0欢迎访问同济大学计算机系基础学科组网站021-6598020421第二章 基本数据类型、运算符和表达式2.1 数据类型2.2 变量和常量 2.3 运算符和表达式2.4 指针2.5 typedef语句2.6 应用举例222.1 数据类型程序中要对各种各样的数据进行描述和操作,用到的数据都必须指明其类型。数据类型的作用:指出了应为数据分配的存储空间的大小规定了数据所能进行的操作 数据类型基本类型 构造类型 整型 (int)实型 字符型(char)布尔型(bool)空类型(void) 单精度型(float)双精度型(double) 指针数组结构型(struct)共用体(union)枚举(enum)
13、类(class)232.2 变量和常量1.变量的定义程序运行过程中其值可变的量, 定义方式如下: C/C+规定: 程序中所有变量必须先定义后使用,可及时发现录入错误(如,定义的变量为data,而程序体中使用变量为date),同时还可限制非法运算(如:a%b , 若a,b为float类型则出错)。C+中变量可随时使用,随时定义。例如:int a, b; (定义变量a和b为整型) float x,y ; (定义变量x和y为单精度实型)数据类型 变量名表 ;2.2.1 变量242.变量的初始化变量必须先有确定的值后才能参与各种相应的操作,变量获取值的途径有三:通过输入语句输入 (如:cina;)通过
14、赋值语句赋值 (如:a=3;)通过初始化方式赋初值 (如:int k=3;)所谓初始化是指在定义变量的同时指定变量的初值,形式有二:例如:int k=3,m=3, n(3);()int k=m=n=3;/不允许为多个变量同时初始化数据类型 变量名=表达式;数据类型 变量名(表达式);253.变量引用C+中增加了“引用”这一概念,许多地方可以代替指针实现相应的功能,比指针更安全。所谓引用即给一个已知变量起个别名,系统不为引用另外开辟内存,而是与原变量共享同一段内存,引用好比是一个虚拟的变量,声明形式为:数据类型 &引用名=已定义的变量如:int a=3, &b=a; /定义b为a的引用b=5;/
15、你知道此时a的值为多少吗?262.2.2 常量在程序运行过程中其值不能改变的量,有值常量和符号常量两种。1.整型常量进制形式实例错例十进制以数字19开始-3,+5,12045八进制以数字0开始(由07之间数字组成)023,-010078十六进制以0 x或0X开始(由09及AF组成)0XAF,-0X510XFG272. 实型常量十进制小数形式:由正负号、数字和小数点组成, 如1.25、-1.25、17. 和 .1 指数形式:由尾数、指数符号e(或E)及指数构成,其中指数必 须是十进制整数。如1.25e-5、+1e10、-1.25e5。 注意:e前面不能没有数字,e后面的数字必须为整数,也不能加园
16、括号。如1E(-3)、E-5、1e2.1都是错误的。283. 字符常量 C/C+提供了两类字符型常量:普通字符常量:用单引号括起来的一个字符。如:A、 0、? 。转义字符常量:以“ ” (反斜杠)开头的用单引号括起来的字符 序列。如: n 、 t 、 x61等。常用的转义 字符见p26。注意: 0表示ASCII码为0的字符,它是一个空字符,注意其与0的区别,后者表示的是ASCII码为48的数字字符。字符型数据在内存中以ASCII码存储,故整型数据和字符型数据在一定范围内可以通用。如: x= a +2; printf( %d , a);294. 字符串常量 字符串常量是用双引号括起来的字符序列,
17、 系统在字符串常量最后自动加字符串结束符号 0 。例如: 字符串“A”的存储形式: 字符A的存储形式:5. 符号常量是以标识符形式出现的常量,作用是便于程序阅读和修改。C+中用define命令或关键字const定义符号常量,形式如下: A 0 A内存中实际存放的是这些字符的ASCII码#define 标识符 常量值 const 数据类型 标识符 = 常量值或:30注意:习惯上符号常量名大写,而变量名小写,以示区分。符号常量虽然用标识符来标识,但本质上是常量,具有常量值不能改变的性质。#define PI 3.14 /const double PI=3.14#include iostream.h
18、void main( )float r=3.0,s,l; l=2*PI*r; s=PI*r*r; coutl=l,s= sendl;例2-11.演示不同精度圆周率的程序运行结果2.观察编译中的“警告”对程序运行的影响3.消除“warning”的方法312.3 运算符和表达式2.3.1 基本概念运算符具有三个属性:优先级:指运算的先后次序,共分15个级别。(见p27表1.2.4) 结合性:指相同优先级运算符连续出现时的计算顺序,分自左 向右和自右向左两种,除特别声明外,皆指自左向右。 目 数: 指运算符要求的操作数的个数,包括单目、双目和三目,一般目数越少,优先级越高。表达式:由常量、变量、函数
19、调用和运算符按一定规律组合在一 起构成的式子。如:a+14/(3+2)-sqrt(17)322.3.2 运算符1.算术运算种类: +(加法或取正) -(减法或取负) *(乘法) /(除法) %(求余数) +(自增) -(自减) 其中:+和-的结合性则是自右向左 优先级:(从高到低)(+、-、+、-) (*、/、%) (+、-) 正、负加、减33说明:在除法运算中,当两个操作数都是整数时,商也为整数,小数部分一律舍去。如: 1/2 0 1.0 /2 0.5 %(求余运算)要求两个操作数都是整型,结果为整除后余下的整余数。自增、自减运算符(+、- -) +i , -i (在使用 i之前,先使i的值
20、加减1) i+ , i- (在使用 i之后, 使i的值加减1)若 i 的值为3,则: j=+i; j的值为4, i的值为4 j=i+; j的值为3, i的值为4注意: 自增、自减运算符只能用于变量,而不能用于常量和表达式。 () 5+、(a+b)+342 .关系运算种类:(小于)、(大于) = =(等于)、 =(大于等于)、 !=(不等于) 优先级: (从高到低)( 、 、 = ) ( = = 、 != )关系运算描述的是一种“判断关系”,其结果有“真(true)”和“假(false)”两种。用“1”代表“真”,用 “0” 代表“假” 例如:53的结果为1, aB的结果为0思考:x为0到100
21、之间的数能否表示为 0=x=100?353.逻辑运算种类:&(逻辑与)、|(逻辑或)、!(逻辑非)优先级: (从高到低)! & | 其中,“!” 是单目运算符,优先级高于算术运算符。“” 和 “|” 低于关系运算符。 逻辑运算通常用来连接关系运算,逻辑运算符两端的操作数如为“非”,就当作“真”来处理,如果是“”,便当作“假”来处理。逻辑运算的结果也只有 0(false)和1(true)两种。36说明:当多个&连续出现时,如表达式& 表达式 & 表达式从左到右,只要一个操作数为0,结果就为0,不进行后续运算。当多个 | 连续出现时,如表达式 | 表达式 | 表达式从左到右,只要一个操作数为1,结
22、果就为1,不进行后续运算。37#include iostream.hvoid main()int m,n=10; m=2&n+; coutm= m ,n= y?x:y); /将和中较大的一个数赋值给变量max条件运算符的结合性是由右向左思考题: 对n(0)个人进行分班,每班k(0)个人,最后不足k人也编一班,问要编几个班?(试用条件运算符表达)n%k0?n/k+1:n/k5.赋值运算格式:作用: 将一个数据赋给一个变量,并以变量的值作为整个式子的值。变量 赋值运算符 表达式39其中赋值运算符可以是 “=”,也可以是复合赋值运算符,如“+=”、“-=”、“*=”、“/=”和“%=”等等。复合赋值
23、运算符的等价形式: (以 “+=”为例) 例如: b /= a+2 等价于: b = b/(a+2)结合性自右向左若两端类型不同,则系统自动将右端类型转换为左端类型。 例如:有定义 int a = 3.78; 则a中存放的值为3左端只能是变量(或数组元素),不能为表达式或常量,如:a+2*=b () a=b+2=c+5 ()变量+=表达式变量 = 变量表达式是一个整体406.逗号运算形式: e1,e2,e3, 其中e1、e2、e3均为表达式,从左向右依次计算各个表达式的值,而将最后一个表达式的值作为整个表达式的值,逗号运算符常用于循环语句的表达式中,将多个表达式连接成一个表达式,如:for(i
24、=0,j=n;ij;i+,j-)逗号运算符的优先级别最低。417 .数据类型的转换数据类型的转换分为显式(强制)转换和隐式(自动)转换。强制转换格式:或: 将一种数据类型的值强制转换为另外一种数据类型。常用于对函数的参数及返回值的操作。 假设、为float型数据,则(int)(x+y)强行将+的值转换成整型,x和y仍为float型。自动转换: 在不同类型数据进行混合运算时,系统自动进行的类型转换。(类型名)表达式类型名(表达式)42char short int unsigned longunsigned longfloatdoublelong double必定的转换混合运算时由低向高转换自动转
25、换还包括赋值运算时赋值号右端类型向左端类型的转换8.内部函数 C/C+中提供了多种内部函数供用户编程序时直接调用,只需把包含内部函数的头文件,通过#include 预处理命令装入到程序中。例如,程序中要使用平方根函数sqrt,应该在程序加入:#include math.h“432.4 指针1. 基本概念 每个变量在内存中存放都对应一段地址,第一个字节的地址就是变量的地址,将存放地址的变量称为指针变量。 &求地址 变量的地址在编程阶段是不知道的 在程序中可以使用&运算符求得变量的地址。 int x; &x就是变量的地址44取内容*(地址) 表示根据地址取内容如图中所示, *(&x) 的值为4指针
26、指针是一种变量,存放另一个变量的地址。 int x=4 ; int *p ; p=&x ; p就是一个指针,存放x的地址。p指向x, *p的值为4,*p就是x。出现x的地方可以用*p代替,出现 *p的地方可以用x代替。10014px452.定义及初始化 定义 例如:int *p;float *q; 指针所指对象的类型。初始化在定义的同时赋初值,称为指针变量的初始化。例如:float d =1.5, *p= &d;可改写为:float d =1.5, *p;p = &d;/注意不能写做*p=&d数据类型 *标识符;不是指针名的一部分&d1.5pd46 假定有定义:int *p, a; p=NUL
27、L;指针的值为NULL(0) 表示不指向任何对象。 p=&a; p指向变量a。 p1=&a; p2=p1;相同类型的指针变量可以相互赋值 例,假设有定义: int a,*p; float f;则以下形式不允许:() p=&f; () p=100; 3.运算赋值运算47算术运算p+n (或p-n):p+n:指向后面的第个元素。p-n:指向前面的第个元素。p+n的值为:p的值n*sizeof(p指向的类型)如,有定义:int a,*p=&a;假设a的地址为1000,则:p的值为1000p+3的值为:1000+3*sizeof(int)=1000+3*4=101248自增(+)和自减(-)p+、 +
28、p、 p-、 -p自增或自减后p指向前一个或后一个元素 指针相减两个类型相同的指针可以相减,结果为这两个地址差之间能够存放的数据个数(数据类型为指针所指的类型)。如,有定义:int *p1, *p2; 假设p1指向1000,p2指向1008, 则p2p1的值为:(1008-1000)/sizeof(int)=2*p+ *(p+) *p p + (*p)+ *p(*p)+494. new和deletenew运算符形式:指针=new 数据类型;指针=new 数据类型(初值);或50delete运算符用于释放用new申请的动态存储空间,形式为: delete 指针;delete 指针; 或无需指明数
29、组长度只能释放由new申请的动态变量例:int a=3,*p=&a,*q;q=new int(6);delete p; () delete q; 512.5 typedef语句形式:typedef 数据类型 新的数据类型名;该语句作用是为已有的数据类型定义新的名称,使其更符合Windows系统中的相关对象的含义,可以像标准C+中的数据类型一样使用这些新定义的类型。如:typedef char CHAR;CHAR c1; /等价于char c1;522.6 应用举例例2-3 用代码表达下列命题:1. 能且只能被和中的一个数整除。解:或 2. ch是大写字母。解: 思考上述命题可否描述为Ach=A
30、&ch =Z53#includeiostream.h#includeiomanip.h#includemath.hvoid main()float a,b,c;double l,s;coutca;b=sqrt(c*c-a*a);/sqrt为内部函数,对其的说明包含在头文件math.h中l=a+b+c;s=a*b/2;cout计算结果:endl;coutsetw(8)另一直角边=bendlsetw(11)周长=lendlsetw(11)面积=sx;c4=x=0?+:-;/x的符号存入c4x=abs(x);/求整型数x的绝对值c3=x%10;/x%10为个位数字x=x/10;c2=x%10;c1=
31、x/10;cout数符 百位数 十位数 个位数endl;coutsetw(2)c4setw(8)c1 setw(8)c2setw(8)c3endl;例2-5 编程输入一个三位整数,依次输出该数的正(负)号和百位、十位、个位数字。 程序分离出符号位后分解各数位第三章 结构化程序设计 3.1 顺序结构 3.2 选择结构 3.3 循环结构 3.4 其他控制语句 3.5 应用举例 3.1 顺序结构 顺序结构:按照语句出现的先后顺序依次执行。 3.1.1 表达式语句 形式: 表达式;例如: i+; sum=a+b; coutabendl;3.1.2 空语句 形式: ; 作用: 当程序中某个位置在语法上需
32、要一条语句,而在语义上又不 要求执行任何动作时,可放上一条空语句。 一般适用于在循环语句中做空循环体; 如: for (m = 0; m1000; m+) ;3.1.3 复合语句 形式: 变量定义 语句组作用:当程序中某个位置在语法上只允许一条语句,而在语义上要执行多条语句才能完成某个操作时,需要使用复合语句。例如:if(x=0) couta; coutb;3.2 选择结构 选择结构:根据条件的值来判断程序的流向。 C/C+中,提供两类选择控制语句: if语句,实现n分支,要求n个表达式; switch语句,实现多分支;只用1个表达式。3.2.1 if 语句 if语句的三种形式: 形式1: i
33、f (表达式) 语句 作用:当表达式为真(非0)时,执行表达式后面的语句, 否则绕过该语句,而执行其后面的语句。【例3.1】已知两个数x和y,比较它们的大小,使得x大于y。 if(xy) t=x; x=y; y=t;coutxy;#include iostream.hvoid main() int x,y,t; cout输入 x yxy; if (xy) t=x; x=y; y=t; /x与y交换 coutxyy) max = x; min = y;else max = y; min = x;形式3: if (表达式1) 语句1else if (表达式2) 语句2 else if (表达式n)
34、 语句nelse 语句n+1作用:当表达式1的值为true时,执行语句1;否则判断当表达式2的值为true时执行语句2;依此类推,若表达式的值都为false,则执行语句n+1。 【例3.3】已知成绩mark,要求显示对应五级制的评定,评定条件:if (mark = 90) cout 优; else if (80 = mark & mark 90) cout 良; else if (60 = mark & mark 70) cout 及格;else if (70 = mark & mark 80) cout 中; else cout= 60) cout= 70) cout= 80) cout=9
35、0) cout 优;else coutyz。 可用一个IF语句和一个嵌套的IF语句实现。 if (xy) t=x ; x=y ; y=t; if (yz) t=y ; y=z ; z=t ; if (xy) t=x ; x=y ; y=t ; 3.2.2 switch语句形式:switch(表达式)case 常量表达式1:语句组1;break; case 常量表达式2:语句组2;break; case 常量表达式n:语句组n;break; default: 语句组n+1执行顺序:当表达式的值与某个常量表达式的值相等时,则执行该常量表达式后面相应的语句,若使用了break, 则执行完该语句后便退
36、出switch语句;否则,还要依次执行其后面的各条语句。若找不到相匹配的常量表达式,则执行default后面的语句。必须为整型或字符型 2a+1 (1=a2)【例3.5】用switch结构求分段函数b= a2-3 (2=a=1&a=2&a4:. default: b=a;共用同一个语句组 思考:若省去break语句,情况会怎样? 3.3 循环结构 C语言提供了三种循环语句: 流程图如下: while do-while forwhile (表达式) 语句do语句while (表达式);for(表达式1;表达式2;表达式3)语句【例3.6】用上述三种循环语句求 while语句:n = 1;s =
37、0;while (n=100) s=s+n; n=n+1; n = 1; s = 0; do s = s+n; n = n+1; while(n=100); do-while语句:for (n = 1,s = 0;n1e-5) e+=t; t/=i; i+;int i(1);float t(1),e(0);for( ;t1e-5; ) e+=t; t/=i; i+;for(i=1,t=1,e=0;t1e-5; e+=t, t/=i,i+);分号不能省略空语句3.3.3 循环的嵌套循环的嵌套:循环体内包含另一个完整的循环结构。三种循环语句皆可以相互嵌套 。【例3.8】打印九九乘法表 #inclu
38、de “iostream.h”void main() coutt 九九乘法表endl; coutt -endl; for(int i=1;i=9;i+) for(int j=1;j=9;j+) coutij=i*jt; cout0;m-) if(m % 6=0) break; coutm0;m-) if(m % 6=0) continue; coutmm;max=m; /第一个数假设为最大数 while (cinm,m!=0) if (mmax) max=m; max=0;/设一个较小的数为最大值的初值 for(int i=0;im; if (mmax) max=m; 以输入0作为结束,输入数
39、的个数未知 输入数的个数已知 2.最大公约数【例3.11】用辗转相除法求两自然数的最大公约数。算法思想:(1) 对于已知两数m,n,使得mn(2) m除以n得余数r(3) 若r=0,则n为最大公约数,结束;否则执行(4)(4) mn,nr,再重复执行(2)m n r12 5 2 5 2 1 2 1 0 辗转相除法while (r=m % n)!=0) m=n;n=r; coutn n=n-m nm m、n为公约数 m=nwhile (m!=n) if(mn)m-=n;else n-=m;#include iostream.hvoid main( ) int m, n, t, r; cout请输
40、入 m n mn; if(mn) t=m; m=n; n=t; while (r=m % n)!=0) m=n;n=r; cout最大公约数为 mendl; 程序:3.质数 【例3.12】求2100之间的素数,并以每行显示8个质数。 质数:除1和它本身外,不能被其他任何一个整数整除的自然数。 分析:(1) 判别某数m是否为素数最简单的方法是:用i=2,3,m-1逐个判别m能否被j整除,只要有一个能整除,m不是素数,退出循环;若都不能整除,则m是素数。可进一步证明:若m不能被 中任一整数整除,则m为质数。(2) 每行显示8个,只要对求得的质数计数,满8个换行。 .for(i=2;m%i!=0;i
41、+);if(i=m) . .k= sqrt(m);for(i=2;ik) .程序:#include “iostream.h”void main() int m,i,countm(0); bool tag; for(m = 2;m=100;m+) tag=false; /tag初值为false for(i = 2;i=m-1;i+)if (m % i = 0) tag=true; if (tag=false) /等价于 if (!tag) coutmt; countm+; if (countm % 8 =0) cout=1e-5) sinx+=t; t=-t*x*x/(i+1)*(i+2); i
42、=i+2; 5. 穷举法【例3.14】百元买百鸡问题。假定小鸡每只5角,公鸡每只2元,母鸡每只3元。现有100元钱要买100只鸡,列出所有可能的购鸡方案。分析: (1) 设母鸡、公鸡、小鸡各为x、y、z只,列出方程为:x+y+y = 1003x+2y+0.5z = 100三个未知数,两个方程,此题有若干个整数解。 (2) 采用试凑法(也称为穷举法或枚举法)来实现,即将可能出现的各种情况一一罗列测试,判断是否满足条件,采用循环结构来实现。用三重循环来实现: for(x=0;x100;x+) for(y=0;y100;y+) for(z=0;z100;z+) if(3*x+2*y+0.5*z)=1
43、00)&(x+y+z)=100) coutsetw(9)xsetw(9)ysetw(9)zendl; 用二重循环来实现: for(x=0;x=33;x+)for(y=0;y=50;y+) z=100-x-y; if(3*x+2*y+0.5*z)=100) coutsetw(9)xsetw(9)ysetw(9)z1e-5);思考: 若迭代最高次数M后,即使达不到精度也要输出结果,程序该如何修改?6.分类统计【例3.16】对输入一串字符,统计其中单词的个数、字母个数、数字个数。规定单词之间用一个空白符分开(空白符包括空格符、水平制表符、换行符)。以z表示输入结束。分析:(1)统计单词的个数,可通过
44、统计空白符的个数得到。(2)由于标准输入流cin输入时会把空白符作为输入结束符,所以应使用getchar()函数逐一读取字符,该函数必须用”stdio.h”。 int alpha(0), num(0),ch(0),word(0); while(c=getchar( )!=EOF) / EOF代表文本结束符,对应输入CTRL+Z if(c= |c=t|c=n) word+; if(c=a & c=A & c=0 & c=9) num+; else ch+; 第四章 数组和指针4.1 一维数组4.2 二维数组4.3 字符数组4.4 指针和数组4.5 程序举例4.1 一维数组4.1.1 引例: 【例
45、4.1】求N个学生的平均成绩,并统计高于平均分的人数 。用以前所学知识实现:int k=0;float s,ave,sum=0;for(int i=0;is; sum=sum+s; ave=sum/100; for(i=0;is; if(save) k+; 用数组来实现:int k=0;float s100,ave,sum=0;for(i=0;isi; sum=sum+si; ave=sum/100; for(i=0;iave)k+; 数组:一组数据类型相同的元素按一定顺序存放,构成的数据集合。4.1.2一维数组的定义、存储和初始化 1. 定义形式 数据类型 数组名整型常量表达式; 如: in
46、t s5; s0 s1 s2 s3 s4 下标从0开始 数组名是常量,表示数组在内存中的首地址。 数组长度应该为整型常量表达式,不能是变量。如: s正确: const int s=10; int as; float f5; 错误: int s=10; int as; float b3.4 2. 数组的初始化 1) 给所有元素赋初值。 如:int a5=0,2,4,6,8; 或 int a =0,2,4,6,8; 2) 给部分元素赋初值。如:int a10=1,3,5,7,9; 花括号内列出的值赋给了前面的若干个元素,其余元素系统自动赋0 。 花括号错误: int a10; a=1,3,5,7,
47、9; /数组名是个地址常量,不能被赋值。 int a10; a10=1,3,5,7,9; /a10不是数组中的元素,不能用花括号为一个元素赋多个值。 int c3=1,2, 3,4; /常量个数超过数组定义的长度。4.1.3 数组元素的引用和基本操作1数组元素的引用 形式:数组名下标 相当于一个普通变量如有: int a10=1,2,3,4,5,6,7,8,9,10,b10,i(2);则: a3=a0+ai; couta2+i; coutaa3; couta10; /数组下标越界 couta; /对数组一般不能作为一个整体进行操作 b=a;2基本操作 假设有定义:int aN; N是已定义过的
48、符号常量。(1) 数组元素的输入for(j=0; jaj;(2)通过随机函数rand()产生0100的N个数据 for ( i = 0; iN;i+) /rand()函数产生032727之间的整数 ai = int(rand()/32728.* 101); (3) 数组元素的求和 sum=0; for(j=0; jN; j+)sum+=aj; (4) 求数组中的最大元素 max=a0; /假设第一个元素值最大 for(j=1; jmax)max=aj;(5) 求最大元素下标 imax=0; /imax代表最大元素下标 for (j=1;jaimax)imax=j;(6) 将最大元素放于某一特定
49、位置(如放在最前头) imax=0; for(j=1;jaimax)imax=j; if(imax!=0) t=a0;a0=aimax;aimax=t;4.1.4 数组排序 排序是将一组数按递增或递减的次序排列,如按学生的成绩、球赛积分等排序。常用的算法有: 选择法 () 冒泡法 () 插入法 快速排序法 . 1. 选择法排序基本思想: (1) 从n个数的序列中选出最小的数(递增),与第1个数交换位置;(2) 除第1个数外,其余n-1个数再按(1)的方法选出次小的数,与第2个数交换位置;(3) 重复(1)n-1遍,最后构成递增序列。【例4.2】对存放在数组中的6个数,用选择法按递增排序。 下标
50、 0 15 1 25 2 35 3 45 4 5for( i= 0;i5;i+) min= i; for(j=i+1;j6;j+) if(ajamin)min= j; if(i!=min) temp=ai; ai= amin; amin=temp; 2. 冒泡法排序 基本思想: (1)从第一个元素开始,对数组中两两相邻的元素比较,将值较小的元素放在前面,值较大的元素放在后面,一轮比较比较完毕,最大的数存放在aN-1中; (2)然后对a0到aN-2的N-1个数进行同(1)的操作,次最大数放入aN-2元素内,完成第二趟排序;依次类推,进行N-1趟排序后,所有数均有序。【例4.3】用冒泡排序法实现例
51、4.28 3497K=5348 79K=4 34789K=33 47 8 9K=2for(i=0;i5;i+) for(j=1;jaj ) temp=aj-1; aj-1=aj; aj=temp; 思考:当数据未交换,说明数组已有序 ,如何结束排序? 4.2 二维数组4.2.1 二维数组的定义和初始化 1. 数组的定义 形式: 数据类型 数组名常量表达式1常量表达式2; 如: float a23;a00 a01 a02 a10 a11 a12 以“先行后列”的规则连续存放: 序号: 0 1 2 3 4 5序号=当前行号*每行列数+当前列号2. 数组的初始化(1)按在内存排列顺序对所有元素赋初值
52、。(2)按行给所有元素赋初值,每一行的数据放于一个花括号内。(3)按行给部分元素赋初值,在静态存贮类型static中省略的元素初值此时自动为0。对应的数组b为:(4)按行赋初值也可省略第一维的长度。 对应的数组c为:int a23=1,2,3,4,5,6; 或 int a3=1,2,3,4,5,6;int a23=1,2,3,4,5,6;static int b34=1,2,0,3,4,0,0,5static int c 3=1, ,2;4.2.2 二维数组的基本操作 1. 数组的输入、输出【例4.4】输入两个矩阵A、B的值,求c=A+B 。 分析:A、B矩阵相加,其实质是将两矩阵的对应元素相
53、加。 相加的条件是有相同的行、列数。 #include iostream.h #include iomanip.h void main() int a23,b23,c23,i,j; for ( i = 0; i2;i+) for( j=0; jaij; for ( i = 0; i2; i+) for( j = 0; jbij; for ( i = 0; i2; i+) /A+B矩阵,每个对应元素相加 for( j =0; j3; j+) cij=aij+bij; for ( i = 0; i2; i+) for( j=0; j3; j+) coutsetw(4)cij; coutendl;
54、程序: 求二维数组中最大(或最小)元素及下标 【例4.5】对33方阵,求最大元素及下标。 与一维数组求最大值的方式相同 max=a00; imax=0; jmax=0;for ( i = 0; i3; i+) for( j=0; jmax) max=aij; imax=i; jmax=j;矩阵转置 将矩阵以主对角线为轴线,将元素的行和列位置调换。 【例4.6】对33方阵转置 1 2 3 1 4 7a = 4 5 6 b = 2 5 8 7 8 9 3 6 9for ( i = 0; i3; i+) for( j=0; ji; j+) t=aij; aij=aji; aji=t; 4. 矩阵相乘
55、 【例4.7】求两个矩阵aMN和bNP的乘积 c 。设矩阵A、B为: 则矩阵C为:即矩阵C的第i行第j列元素可通过右边公式求得:c00元素的实现:s=0; for(k=0; k3; k+)s+=a0k*bk0;c00=s;程序:#include iostream.h#define M 2#define N 3#define P 4void main() int aMN=3,5,7,4,6,8,bNP=1,4,7,10,2,5,8,11,3,6,9,12; int cMP,i, j, k, s; for(i=0; iM; i+) for(j=0; jP; j+) s=0;/ 求一个元素的值 fo
56、r(k=0; kN; k+) s+=aik*bkj; cij = s; for(i=0;iM;i+) for(j=0;jP;j+) coutcij ; coutendl; 4.3 字符数组 字符串常量: ab123ab1230系统自动添加 0 (结束标志符)处理字符串的方法有: 字符数组、CString(string)类和字符指针。4.3.1 字符数组 1. 字符数组如: char s6;char s126;字符数组若干个字符字符串abcdabcd0字符数组的初始化 (1) 逐个字符赋初值(2) 用字符串为字符数组初始化char s10 = I, , a, m, . f, i, n, e; /
57、s不是字符串char s10 = I am fine;char s10 = I am fine;s是字符串, 0 系统自动添加(3) 字符串数组初始化 对二维数组以字符串形式初始化。char a48=COBOL, FORTRAN, PASCAL, C/C+;注意:对于二维字符数组,用两个下标表示数组中的一个字符。 注意不要出现下面的错误: char s10=“This is a book; char s10; s = I am fine; char s10; s = I, , a, m, . f, i, n, e;3. 字符数组的输入/输出 逐个数组元素的输入/输出 char s110;for
58、 (i = 0; is1i; /s1中是字符,不是字符串注意:输入时各输入项之间不需加空格分隔 字符串整体的输入/输出 char s110,s225;输入:输出: cins1; cout s1; gets(s1); puts(s1); for( int i=0; i2;i+) for( i=0; is1;语句,字符串中不能有空格。 函数gets()和puts()是对字符串整体输入/输出 ,应加#include “stdio.h”命令。gets(字符数组名或字符指针变量名);puts(字符数组名或字符指针变量名);#include stdio.h#include iostream.hvoid m
59、ain( ) int i; char c5 = C, h, i, n, a; char b = China; for ( i = 0; i5; i+) /不能用puts(c); 也不能用coutc; cout ci; puts(b); /或 coutb; for (i = 0; bi !=0; i+) /正确的,但是坏的,不主张用这种方法 cout bi;【例4.8】字符串的输入/输出 4. 字符串处理函数 使用下面函数时,应加#include “string.h”命令。1. strlen(str) 功能:求str所指向的字符串的长度。不包括字符串结束标志0。 说明:str可为字符串常量、字符
60、数组名或字符指针。2. strlwr(str) 功能:将字符串中的大写字母转换成小写字母。 说明:str为字符字符串常量、数组名或字符指针。3. strupr(str) 功能:将字符串中的小写字母转换成大写字母。 说明:str为字符字符串常量、数组名或字符指针。4. strcpy(str1,str2) 功能:将str2所指的字符串复制到str1中。 说明:str1和str2为字符数组名或字符指针,str2还可以是字符串常量。 str1要有足够大的空 间。设:char str210= “aaa,str110; strcpy(str1,str2); str1= “bb; str1=str2; 5.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 22517.1-2024体育场地使用要求及检验方法第1部分:综合体育场馆木地板场地
- 2024年度企业租赁与经营权转让合同:商场内独立店铺的经营权交易2篇
- 2024年度童鞋跨界合作购销合同
- 手车位转让协议 3篇
- 排水工程承包合同
- 化工设计:第12章 设计报告和设计说明书
- 个人与公司买卖合同范本完整版
- 2024版自动驾驶技术研发与应用合同2篇
- 2024年度吊车租赁合同的合同变更条件及程序3篇
- 最好的励志课件
- 学前儿童卫生保健-第一章-学前儿童生理特点及卫生保健-课件
- 内科学第九版糖尿病
- GB/T 43644-2024红掌生产技术规程
- 新质生产力解读课件
- 人教版六年级上册数学《圆》大单元作业设计
- 国家集采药品培训课件
- 盐酸氨溴索喷雾剂-药品临床应用解读
- 0cr18ni9执行标准资料
- 王阳明心学完整版本
- 2024年大学试题(大学选修课)-植物知道生命的答案笔试历年真题荟萃含答案
- 生产管理部周报-样板OK
评论
0/150
提交评论