55
大大 C++ 大大大大大大 大大大大大 西 大大大大大大大大大 http:// ctec.xjtu.edu.cn

大学 C++ 程序设计教程

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

Page 1: 大学 C++ 程序设计教程

大学 C++ 程序设计教程

西安交通大学计算机教学实验中心http://ctec.xjtu.edu.cn

Page 2: 大学 C++ 程序设计教程

2/54

第 3 章 基本数据类型 本章目标

– C++ 语言的基本数据类型» 整型、实型

– C++ 语言的数据 ( 形式 )

» 常数、变量

Page 3: 大学 C++ 程序设计教程

3/54

授 课 内 容 3.1 数据类型 3.2 常量 3.3 变量 3.4 枚举类型 3.5 typedef 语句 3.6 类型修饰符 3.7 八进制和十六进制常量 程序设计举例 编程提示

Page 4: 大学 C++ 程序设计教程

4/54

3.1 数据类型– 程序的主要任务是对数据进行处理,而数据有多种类型,如数值数据、文字数据、图像数据以及声音数据等,其中最基本的、也是最常用的是数值数据和文字数据。

– 不同类型的数据在存储器中存放的格式也不相同 – 程序中对各种数据进行处理之前都要对其类型 ( 也就是存储格式 ) 预先加以说明,这样做一是便于为这些数据分配相应的存储空间,二是说明了程序处理数据时应采用何种具体运算方法。

– 数值数据,其存储格式又可以分为整型、长整型、浮点型和双精度型等几种类型 ;

– 文字数据也可以分为单个字符和字符串。

Page 5: 大学 C++ 程序设计教程

5/54

数据的表示 C ++ 的数据有两种:常量和变量。

– 常量通过本身的书写格式就说明了该常量的类型;– 变量必须先说明其类型,否则程序无法为该变量分配存储空间。

在计算机中为了区别不同的数,使用了不同的表示 方法。包括:

– 整数的表示– 实数的表示– 字符数据的表示– 数组的表示

Page 6: 大学 C++ 程序设计教程

6/54

数据类型 计算机只能存放二进制数据。不同类型的事物如何区分和描述?由此产生数据类型。

不同类型的数据占据不同长度的存储单元。 不同类型的数据对应不同的值域范围。 不同类型的数据对应不同的操作(运算)及规则。

数据类型越丰富,求解能力越强大。

Page 7: 大学 C++ 程序设计教程

7/54

图 3.1 C++ 数据类型的分类

Page 8: 大学 C++ 程序设计教程

8/54

基本数据类型 C++ 语言的基本数据类型:

数据类型 类型说明浮 占用字节– 字符型 char 1 个– 短整数 short 2 个– 整型 int 4 个– 浮点型 float 4 个– 双精度型 double 8 个

Page 9: 大学 C++ 程序设计教程

9/54

数据在计算机中的存放

数据在计算机中采用二进制存放;一个字节 8 个二进制位,示意图如下:

数的表示范围: -2^7~2^7-1(-128~127)

显然,一个字节表示数的范围是有限的。要表示更大范围内的数,就要使用多个字节。

7 0

Page 10: 大学 C++ 程序设计教程

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

Page 11: 大学 C++ 程序设计教程

11/54

实数的表示 实数也称为浮点数,用于表示小数;有两种形式:

– 十进制形式:xxxxx . xxxx– 指数形式:xxx . Exx

一般浮点数的可以达到 7 位有效数字。例如 1234.567 。双精度浮点数的有效位数可以达到 15~16 位。

尾数部分 指数部分

31 24 23 16 15 8 7 0

Page 12: 大学 C++ 程序设计教程

12/54

常数和变量 变化的量称变量; 不变化的量称常量; 常量和变量是计算机语言中数据的两种基本形式。

Page 13: 大学 C++ 程序设计教程

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;

Page 14: 大学 C++ 程序设计教程

14/54

( 1 )符号常量 用 #define 定义的常数;类似变量,但不是变量。

– 例如: #define PI 3.1415926– #define MAXNUM 10000

可以出现在表达式中; – f1= r * r * PI;

但是不能作左值 , 下列用法是错误的:–      PI = PI*PI ;

用 const 定义的常数–      const double pi=3.1415926;

Page 15: 大学 C++ 程序设计教程

15/54

( 2 )文字数据表示 文字数据有两种:

– 单个字符, 例如,‘ A’ 、‘ \0’ 、‘ ‘ 等– 字符串,例如,“ This is a string .”

计算机中的文字使用 ASCII 字符,总共有 128 个:– 10 个阿拉伯数字– 52 个英文字母– 32 控制字符(非显示字符)– 34 个特殊字符

Page 16: 大学 C++ 程序设计教程

16/54

ASCII 码对应的字符:– ‘A’ 的值 65 、‘ a’ 的值 97 (差是 32 )– ‘0’ 的值 48– 回车键的值 13 、 ESC 键的值 27– 问号‘?’的值 63 、‘ *’ 的值 42

Page 17: 大学 C++ 程序设计教程

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; // 说明了两个双精度类型的变量

Page 18: 大学 C++ 程序设计教程

18/54

( 1 )变量定义 用基本数据类型描述符说明的对象是定义的变量。

例如:– int i,j,k,*p;– float eps,f0,f1[5];– char c0,c1,c2[100];– double array[10][10];

Page 19: 大学 C++ 程序设计教程

19/54

(2) 变量 ( 标识符 ) 命名 命名规则:

