第二章—C++简单程序设计(一)

计算机的最基本的功能是数据处理

C++支持的基本数据类型:整数、实数、字符、布尔数据

C++支持的基本运算:算术运算、关系运算、逻辑运算、位运算、逗号运算、条件运算

程序要能够输入数据、输出数据

C++中的输入/输出可以调用预定义的功能模块实现

程序的执行流程

顺序的,因此程序要能够对执行流程进行选择(选择、开关语句);

反复用同一算法依次处理大批量数据(循环语句)。

枚举类型

通过列出所有可取值来定义一种新类型。


C++的特点和程序实例

C++的产生和发展

从C语言发展演变而来,最初被称为“带类的C”;
  • 1983年正式取名为C++;
  • 1998年11月被国际标准化组织(ISO)批准为国际标准;
  • 2003年10月15日发布第2版C++标准ISO/IEC 14882:2003;
  • 2011年8月12日ISO公布了第三版C++标准C++11,包含核心语言的新机能、扩展C++标准程序库。
  • 2014年8月18日ISO公布了C++14,其正式名称为“International Standard ISO/IEC 14882:2014(E) Programming Language C++”.
  • C++14作为C++11的一个小扩展,主要提供漏洞修复和小的改进。
C++的特点
  • 兼容C,支持面向过程的程序设计;
  • 支持面向对象的方法;
  • 支持泛型程序设计方法。
命名空间
  • 避免命名冲突
  • std是C++标准库的命名空间(namespace)名
  • using namespace std表示打开std命名空间
2-1
#include <iostream>
using namespace std;
int main() {
cout << "Hello!" << endl;
cout << "Welcome to c++!" << endl;
return 0;
}

运行结果:
Hello!
Welcome to c++!

C++字符集和词法记号

字符集
  • 大小英文字母:A~Z,a~z
  • 数字字符:0~9
  • 特殊字符:! # % ^ & * _ + = - ~ < > / \ ' " ; . , : ? ( ) [ ] { } |
记号
  • 关键字——C++与的定义的单词
  • 标识符——程序员声明的单词,它命名程序正文中的一些实体
  • 文字——在程序中直接使用符号表示的数据
  • 分隔符——() {} , : ;    用于分隔各个词法记号或程序正文
  • 运算符(操作符)——用于实现各种运算的符号
  • 空白符——空格、制表符(TAB键产生的字符)、垂直制表符、换行符、回车符和注释的总称
标识符构成规则
  • 大写字母、小写字母或下划线开始
  • 可以有以大写字母、小写字母、下划线(_)或数字0~9组成
  • 大写字母和小写字母代表不同的标识符
  • 不能是C++关键字或操作符

基本数据类型、常量、变量

C++能够处理的基本数据类型
  • 整数类型
  • 浮点数类型;
  • 字符类型;
  • 布尔类型。
程序中的数据
  • 常量:①在源程序中直接写明的数据;②其值在整个程序运行期间不可改变。
变量:在程序运行过程中允许改变的数据。
整数类型
  • 基本的整数类型:int
  • 按符号分:符号的(signed)、无符号的(unsigned)
  • 按照数据范围分:短整数(short)、长整数(long)、长长整数(long long)
  • ISO C++标准并没有明确规定每种数据类型的字节数和取值范围,它只是规定它们之间的字节数大小顺序满足:(signed/unsigned)signed char ≤ (unsigned) short int ≤ (unsigned) int ≤ (unsigned) long int ≤ long long int
字符类型(char)
  • 容纳单个字符的编码
  • 实质上存储的也是整数。
浮点数类型
  • 单精度(float)
  • 双精度(double)
  • 扩展精度(long double)
字符串类型
  • 字符串常量
  • 基本类型中没有字符串变量
  • 采用字符数组存储字符串(C风格的字符串)
  • 标准C++类库中的String类(C++风格的字符串)
布尔类型(bool)
  • 只有两个值:true(真)、false(假)
  • 常用来表示关系比较、相等比较或逻辑运算的结果
基本类型取值范围

常量
  • 在程序运行的整个过程中始终不可改变的量;
  • 直接使用符号(文字)表示的值;
  • 例如:12,3.5,'A'都是常量。
整数常量
  • 文字形式出现的整数
  • 十进制:若干个0~9的数字,但数字部分不能以0开头,正数前边的正号可以省略。
  • 八进制:前导0+若干个0~7的数字
  • 十六进制:前导0x+若干个0~9的数字及A~F的字母(大小写均可)
  • 后缀:后缀L(或 l)表示类型少是long,后缀LL(或 ll)表示类型是long long,后缀U(或 u)表示unsigned类型。
