第二讲 基本数据类 型及数组等 此为封面页,需列出课程编码、课程名称和课程开发室名称。 第二讲 基本数据类 型及数组等 此为封面页,需列出课程编码、课程名称和课程开发室名称。 要求:每个子课程(6位编码的课程)要求做一个这样的胶片,胶片文件命名为“课程编码 课程名称.ppt”。 此页胶片仅在授课时使用,胶片+注释中不使用。 封面页按产品分为4个,各产品使用自己的封面,把其他封面直接删除即可。
本讲内容 上次作业讲解 常见错误 基本数据类型 数组及其应用 本讲作业 2
2.1 上次作业讲解 1、编写程序计算y的值: x-5 (x<1) y= x*5+2 (1≤x<10) x+5 (x≥10) 2、从键盘上输入一个整数和一浮点数,比较 其大小,并输出小值。 3
上次作业讲解 #include <iostream.h> void main( ) { double x,y; cout <<"Input x:" ; cin >> x ; if(x<1) y=x-5; else if(x>=1 &&x<10) y=x*5+2; else y=x+5; cout<<"y="<<y<<endl; } 4
cout <<"Input x(int) and y(double):" ; cin >> x >>y; int x,double y; cout <<"Input x(int) and y(double):" ; cin >> x >>y; double min=x<y?x:y; cout<<"The min is\t"<<min<<endl; int x;double y; 90 56.6 90 56 'double ' : storage-class or type specifier(s) unexpected here; ignored nonstandard extension used : qualifiers after comma in declarator list are ignored--两个警告 5
2.2 常见错误与警告 1、变量未定义或定义了却从未使用 2、逻辑表达式错误(||与&&) 3、IF…ELSE不匹配,或IF(表达式)中少了括号 4、字符串与表达式的错误,如“y=x-5”是字符串 5、 cin >> x,y ; cin >> x>>y >>endl; 之类的错误 6、函数实现的函数头处写分号的错误(见上讲程序) 7、函数未能按声明、使用、定义的原则(第四讲) 重复上机过程! 6
常见错误及改正 1、单词拼写错误 void—viod main---mian iostream--iosteam cout---count endl—end1 2、输出<< 与输入>>用错 cin<<"Enter two numbers:">>x,y; cout<<"Enter two numbers:"; cin>>x>>y; 3、main后少了( ),函数体少了{ }或{ }不匹配 7
error C2018: unknown character "0xa3" 4、;用错,该有的没有,不该有的却有 #include <iostream.h> void main( ) { double x,y; cout << "Enter two float number:" ; cin >> x>>y ; double z=x+y; cout <<"x+y= "<<z<<endl ; } 不是“ ”! 此处无; 应该是; 5、中文标点用错,特别是引号 肯定是用错了中文符号 error C2018: unknown character "0xa3" 8
unknown character “ 0xa3 ”:不可知字符(中文符号) 6、大小写错误 void –Void 前面是x,后面完成X 7、函数后面接(),不是{ }也不是[ ] 8、常见错误 unknown character “ 0xa3 ”:不可知字符(中文符号) syntax error : missing ";" before type "double" "x" : undeclared identifier:x:是没有声明的标识符 4、unexpected tokens following preprocessor directive - expected a newline(若在#include行尾有;则有本条错误):在预处理命令后有一个意外的符号 9
解决办法 5、missing function header (old-style formal list?) 缺少函数头(在函数实现代码如main后面加了;就会出现) 6、subscript requires array or pointer type 下标需要数组或指针类型,max(2,4)误写成max[2,4]! 7、"max" : function does not take 3 parameters 函数不支持3个参数 8、"main" : function should return a value; "void" return type assumed main前少了void 9、local variable "x" used without having been initialized 本地变量没有初始化就使用了 10、function "void _cdecl main(void)" already has a body 在程序中有两个main函数体!不能在同一文件中放两个程序的代码,一个程序中只有一个main函数! 解决办法 10
11、编译与构建时文件名称不同 解决办法:关闭工作区-选择否-重新编译、构建 大.obj : error LNK2005: _main already defined in aa.obj 大.obj : error LNK2005: "double __cdecl max(double,double)" (?max@@YANNN@Z) already defined in aa.obj Debug/aa.exe : fatal error LNK1169: one or more multiply defined symbols found 解决办法:关闭工作区-选择否-重新编译、构建 11
2.3 基本数据类型 基本数据类型 类型修饰符 常用数据类型
基本数据类型 C++语言的基本数据类型有如下4种: char(字符型) int(整型) float(单精度浮点型)、 double(双精度浮点型) void(空值型) 如:A,b ,z 12 ,98999 12.90, 0.9e12
类型修饰符 C++语言中还有四种类型修饰符: signed(有符号) unsigned(无符号) long(长型) short (短型) 是否能为负数 数的范围是否更宽 无符号:00000000 ~11111111 可表示0到255共256个数 有符号: 11111111~ 01111111 可表示-128到+127共256个数 0代表正,1代表负, ×111111 1
常用数据类型 允许用修饰符组合构成的常用数据类型有: char (signed char) ,unsigned char: 1个字节 short(signed short),unsigned short:2个字节 int (signed int ) ,unsigned int : 4个字节 long (signed long) ,unsigned long: 4个字节 float: 4个字节(大约6位有效数字) double: 8个字节(大约12位有效数字) long double: 10个字节(大约15位有效数字)
常量和变量 常量 是指在程序中不被改变的量 变量 指在程序中其值可以被改变的量
常量 1、整型常量 2、浮点型常量 3、字符型常量 4、字符串常量 5、符号常量 常量是指在程序中不被改变的量。 常量有各种不同的数据类型,这由它的表示方法决定。 1、整型常量 2、浮点型常量 3、字符型常量 4、字符串常量 5、符号常量
1、整型常量 有3种表示方式: 十进制整数 八进制整数(以0开头的整数) 十六进制整数(以0X或0x开头的整数) 如: 123,-34,0 0123(=1*82+2*81+3*80) //等于数83 0X123 //等于数291 -024,-0X32 //不正确 123L //长整型数 123LU //无符号长整型数
2、浮点型常量 有两种表示: 定点数形式 指数形式 如: 0.123,.23,0.0 //定点数形式 0.123,.23,0.0 //定点数形式 123E5,23.4e-2 //指数形式 要注意E或e的前面要有数字,且E的后面的指数必须为整数。 E2,2.1E3.5,e //不合法 实型常数分为单精度、双精度和长双精度3类。 如:34.5 、3.8f、 34.6l 在C++中,一个实型常数未说明则表示是double型。
3、字符型常量 是用单引号括起来的一个字符。如'a'、'! '等。 此外,还有一种特殊形式,即以'\ '开头的字符序列,称为转义字符。 如' \n ' ,它表示一个换行符。 转义字符中可将反斜杠同八进制或十六进制数值结合使用,以表示相应于该数值的ASCII码。 用八进制数表示时,所能表示的范围为 '\000'~'\377',即从0~255。 用十六进制数表示时,表示的范围是'\x00'~'\xff'。
4、字符串常量 是由一对双引号括起来的字符序列。 如: " How do you do? " 、 " hello "字符常量和字符串常量在存储方式上是不同的。 字符常量只占一个字节的空间,而字符串常量除字符序列中每个字符占一个字节外,还要在最后多占一个字节空间用来保存一个'\0'字符(空字符)称为字符串结束标志符号。它是系统自动增加的。 " hello " 的长度为6,占6个内存单元。 注意: "0"与'0'的不同。
5、符号常量 用一个与常量相关的标识符来替代常量出现在程序中,这种相关的标识符称为符号常量。 定义方法须用类型说明符const。 如: const float pi=3.14159; 定义成符号常量后,程序中对其值只能读而不能改变,否则出现编译错误。 由于其常量值不可改变,所以该常量定义时必须初始化。 注: 符号常量名不能放在赋值语句的左边。
变量 1、变量名 变量是指在程序中其值可以被改变的量。 变量具有三个基本要素:名字、类型和值。 C++将大写和小写的字母认为是不同的字母。 如变量名something和 Something为不同的名字。 命名变量名的规则为: 不能为关键字 遵循标识符的命名规则 不能与程序中的其他名字如函数名等同名 一般讲究见名知意 一般变量名全用小写字母。如myBook,theFox。
2、变量类型 必须先定义其类型才能使用该变量。 如: unsigned myAge , myWeight; float myScore; 可用赋值运算符给变量赋值。 如:int x(0); unsigned short width; width=5; 也可在定义时直接给变量赋值。这时所赋的一般是初始值,称为变量初始化。 unsigned short width=5;
3、变量值 如: int a; a=300; 注意有两个值的概念: 一个是数据值(存放在内存空间中的数据) 另一个是地址值(所占内存空间的起始地址) 内容 起始地址 空间大小 由类型决定 与变量名A关联 对应变量值 100110051009100d 300
2.4 数组 数组的定义 数组的赋值 字符数组
数组的定义 数组是一种用一个名字来标识一组有序且类型相同的数据组成的派生数据类型,它占有一片连续的内存空间。 一维数组的说明形式为: 类型说明符 数组名[常量表达式]; 起始地址 内容 B 1001 1005 1009 100d 1011 对应元素值 与数组名关联 如: int B[5]; 表示定义了一个名为B的一维数组,其中有5个元素,类型都为整型。
定义时方括号内必须为常量形式,不能为变量。 如: int size=50; void main ( ) { int array[size]; // error … } 应为:const int size=50;
数组的赋值 1、数组元素的表示 数组的赋值是给数组的各个元素赋值。数组的元素可以被赋值也可被赋初值。 一维数组元素的下标表示如下: <数组名>[<下标表达式>] 如: int a[5]; 则元素为a[0]~a[4] 注意:a[5]不属于该数组的空间范围。 又如: int b[3][4]; 则元素为b[0][0]~b[2][3]。 1 2 3 4 5 a[0] a[1] a[2] a[3] a[4]
2、数组元素的赋初值 在定义数组时,同时给各元素赋初值,这称为数组元素的初始化。 规定:数组元素的个数不能少于初始值的个数。 如: int a[4]={1,2,3,4}; int a[4]={2,3}; //默认值为0 int a[4]={1,2,3,4,5}; //error int b[2][3]={{1,2,3},{4,5,6}}; int b[2][3]={1,2,3,4,5}; int b[2][3]={{1,3},{2,4}};
3、数组元素的赋值 即用赋值表达式给每个数组元素赋值。 如: int m[3]; m[0]=1; m[1]=2;m[2]=3; 注意:m[3]=4; //error 也可用循环语句实现: int a[5]; for (int i=0;i<5;i++) a[i]=i*2+1; 1 2 3 4 5 a[0] a[1] a[2] a[3] a[4] 1 3 5 7 9
例如:计算由键盘输入的五个人的平均年龄 #include <iostream.h> void main( ) { int age[5]; //数组声明 int sum=0; for(int i=0; i<5; i++) { cin>>age[i]; //给数组赋值 sum+=age[i]; //累加数组元素之和 cout<<"Enter another age:"; } cout<<"the average is:"<<sum/5.0<<endl;
字符数组 字符数组是指数组类型为char的一种数组。如: char s1[4]={'a', 'b', 'c', 'd'}; char s3[5]="abcde"; //error char s3[ ]="abcde"; //元素个数由初始值的个数决定 char ss[2][3]={{'a', 'b', '\0''},{ 'c', 'd', '\0'}}; char ss[2][3]={"ab", "cd"}; ss[0,0] ss[0,1] ss[0,2] ss[1,0] ss[1,1] ss[1,2] a b \0 c d
char s1[5]; s1[5]="abcd"; //error 注意: char s1[5]; s1[5]="abcd"; //error s1="abcd"; //error,too! 初始化时允许直接用字符串常量赋值,而在一般赋值时严禁直接对数组名操作,而只能对其中的元素逐个操作(因为数组名是一个指针常量!)。如: static int a[ ]={1,2,4,8,16}; for (int i=0; i<5;i++) cout<<a[i]<<" "; cout<<endl; 结果为:1 2 4 8 16 注 意
for(int i=0;i<12;i++) a[i]=i+1; //元素赋值 给一维数组赋值,并按每行4个元素输出 a[12] #include "iostream.h" void main() { int a[12]; for(int i=0;i<12;i++) a[i]=i+1; //元素赋值 cout<<a[i]<<"\t"; if(i%4==0)cout<<endl; } p 1 2 3 4 5 6 7 8 9 10 11 12 a[0] a[1] a[2] a[9] a[10] a[11]
随机生成数组的10个元素,求它们的最大值及平均值 #include <iostream.h> #include <stdlib.h> //srand()及rand()函数 #include <time.h> //包含time()函数 void main() { int i,a[10],sum=0,max; srand((unsigned) time( NULL ) ); //使种子数随时间变化,否则每次运行结果相同 //数组元素用随机函数赋值 for(i=0;i<10;i++) a[i]=rand()/300;//rand()值的范围是0-32768
//数组元素累加求和 for(i=0;i<10;i++) sum=sum+a[i]; //求数组的最大值(打擂算法) max=a[0]; for(i=1;i<10;i++) if(a[i]>max)max=a[i]; //数组按每行5列输出 { if (i%5==0)cout<<endl; cout<<a[i]<<"\t"; } cout<<"\nmax of array a[] is "<<max<<endl; }
a[i][j]是一维数组中的第几个元素? 1 2 3 4 5 6 7 8 9 10 11 12 a[0][0] 1 2 3 4 5 6 7 8 9 10 11 12 a[0][0] a[1][0] a[2][0] a[2][0] a[2][1] a[2][2] a[2][3] a[i][j]是一维数组中的第几个元素? 如a[2][1]:以首元素为基准,前面有2行(2*4个) ,有1列故有2*4+1=9,其地址为: &(a[0][0]+ 2*4+1) a[2][3]
a[0][0] a[0][1] a[0][2] a[0][3] a[0][0] a[2][3] 4 5 6 7 8 9 10 11 12 a[0][0] for(int i=0;i<4;i++) a[0][i]=i+1; 给1行赋值 for(int i=0;i<4;i++) a[1][i]=5+i; 给2行赋值 for(int i=0;i<4;i++) a[2][i]=9+i; a[2][3]
a[0][0] a[0][1] a[0][2] a[0][3] for(int i=0;i<3;i++) //外循环,控制行 { for(int j=0;j<4;j++) //内循环,控制列 { a[i][j]=4*i+j+1; cout<<a[i][j]<<"\t"; } 可把a[i][j]改为*(*(a+i)+j) cout<<endl; } 2 3 4 5 6 7 8 9 10 11 12
2.5 枚举类型 枚举模式和枚举变量 枚举变量的值
枚举模式和枚举变量 枚举类型是若干个有名字的整型常量的集合。 枚举类型的定义格式为: enum <枚举类型名>{<枚举常量表>}; 如: enum day {sun, mon, tue, wed, thu, fri, sat}; 这时,枚举常量所对应的常量值默认为0~6。 枚举变量的定义格式为: enum <枚举类型名><枚举变量名表>; enum day d1,d2,d3; 也可连在一起写: enum day {sun, mon, tue, wed} d1,d2,d3;
枚举变量的值 如: enum day {sun,mon,tue,wed,thu,fri,sat} d1,d2,d3; enum color {red,blue,yellow,black,white} c1,c2,c3; 则有: d1=sun; d2=sat; c1=red; c2=blue; 但无: d3=yellow; //集合中无该枚举常量值 c3=3; //枚举常量值并不能直接对应整型值 若输出某个枚举变量的值则总是整型数值,而不是枚举符。 如:cout<<d1<<c2; 则输出:0 1 若要输出sun和blue,则要通过编程实现。
2.5 本讲作业 从键盘上输入三个整数,求出其中的最大与最小值(用条件运算符); 分别设计一个求最大值与最小值的函数,求出最大、最小值及中间值,并输出; 编程输出以下图形: * ** *** **** ***** ****** ****** ***** **** *** ** * 4、编程求Sum=1!+2!+3!+…+10!之和。
从键盘上输入三个数,求三个数的最大与最小值 从键盘上输入三个数,求三个数的最大与最小值 void main() { double x,y,z,max,min; cout<<"Enter three number:\n"; cin>>x>>y>>z; //先比较其中两数,求出大的再与第三个数相比 if(x>=y) max=x; else max=y; if(z>max)max=z; if(x<=y)min=x; else min=y; if(z<min)min=z; cout<<"max="<<max<<"\tmin"<<min<<endl; cout<<"mid="<<(x+y+z-max-min)<<endl;
从键盘上输入三个数,通过函数实现对三个数的从小到大的排序 从键盘上输入三个数,通过函数实现对三个数的从小到大的排序 #include "iostream.h" void main() { double x,y,z; //定义三个变量用来输入三个数 double maxv,midv,minv; // 存放最大、最小及中间数 double max(double x,double y); //求最大值函数max的声明 double min(double x,double y); //求最小值的函数min的声明 cout<<"Enter three number:\n"; cin>>x>>y>>z; //从键盘上输入三个任意的数 maxv=max(x,max(y,z)); //计算最大值 minv=min(x,min(y,z)); //计算最小值 midv=(x+y+z)-(maxv+minv); //通过公式计算中间值 cout<<"最大值 "<<"中间值 "<<"最小值 "<<endl; cout<<maxv<<" "<<midv<<" "<<minv<<" "<<endl;}
return(x>y?x:y); return(x<y?x:y); /**********求最大值的函数的实现***************/ double max(double x,double y) { if(x>y) return x; else return y; } /**********************************************/ /**********求最小值的函数的实现***************/ double min(double x,double y) { if(x<y) return(x>y?x:y); return(x<y?x:y);