– ( 1 )变量名只能由字母、数字或下划线组成;– ( 2 )变量名的第一个字符必须是字母或下划线;– ( 3 )变量名长度不超过 32 个字符( TC );– ( 4 )不要用保留字定义变量名(有 32 个保留字)。

合法变量名:– a 、 b1 、 _area 、 employee_name

不合法变量名 :– 1-name 、 max one 、 float 、 *account

Page 20: 大学 C++ 程序设计教程

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.”;

Page 21: 大学 C++ 程序设计教程

21/54

( 4 )变量初始化 变量初始化就是给变量赋初值;有两种形式:– 先定义,再赋初值;– 例如: int sum , fac ;– sum=0 ; fac=1 ;– 定义时赋值– 例如: char c=‘A’;– int count = 0;

Page 22: 大学 C++ 程序设计教程

22/54

(5) 类型修饰符 在基本数据类型前加类型修饰符,可以改变数据表示的范围。常用的有:– unsigned —— 无符号– long —— 长型– short —— 短型

例如:– unsigned char 表示范围变为 0~255– unsigned int 表示范围变为 0~65535

Page 23: 大学 C++ 程序设计教程

23/54

整型数据的溢出– void main()– { short a , b;–   a=32767; b=a+1;– printf("%d , %d" , a , b);– }– 运行结果为: 32767 , -32768

Page 24: 大学 C++ 程序设计教程

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

Page 25: 大学 C++ 程序设计教程

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?是

Page 26: 大学 C++ 程序设计教程

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;

Page 27: 大学 C++ 程序设计教程

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;

Page 28: 大学 C++ 程序设计教程

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;– }

Page 29: 大学 C++ 程序设计教程

29/54

字符和字符串的区别 字符是用单引号括起来的单个字符,它在存储器中占 1 个字节;

字符串是用双引号括起来的一串字符,它在存储器中占 n+1 个字节,即字符串的结束符‘ \0’ 也占 1 个字节的位置。

‘A’ 和“ A” 是有区别的;前者是字符常数,后者是字符串常数。

Page 30: 大学 C++ 程序设计教程

30/54

例 3-2 根据键盘输入的首字符选择对应颜色

算法– 枚举类型颜色的符号值可以通过读入其前一个或两个字符来区分,可以先从键盘上读入两个字符,然后用选择结构将对应的值找出来并赋给变量,对该变量再一次使用选择结构打印输出正确的符号值。

Page 31: 大学 C++ 程序设计教程

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;

Page 32: 大学 C++ 程序设计教程

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;

}

Page 33: 大学 C++ 程序设计教程

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;

Page 34: 大学 C++ 程序设计教程

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;

}

Page 35: 大学 C++ 程序设计教程

35/54

程序设计举例 例 3-3 编写程序制作九九乘法表 例 3-4 计算 1!+2! +3! +4! +......+10! 例 3-5 求 的近似值 例 3-6 根据三边长求三角形面积 例 3-7 输入一个四位无符号整数,反序输出这四位数的四个数字字符

例 3-8 编写一个可以打印任何一年的日历的程序

Page 36: 大学 C++ 程序设计教程

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;

}

Page 37: 大学 C++ 程序设计教程

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

Page 38: 大学 C++ 程序设计教程

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;

}

Page 39: 大学 C++ 程序设计教程

39/54

例 3-5 求 的近似值 算法 利用公式:

计算,直到最后一项的绝对值小于 104 为止。

...7

1

5

1

3

11

4

Page 40: 大学 C++ 程序设计教程

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;

}

Page 41: 大学 C++ 程序设计教程

41/54

例 3-6 根据三边长求三角形面积

算法 利用海伦公式:

其中 a, b, c 分别为三角形三条边的长度。

))()(( csbsassA ))()(( csbsassA

)(2

1cbas )(

2

1cbas

Page 42: 大学 C++ 程序设计教程

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;– }

Page 43: 大学 C++ 程序设计教程

43/54

例 3-7 输入一个四位无符号整数

算法 :从输入的无符号整数 n 中依次分解出个位数字,十位数字,百位数字,千位数字并依次存放到变量 c1,c2,c3,c4 中,

将 n%10 的值即个位数字存入 c1 中 将 n/10%10 的值即十位数字存入 c2 中 将 n/100%10 的值即百位数字存入 c3 中 将 n/1000 的值即千位数字存入 c4 中 再将各数字值 +'0' 则转为对应的数字字符。

Page 44: 大学 C++ 程序设计教程

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;

}

Page 45: 大学 C++ 程序设计教程

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 [ 求出最后的星期数 ]

Page 46: 大学 C++ 程序设计教程

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 是

Page 47: 大学 C++ 程序设计教程

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否

Page 48: 大学 C++ 程序设计教程

48/54

程序模块结构

主函数 main()主函数 main()

子函数求元旦的星期数week_of_newyears_day()

子函数判别闰月Isleap ()

子函数判别闰月Isleap ()

Page 49: 大学 C++ 程序设计教程

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;}

Page 50: 大学 C++ 程序设计教程

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;

}

Page 51: 大学 C++ 程序设计教程

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);// 求元旦是星期几

Page 52: 大学 C++ 程序设计教程

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;

Page 53: 大学 C++ 程序设计教程

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;

Page 54: 大学 C++ 程序设计教程

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;

}

Page 55: 大学 C++ 程序设计教程

55/54

习题

2 .输入两个角度值 x 、 y ,计算如下式子的值。

3 .用牛顿迭代法求方程: 2x3—4x2 十 3x 一 6= 0 在 1.5 附近的根。4 .打印出以下的杨辉三角形(要求打印出 10行)

|)cos(|

|)||sin(|

yx

yx