《算法竞赛入门经典》读书笔记
第一章 程序设计入门
1.1 算术表达式
知识点1:C程序基本框架
#include
int main() //主函数,表示程序的入口
{
此处省略N行代码;
return 0; //返回0,表示程序正常退出
}
知识点2:算术表达式
(1)运算符:+、-、*、/
(2)多面手“/”
整数 / 整数 = 整数(商的整数部分)
浮点数/浮点数 = 浮点数
浮点数/整数 = 浮点数 整数/浮点数 = 浮点数
提示:上述运算过程中,整数先自动转换为浮点数,然后进行浮点数与浮点数之间的运算
(3)算术运算符具有优先级(先括号内,后括号外;先乘除、后加减);不明确优先级的情况下,请善用括号。
知识点3:(格式化)输出语句
printf("%d\n",1+2);
(1)双引号内的“%d”、“%lf”表示占位符,其中 %d表示此处需要输出一个整型数,%lf表示此处输出一个浮点数,%.1lf表示精确到小数点后第1位,其他类推;
(2)双引号内的其他可打印字符(串)原样输出,例如printf("value=%d\n",1+2);
(3)“\n”表示换行(转义字符中的一种)
知识点4:数学函数sqrt()
(1)sqrt(x)表示求x的算术平方根,应用前请调用
#include
1.2 变量及其输入
知识点1:变量
程序运行过程中发生变化的量;变量必须先定义(声明),再使用;声明的过程类似于“酒店开房”的过程,变量一旦声明,计算机即为其开辟一片对应的内存空间供其使用。
声明语法:
int a,b; //声明整型变量(经济间)
double a,b; //声明(双精度)浮点数变量(豪华间)
知识点2:(格式化)输入语句
scanf(“%d%d”,&a,&b);
(1)双引号内每出现一个“%d”即表示此处需输入一个对应的整型数;
(2)&a、&b分别表示变量a,b在内存中的地址(类似于“房间号”);a、b则分别表示变量a、b中保存的值
【课堂练习】
1、请将例程1-4的输出结果修改为可以输出整个算术表达式;
输入样例1:1 2
输出样例2:1+2=3
输入样例2:3 4
输出样例2:3+4=7
2、如果需要满足浮点数计算要求,程序如何修改?
输入样例3:1.1 2.2
输出样例3:1.1+2.2=3.3
知识点3:常量
程序运行过程中始终不变的量;在程序运行过程中任何企图修改常量值的操作都是非法的。
声明:constdouble PI = 4.0 * atan(1.0)
提示:这里的PI为什么不直接表示为 constdouble PI = 3.1415926;
知识点4:赋值语句
与数学中的等式表示“相等”关系不同,C程序中的等号表示赋值,赋值是个动作,先计算右边的值,再赋给左边的变量,覆盖它原来的值。
例如:
r = 3
s = pi * r * r;
【课堂练习】
1、修改例程1-5,增加计算圆柱体的体积(volume)。
1.3 顺序结构程序设计
知识点1:程序的基本控制结构
有理论证明,任何具有单入口单出口的程序都可以用三种基本结构表达:顺序结构、选择(分支)结构、循环结构。
知识点2:%与/的混用
(1)%表示取余数,%两边的操作数必须都为整型数;
(2)三位数反转的例程告诉我们数字分离的常见手段是:利用x%10取x最末位数字,然后利用x/10“消去”最末位,循环反复,直到某一步计算使得当前商为0即结束循环。
|
知识点3:printf(“%03d”,x);
(1)其中3表示数值所占位数;
(2)其中0表示不足位数,左端补0
知识点4:变量的赋值(变量交换)
(1)变量赋值的特性是“新的不来,旧的不去”。
思考: a = b b = a为什么不行?
(2)实现“两变量交换”的最典型方法是:“三变量交换”法;其他方法仅作了解即可;
思考: 三变量交换法与教材中液体交换的类比是否完全一致?
知识点5:黑箱测试 只考察程序解决问题的能力,而不关心采用了什么方法。
【课后思考】
1、修改例程1-6,使其支持下列测试数据。
输入样例1:123
输出样例2:321
输入样例2:-123
输出样例2:-321
1.4 分支结构程序设计
知识点1:单分支If语句
If (条件) 语句; //当条件满足(条件表达式值为真时),执行语句;否则什么都不做
知识点2:语句与语句块
写法1:
If(n < 0)
printf(“-”);
n = -n;
写法2:
If(n < 0)
{
printf(“-”);
n = -n;
}
注:{ }将多条语句成为语句块处理;
知识点3:关系表达式
(1)运算符 >、>=、<、<=、==、!=
(2)注意区分“=”与“==”的本质区别
例如:if (a = 1) { } //先将a赋值为1,条件恒成立
if (a == 1) { } //判定a是否等于1
知识点4:逻辑表达式
(1)运算符 逻辑与&&、逻辑或 ||、逻辑非!
(2)运算规则(真值表)
a |
b |
a&&b |
a||b |
!a |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
(3)优先级 ! > && > ||
(4)短路效应:在进行到某步逻辑运算过程中,一旦能确定整个表达式的值,就不再继续计算
(5)逻辑表达式的值:非0表示true、0表示false
知识点5:混合运算符优先级
逻辑非! > 算术运算符 > 关系运算符 > && 和 || >赋值运算符
知识点6:分支基本结构
(1)单分支
if ( 条件) 语句;
(2)双分支
if ( 条件)
语句1;
Else
语句2;
(3)多分支
if ( 条件)
语句1;
else If
语句2;
else If
语句3;
……
else
语句n;
(4)嵌套分支
if ( 条件)
if ( 条件)
语句1;
else //这里的Else与哪个If配对呢?
语句2;
知识点8:“选择排序”算法思想
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
以下为简单选择排序的存储状态,其中大括号内为无序区,大括号外为有序序列:
初始序列:{ 49 27 6597 76 12 38 }
第1趟:12与49交换:12 { 27 65 97 76 49 38 }
第2趟:27不动 :1227 { 65 97 76 49 38 }
第3趟:65与38交换:1227 38 { 97 76 49 65 }
第4趟:97与49交换:1227 38 49 { 76 97 65 }
第5趟:76与65交换:1227 38 49 65 { 97 76 }
第6趟:97与76交换:1227 38 49 65 76 97 完成
【课堂练习】
(1) 闰年判定
参考代码:
#include
int main()
{
int year;
scanf("%d",&year);
if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
printf("%d is leap year.",year);
else
printf("%d is not leap year.",year);
return 0;
}
(2) 一元二次方程根的求解
利用一元二次方程根的判别式( )可以判断方程的根的情况。
一元二次方程 的根与根的判别式 有如下关系:
① 当 时,方程有两个不相等的实数根;
② 当 时,方程有两个相等的实数根;
③ 当 时,方程无实数根,有2个不相等的虚数根。
④ 参考代码:
#include
int main()
{
int a, b, c;
int delta;
scanf("%d%d%d",&a, &b, &c);
delta = b * b - 4 * a * c;
if (delta >= 0)
{
if (delta > 0)
printf("two real roots");
else
printf("only one repeated root");
}
else
{
printf("no real roots");
}
return 0;
}
(3) BMI体质指数判定
BMI指数(即身体质量指数,简称体质指数又称体重指数,英文为Body Mass Index,简称BMI),是用体重公斤数除以身高米数平方得出的数字,是目前国际上常用的衡量人体胖瘦程度以及是否健康的一个标准。
|
WHO标准 |
相关疾病发病危险性 |
|
偏瘦Lean |
<18.5 |
低(但其它疾病危险性增加) |
|
正常Normal |
18.5~25.0 |
平均水平 |
|
偏胖Fat |
25.0~35.0 |
增加 |
|
重度肥胖Severe Obesity |
35.0~40.0 |
严重增加 |
|
极重度肥胖Very severe obesity |
≥40.0 |
非常严重增加 |
参考代码:
#include
intmain()
{
double h, w;
double bmi;
scanf("%lf%lf",&h, &w);
w = w / 100.0;
bmi = h / (w * w);
if (bmi < 18.5)
printf("Lean");
else if ((bmi >= 18.5) && (bmi< 25.0))
printf("Normal");
else if ((bmi >= 25.0) && (bmi< 35.0))
printf("Fat");
else if ((bmi >= 35.0) && (bmi< 40))
printf("Severe Obesity");
else
printf("Very severeobesity,dangerous");
return 0;
}
【课后练习】完成《算法竞赛入门经典》第一章课后习题