《C++程序设计基础教程》——刘厚泉,李政伟,二零一三年九月版,学习笔记
文章目录
- 1、选择结构
- 1.1、if 语句
- 1.2、嵌套的 if 语句
- 1.3、条件运算符 ?:
- 1.4、switch 语句
- 2、循环结构
- 2.1、while 语句
- 2.2、do-while 语句
- 2.3、 for 循环
- 2.4、循环嵌套
- 3、跳转结构
- 3.1、break 语句
- 3.2、continue 语句
- 3.3、goto 语句
- 3.4、return 语句
- 4、应用实例
1、选择结构
if
、switch
、?:
1.1、if 语句
if 语句是最基本的选择结构,它用于在条件为真时执行特定的代码块。
#include <iostream>
using namespace std;
int main()
{
int n = 10;
if (n > 0)
{
cout << "Number is positive." << endl;
}
return 0;
}
output
Number is positive.
if-else 语句用于在条件为真时执行一个代码块,否则执行另一个代码块。
#include <iostream>
using namespace std;
int main()
{
int num = -5;
if (num > 0)
{
cout << "Number is positive." << endl;
}
else
{
cout << "Number is not positive." << endl;
}
return 0;
}
output
Number is not positive.
1.2、嵌套的 if 语句
当需要判断的条件不止一个,可以使用嵌套 if 语句来实现。
所谓嵌套 if 语句,指的是其中一个 if 语句作为另一个 if 语句或者 else 语句的内嵌语句。
C++ 规定,else 语句总是与在同一块离它最近且无 else 语句配对的 if 语句相结合。
#include <iostream>
using namespace std;
int main()
{
int num = 59;
if (num > 0)
cout << "Number is positive." << endl;
if (num >= 60)
cout<< "passed." << endl;
else
cout << "not passed." << endl;
return 0;
}
output
Number is positive.
not passed.
编译器不关心程序的缩进形式
当你对嵌套 if 语句混淆不清时,可以通过添加 {} 来解决
eg
#include <iostream>
using namespace std;
int main()
{
int score;
cin >> score;
if (score < 0)
cout << "error score!" << endl;
else if (score < 60)
cout << "Get D!" << endl;
else if (score < 70)
cout << "Get C!" << endl;
else if (score < 80)
cout << "Get B!" << endl;
else
cout << "Get A!" << endl;
return 0;
}
output
75
Get B!
1.3、条件运算符 ?:
表达式1?表达式2:表达式3
条件运算符是 C++ 中唯一的 3 目运算符
如果表达式 1 为 true,执行表达式 2,否则执行表达式 3
#include <iostream>
using namespace std;
int main()
{
float a = 60.1;
bool result = a<60?false:true;
cout << result << endl;
return 0;
}
output
1
1.4、switch 语句
switch 语句可以一次将测试值与多个值进行判定,而不是只测试一个判定条件
switch(表达式)
{
case 整型常量表达式1:
语句组1
case 整型常量表达式2:
语句组2
...
case 整型常量表达式n:
语句组n
default:
语句组 n+1
}
每个 case 语句后必须是与表达式类型兼容的一个常量(必须为常量,不能为变量,且要求为整型或者能够转化为整型),eg 整型、字符型或枚举型表达式
default 语句并非必须
需要注意的是,每个case块的末尾通常有一个break语句,以防止程序继续执行下一个case块的代码(这称为“贯穿”)。
eg:贯穿
#include <iostream>
using namespace std;
int main() {
char grade;
cout<<"请输入成绩:";
cin>>grade;
switch(grade)
{
case 'A':
cout<<"80~100\n";
case 'B':
cout<<"60~80\n";
case 'C':
cout<<"0~60\n";
default:
cout<<"error\n";
}
return 0;
}
output
请输入成绩:A
80~100
60~80
0~60
error
引入 break 以后
#include <iostream>
using namespace std;
int main() {
char grade;
cout<<"请输入成绩:";
cin>>grade;
switch(grade)
{
case 'A':
cout<<"80~100\n";
break;
case 'B':
cout<<"60~80\n";
break;
case 'C':
cout<<"0~60\n";
break;
default:
cout<<"error\n";
break;
}
return 0;
}
output
请输入成绩:A
80~100
output
请输入成绩:a
error
再来个例子
#include <iostream>
using namespace std;
int main() {
int day;
cout << "请输入星期几 (1-7): ";
cin >> day;
switch (day)
{
case 1:
cout << "星期一" << endl;
break;
case 2:
cout << "星期二" << endl;
break;
case 3:
cout << "星期三" << endl;
break;
case 4:
cout << "星期四" << endl;
break;
case 5:
cout << "星期五" << endl;
break;
case 6:
cout << "星期六" << endl;
break;
case 7:
cout << "星期日" << endl;
break;
default:
cout << "输入无效" << endl;
}
return 0;
}
output
请输入星期几 (1-7): 7
星期日
2、循环结构
2.1、while 语句
while 循环在循环条件为真时一直执行。
while (循环条件) {
// 循环体
}
eg:计算 1 到 100 的和
#include <iostream>
using namespace std;
int main()
{
int i = 0, sum = 0;
while (i<101)
{
sum += i;
i++;
}
cout << sum << endl;
return 0;
}
output
5050
2.2、do-while 语句
do-while 循环与 while 循环类似,但不同之处在于它至少执行一次循环体,即使在第一次迭代时循环条件为假。
do {
// 循环体
} while (循环条件);
计算 1到100 的和
#include <iostream>
using namespace std;
int main()
{
int i = 0, sum = 0;
do
{
sum += i;
i++;
}while(i<101);
cout << sum << endl;
return 0;
}
output
5050
2.3、 for 循环
for 循环通常用于已知执行次数的循环
for (初始化表达式; 循环条件; 步进表达式) {
// 循环体
}
eg,计算 1-100 的和
#include<iostream>
using namespace std;
int main(){
int sum = 0;
for (int i = 0; i <= 100; i++)
{
sum += i;
}
cout << sum << endl;
return 0;
}
output
5050
注意,初始化表达式、循环条件、步进表达式都可以省略,循环体不能省略
#include<iostream>
using namespace std;
int main(){
int sum = 0, i = 0;
for (;;)
{
if (i <= 100)
sum += i++;
else
break;
}
cout << sum << endl;
return 0;
}
output
5050
允许两个或者两个以上的变量控制循环
#include<iostream>
using namespace std;
int main(){
int i1 = 1, i2 = 10;
for (i1, i2; i1<i2; i1++, i2--)
cout << i1 << " " << i2 << endl;
return 0;
}
output
1 10
2 9
3 8
4 7
5 6
2.4、循环嵌套
循环结构可以嵌套使用,即一个循环内部包含另一个循环。
#include<iostream>
using namespace std;
int main()
{
for (int i = 1; i <= 10; i++)
{
for (int j = i; j <= 10; j++)
cout << "*";
cout << endl;
}
return 0;
}
output
**********
*********
********
*******
******
*****
****
***
**
*
再来个例子
#include<iostream>
using namespace std;
int main()
{
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
cout << "i = " << i << ", j = " << j << endl;
}
}
return 0;
}
output
i = 0, j = 0
i = 0, j = 1
i = 0, j = 2
i = 1, j = 0
i = 1, j = 1
i = 1, j = 2
i = 2, j = 0
i = 2, j = 1
i = 2, j = 2
while、do-while、for 循环均可以相互嵌套
3、跳转结构
break、continue、goto、return 4 种
3.1、break 语句
用于立即退出循环或switch语句。
一个 break 只能跳出所在的最内层循环
#include<iostream>
using namespace std;
int main()
{
int num;
for (int i = 0; i < 2; i++)
{
num = 1;
while (1)
{
cout << num << endl;
num++;
if (num > 4)
break;
}
}
return 0;
}
output
1
2
3
4
1
2
3
4
3.2、continue 语句
用于跳过循环中剩余的代码,并立即开始下一次迭代。
不能用在 switch 中
#include<iostream>
using namespace std;
int main()
{
int sum = 0;
for (int i = 0; i <= 100; i++)
{
if (i % 10 != 0)
continue;
sum += i;
}
cout << sum << endl;
return 0;
}
output
550
3.3、goto 语句
用于无条件跳转到同一函数内的标签位置。
适用于从多层循环中直接跳出,如果用 break 的话,需要多个
#include<iostream>
using namespace std;
int main()
{
int num = 10;
if (num > 0) {
goto positive; // 跳转到标签 positive
}
cout << "Number is negative or zero.\n";
goto end; // 跳转到标签 end
positive:
cout << "Number is positive.\n";
end:
return 0;
}
output
Number is positive.
3.4、return 语句
用于从函数返回一个值(如果函数有返回值类型)或无条件退出函数。
4、应用实例
eg 3-10 判断正整数是否为素数
#include <iostream>
#include<math.h>
using namespace std;
int main()
{
int x,i,b;
int num = 5;
while(num)
{
cin >> x;
b = sqrt(x);
num--;
if (x <= 1)
{
cout << "False\n";
continue;
}
for (i=2; i<=b; i++)
{
if (x % i == 0)
break;
}
if (i>=b+1)
cout << "True\n";
else
cout << "False\n";
}
return 0;
}
output
0
False
1
False
2
True
3
True
9
False
设置了可以输入 5 次,for 循环的判断边界为 sqrt(x)可以提高计算效率,最后判断是否为素数的条件 i>=b+1
也很巧妙,注意算法的边界测试,if (x <= 1)
就是来弥补边界漏洞的
eg 3-11 使用循环语句求解 300 -400 范围内的所有素数
#include <iostream>
#include<math.h>
using namespace std;
int main()
{
int i,b;
for (int x=301; x<401; x+=2)
{
b = sqrt(x);
for (i=2; i<=b; i++)
{
if (x % i == 0)
break;
}
if (i>=b+1)
cout << x << " ";
}
return 0;
}
output
307 311 313 317 331 337 347 349 353 359 367 373 379 383 389 397
可以看到 for 循环中的自增项采用的是 x+=2
,进一步优化了计算速度,因为偶数肯定可以除以2余0,不是素数,我们遍历所有奇数即可
eg 3-12 用公式 π 4 = 1 − 1 3 + 1 5 − 1 7 + . . . \frac{\pi}{4} = 1-\frac{1}{3}+\frac{1}{5}-\frac{1}{7}+... 4π=1−31+51−71+... 求圆周率 π 的近似值,直到最后一项的绝对值小于 1 0 − 8 10^{-8} 10−8 为止
注意审题,最后一项的绝对值,而不是整个式子的绝对值
#include <iostream>
#include<math.h>
#include<iomanip>
using namespace std;
int main()
{
double i = 3.0;
double x=1.0, result=1.0;
int sign = 1;
while(fabs(x)>=1e-8)
{
sign *= -1;
x = sign / i;
i+=2;
result += x;
cout << x <<endl;
}
//cout << result * 4;
cout << setiosflags(ios::fixed) << setprecision(8) << result * 4; // 输出小数点后八位
return 0;
}
output
3.14159267
程序会运行很久
abs
函数通常用于整数类型(如 int、long 等)。
fabs
函数专门用于浮点数类型(如 float、double 等)。
这里正负符号的转变很巧妙 sign *= -1;