浮点数常量
  • 文字形式出现的实数
  • 一般形式:例如,12.5,-12.5等。
  • 指数形式:例如,0.345E+2,-34.4E-3;整数部分和小数部分可以省略其一。
  • 浮点常量默认为double型,如果后缀F(或 f)可以使其称为float型,例如:12.3f。
字符常量
  • 单引号括起来一个字符,如:'a'、'D'、'?'、'$';
  • C++转义字符列表(用于在程序中表示不可显示字符)

C风格字符串常量
  • 一对双引号括起来字符序列
  • 在内存中按串中字符的排列次序顺序存放,每个字符占一个字节;
  • 在末尾添加'\0'作为结尾标记。例:
通过添加前缀可以改变字符常量或者字符串常量的类型,前缀及其含义如下表所示:

变量:在程序的运行过程中,其值可变的量
  • 变量定义:数据类型 变量名1, 变量名2,...,变量名n;
  • 初始化:C++语言中提供了多种初始化方式;
例如:
int a = 0;
int a(0);
int a = {0};
int a{0};
其中使用大括号的初始化方式称为列表初始化,列表初始化时不允许信息的丢失。
例如用double值初始化int变量,就会造成数据丢失。
符号常量
  • 常量定义语句形式:①const 数据类型说明符 常量名 = 常量值;②数据类型说明符 const 常量名 = 常量值;
  • 例如,可以定义一个代表圆周率的符号常量:const float PI = 3.1415926;
  • 符号常量在定义时一定要初始化,在程序中间不能改变其值。

程序举例

题目:读入并显示整数
主要知识点:
①常量:在源程序中直接写明的数据,其值在整个程序运行期间不可改变,这样的数
据称为常量。
②变量:在运行过程中从计算机的外部设备(例如键盘、硬盘)读取的,这些数据的
值在程序运行过程中允许改变,这样的数据称为变量
③从键盘输入数据:iostream 类的对象cin 的>>操作,可以从标准输入设备(通常是键盘)读入
数据
④数据的存储:为了存储数据,需要预先为这些数据分配内存空间,变量的定义就是在给变量命名的时候分配内存空间。

源代码
#include <iostream>
using namespace std;
int main()
{
int radius;
cout<<"Please enter the radius!\n";
cin>>radius;
cout<<“The radius is:”<<radius<<‘\n’;
cout<<“PI is:”<<3.14<<‘\n’;
cout<<"Please enter a different radius!\n";
cin>>radius;
cout<<"Now the radius is changed to:"
<<radius<<‘\n’;
return 0;
}

题目:为常量命名
主要知识点:符号常量
源代码
#include <iostream>
using namespace std;
int main()
{ const double pi(3.14159);
int radius;
cout<<"Please enter the radius!\n";
cin>>radius;
cout<<"The radius is:"<<radius<<'\n';
cout<<"PI is:"<<pi<<'\n';
cout<<"Please enter a different radius!\n";
cin>>radius;
cout<<"Now the radius is changed to:"<<radius<<'\n';
cout<<"PI is still:"<<pi<<'\n‘;
//cin>>pi;
return 0;
}
运行结果
Please enter the radius!
2
The radius is:2
PI is:3.14159
Please enter a different radius!
3
Now the radius is changed to:3
PI is still:3.14159

题目:变量的初始化
主要知识点:变量的初始化
  • 虽然变量的值是可以在运行时获得的,但是在定义变量时也可以进行初始化,而
    且应该提倡进行初始化;
  • 未经初始化的变量,其值可能是随机的。如果误用了未经初始化也没有给予确定
    值的变量,就会引起错误。
源代码
#include <iostream>
using namespace std;
int main()
{
const double pi(3.14159);
int radius(0);
cout<<"The initial radius is:"<<radius<<'\n';
cout<<"PI is:"<<pi<<'\n‘; 。
cout<<"Please enter a different radius!\n";
cin>>radius;
cout<<"Now the radius is changed to:"<<radius<<'\n';
cout<<“PI is still:”<<pi<<‘\n’;
return 0;
}

算数运算赋值运算

算数运算

  • 基本算术运算符:+ - * /(若整数相除,结果取整),%(取余,操作数为整数)
  • 优先级与结核性:先乘除,后加减,同级自左至右
  • ++,--(自增、自减) 例:i++; --j;
赋值运算
  • 赋给变量
  • 赋值运算符“=”
  • 赋值表达式:①用赋值运算符连接的表达式;②例:n = 5    n = n + 5;③表达式的值:赋值运算符左边对象被赋值后的值;④表达式的类型:赋值运算符左边对象的类型
  • 复合的赋值运算符:①+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=;②例 a += 3等价于a = a + 3;x *= y + 8等价于x = x * (y + 8)

