Upload
kasper-molina
View
185
Download
2
Embed Size (px)
DESCRIPTION
大学 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 数据类型. - PowerPoint PPT Presentation
Citation preview
大学 C++ 程序设计教程
西安交通大学计算机教学实验中心http://ctec.xjtu.edu.cn
2/54
第 3 章 基本数据类型 本章目标
– C++ 语言的基本数据类型» 整型、实型
– C++ 语言的数据 ( 形式 )
» 常数、变量
3/54
授 课 内 容 3.1 数据类型 3.2 常量 3.3 变量 3.4 枚举类型 3.5 typedef 语句 3.6 类型修饰符 3.7 八进制和十六进制常量 程序设计举例 编程提示
4/54
3.1 数据类型– 程序的主要任务是对数据进行处理,而数据有多种类型,如数值数据、文字数据、图像数据以及声音数据等,其中最基本的、也是最常用的是数值数据和文字数据。
– 不同类型的数据在存储器中存放的格式也不相同 – 程序中对各种数据进行处理之前都要对其类型 ( 也就是存储格式 ) 预先加以说明,这样做一是便于为这些数据分配相应的存储空间,二是说明了程序处理数据时应采用何种具体运算方法。
– 数值数据,其存储格式又可以分为整型、长整型、浮点型和双精度型等几种类型 ;
– 文字数据也可以分为单个字符和字符串。
5/54
数据的表示 C ++ 的数据有两种:常量和变量。
– 常量通过本身的书写格式就说明了该常量的类型;– 变量必须先说明其类型,否则程序无法为该变量分配存储空间。
在计算机中为了区别不同的数,使用了不同的表示 方法。包括:
– 整数的表示– 实数的表示– 字符数据的表示– 数组的表示
6/54
数据类型 计算机只能存放二进制数据。不同类型的事物如何区分和描述?由此产生数据类型。
不同类型的数据占据不同长度的存储单元。 不同类型的数据对应不同的值域范围。 不同类型的数据对应不同的操作(运算)及规则。
数据类型越丰富,求解能力越强大。
7/54
图 3.1 C++ 数据类型的分类
8/54
基本数据类型 C++ 语言的基本数据类型:
数据类型 类型说明浮 占用字节– 字符型 char 1 个– 短整数 short 2 个– 整型 int 4 个– 浮点型 float 4 个– 双精度型 double 8 个
9/54
数据在计算机中的存放
数据在计算机中采用二进制存放;一个字节 8 个二进制位,示意图如下:
数的表示范围: -2^7~2^7-1(-128~127)
显然,一个字节表示数的范围是有限的。要表示更大范围内的数,就要使用多个字节。
7 0
10/54
整数的存储格式 字符型
短整型 短整数表示范围为: -2^15~2^15-1(-32768~32767)
长整型
长整数表示范围为: -2^31~2^31-1
7 0
15 8 7 0
31 24 23 16 15 8 7 0
11/54
实数的表示 实数也称为浮点数,用于表示小数;有两种形式:
– 十进制形式:xxxxx . xxxx– 指数形式:xxx . Exx
一般浮点数的可以达到 7 位有效数字。例如 1234.567 。双精度浮点数的有效位数可以达到 15~16 位。
尾数部分 指数部分
31 24 23 16 15 8 7 0
12/54
常数和变量 变化的量称变量; 不变化的量称常量; 常量和变量是计算机语言中数据的两种基本形式。
13/54
3.2 常量1.整型常量
–2 进制常量,例 10011101B , 10B –8 进制常量,例 04400 , 0777 , 0100–10 进制常量,例 2304–16 进制常量, 0x900 , 0xABC , 0xffff
2.实型常量–0.0, 2.68, 3.141593, 637.312, 32767.0, 32768.0,… –0.0E0, 6.226E4, 1.267E20, …
3.字符型常量–符号常量,例 #define PI 3–字符常量,例 'a', 'A', '1', ' ', '+', –转义常量 '\n'( 换行 ), '\r'( 回车 ), '\t'( 横向跳格 ), '\''( 单引号 ), …
4.字符串常量–"Visual C++", "12.34", "This is a string.\n", …
5.CONST 常量 CONST DOUBLE PI=3.1415926;
14/54
( 1 )符号常量 用 #define 定义的常数;类似变量,但不是变量。
– 例如: #define PI 3.1415926– #define MAXNUM 10000
可以出现在表达式中; – f1= r * r * PI;
但是不能作左值 , 下列用法是错误的:– PI = PI*PI ;
用 const 定义的常数– const double pi=3.1415926;
15/54
( 2 )文字数据表示 文字数据有两种:
– 单个字符, 例如,‘ A’ 、‘ \0’ 、‘ ‘ 等– 字符串,例如,“ This is a string .”
计算机中的文字使用 ASCII 字符,总共有 128 个:– 10 个阿拉伯数字– 52 个英文字母– 32 控制字符(非显示字符)– 34 个特殊字符
16/54
ASCII 码对应的字符:– ‘A’ 的值 65 、‘ a’ 的值 97 (差是 32 )– ‘0’ 的值 48– 回车键的值 13 、 ESC 键的值 27– 问号‘?’的值 63 、‘ *’ 的值 42
17/54
3.3 变量 C ++ 的数据变量说明语句的格式为 : < 类型说明符 > < 变量名 1> ; 4 种C ++ 整数数据类型的说明符分别为 :
– char c1, c2; // 说明了 2 个字符型变量 – int i, j, k; // 说明了 3 个整型变量– long len; // 说明了 1 个长整型变量
说明浮点类型和双精度类型的变量 – float average, sum; // 说明了两个浮点类型的变量
– double distance, weight; // 说明了两个双精度类型的变量
18/54
( 1 )变量定义 用基本数据类型描述符说明的对象是定义的变量。
例如:– int i,j,k,*p;– float eps,f0,f1[5];– char c0,c1,c2[100];– double array[10][10];
19/54
(2) 变量 ( 标识符 ) 命名 命名规则:
– ( 1 )变量名只能由字母、数字或下划线组成;– ( 2 )变量名的第一个字符必须是字母或下划线;– ( 3 )变量名长度不超过 32 个字符( TC );– ( 4 )不要用保留字定义变量名(有 32 个保留字)。
合法变量名:– a 、 b1 、 _area 、 employee_name
不合法变量名 :– 1-name 、 max one 、 float 、 *account
20/54
( 3 )变量使用规则 先定义,后使用;
– 例如: int a , b , c ; – a=1 ; b=2 ;– c= a+b ;
下列用法是错误的:– b=a+c ;– cout<<max;
不能用保留字作变量名– 例如: sin=1.0;– cout= “Print Formatting.”;
21/54
( 4 )变量初始化 变量初始化就是给变量赋初值;有两种形式:– 先定义,再赋初值;– 例如: int sum , fac ;– sum=0 ; fac=1 ;– 定义时赋值– 例如: char c=‘A’;– int count = 0;
22/54
(5) 类型修饰符 在基本数据类型前加类型修饰符,可以改变数据表示的范围。常用的有:– unsigned —— 无符号– long —— 长型– short —— 短型
例如:– unsigned char 表示范围变为 0~255– unsigned int 表示范围变为 0~65535
23/54
整型数据的溢出– void main()– { short a , b;– a=32767; b=a+1;– printf("%d , %d" , a , b);– }– 运行结果为: 32767 , -32768
24/54
例 3.1 VC0301.CPP 用牛顿迭代法求平方根。迭代公式为: 迭代结束的条件为: 算法分析:
定义两个工作变量 x0 和 x1;
x1 = 1; // 迭代初值取 1
do
{ x0 = x1;
}while(x1 与 x0 的相对误差大于控制参数 ε);
2
)/(1
nnn
xaxx
1
1
n
nn
x
xx
001 2
1
x
qxx
25/54
程序逻辑功能框图
输入成绩 X输入成绩 X
X0 = X1
X1 = ( X0+X / X0 ) / 2
X0 = X1
X1 = ( X0+X / X0 ) / 2
打印结果 X1打印结果 X1
X1=1.0
|(X0-X1)/X1|>=eps?是
否
26/54
// 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;
27/54
– if(x>0.0)– { do {x0 = x1;– x1 = (x0+x/x0)/2;– } while(fabs((x0-x1)/x1)>=EPS);
//fabs() 函数为求绝对值的库函数– y= x1;– }– else– y= x;
28/54
求平方根程序主函数 main ()– if(y<0)– cout << "Negative Value have
not square root !" << endl;– else– cout << "The square root of "
<< x << " is " << y << endl;– return 0;– }
29/54
字符和字符串的区别 字符是用单引号括起来的单个字符,它在存储器中占 1 个字节;
字符串是用双引号括起来的一串字符,它在存储器中占 n+1 个字节,即字符串的结束符‘ \0’ 也占 1 个字节的位置。
‘A’ 和“ A” 是有区别的;前者是字符常数,后者是字符串常数。
30/54
例 3-2 根据键盘输入的首字符选择对应颜色
算法– 枚举类型颜色的符号值可以通过读入其前一个或两个字符来区分,可以先从键盘上读入两个字符,然后用选择结构将对应的值找出来并赋给变量,对该变量再一次使用选择结构打印输出正确的符号值。
31/54
// 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;
32/54
// 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;
}
33/54
// 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;
34/54
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;
}
35/54
程序设计举例 例 3-3 编写程序制作九九乘法表 例 3-4 计算 1!+2! +3! +4! +......+10! 例 3-5 求 的近似值 例 3-6 根据三边长求三角形面积 例 3-7 输入一个四位无符号整数,反序输出这四位数的四个数字字符
例 3-8 编写一个可以打印任何一年的日历的程序
36/54
// 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;
}
37/54
九九乘法表输出1*1=11*2=2 2*2=41*3=3 2*3=6 3*3=91*4=4 2*4=8 3*4=12 4*4=161*5=5 2*5=10 3*5=15 4*5=20 5*5=251*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=361*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=421*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=481*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54
38/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;
}
39/54
例 3-5 求 的近似值 算法 利用公式:
计算,直到最后一项的绝对值小于 104 为止。
...7
1
5
1
3
11
4
40/54
// 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;
}
41/54
例 3-6 根据三边长求三角形面积
算法 利用海伦公式:
其中 a, b, c 分别为三角形三条边的长度。
))()(( csbsassA ))()(( csbsassA
)(2
1cbas )(
2
1cbas
42/54
// 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;– }
43/54
例 3-7 输入一个四位无符号整数
算法 :从输入的无符号整数 n 中依次分解出个位数字,十位数字,百位数字,千位数字并依次存放到变量 c1,c2,c3,c4 中,
将 n%10 的值即个位数字存入 c1 中 将 n/10%10 的值即十位数字存入 c2 中 将 n/100%10 的值即百位数字存入 c3 中 将 n/1000 的值即千位数字存入 c4 中 再将各数字值 +'0' 则转为对应的数字字符。
44/54
// 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;
}
45/54
例 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 [ 求出最后的星期数 ]
46/54
程序逻辑功能框图
输入年 year输入年 year
调用 isleap ()判断是否闰年调用 isleap ()判断是否闰年
调用子函数求元旦是星期几week_of_newyear_day()
调用子函数求元旦是星期几week_of_newyear_day()
Month<=12?Month<=12?
Month=1
打印当前月日历打印当前月日历month=month+1month=month+1 是
否
47/54
打印当前月处理框图
确定当月 1 日的位置确定当月 1 日的位置
确定月天数len_of_month
确定月天数len_of_month
月天数 =
30 天 小月31 天 大月28 天 平 2 月29 天 闰 2 月
day<= 月天数?day<= 月天数?
打印当前日期打印当前日期
是否 7 天?是否 7 天?
换行
day= day+1day= day+1 否
是
是
day =1否
48/54
程序模块结构
主函数 main()主函数 main()
子函数求元旦的星期数week_of_newyears_day()
子函数判别闰月Isleap ()
子函数判别闰月Isleap ()
49/54
确定闰年子函数程序#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;}
50/54
求元旦是星期几子函数// 函数 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;
}
51/54
// 主函数 : 打印年历– int main()– { int year, month, day, weekday, len_of_mo
nth, i;– cout << "Please input year: ";– cin >> year; // 打印年历– cout << endl << year << endl; // 打印年份
– weekday = week_of_newyears_day(year);// 求元旦是星期几
52/54
– for(month=1; month<=12;month=month+1)// 打印 12 个月的月历
– {– cout << endl << month << endl;– cout << "---------------------------------" << e
ndl;– cout << "SUN MON TUE WED THU
FRI SET" << endl;– cout << "---------------------------------" << e
ndl;
53/54
确定当月的天数for(i=0;i<weekday;i=i+1)// 找当月 1 日的打印位置
cout << " ";if(month==4 || month== 6 || month==9 || month==11)
len_of_month = 30;else if(month==2){ if(isleap(year))
len_of_month = 29;else
len_of_month = 28;}else
len_of_month = 31;
54/54
打印当月的日历for(day=1;day<=len_of_month;day=day+1)// 打印当月日期
{ if(day>9)cout << day << " ";
elsecout << day << " ";
weekday = weekday+1;if(weekday==7) // 打满一星期应换行{ weekday = 0;
cout << endl;}
}cout << endl; // 打完一月应换行
}return 0;
}
55/54
习题
2 .输入两个角度值 x 、 y ,计算如下式子的值。
3 .用牛顿迭代法求方程: 2x3—4x2 十 3x 一 6= 0 在 1.5 附近的根。4 .打印出以下的杨辉三角形(要求打印出 10行)
|)cos(|
|)||sin(|
yx
yx