钱能《C++程序设计教程最新版》
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
double area(double ra){ return ra*ra*3.14; }
11:39:52 4
调用函数就是使用函数名字,使用名字前必须清 楚名字的性质,所以必须先对函数进行声明. 运行程序中,会涉及到被调用函数的执行,所以 凡是被调用的函数都必须有函数定义,不管该定 义在程序的什么位置.如:
11:39:52
2
1. 说明语句 ( Declarative Statements )
数据说明:
求解问题所使用的数据是什么性质,进行什 么运算,表达范围如何,必须预先说明 说明方式: 既要指明其名字,也要指明其是 什么类型,还可以顺便初始化.如: int a; double d = 3.5; 说明数据的另一个目的是创建一个所需大小 的实体空间给该名字,以便存储所用的数据 值 若数据名字没有说明,使用其便是非法的
11:39:52 3
过程(函数)说明:
求解中需要通过函数调用来实施求解时,便要 对函数的性质进行说明,说明其返回类型,参 数类型,参数个数 函数说明分函数声明和函数定义两种: 函数声明是说明函数的名字,函数的返回类 型,以及函数的参数和个数.如:
double area(double ra);
函数定义是在函数声明的基础上,对整个实 现过程进行详细定义.如:
11:39:52 5
条件语句(Condition Statements ) 2. 条件语句
if语句的两种形态:
条件 是
否 条件 是
否
语句1
语句1
语句2
11:39:52
6
对应语句: if(a>b) cout<<a<<endl; if(a==b) cout<<a<<endl; else cout<<b<<endl;
11:39:52 27
百鸡问题的例子:
for(int c=1; c<=13; ++c) for(int h=1; h<=18; ++h) for(int s=1; s<=96; ++s){ if(7*c+5*h+s/3-100) continue; if(c+h+s-100) continue; if(s%3) continue; cout<<"Cock:"<<c <<", Hens:"<<h <<", Chicks:"<<100-c-h<<endl; }
double sphere(); // 声明 int main(){ double result = sphere(); // 调用 cout<<“area: ”<<result<<“\n”; } void sphere(){ // 定义 cout<<“Please input radius: ”; double r; cin >>r; return r*r*3.14; }
for(int i; ; ) { for( ; ; ) { // ... if(i==1) break; // ... } a=1; // ... }
break跳到此处
11:39:52
23
continue一般是用条件判断执行的,通过反 条件,可以免去continue的使用,所以,它 用来构筑良好的程序风格 for(int n=100; n<=200; ++n) { if(n%3==0) continue; cout<<n<<endl; } 免去continue continue的情形: continue for(int n=100; n<=200; ++n) if(n%3!=0) cout<<n<<endl;
C ++ 程序设计教程(第二版)
第二章 基本编程语句 Chapter 2 Basic Programming Statements
清华大学出版社
钱 能
11:39:52
1
第二章内容
1. 2. 3. 4. 5. 6. 7. 说明语句 ( Declarative Statements ) 条件语句 (Condition Statements ) 循环语句 ( Loop Statements ) 循环设计(Loop Designs ) 循环设计 输入输出语句( 输入输出语句 Input/Output Statements ) 转移语句 ( Move Statements ) 再做循环设计(More Loop Designs ) 再做循环设计
m=i×j 假定i≤j, 则 i2≤i×j=m≤j2 即 i2≤m≤j2 即 i≤√m≤j bool isPrime(int m){ double sqm=sqrt(m*1.0); for(int i=2; i<=sqm; ++i) if(m%i==0) return false; return true; }
#include<iomanip> … cout<<setw(6)<<setfill(‘$’)<<27<<endl;
11:39:52
// 输出: $$$$27
21
文件流的输入出操作与标准输入出基本相 同,只是需要以一定方式打开和关闭 如,将文件a.in打开,逐行读入字符,输 出到文件a.out:
ifstream in(“a.in”); ofstream out(“a.out”); for(string s; getline(in, s); ) out<<s<<endl;
循环体
11:39:52
13
每次循环体执行,都改变循环状态,直 每次循环体执行,都改变循环状态, 到条件不满足而终止. 到条件不满足而终止.
如,设置求和的初始值,交给循环计算,完 设置求和的初始值,交给循环计算, 成循环后,输出求和结果: 成循环后,输出求和结果: int sum = 0; for(int i=1; i<=100; i++) { sum = sum+i; } cout<<sum<<endl;
14
循环开始
循环结束
11:39:52
因为并不是所有循环都有明显的循环初 始状态和状态修正的,所以, 始状态和状态修正的,所以,while 循环是一种for循环的简洁形式. for循环的简洁形式 循环是一种for循环的简洁形式.
循环开始
如,同样的求和: 同样的求和: int sum=0, i=1; while(i<=100) sum += i++; cout<<sum<<endl;
11:39:52
9
switch多分支语句:
switch(整数表达式){ case value1: 语句1; break; case value2: 语句2; break; … default: 语句n; } 等价于: 等价于: if(整数表达式 整数表达式==value1) 整数表达式 语句1; 语句 else if(整数表达式 整数表达式==value2) 整数表达式 语句2; 语句 … else 语句n; 语句 }
11:39:52 11
3. 循环语句 ( Loop Statements
开始
)
for循环结构:
循环初始状态
状态修正
条件判断
结束
未结束
循环体
结束
11:39:52 12
对应语句为: 对应语句为:
for(int i=1; i<=10; i++) cout<<”hello.\n”;
循环初始状态 条件判断 状态修正
ຫໍສະໝຸດ Baidu等价于:
for(int i=1; i<=100; ++i) cout<<i<<“\n”;
11:39:52 25
break语句的可取之处: // 用break语句的代码段 bool flag=false; // 用于做退出记号 for(int i=1; i<100; ++i){ for(int j=1; j<100; ++j) if(i*j==651){ flag=true; break; }else{ // ... } if(flag) break; } // goto语句的代码段 for(int i=1; i<100; ++i) for(int j=1; j<100; ++j){ if(i*j==651) goto End; // ... } End:
误解:else从属于外面的if
if(x>0){ if(x < 50) cout<<”OK\n”; }else cout<<”NOT OK\n”;
11:39:52
8
条件表达式:
对于 if(x) a = 327981; else b = 327981; 可表示为: 可表示为: x ? a=327981 : b=327981; 如果a和 为同类型 则还可以: 为同类型, 如果 和b为同类型,则还可以: (x?a:b) = 327981;
11:39:52 10
虽然switch有等价的复合if表示, 而且, 分支判断值只能是整数,显得应用范围 狭窄, 但是switch在使用上的直观和灵 活形式, 使得其仍具有编程价值. 如: break可选,甚至case可以重叠:
case value1: 语句1; case value2: 语句2; case v1: case v2: case v3: 语句;
11:39:52
26
7. 再做循环设计 More Loop Designs ) 再做循环设计(
逻辑判断类的语句控制结构: for(所有可能情况){ // 可为多重循环 if(条件1不满足) continue; if(条件2不满足) continue; // … if(条件n不满足) continue; 输出所要的结果 }
11:39:52 24
goto的程序段除了系统跟踪和架构困 难外,阅读也相对复杂:
int a; goto Init; Forward: a = a + 1; Print: cout<<a<<endl; goto Down; Init: a = 1; goto Print; Down: if(a<100) goto Forward;
15
循环结束
11:39:52
4. 循环设计 ( Loop Designs )
(1)简单字符图形的双重循环
M MM MMM MMMM MMMMM MMMMMM MMMMMMM MMMMMMMM MMMMMMMMM MMMMMMMMMM
11:39:52
16
分析方法:
该图形一共10行,每一行增加一个字符,所 以,应循环10次,每次输出一行,其循 环模式为: for(int i=1; i<=10; ++i) { 输出第i行(循环) 换行 }
11:39:52
7
错综复杂时,必须注意两义性:
if(x>0) if(x<50) cout<<”x is ok.\n”; else cout<<”x is not ok.\n”;
正解:else从属于紧挨的if
if(x>0){ if(x < 50) cout<<”OK\n”; else cout<<”NOT OK\n”; }
11:39:52
20
控制宽度和填充字符的操作是带参数的,注意width(n)为 一次性操作,即第二次显示时将不再有效。默认为 width(0),表示仅显示数值。例如:
cout.width(5); cout.fill(‘S’); cout<<23<<23;
// 输出: SSS2323
在头文件iomanip的支持下,还可以直接由<<操作:
行 1 2 3 4 ... 10 i M个数 1 1 2 2 3 3 4 4 10 10
11:39:52
17
for(int i=1; i<=10; ++i) { for(int j=1; j<=i; ++j) cout<<”M”; cout<<endl; }
11:39:52
18
(2)判断素数:(利用数学定律)
11:39:52
19
5. 输入输出语句( Input/Output Statements ) 输入输出语句
标准输出流:
可以控制输出格式
cout<<showpos<<12; // +12 cout<<hex<<18<<” “<<showbase<<18; // 12 0x12 cout<<hex<<255<<” “<<uppercase<<255; // ff FF cout<<123.0<<” “<<showpoint<<123.0; // 123 123.000 cout<<(2>3)<<” “<<boolalpha<<(2>3); // 0 false cout<<fixed<<12345.678; // 12345.678000 cout<<scientific<<123456.678; // 1.234568e+05
其中文件流读入操作总是伴随着状态返回, 判断状态就可以确定文件是否正常读入, 如getline(in,s)当读到文件尾时, 便返回false,以使循环结束
11:39:52
22
6. 转移语句 ( Move Statements )
break 除了 用在 switch 之外 , 主 要的是用在终结本次循环
11:39:52 4
调用函数就是使用函数名字,使用名字前必须清 楚名字的性质,所以必须先对函数进行声明. 运行程序中,会涉及到被调用函数的执行,所以 凡是被调用的函数都必须有函数定义,不管该定 义在程序的什么位置.如:
11:39:52
2
1. 说明语句 ( Declarative Statements )
数据说明:
求解问题所使用的数据是什么性质,进行什 么运算,表达范围如何,必须预先说明 说明方式: 既要指明其名字,也要指明其是 什么类型,还可以顺便初始化.如: int a; double d = 3.5; 说明数据的另一个目的是创建一个所需大小 的实体空间给该名字,以便存储所用的数据 值 若数据名字没有说明,使用其便是非法的
11:39:52 3
过程(函数)说明:
求解中需要通过函数调用来实施求解时,便要 对函数的性质进行说明,说明其返回类型,参 数类型,参数个数 函数说明分函数声明和函数定义两种: 函数声明是说明函数的名字,函数的返回类 型,以及函数的参数和个数.如:
double area(double ra);
函数定义是在函数声明的基础上,对整个实 现过程进行详细定义.如:
11:39:52 5
条件语句(Condition Statements ) 2. 条件语句
if语句的两种形态:
条件 是
否 条件 是
否
语句1
语句1
语句2
11:39:52
6
对应语句: if(a>b) cout<<a<<endl; if(a==b) cout<<a<<endl; else cout<<b<<endl;
11:39:52 27
百鸡问题的例子:
for(int c=1; c<=13; ++c) for(int h=1; h<=18; ++h) for(int s=1; s<=96; ++s){ if(7*c+5*h+s/3-100) continue; if(c+h+s-100) continue; if(s%3) continue; cout<<"Cock:"<<c <<", Hens:"<<h <<", Chicks:"<<100-c-h<<endl; }
double sphere(); // 声明 int main(){ double result = sphere(); // 调用 cout<<“area: ”<<result<<“\n”; } void sphere(){ // 定义 cout<<“Please input radius: ”; double r; cin >>r; return r*r*3.14; }
for(int i; ; ) { for( ; ; ) { // ... if(i==1) break; // ... } a=1; // ... }
break跳到此处
11:39:52
23
continue一般是用条件判断执行的,通过反 条件,可以免去continue的使用,所以,它 用来构筑良好的程序风格 for(int n=100; n<=200; ++n) { if(n%3==0) continue; cout<<n<<endl; } 免去continue continue的情形: continue for(int n=100; n<=200; ++n) if(n%3!=0) cout<<n<<endl;
C ++ 程序设计教程(第二版)
第二章 基本编程语句 Chapter 2 Basic Programming Statements
清华大学出版社
钱 能
11:39:52
1
第二章内容
1. 2. 3. 4. 5. 6. 7. 说明语句 ( Declarative Statements ) 条件语句 (Condition Statements ) 循环语句 ( Loop Statements ) 循环设计(Loop Designs ) 循环设计 输入输出语句( 输入输出语句 Input/Output Statements ) 转移语句 ( Move Statements ) 再做循环设计(More Loop Designs ) 再做循环设计
m=i×j 假定i≤j, 则 i2≤i×j=m≤j2 即 i2≤m≤j2 即 i≤√m≤j bool isPrime(int m){ double sqm=sqrt(m*1.0); for(int i=2; i<=sqm; ++i) if(m%i==0) return false; return true; }
#include<iomanip> … cout<<setw(6)<<setfill(‘$’)<<27<<endl;
11:39:52
// 输出: $$$$27
21
文件流的输入出操作与标准输入出基本相 同,只是需要以一定方式打开和关闭 如,将文件a.in打开,逐行读入字符,输 出到文件a.out:
ifstream in(“a.in”); ofstream out(“a.out”); for(string s; getline(in, s); ) out<<s<<endl;
循环体
11:39:52
13
每次循环体执行,都改变循环状态,直 每次循环体执行,都改变循环状态, 到条件不满足而终止. 到条件不满足而终止.
如,设置求和的初始值,交给循环计算,完 设置求和的初始值,交给循环计算, 成循环后,输出求和结果: 成循环后,输出求和结果: int sum = 0; for(int i=1; i<=100; i++) { sum = sum+i; } cout<<sum<<endl;
14
循环开始
循环结束
11:39:52
因为并不是所有循环都有明显的循环初 始状态和状态修正的,所以, 始状态和状态修正的,所以,while 循环是一种for循环的简洁形式. for循环的简洁形式 循环是一种for循环的简洁形式.
循环开始
如,同样的求和: 同样的求和: int sum=0, i=1; while(i<=100) sum += i++; cout<<sum<<endl;
11:39:52
9
switch多分支语句:
switch(整数表达式){ case value1: 语句1; break; case value2: 语句2; break; … default: 语句n; } 等价于: 等价于: if(整数表达式 整数表达式==value1) 整数表达式 语句1; 语句 else if(整数表达式 整数表达式==value2) 整数表达式 语句2; 语句 … else 语句n; 语句 }
11:39:52 11
3. 循环语句 ( Loop Statements
开始
)
for循环结构:
循环初始状态
状态修正
条件判断
结束
未结束
循环体
结束
11:39:52 12
对应语句为: 对应语句为:
for(int i=1; i<=10; i++) cout<<”hello.\n”;
循环初始状态 条件判断 状态修正
ຫໍສະໝຸດ Baidu等价于:
for(int i=1; i<=100; ++i) cout<<i<<“\n”;
11:39:52 25
break语句的可取之处: // 用break语句的代码段 bool flag=false; // 用于做退出记号 for(int i=1; i<100; ++i){ for(int j=1; j<100; ++j) if(i*j==651){ flag=true; break; }else{ // ... } if(flag) break; } // goto语句的代码段 for(int i=1; i<100; ++i) for(int j=1; j<100; ++j){ if(i*j==651) goto End; // ... } End:
误解:else从属于外面的if
if(x>0){ if(x < 50) cout<<”OK\n”; }else cout<<”NOT OK\n”;
11:39:52
8
条件表达式:
对于 if(x) a = 327981; else b = 327981; 可表示为: 可表示为: x ? a=327981 : b=327981; 如果a和 为同类型 则还可以: 为同类型, 如果 和b为同类型,则还可以: (x?a:b) = 327981;
11:39:52 10
虽然switch有等价的复合if表示, 而且, 分支判断值只能是整数,显得应用范围 狭窄, 但是switch在使用上的直观和灵 活形式, 使得其仍具有编程价值. 如: break可选,甚至case可以重叠:
case value1: 语句1; case value2: 语句2; case v1: case v2: case v3: 语句;
11:39:52
26
7. 再做循环设计 More Loop Designs ) 再做循环设计(
逻辑判断类的语句控制结构: for(所有可能情况){ // 可为多重循环 if(条件1不满足) continue; if(条件2不满足) continue; // … if(条件n不满足) continue; 输出所要的结果 }
11:39:52 24
goto的程序段除了系统跟踪和架构困 难外,阅读也相对复杂:
int a; goto Init; Forward: a = a + 1; Print: cout<<a<<endl; goto Down; Init: a = 1; goto Print; Down: if(a<100) goto Forward;
15
循环结束
11:39:52
4. 循环设计 ( Loop Designs )
(1)简单字符图形的双重循环
M MM MMM MMMM MMMMM MMMMMM MMMMMMM MMMMMMMM MMMMMMMMM MMMMMMMMMM
11:39:52
16
分析方法:
该图形一共10行,每一行增加一个字符,所 以,应循环10次,每次输出一行,其循 环模式为: for(int i=1; i<=10; ++i) { 输出第i行(循环) 换行 }
11:39:52
7
错综复杂时,必须注意两义性:
if(x>0) if(x<50) cout<<”x is ok.\n”; else cout<<”x is not ok.\n”;
正解:else从属于紧挨的if
if(x>0){ if(x < 50) cout<<”OK\n”; else cout<<”NOT OK\n”; }
11:39:52
20
控制宽度和填充字符的操作是带参数的,注意width(n)为 一次性操作,即第二次显示时将不再有效。默认为 width(0),表示仅显示数值。例如:
cout.width(5); cout.fill(‘S’); cout<<23<<23;
// 输出: SSS2323
在头文件iomanip的支持下,还可以直接由<<操作:
行 1 2 3 4 ... 10 i M个数 1 1 2 2 3 3 4 4 10 10
11:39:52
17
for(int i=1; i<=10; ++i) { for(int j=1; j<=i; ++j) cout<<”M”; cout<<endl; }
11:39:52
18
(2)判断素数:(利用数学定律)
11:39:52
19
5. 输入输出语句( Input/Output Statements ) 输入输出语句
标准输出流:
可以控制输出格式
cout<<showpos<<12; // +12 cout<<hex<<18<<” “<<showbase<<18; // 12 0x12 cout<<hex<<255<<” “<<uppercase<<255; // ff FF cout<<123.0<<” “<<showpoint<<123.0; // 123 123.000 cout<<(2>3)<<” “<<boolalpha<<(2>3); // 0 false cout<<fixed<<12345.678; // 12345.678000 cout<<scientific<<123456.678; // 1.234568e+05
其中文件流读入操作总是伴随着状态返回, 判断状态就可以确定文件是否正常读入, 如getline(in,s)当读到文件尾时, 便返回false,以使循环结束
11:39:52
22
6. 转移语句 ( Move Statements )
break 除了 用在 switch 之外 , 主 要的是用在终结本次循环