逗号运算、关系运算、逻辑运算和条件运算

逗号运算逗号表达式

  • 格式:表达式1,表达式2
  • 求解顺序及结果:①先求解表达式1,再求解表达式2;②最终结果为表达式2的值
  • 例 a = 3 * 5, a * 4 最终结果为60
关系运算关系表达式
  • 关系运算比较简单一种逻辑运算,优先次序为:
  • 关系表达式一种最简单逻辑表达式:其结果类型为bool,值只能为true或false
  • 例如:a > b, c <= a + b, x + y == 3
逻辑运算逻辑表达式
  • 逻辑运算符:①!(非)   &&(与)    ||(或);②优先次序:高 →低
  • 逻辑运算结果类型:bool,值只能为true或false
  • 逻辑表达式,例如:(a > b) && (x > y)
"&&"(逻辑与)运算
  • “&&”的运算规则:①两侧表达式都为真,结果为真;②有一侧表达式为假,结果为假。
  • “&&”的“短路特性”:表达式1 && 表达式2  ①先求解表达式1;②若表达式1的值为fasle,则最终结果为false,不再求解表达式2;③若表达式1的结果为true,则求解表达式2,以表达式2的结果作为最终结果
“||”(逻辑或)运算
  • “||”的运算规则:①两侧表达式都为假,结果为假;②有一侧表达式为真,结果为真。
  • “||”的“短路特性”:表达式1 || 表达式2  ①先求解表达式1;②若表达式1的值为true,则最终结果为true,不再求解表达式2;③若表达式1的结果为false,则求解表达式2,以表达式2的结果作为最终结果
条件运算符条件表达式
  • 一般形式:
表达式1 ? 表达式2 : 表达式3;
表达式1必须是bool类型
  • 执行顺序:①先求解表达式1;②若表达式1的值为true,则求解表达式2,表达式2的值为最终结果;③若表达式1的值为false,则求解表达式3,表达式3的值为最终结果
  • 例:x = a > b ? a : b; 如果a > b为true,计算结果为a,如果a > b为false,计算结果为b
条件运算的优先级
  • 条件运算符优先级高于赋值运算符,低于逻辑运算符,例
  • 表达式1式bool类型,表达式2、3的类型可以不同,条件表达式的最终类型为2和3中较高的类型

Sizeof运算、位运算

sizeof运算
  • 语法形式:sizeof(类型名)或 sizeof 表达式
  • 结果值:“类型名”所指定的类型或“表达式”的结果类型所占的字节数
  • 例:sizeof(short)     sizeof x
位运算——按位与(&)
  • 运算规则:将两个运算量的每一个位进行逻辑与操作
  • 举例:计算3 & 5
  • 用途:①将某一位置0,其他位不变。例如:将char型变量a的最低位置0:a = a & 0xfe;②取指定位。例如:有char c; int a;取出a的低字节,置于c中:c = a & 0xff;
运算——按位或(|)
  • 运算规则:将两个运算量的每一个位进行逻辑或操作
  • 举例:计算3 | 5
  • 用途:①将某些位置1,其他位不变;②例如:将int型变量a的低字节置1:a = a | 0xff;
运算——按位异或(^)
  • 运算规则:两个操作数进行异或;若对应位相同,则结果该位为0,若对应位不同,则结果该位为1.
  • 举例:计算071 ^ 052
  • 用途举例:使特定位翻转(与0异或保持原值,与1异或取反)
例如:要使01111010低四位翻转:

运算——取反(~)
  • 运算规则:单目运算符,对一个二进制数按位取反
  • 例, 025:0000000000010101    ~025:1111111111101010
位运算——移位(<<、>>)
  • 左移运算(<<):左移后,低位补0,高位舍弃
  • 右移运算(>>):右移后地位舍弃,高位无符号数补0,有符号数补“符号位”

运算优先级、类型转换

运算符优先级

优先级

运算符

结合性

1

[ ]  ( )  .  >    后置 ++   后置 –– 

左→右

2

前置 ++   前置 ––   sizeof   &   *   +(正号)  (负号) ~  ! 

右→左

3

(强制转换类型)

右→左

4

.*   ->*

左→右

5

*  /  %

左→右

6

左→右

7

<< >>

左→右

8

< > <=  >=

左→右

9

==  !=

左→右

10

&

左→右

11

^

左→右

12

|

左→右

13

&&

左→右

14

||

