虽然前四章内容比较基础,是作者给出了不少细节问题,值得全面学习一遍。
由于时间紧迫,所以先按照学习目标做一次学习。
第一章
【学习目标】
01熟练C语言程序的编译和运行(OK)
02学会编程计算并输出常见的算法表达式的结果(数学函数不熟悉)
03掌握整数和浮点数的含义和输出方法(对浮点数陷阱理解不够)
04掌握数学函数的使用方法(包括常用的哪些?)
05初步了解变量的含义(OK)
06掌握整数和浮点数变量的声明方法(OK)
07掌握整数和浮点数变量的读入方法(OK)
08掌握变量交换的三变量法(OK)
09理解算法竞赛中的程序三步曲:输入、计算、输出(OK)
10记住算法竞赛的目标及其对程序的要求(罗列一下)
01
编译应该用 gcc -Wall -g test.c -o test
其实我也不明白-Wall的真正功能,只是知道这样子可以加强检测,给更多警告让我们编写出更规范的程序
比如函数返回了一个int类型,但函数前面没有写明返回值类型,开启了-Wall之后编译时会得到警告:test.c:13: warning: return type defaults to 'int'
02
计算机中的towards zero,就是不管正负数计算结果总是朝0的方向靠近。
数据类型包括了数据集合和定义数据集合上的操作。所以同类型的数据类型四则运算肯定就是原来的类型。
而不同类型的,可以进行强制类型转换,或者隐式转换,比如4-3.14或者3.14-4,是先把4隐式转换成浮点数类型,然后进行浮点数之间的四则运算。
比如写成printf("%d\n", 4-3.14);就会警告第二个操作数了,而要写成"%lf"或“%f”。
顺便回顾下,"%10.2f"是指输出10个字节的长度(不足前面留空白,超过就超过)并且保留小数点后的2位有效数字。记忆模糊时测试一下便知!
include <math.h>中常用数学函数包括:
绝对值double fabs(double);三角函数double sin(double);反三角double asin(double);
开方double sqrt(double);求幂double pow(double a, double x)means a^x;求对数 (e为底)double log(double);(10为底)double log10(double)
取上整double ceil(double);取下整double floor(double); 这里上和下可以理解为取大和取小,比如-1.44,floor后是-2.0,ceil后是-1.0
注意abs()定义在<stdlib.h>中,当然自己宏定义一个也方便——abs(x) : ((x > 0) ? (x) : (-(x)))
03
整数类型和浮点数类型,可以近似理解为数学上的整数和实数。
历史的原因区分了float和double,现在基本上可以纯用double,不用float了。
注意:如果你的代码含有printf("lf\n", double(10));
gcc -pedantic编译时会提示ISO C90标准中printf()函数中没有"%lf",也就是说scanf()中区分"%f"和“%lf”,printf()中只有%f"" 了。
04数学函数的使用方法
还包括:const double pi = 4.0 * atan(1.0); // needs include <math.h>
05初步了解变量的含义(OK)
变量就是一个已经声明的具体的数据类型,它可以被赋值。比如int i; i = 100;
06掌握整数和浮点数变量的声明方法(OK)
int i; float j; double k;
07掌握整数和浮点数变量的读入方法(OK)
scanf("%d%f%lf", &i, &j, &k);
08掌握变量交换的三变量法(OK)
int i, j, tmp; tmp = i; i = j; j = tmp;
09理解算法竞赛中的程序三步曲:输入、计算、输出(OK)
略
10记住算法竞赛的目标及其对程序的要求
目标只有一个,就是解决问题。而不看解决问题的方法,只看你能不能AC。当然比赛之余的学习应该适度注重算法和数据结构的优化,也注意不要过度优化。而像代码长度更不能过度要求自己,像《短码之美》就是典型的geek蛋疼之作,属于个人或小众兴趣范畴的研究了。(其实我也做过这种事情 - - ! 但不迷恋)
程序的要求包括:符合题目的输入输出要求,中间不暂停程序,主函数包括:int main() {return 0;}
第一章包括的例题:
圆柱体的表面积、三位数反转、交换变量、鸡兔同笼、三整数排序
对于三整数排序的第三个程序
#include <stdio.h> int main(void) { int a, b, c, t; scanf("%d%d%d", &a, &b, &c); if (a > b) { t = a; a = b; b = t; } if (a > c) { t = a; a = c; c = t; } if (b > c) { t = b; b = c; c = t; } printf("%d %d %d\n", a, b, c); return 0; }
首先a,b,c是除名字不同以外,没有其他任何区别,通过比较两次可以得到三个元素中的最小值,然后剩下的两个元素通过比较一次就可以得到两者中的“最”小值;因此其他顺序是可以的,只是输出时要按对应顺序。比如你的意图是更新b为最小,那么首先输出b。