《算法竞赛入门经典》读书笔记(第一章)

《算法竞赛入门经典》读书笔记

第一章 程序设计入门

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即结束循环。

123    123 % 10  3

           123/10    12

12     12 % 10   2

          12 / 10    1

1       1 % 10    1

          1 / 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趟:1249交换:12 { 27 65 97 76 49 38 }

2趟:27不动 :1227 { 65 97 76 49 38 }

3趟:6538交换:1227 38 { 97 76 49 65 }

4趟:9749交换:1227 38 49 { 76 97 65 }

5趟:7665交换:1227 38 49 65 { 97 76 }

6趟:9776交换: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;

}

 

【课后练习】完成《算法竞赛入门经典》第一章课后习题

 

你可能感兴趣的:(算法竞赛入门经典)