770 likes | 1.05k Views
Visual C++ 与面向对象程序设计教程. 第 3 章 基本数据类型 计算机教学实验中心 西安交通大学. 教学目标. C++ 语言的基本数据类型 整型、实型 C++ 的构造类型 数组 C++ 语言的数据(形式) 常数、变量. 学习要求. 掌握常量与变量、整型数与实型数的概念。 掌握字符型数据与字符串型数据的概念以及二者的区别。 掌握各种类型的变量说明及其初始化。 掌握各种数组类型的使用方法 进一步熟悉 C++ 程序的编辑、编译、连接、运行的过程。. 授 课 内 容. 3.1 数据类型 3.2 常量 3.3 变量 3.4 数组
E N D
Visual C++与面向对象程序设计教程 第3章 基本数据类型 计算机教学实验中心 西安交通大学
教学目标 • C++语言的基本数据类型 • 整型、实型 • C++的构造类型 • 数组 • C++语言的数据(形式) • 常数、变量
学习要求 • 掌握常量与变量、整型数与实型数的概念。 • 掌握字符型数据与字符串型数据的概念以及二者的区别。 • 掌握各种类型的变量说明及其初始化。 • 掌握各种数组类型的使用方法 • 进一步熟悉C++程序的编辑、编译、连接、运行的过程。
授 课 内 容 • 3.1 数据类型 • 3.2 常量 • 3.3 变量 • 3.4 数组 • 3.5 字符型数组和字符串处理库函数 • 调试技术 • 程序设计举例
3.1、数据类型 • 计算机能够做许多事情。但是,归根到底计算机只能处理数据。 • 大千世界丰富多彩。为表现不同性质的事物,要用不同的数据类型。 • 在计算机中,为方便数据处理,采用两种基本形式存放数据。
数据 • 是对认识的事实性记载 • 是用来表示客观事物的符号 • 是指能够由计算机处理的数字、字母、符号、声音、图象、影视信息等。 • 是程序的必要组成部分和程序处理的对象。
数的表示 • 在计算机中为了区别不同的数,使用了不同的表示 方法。包括: • 整数的表示 • 实数的表示 • 字符数据的表示 • 数组的表示
数据类型 • 计算机只能存放二进制数据。不同类型的事物如何区分和描述?由此产生数据类型。 • 不同类型的数据占据不同长度的存储单元。 • 不同类型的数据对应不同的值域范围。 • 不同类型的数据对应不同的操作(运算)及规则。 • 数据类型越丰富,求解能力越强大。
3.2、基本数据类型 • C语言的基本数据类型: 数据类型 类型说明浮 占用字节 • 字符型 char 1个 • 短整数 short 2个 • 整型 int 4个 • 浮点型 float 4个 • 双精度型 double 8个
数据在计算机中的存放 • 数据在计算机中采用二进制存放;一个字节8个二进制位,示意图如下: 0 7 数的表示范围:-2^7~2^7-1(-128~127) 显然,一个字节表示数的范围是有限的。要表示更大范围内的数,就要使用多个字节。
整数的存储格式 0 7 • 字符型 • 短整型 短整数表示范围为:-2^15~2^15-1(-32768~32767) • 长整型 长整数表示范围为:-2^31~2^31-1 15 8 7 0 31 24 23 16 15 8 7 0
实数的表示 • 实数也称为浮点数,用于表示小数;有两种表示形式: • 十进制形式:xxxxx.xxxx • 指数形式:xxx.Exx 24 23 16 15 8 7 31 0 指数部分 尾数部分 一般浮点数的可以达到7位有效数字。例如1234.567。双精度浮点数的有效位数可以达到15~16位。
常数和变量 • 变化的量称变量; • 不变化的量称常量; • 常量和变量是计算机语言中数据的两种基本形式。
3.2 常量 • 整型常量 • 0, 1, 2, 637, 32767, 32768, … • 0L, 1L, 2L, 637L, 32767L, 32768L, … • 实型常量 • 0.0, 1.0, 2.68, 3.141593, 637.312, … • 0.0E0, 6.226e4, 6.226E4, 1.267E20, … • 字符常量 • 'a', 'A', '1', ' ', '+', … • '\n'(换行), '\r'(回车), '\t'(横向跳格), '\''(单引号), … • 字符串常量. • "Visual C++", "12.34", "This is a string.\n", …
常数 • 符号常数 • 整型常数 • 实型常数 • 字符型常数 • 8进制常数 • 16进制常数
(1)符号常数 • 用#define定义的常数;类似变量,但不是变量。 例如: #define PI 3.1415926 #define MAXNUM 10000 • 可以出现在表达式中; f1= r * r * PI; • 但是不能作左值,下列用法是错误的: PI = PI*PI ; • 用const定义的常数 const double pi=3.1415926;
(2)整、实型常数 • 整型常数的表示范围是:-32768~32767 例如: 128 ,256 • 实型常数的表示范围是:10-38~1038 例如: 2.7198 , 1.034e14
(3)、字符型常数 • 由单引号括起来的单个字符。 例如,‘A’,‘b’,‘C’
(4)、8进制常数 • 8进制常数是以0打头的8进制数组成。 合法的8进制数: 072,0777,0100 非法的8进制数: 0800,7600,0776
(5)、16进制常数 • 16进制常数是以0x打头的16进制数组成。 合法的16进制常数: 0x10001,0xABC,0xffff 非法的16进制常数: FFFF,aaaa,0xgggg
文字数据表示 • 文字数据有两种: • 单个字符, 例如,‘A’、‘\0’ 、‘ ‘ 等 • 字符串,例如,“This is a string .” • 计算机中的文字使用ASCII字符,总共有128个: • 10个阿拉伯数字 • 52个英文字母 • 32控制字符(非显示字符) • 34个特殊字符 • ASCII码对应的字符: • ‘A’的值65、‘a’的值97(差是32) • ‘0’的值48 • 回车键的值13、ESC键的值27 • 问号‘?’的值63、‘*’的值42
例3.1 VC0301.CPP • 将大写字母转换为小写字母。 转换公式: ch = ch - ‘A’+‘a’ • 算法分析: • 输入一个字符,判别是否是字母; • 是字母将其转换为小写 • 否则,跳过 • 按转换公式进行转换 • 输出转换结果值
转换子函数lower()程序 //Example3.1: 将大写字母转换为小写字母*/ int lower(int ch) { if(ch>='A' && ch<='Z') ch = ch-'A'+'a'; return ch; }
VC0301.CPP主函数 #include <iostream.h> main() { char s[100] = "Hello, C!"; int i= 0, c; while(s[i]!=0) { c = lower(s[i]); s[i]=c; i = i+1; } cout<<s; }
数据基本形式 • 在实际数据处理过程中,有些数据经常变化(大批量),而有些数据不变化(个别)。 • 变化的量称变量,不变化的量称常量。常量和变量是计算机语言中数据的两种基本形式。 • 常量和变量的运算规则是有区别的。
3.3 变量 • C++的数据变量说明语句的格式为: <类型说明符> <变量名1> ; • 4种C++整数数据类型的说明符分别为: • char c1, c2; // 说明了2个字符型变量 • int i, j, k; // 说明了3个整型变量 • long len; // 说明了1个长整型变量 • 说明浮点类型和双精度类型的变量 • float average, sum; // 说明了两个浮点类型的变量 • double distance, weight; // 说明了两个双精度类型的变量
1、变量 • 变量定义 • 变量命名规则 • 变量使用规则 • 变量初始化 • 变量引用 • 类型修饰符
(1)变量定义 • 用基本数据类型描述符说明的对象是定义的变量。 • 例如: • int i,j,k,*p; • float eps,f0,f1[5]; • char c0,c1,c2[100]; • double array[10][10];
(2)变量(标识符)命名 命名规则: (1)变量名只能由字母、数字或下划线组成; (2)变量名的第一个字符必须是字母或下划线; (3)变量名长度不超过32个字符(TC); (4)不要用保留字定义变量名(有32个保留字)。 合法变量名: a、 b1、 _area、employee_name 不合法变量名: 1-name、 max one 、float 、*account
(3)变量使用规则 • 先定义,后使用; 例如: int a,b,c; a=1;b=2; c= a+b; 下列用法是错误的: b=a+c; printf( “max=%d\n”,max); • 不能用保留字作变量名 例如: sin=1.0; printf= “Print Formatting.”;
(4)变量初始化 • 变量初始化就是给变量赋初值;有两种形式: • 先定义,再赋初值; 例如: int sum,fac; sum=0;fac=1; • 定义时赋值 例如: char c=‘A’; int count = 0;
(5)变量引用 • 作为“左值”,出现在赋值语句左边; 例如: i=i+1; sum=sum+i; • 出现在表达式中; 例如: x1 = (x0 + x / x0)/ 2 ; • 作为函数的参数; 例如: printf(“max=%d\n”,max(a,b)); • 作为数组的下标表达式; 例如: c[i][j]=a[i][k]*a[k][j];
(6)类型修饰符 • 在基本数据类型前加类型修饰符,可以改变数据表示的范围。常用的有: • unsigned —— 无符号 • long —— 长型 • short —— 短型 例如: unsigned char 表示范围变为0~255 unsigned int 表示范围变为0~65535
例3.2 VC0301.CPP • 用牛顿迭代法求平方根。迭代公式为: 迭代结束的条件为: • 算法分析: 定义两个变量X0、X1 X1取初值1.0 循环执行:迭代公式 判别X0和X1的相对误差eps • 若大于eps,继续执行 • 否则,得到结果的根;结束循环。
程序逻辑功能框图 输入成绩X X1=1.0 X0 = X1 X1 = ( X0+X / X0 ) / 2 |(X0-X1)/X1|>=eps? 是 否 打印结果X1
程序模块结构 主函数main() 子函数求平方根 newton_sqrt( )
求平方根子函数newton_sqrt( ) // Example3.2: 用牛顿迭代公式求平方根 #include <iostream.h> #include <math.h> #define EPS 1.0e-10 double newton_sqrt(double x) { double x0, x1; x1 = 1.0; if(x>0.0) { do { x0 = x1; x1 = (x0+x/x0)/2; } while(fabs((x0-x1)/x1)>=EPS); return x1; } else return x; }
求平方根程序主函数main() // 用于计算平方根的主函数 main() { double x, y; cout<<"Please input the value : "; cin>>x; y = newton_sqrt(x); if(y<0) cout<<"Negative Value have not square root !”<<endl; else cout<<"The square root of”<<x<<“ is “<<y<<endl; }
字符和字符串的区别 • 字符是用单引号括起来的单个字符,它在存储器中占1个字节; • 字符串是用双引号括起来的一串字符,它在存储器中占n+1个字节,即字符串的结束符‘\0’也占1个字节的位置。 • ‘A’和“A”是有区别的;前者是字符常数,后者是字符串常数。
3.4、数组 • 问题的引出: • 实际应用的程序设计中,只用几个变量的情况是极少的;更多的情况是处理大批量的相同类型或不同类型的数据。 • 相同类型数据举例:统计交大15,000学生英语4级统考成绩; • 不同类型数据举例:管理交大15,000学生学籍信息记录,包括:姓名、学号、出生日期、班级、各科成绩等。 • 用什么样的数据结构来描述这类应用更简洁?
应用举例: 例:输入100个实数,按相反的次序 每5个为一行打印出来。 分析: 按前边所学内容,应设置100个实型变量,如果用读数cin ,每行读入5个数,需要20个cin语句;用cout输出,同样也需要20个。 结论: 若用“数组”形式的数据结构,这类应用就简单多了。
数组定义 • 具有相同类型的数据的集合被称为数组。 • 和简单变量类似,数组用数组名来标识。一个数组名用来表示一组同类型的数据;这批同类型的数据被称为数组元素或分量。 • 数组描述的是顺序数据结构;即数组元素在逻辑上相邻,在物理也相邻。在内存中它们是连续存放的。 • 数组和变量一样,必须先定义,后使用。
数组说明 • 数组必须先说明,才能使用。说明的一般格式: 类型说明符 数组名[常数表达式][……][,…..] • 说明: • 类型说明符可以是任意类型(例如char、int) • 常数表达式的值是数组元素的个数 • 数组可以是一维、二维或多维数组;是几维数组,数组名右边就有几对方括号,分别确定各维的长度(元素个数); • 举例: char a[10],str[10][80];/*10行80列的字符数组*/ int s1[100][10],i1[1000];
存贮结构 • 存贮结构也称物理结构;它描述数据在计算机中的表示(又称映象)。 • 逻辑结构和存贮结构的区别: (1)逻辑结构是从逻辑关系(某种顺序)上观察数据,它是独立于计算机的;可在理论上、形式上进行研究、运算。 (2)存储结构是逻辑结构在计算机中的实现,它是依赖于计算机的;离开计算机,则无法进行任何操作。 (3)任何一个算法的设计取决于选定的数据逻辑结构;而算法的最终实现依赖于采用的存储结构。
一维数组存储结构 • 逻辑结构: 由一串数据构成的向量表,每个元素的下标值确定了各元素在此数据表中的位置。例如, A[5]排序次序为: A[0],A[1],A[2],A[3],A[4] • 存贮结构: 数组元素存放为一片连续的存储单元,其元素在内存中的存放顺序与逻辑结构是一致的;即所谓“逻辑上相邻,物理上也相邻”。A[5]的存储结构为: A[0] A[1] A[2] A[3] A[4]
二维数组存储结构 • 逻辑结构: 二维数组恰似一张表格(或矩阵)。数组元素中的第一个下标值表示该元素在表格中的行号,第二个下标为列号。M[3][3]具有如下逻辑结构: M[0][0] M[0][1] M[0][2] M[1][0] M[1][1] M[1][2] M[2][0] M[2][1] M[2][2] • 存贮结构: 二维数组在内存中按一维数组存放、占据一片连续的存贮单元;是“按行顺序”在内存中分配存贮单元。M数组在内存中排列如下: m01 m02 m10 m11 m12 m20 m21 m22 m00
三维数组存储结构 • 三维数组可以看成是若干个二维数组;在内存中也按一维数组存放。C[2][3][3]的数组元素排列如下: • 三维数组元素在内存中 的排列顺序为: C000、 C001 、 C002、 C010、 C011、 C012、 C020、 C021、 C022、 C100、 C101、 C102、 C110、 C111、 C112、 C120、 C121、 C122。 C100 C101 C102 C110 C110 C112 C120 C121 C122 C000 C001 C002 C010 C010 C012 C020 C021 C022
例3.3 找出数组中的最大数 算法分析: 1、假设数组中第1个元素最大,令max=a[0] 2、将a[i](0<= i < n)与max进行比较, • 若a[i] < max ,i=i+1,再执行2 • 否则,令max=a[i],i=i+1,再执行2 3、循环结束,求出最大元素并输出max。
程序逻辑功能框图 max=a[0] 否 i < n ? 是 max=a[i] i = i + 1 打印结果max