550 likes | 721 Views
大学 C++ 程序设计教程. 西安交通大学 计算机教学实验中心 http://ctec.xjtu.edu.cn. 第 3 章 基本数据类型. 本章目标 C++ 语言的基本数据类型 整型、实型 C++ 语言的数据 ( 形式 ) 常数、变量. 授 课 内 容. 3.1 数据类型 3.2 常量 3.3 变量 3.4 枚举类型 3.5 typedef 语句 3.6 类型修饰符 3.7 八进制和十六进制常量 程序设计举例 编程提示. 3.1 数据类型.
E N D
大学C++程序设计教程 西安交通大学 计算机教学实验中心http://ctec.xjtu.edu.cn
第3章 基本数据类型 • 本章目标 • C++语言的基本数据类型 • 整型、实型 • C++语言的数据(形式) • 常数、变量
授 课 内 容 • 3.1 数据类型 • 3.2 常量 • 3.3 变量 • 3.4 枚举类型 • 3.5 typedef语句 • 3.6 类型修饰符 • 3.7 八进制和十六进制常量 • 程序设计举例 • 编程提示
3.1数据类型 • 程序的主要任务是对数据进行处理,而数据有多种类型,如数值数据、文字数据、图像数据以及声音数据等,其中最基本的、也是最常用的是数值数据和文字数据。 • 不同类型的数据在存储器中存放的格式也不相同 • 程序中对各种数据进行处理之前都要对其类型 (也就是存储格式) 预先加以说明,这样做一是便于为这些数据分配相应的存储空间,二是说明了程序处理数据时应采用何种具体运算方法。 • 数值数据,其存储格式又可以分为整型、长整型、浮点型和双精度型等几种类型; • 文字数据也可以分为单个字符和字符串。
数据的表示 • C++的数据有两种:常量和变量。 • 常量通过本身的书写格式就说明了该常量的类型; • 变量必须先说明其类型,否则程序无法为该变量分配存储空间。 • 在计算机中为了区别不同的数,使用了不同的表示 方法。包括: • 整数的表示 • 实数的表示 • 字符数据的表示 • 数组的表示
数据类型 • 计算机只能存放二进制数据。不同类型的事物如何区分和描述?由此产生数据类型。 • 不同类型的数据占据不同长度的存储单元。 • 不同类型的数据对应不同的值域范围。 • 不同类型的数据对应不同的操作(运算)及规则。 • 数据类型越丰富,求解能力越强大。
基本数据类型 • 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 常量 • 整型常量 • 2进制常量,例10011101B,10B • 8进制常量,例04400,0777,0100 • 10进制常量,例2304 • 16进制常量,0x900,0xABC,0xffff • 实型常量 • 0.0, 2.68, 3.141593, 637.312, 32767.0, 32768.0,… • 0.0E0, 6.226E4, 1.267E20, … • 字符型常量 • 符号常量,例#define PI 3 • 字符常量,例'a', 'A', '1', ' ', '+', • 转义常量 '\n'(换行), '\r'(回车), '\t'(横向跳格), '\''(单引号), … • 字符串常量 • "Visual C++", "12.34", "This is a string.\n", … • CONST常量 CONST DOUBLE PI=3.1415926;
(1)符号常量 • 用#define定义的常数;类似变量,但不是变量。 • 例如: #define PI 3.1415926 • #define MAXNUM 10000 • 可以出现在表达式中; • f1= r * r * PI; • 但是不能作左值,下列用法是错误的: • PI = PI*PI ; • 用const定义的常数 • const double pi=3.1415926;
(2)文字数据表示 • 文字数据有两种: • 单个字符, 例如,‘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.3 变量 • C++的数据变量说明语句的格式为: • <类型说明符> <变量名1> ; • 4种C++整数数据类型的说明符分别为: • char c1, c2; // 说明了2个字符型变量 • int i, j, k; // 说明了3个整型变量 • long len; // 说明了1个长整型变量 • 说明浮点类型和双精度类型的变量 • float average, sum; // 说明了两个浮点类型的变量 • double distance, weight; // 说明了两个双精度类型的变量
(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; • cout<<max; • 不能用保留字作变量名 • 例如: sin=1.0; • cout= “Print Formatting.”;
(4)变量初始化 • 变量初始化就是给变量赋初值;有两种形式: • 先定义,再赋初值; • 例如: int sum,fac; • sum=0;fac=1; • 定义时赋值 • 例如: char c=‘A’; • int count = 0;
(5)类型修饰符 • 在基本数据类型前加类型修饰符,可以改变数据表示的范围。常用的有: • unsigned —— 无符号 • long —— 长型 • short —— 短型 • 例如: • unsigned char 表示范围变为0~255 • unsigned int 表示范围变为0~65535
整型数据的溢出 • void main() • { short a,b; • a=32767; b=a+1; • printf("%d,%d",a,b); • } • 运行结果为: 32767,-32768
例3.1 VC0301.CPP • 用牛顿迭代法求平方根。迭代公式为: 迭代结束的条件为: • 算法分析: 定义两个工作变量x0和x1; x1 = 1; // 迭代初值取1 do { x0 = x1; }while(x1与x0的相对误差大于控制参数ε);
程序逻辑功能框图 输入成绩X X1=1.0 X0 = X1 X1 = ( X0+X / X0 ) / 2 |(X0-X1)/X1|>=eps? 是 否 打印结果X1
// 3-1:用迭代公式求平方根 • #include <iostream.h> • #include <math.h> • #define EPS 1.0e-10 • int main() • { double x, y; • cout << "Please input the value : "; • cin >> 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); //fabs()函数为求绝对值的库函数 • y= x1; • } • else • y= x;
求平方根程序主函数main() • if(y<0) • cout << "Negative Value have not square root !" << endl; • else • cout << "The square root of " << x << " is " << y << endl; • return 0; • }
字符和字符串的区别 • 字符是用单引号括起来的单个字符,它在存储器中占1个字节; • 字符串是用双引号括起来的一串字符,它在存储器中占n+1个字节,即字符串的结束符‘\0’也占1个字节的位置。 • ‘A’和“A”是有区别的;前者是字符常数,后者是字符串常数。
例3-2根据键盘输入的首字符选择对应颜色 • 算法 • 枚举类型颜色的符号值可以通过读入其前一个或两个字符来区分,可以先从键盘上读入两个字符,然后用选择结构将对应的值找出来并赋给变量,对该变量再一次使用选择结构打印输出正确的符号值。
// Example 3-2:选择颜色 #include <iostream.h> int main() {//定义枚举类型颜色并同时声明一个该类型的变量 enum Colors{ blue, brown, green, red, white, yellow} choose; char ch1, ch2; cout<<"Please input the first two letters of the colors you have choosed:"<<endl; cin>>ch1>>ch2; //输入两个字符 //判断键盘输入字符所对应的枚举类型值 switch(ch1) { case 'b': if(ch2=='l') choose=blue;
// Example 3-2:选择颜色 else choose=brown; break; case 'g': choose=green; break; case 'r': choose=red; break; case 'w': choose=white; break; case 'y': choose=yellow; break; default: cout<<"Illegal input!"<<endl; }
// Example 3-2:选择颜色 //输出枚举类型值 switch(choose) {case blue: cout<<"The color you chosen is blue"<<endl; break; case brown: cout<<"The color you chosen is brown"<<endl; break; case green: cout<<"The color you chosen is green"<<endl; break;
case red: cout<<"The color you chosen is red"<<endl; break; case white: cout<<"The color you chosen is white"<<endl; break; case yellow: cout<<"The color you chosen is yellow"<<endl; } return 0; }
程序设计举例 • 例3-3 编写程序制作九九乘法表 • 例3-4 计算1!+2!+3!+4!+......+10! • 例3-5 求 的近似值 • 例3-6 根据三边长求三角形面积 • 例3-7 输入一个四位无符号整数,反序输出这四位数的四个数字字符 • 例3-8 编写一个可以打印任何一年的日历的程序
// Example 3-3:制作乘法表 #include <iostream.h> int main() { int i,j; for(i=1; i<10; i=i+1) { for(j=1; j<=i; j=j+1) cout << j <<"*"<< i <<"="<<i*j <<"\t"; cout << endl; } return 0; }
九九乘法表输出 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54
// Example 3-4:求阶乘的和 #include <iostream.h> int main() { int sum = 0, u = 1; for(int i=1; i<=10; i=i+1) { u = u*i; sum = sum+u; } cout<<"sum = "<<sum<<endl; return 0; }
例3-5 求 的近似值 • 算法 利用公式: • 计算,直到最后一项的绝对值小于104为止。
// Example 3-5:求π的近似值 #include <iostream.h> #include <math.h> int main() { int s = 1; double n = 1.0, u = 1.0, pi = 0.0; while(fabs(u)>=1e-4) { pi = pi+u; n = n+2; s = -s; //符号位的生成 u = s/n; } cout << "pi = " << 4*pi << endl; return 0; }
例3-6根据三边长求三角形面积 算法 利用海伦公式: 其中a, b, c分别为三角形三条边的长度。
// Example 3-6:求三角形面积 • #include <iostream.h> • #include <math.h> • int main() • { double a, b, c, s, area; • cout << "please input a, b, c =?"; • cin >> a >> b >> c; • s = (a+b+c)/2; • area = sqrt(s*(s-a)*(s-b)*(s-c)); • cout << "area = " << area << endl; • return 0; • }
例3-7 输入一个四位无符号整数 • 算法:从输入的无符号整数n中依次分解出个位数字,十位数字,百位数字,千位数字并依次存放到变量c1,c2,c3,c4中, • 将n%10的值即个位数字存入c1中 • 将n/10%10的值即十位数字存入c2中 • 将n/100%10的值即百位数字存入c3中 • 将n/1000的值即千位数字存入c4中 • 再将各数字值+'0'则转为对应的数字字符。
// Example 3-7 #include <iostream.h> int main() { unsigned int n; char c1,c2,c3,c4; cout<<"Please input one integer between 1000 and 9999: "<<endl; cin>>n; cout<<"Before inverse the number is: "<< n <<endl; c1=n%10+'0'; //分离个位数字 c2=n/10%10+'0'; //分离十位数字 c3=n/100%10+'0'; //分离百位数字 c4=n/1000+'0'; //分离千位数字 cout<<"After inverse the number is: "<<c1<<c2<<c3<<c4<<endl; return 0; }
例3-8 打印年历 算法分析: 1、确定闰年 year%4=0 且 year%100!=0 或 year%400=0 2、确定元旦是星期几 • 平年一年是52(52x7=354)个星期多一天 。所以平年元旦的星期数是上一年元旦星期数加1。 • 闰年又多一天,所以闰年元旦的星期数是上一年元旦星期数加2。 • 1900年的元旦是星期一,所以year的星期几可以根据下列方法计算 n = year -1900 [相差n年 ] n = n +(n - 1 )/4 +1 [n年多n天,(n-1)/4个闰年数,再加1900年元旦的星期序号1] n = n % 7[求出最后的星期数 ]
程序逻辑功能框图 输入年year 调用isleap()判断是否闰年 调用子函数求元旦是星期几 week_of_newyear_day() Month=1 否 Month<=12? month=month+1 是 打印当前月日历
打印当前月处理框图 30天 小月 31天 大月 28天 平2月 29天 闰2月 月天数 = 确定当月1日的位置 确定月天数 len_of_month day =1 day<=月天数? 否 是 打印当前日期 day= day+1 否 是否7天? 是 换行
程序模块结构 主函数main() 子函数求元旦的星期数 week_of_newyears_day() 子函数判别闰月 Isleap()
确定闰年子函数程序 #include <iostream.h> #define YES 1 // 定义符号常数"是" #define NO 0 // 定义符号常数"否" // 函数 isleap(): 判断某年是否闰年 int isleap(int year) { int leap=NO; if(year%4==0&&year%100!=0||year%400==0) leap=YES; return leap; }
求元旦是星期几子函数 // 函数 week_of_newyears_day(): 求元旦是星期几 int week_of_newyears_day(int year) { int n = year-1900; n = n+(n-1)/4+1; n = n%7; return n; }