2.1 C++ 语言概述
1、程序示例
//2_1.cpp #include <iostream> using namespace std; void main(void) { cout<<"Hello! "; cout<<"Welcome to c++! "; }
运行结果: Hello!
Welcome to c++!
2、C++字符集
大小写的英文字母:A~Z,a~z
数字字符:0~9
特殊字符: 空格 ! # % ^ & *
_(下划线) + = - ~ <
> / ' " ; . , () [] {}
3、词法记号
关键字 C++预定义的单词
标识符 程序员声明的单词,它命名程序正文中的一些实体
文字 在程序中直接使用符号表示的数据
操作符 用于实现各种运算的符号
分隔符 () {} , : ; 用于分隔各个词法记号或程序正文
空白符 空格、制表符(TAB键产生的字符)、换行符(Enter键所产生的字符)和注释的总称
2.2 基本数据类型和表达式
2.2.1基本数据类型
2.2.2 常量
- 整型常量:正整数、负整数、零。表示形式有:十进制、八进制和十六进制
- 实型常量:一般形式和指数形式,如 0.345E+2
- 字符常量:'a', 'D', '?', '$'
- 字符串常量:一对双引号括起来的字符序列
- 布尔常量:false 和 true
2.2.3 变量
变量的存储类型:
- auto 属于一时性存储,其存储空间可以被若干变量多次覆盖使用。
- register 存放在通用寄存器中。
- extern 在所有函数和程序段中都可引用。
- static 在内存中是以固定地址存放的,在整个程序运行期间都有效。
2.2.4 符号常量
const 数据类型说明符 常量名=常量值 ;
或
数据类型说明符 const 常量名=常量值 ;
例如:以声明一个代表圆周率的符号常量
const float PI= 3.1415926:
注:符号常量在声明时一定要赋初值,而在程序中闯不能改变其值
2.2.5 运算符与表达式
- 基本算术运算符 + - * / (若整数相除,结果取整) %(取余,操作数为整数)
- 优先级与结合性 先乘除,后加减,同级自左至右
- ++, --(自增、自减) 例:i++; -- j;
2、逗号运算和逗号表达式
格式:表达式1,表达式2
求解顺序及结果:先求解1,再求解2,最终结果为表达式2的值
3、条件运算符与条件表达式:
- 一般形式:表达式1?表达式2:表达式3 (表达式1 必须是 bool 类型) 例: x=a>b? a:b;
- 执行顺序:
- 先求解表达式1,
- 若表达式1的值为true,则求解表达式2,表达式2的值为最终结果
- 若表达式1的值为false,则求解表达式3,表达式3的值为最终结果
注意:条件运算符优级高于赋值运算符,低于逻辑运算符
4、sizeof运算符
语法形式 sizeof (类型名) 或 sizeof 表达式
结果值: “类型名”所指定的类型或“表达式”的结果类型所占的字节数。
例:
sizeof(short) sizeof(x)
7、位运算
- 按位与&:将两个操作数对应的每一位分别进行逻辑与操作。
- 用途:
- 将某一位置0,其它位不变。
- 取指定位。
- |按位或 :将两个操作数对应的每一位分别进行逻辑或操作。
- 用途:将某些位置1,其它位不变。
- 按位异或^ :将两个操作数对应的每一个位进行异或,具体运算规则是:若对应位相同,则该位的运算结果为0;若对应位不同,则该位的运算结果为1。
- 用途:使特定位翻转(与0异或保持原值,与1异或取反)
- 按位取反~:按位取反是一个单目运算符,其作用是对一个二进制数的每一位取反
- 左移运算<<:左移后,低位补0,高位舍弃
- 右移运算>>:右移后,低位:舍弃 ;高位:无符号数:补0 有符号数:补“符号位”
8、运算符优先级与结合性
9、混合数据类型转换:在算术运算和关系运算中如果参与运算的操作数类型不一致,编译系统会自动对数据进行转换(即隐含转换)
- 隐式转换:低类型数据转换为高类型数据
- 这种转换是安全的,因为在转换过程中数据的精度没有损失。
- 显式转换:强制类型转换
- 语法形式: 类型说明符(表达式) 或 (类型说明符)表达式
2.2.6 语句
2.3 数据的输入与输出
2.3.1 I/O流
插入操作。数据的输入与输出是通过I/O流来实现的,cin和cout是预定义的流类对象。
cin 用来处理标准输入,即键盘输入。
cout 用来处理标准输出,即屏幕输出。
2.3.2 预定义的插入符和提取符
cout 流插入运算符 <<
cin 流提取运算符 >>
#include <iostream> using namespace std; int main( ) { char name[50]; cout << "请输入您的名称: "; cin >> name; cout << "您的名称是: " << name << endl; }
endl 用于在行末添加一个换行符
流插入运算符 << 和 流提取运算符 >> 在一个语句中可以多次使用,如上面实例中所示。
2.4 算法的基本控制
算法的基本控制结构有3种:顺序结构、选择结构和循环结构。
2.4.1 if 语句
三种形式
if (表达式) 语句
例:if (x>y) cout<<x;
if (表达式) 语句1 else 语句2
例:if (x>y) cout<<x;
else cout<<y;
if (表达式1) 语句1
else if (表达式2) 语句2
else if (表达式3) 语句3
…
else 语句 n
2.4.2 多重选择结构
#include<iostream> using namespace std; void main() { int x,y; cout<<"Enter x and y:"; cin>>x>>y; if (x!=y) if (x>y) cout<<"x>y"<<endl; else cout<<"x<y"<<endl; else cout<<"x=y"<<endl;
if语句嵌套 一般形式:
if ( )
if ( ) 语句 1
else 语句 2
else
if ( ) 语句 3
else 语句 4
注意:语句 1、2、3、4 可以是复合语句,每层的 if 与 else 配对,或用 { } 来确定层次关系。
//输入一个0~6的整数,转换成星期输出。 #include <iostream> using namespace std; void main(void) { int day; cin >> day; switch (day) { case 0: cout << "Sunday" << endl; break; case 1: cout << "Monday" << endl; break; case 2: cout << "Tuesday" << endl; break; case 3: cout << "Wednesday" << endl; break; case 4: cout << "Thursday" << endl; break; case 5: cout << "Friday" << endl; break; case 6: cout << "Saturday" << endl; break; default: cout << "Day out of range Sunday .. Saturday" << endl; break; } }
一般形式:
switch (表达式)
{ case 常量表达式 1:语句1
case 常量表达式 2:语句2
┆
case 常量表达式 n:语句n
default : 语句n+1
}
执行顺序:case中的常量表达式值为入口标号,由此开始顺序执行。因此,每个case分支最后应该加break语句。
注意问题:
- case分支可包含多个语句,且不用{ }。
- 表达式、判断值都是int型或char型。
- 若干分支执行内容相同可共用一组语句。
2.4.3 循环结构与选择
形式: while (表达式) 语句
//求自然数1~10之和 #include<iostream> using namespace std; void main() { int i(1), sum(0); while(i<=10) { sum+=i; //相当于sum=sum+i; i++; } cout<<"sum="<<sum<<endl; }
do 语句
while (表达式)
//输入一个整数,将各位数字反转后输出。 #include <iostream> using namespace std; void main(void) { int n, right_digit, newnum = 0; cout << "Enter the number: "; cin >> n; cout << "The number in reverse order is "; do { right_digit = n % 10; cout << right_digit; n /= 10; //相当于n=n/10 } while (n != 0); cout<<endl; }
语法形式:
for (表达式1;表达式2;表达式3) 语句
#include <iostream> using namespace std; void main(void) { int n, k; cout << "Enter a positive integer: "; cin >> n; cout << "Number " << n << " Factors "; for (k=1; k <= n; k++) if (n % k == 0) cout << k << " "; cout << endl; }
例题:编写程序输出以下图案
*
***
*****
*******
*****
***
*
#include<iostream> using namespace std; void main() { int i,j,n=4; for(i=1;i<=n;i++) //输出前4行图案 { for(j=1;j<=30;j++) cout<<' '; //在图案左侧空30列 for(j=1; j<=8-2*i ;j++) cout<<' '; for(j=1; j<=2*i-1 ;j++) cout<<'*'; cout<<endl; } for(i=1;i<=n-1;i++) //输出后3行图案 { for(j=1;j<=30;j++) cout<<' '; //在图案左侧空30列 for(j=1; j<=7-2*i ;j++) cout<<'*'; cout<<endl; } }
循环结构与选择结构的嵌套
#include<iostream> using namespace std; void main() { int n; for(n=100; n<=200; n++) { if (n%3!=0) cout<<n; } }
例题:读入一系列整数,统计出正整数个数i和负整数个数j,读入0则结束。
#include<iostream> using namespace std; void main() { int i=0, j=0, n; cout<<"请输入若干整数(输入0则结束):"; cin>>n; while( n!=0 ) { if(n>0) i++; if(n<0) j++; cin>>n ; } cout<<"正整数个数:"<<i<<" 负整数个数:"<<j<<endl; }
2.4.5 其他控制语句
break语句
使程序从循环体和switch语句内跳出,继续执行逻辑上的下一条语句。不宜用在别处。
continue 语句
结束本次循环,接着判断是否执行下一次循环
2.5 自定义数据类型
2.5.1 typedef
为一个已有的数据类型另外命名
语法形式 typedef 已有类型名 新类型名表;
例如
typedef double area,volume;
typedef int natural;
natural i1,i2;
area a;
volume v;
2.5.2 枚举类型enum
枚举类型应用说明:
- 对枚举元素按常量处理,不能对它们赋值。例如,不能写:sun=0;
- 枚举元素具有缺省值,它们依次为: 0,1,2,......。
- 也可以在声明时另行指定枚举元素的值,如:
-
enum weekday {sun=7,mon=1,tue,wed,thu,fri,sat};
- 枚举值可以进行关系运算。
- 整数值不能直接赋给枚举变量,如需要将整数赋值给枚举变量,应进行强制类型转换。
例子:设某次体育比赛的结果有四种可能:胜(win)、负(lose)、平局(tie)、比赛取消(cancel),编写程序顺序输出这四种情况。
#include <iostream> using namespace std; enum game_result {WIN, LOSE, TIE, CANCEL}; int main() { game_result result; enum game_result omit = CANCEL; int count; for (count = WIN ; count <= CANCEL ; count++) { result = (game_result)count; if (result == omit) { cout << "The game was cancelled "; } else { cout << "The game was played "; if (result == WIN) cout << "and we won!"; if (result == LOSE) cout << "and we lost."; cout << " "; } } return 0; }
2.5.3 结构体 - 结构的声明
结构:是由不同数据类型的数据组成的集合体
struct 结构名
{
数据类型 成员名 1;
数据类型 成员名 2;
……
数据类型 成员名 n;
};
举例:
struct student //学生信息结构体
{
int num; //学号
char name[20]; //姓名
char gender; //性别
int age; //年龄
float score; //成绩
char addr[30]; //住址
}
结构体变量形式:
结构名 结构变量名;
注意:
- 结构变量的存储类型概念、它的寿命、可见性及使用范围与普通变量完全一致。
- 结构变量说明在结构类型声明之后,二者也可同时进行。
- 结构变量占内存大小可用 sizeof 运算求出: sizeof(运算量)
初始化: 说明结构变量的同时可以直接设置初值。
使用: 结构体成员的引用形式: 结构变量名.成员名
结构体变量的初始化和使用
#include <iostream> #include <iomanip> using namespace std; struct student //学生信息结构体 { int num; //学号 char name[20]; //姓名 char gender; //性别 int age; //年龄 }stu={97001,"Lin Lin",'F',19}; void main() { cout<<setw(7)<<stu.num<<setw(20)<<stu.name <<setw(3)<<stu.sex<<setw(3)<<stu.age; }
2.54 联合体
union 联合名
{
数据类型 成员名 1;
数据类型 成员名 2;
……
数据类型 成员名 n;
};
例子:
union uarea
{ char c_data;
short s_data;
long l_data;
}
2.54 无名联合体
无名联合没有标记名,只是声明一个成员项的集合,这些成员项具有相同的内存地址,可以由成员项的名字直接访问。
例:
union
{ int i;
float f;
}
在程序中可以这样使用:
i=10;
f=2.2;