左→右

15

? :

右→左

16

=  *=  /=  %= +=  =  <<=  >>=&=  ^=  |=

右→左

17

,

左→右

混合运算时数据类型转换

  • 一些二元运算符(算术运算符、关系运算符、逻辑运算符、位运算符和赋值运算符)
    要求两个操作数的类型一致。
  • 在算术运算和关系运算中如果参与运算的操作数类型不一致,编译系统会自动对数据
    进行转换(即隐含转换),基本原则是将低类型数据转换为高类型数据。

数据输入输出

I/O流

  • 在在 C++中,将数据从一个对象到另一个对象的流动抽象为“流”。流在使用前要被建
    立,使用后要被删除。
  • 数据的输入与输出是通过I/O 流来实现的,cin 和cout 是预定义的流类对象。cin 用
    来处理标准输入,即键盘输入。cout 用来处理标准输出,即屏幕输出。
  • 从流中获取数据的操作称为提取操作,向流中添加数据的操作称为插入操作。

预定义插入符提取符

  • “<<”是预定义的插入符,作用在流类对象cout 上便可以实现项标准输出设备输出。
cout<< 表达式 << 表达式...
  • 标准输入是将提取符作用在流类对象cin 上。
cin>> 表达式 >> 表达式...
  • 提取符可以连续写多个,每个后面跟一个表达式,该表达式通常是用于存放输入值的
    变量。例如:
int a, b;
cin >> a >> b;

常用的I/O 流类库操纵符

操纵符名 含 义
dec 数值数据采用十进制表示
hex 数值数据采用十六进制表示
oct 数值数据采用八进制表示
ws 提取空白符
endl 插入换行符,并刷新流
ends 插入空字符
setsprecision(int) 设置浮点数的小数位数(包括小数点)
setw(int) 设置域宽
例:cout << setw(5) << setprecision(3) << 3.1415;

if语句

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-2 输入一个年份,判断是否闰年 

#include <iostream>
using namespace std;
int main() {
int year;
bool isLeapYear;
cout << "Enter the year: ";
cin >> year;
isLeapYear = ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0));
if (isLeapYear)
cout << year << " is a leap year" << endl;
else
cout << year << " is not a leap year" << endl;
return 0;
}

嵌套的if 结构

语法形式
if ()
if() 语句1
else  语句2
else
if() 语句3
else  语句4
  • 注意:①语句1、2、3、4可以是复合语句;②每层的if与else配对,或用{}来确定层次关系
例2-3:输入两个整数,比较两个数的大小
#include<iostream>
using namespace std;
int 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;
return 0;
}

switch语句

  • 语法形式
switch(表达式)
{ case 常量表达式 1:语句1
case 常量表达式 2:语句2

case 常量表达式 n:语句n
default : 语句n+1
}
  • 执行顺序:以 case 中的常量表达式值为入口标号,由此开始顺序执行。因此,每个case 分
    支最后应该加break 语句。
  • 注意:case 分支可包含多个语句,且不用{ }。表达式、判断值都是int 型或char 型。如果若干分支执行内容相同可共用一组语句。
例 2-4:输入一个0~6 的整数,转换成星期输出
#include <iostream>
using namespace std;
int main() {
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;
}
return 0;
}


while语句

  • 语法形式:while (表达式) 语句        
注意:表达式可以是复合语句,其中必须含
有改变条件表达式值的语句。
  • 执行顺序:先判断表达式的值,若为 true 时,执行语句。
 2-5 求自然数1~10 之和
#include <iostream>
using namespace std;
int main() {
int i = 1, sum = 0;
while (i <= 10) {
sum += i; //相当于sum = sum + i;
i++;
}
cout << "sum = " << sum << endl;
return 0;
}

 
 


do-while语句

  • do-while 语句的语法形式
do 语句
while (表达式)
注意:语句可以是复合语句,其中必须含
有改变条件表达式值的语句。
  • 执行顺序:先执行循环体语句,后判断条件。表达式为 true 时,继续执行循环体。
 2-6:输入一个数,将各位数字翻转后输出
#include <iostream>
using namespace std;
int main() {
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;
return 0;
}

 
  

 2-7 用do-while 语句编程,求自然数1~10 之和
#include <iostream>
using namespace std;
int main() {
int i = 1, sum = 0;
do {
sum += i;
i++;
} while (i <= 10);
cout << "sum = " << sum << endl;
return 0;
}
对

对比下面程序
程序1:
#include <iostream>
using namespace std;
int main() {
int i, sum = 0;
cin >> i;
while (i <= 10) {
sum += i;
i++;
}
cout<< "sum= " << sum
<< endl;
return 0;
}

 
 
程序2:
#include <iostream>
using namespace std;
int main() {
int i, sum = 0;
cin >> i;
do {
sum += i;
i++;
} while (i <= 10);
cout << "sum=" << sum
<< endl;
return 0;
}
 
 

for语句

  • for语句语法形式:
  • for语句的另一种形式:范围for 语句:for (声明:表达式) 语句
 2-8:输入一个整数,求出它的所有因子
#include <iostream>
using namespace std;
int main() {
int n;
cout << "Enter a positive integer: ";
cin >> n;
cout << "Number " << n << " Factors ";
for (int k = 1; k <= n; k++)
if (n % k == 0)
cout << k << " ";
cout << endl;
return 0;
}
运行结果1:
Enter a positive integer: 36
Number 36 Factors 1 2 3 4 6 9 12 18 36

运行结果2:
Enter a positive integer: 7
Number 7 Factors 1 7

嵌套的控制结构、其他控制语句

 2-10 输入一系列整数,统计出正整数个数i 和负整数个数j,读入0 则结
束。

#include <iostream>
using namespace std;
int main() {
int i = 0, j = 0, n;
cout <<"Enter some integers please (enter 0 to quit):" << endl;
cin >> n;
while (n != 0) {
if (n > 0) i += 1;
if (n < 0) j += 1;
cin >> n;
}
cout << "Count of positive integers: " << i << endl;
cout << "Count of negative integers: " << j << endl;
return 0;
}


其他控制语句

  • break语句:使程序从循环体和switch 语句内跳出,继续执行逻辑上的下一条语句。不宜用在别
    处。
  • continue 语句:结束本次循环,接着判断是否执行下一次循环。
  • goto 语句:使程序的执行流程跳转到语句标号所指定的语句。不提倡使用。

自定义类型

类型别名:为已有类型另外命名

  • typedef  已有类型名 新类型名表
例:
typedef double Area, Volume;
typedef int Natural;
Natural i1,i2;
Area a;
Volume v;
  • using 新类型名 = 已有类型名;
例 :
using Area = double;
using Volume = double;
枚举类型
  • 定义方式:将全部可取值一一列举出来。
  • 语法形式: enum 枚举类型名 {变量值列表};
  • 例:enum Weekday {SUN, MON, TUE, WED, THU, FRI, SAT};
    默认情况下 SUN=0,MON=1,TUE=2,......,SAT=6
C++包含两种枚举类型:
  • 不限定作用域枚举类型:enum 枚举类型名 {变量值列表};
  • 限定作用域的enum 类
不限定作用域枚举类型说明:
  • 枚举元素是常量,不能对它们赋值
    例如有如下定义
    enum Weekday {SUN, MON, TUE, WED, THU, FRI, SAT};
    不能写赋值表达式:SUN = 0
  • 枚举元素具有默认值,它们依次为: 0,1,2,......。
  • 也可以在声明时另行指定枚举元素的值,如:
    enum Weekday{SUN=7,MON=1,TUE,WED, THU,FRI,SAT};
  • 也可以在声明时另行指定枚举元素的值;
  • 枚举值可以进行关系运算。
  • 整 数值不能直接赋给枚举变量, 如需要将整数赋值给枚举变量, 应进行强
    制类型转换。
  • 枚举值可以赋给整型变量。

2-11
  • 设某次体育比赛的结果有四种可能:胜(WIN)、负(LOSE)、平局(TIE)、比赛取
    消(CANCEL),编写程序顺序输出这四种情况。
  • 分析:
    比赛结果只有四种可能,可以声明一个枚举类型。
#include <iostream>
using namespace std;
enum GameResult {WIN, LOSE, TIE, CANCEL};
int main() {
GameResult result;
enum GameResult omit = CANCEL;
for (int count = WIN; count <= CANCEL; count++) {
result = GameResult(count);
if (result == omit)
cout << "The game was cancelled" << endl;
else {
cout << "The game was played ";
if (result == WIN) cout << "and we won!";
if (result == LOSE) cout << "and we lost.";
cout << endl;
}
}
return 0;
}

auto类型与decltype 类型
  • auto:编译器通过初始值自动推断变量的类型
例如:auto val = val1 + val2;
如果val1+val2 是int 类型,则val 是int 类型;
如果val1+val2 是double 类型,则val 是double 类型。
  • decltype:定义一个变量与某一表达式的类型相同,但并不用该表达式初始化变量
例如:decltype(i) j = 2;





猜你喜欢

转载自blog.csdn.net/mileytimer/article/details/78559806