[算法]算法竞赛入门经典第4章笔记
2014-01-01 17:15
429 查看
1. 数学函数的定义“返回类型 函数名(参数列表){函数体}”函数体最后一条语句应该是“return表达式;”。
2. Main函数总是返回0
3. Hypot函数
原型:extern float hypot(float x, float y);
用法:#include <math.h>
功能: 计算直角三角形的斜边长
用法: double hypot(double x, double y);
例:
#include <stdio.h>
#include <math.h>
int main(void)
{
double result;
double x = 3.0;
double y = 4.0;
result =hypot(x, y);
printf("Thehypotenuse is: %lf\n", result);
return 0;
}
4. 定义结构体的方法:“struct 结构体名称{域定义};”花括号后还有分号
5. 往往用“typedef struct{域定义;}类型名;”方式定义一个新类型名,这一可以像原生数据类型一样使用这个自定义类型。
6. 注意避免溢出。
7. 谓词函数命名成is_xxx的形式;返回int值,非0为真,0为假
8. int is_prime(intx)
{
inti;
for(i=2;i*i<=x;i++)
if(x%i==0)return0;
return1;
}
9. assert()是一个诊断宏,用于动态辨识程序的逻辑错误条件。其原型是: void assert(int expression); assert只是对所给的表达式求值,就像if判断语句中一样,然后如果该值为真则正常运行,否则报错,并调用abort(),产生异常中断,exit出来。使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。
在调试结束后,可以通过在包含#include<assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下:
#include<stdio.h>
#define NDEBUG
#include<assert.h>
注意:assert是宏,而不是函数。在C的assert.h头文件中。
1)对非预期错误使用断言2)不要把需要执行的代码放入断言中
3)对来源于内部系统的可靠的数据使用断言,而不要对外部不可靠的数据使用断言,对于外部不可靠数据,应该使用错误处理代码。再次强调,把断言看成可执行的注释。
10.调用栈,由多个栈帧stack frame组成,每个栈帧对应着一个未运行完的函数。栈帧中保存了该函数的返回地址和局部变量,保证不同函数间的局部变量互不相干,因为不同函数对应着不同的栈帧。Gdb中可用backtrace命令打印所有栈帧,若要用p打印非当前栈帧的局部变量,可以用frame命令。
![](https://img-blog.csdn.net/20140101171320765?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZHVidXFpbmdmZW5nZ3p5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20140101171342218?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZHVidXFpbmdmZW5nZ3p5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20140101171411578?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZHVidXFpbmdmZW5nZ3p5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
11.*a是指“a指向的变量”,而不仅是“a指向的变量所拥有的值”
用int*a声明的变量a是指向int型变量的指针。赋值a=&b的含义是把变量b的地址存放在指针a中,表达式*a代表a指向的变量,它既可以放在赋值符号的左边,也可以放在右边。
12.不要滥用指针,可能会把自己搞糊涂。
13.Unix/Linux可执行文件格式ELF,dos下是COM,COFF格式,windows下是PE。具有共同的概念--段。Segmentation是指二进制文件内的区域,所有某种特定类型信息被保存在里面。Size程序可以求各个段的大小
![](https://img-blog.csdn.net/20140101171459531?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZHVidXFpbmdmZW5nZ3p5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
在可执行文件中,正文段(textsegment)储存指令,数据段(data segment)储存已初始化的全局变量,BSS段(BSS segment)储存未赋值的全局变量所需的空间。
堆栈段(运行时创建),存放调用栈和局部变量。如果越界访问,会出现段错误。栈帧过多,可能导致段溢出。
14.栈大小Linux下ulimit –a可显示当前栈大小,而ulimit –s 32768将把栈大小指定为32MB,windows使用gcc可指定可执行文件的栈大小,gcc –Wl,--stack=16777216,这样栈大小就变成了16MB
栈大小是有链接程序ld指定的,gcc编译参数-Wl的作用正是把其后的参数传递给ld
15.C语言程序设计奥秘
16.gcc 命令的常用选项
选项 解释
-ansi 只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色,
例如 asm 或 typeof 关键词。
-c 只编译并生成目标文件。
-DMACRO 以字符串“1”定义 MACRO 宏。
-DMACRO=DEFN 以字符串“DEFN”定义 MACRO宏。
-E 只运行 C 预编译器。
-g 生成调试信息。GNU 调试器可利用该信息。
-IDIRECTORY 指定额外的头文件搜索路径DIRECTORY。
-LDIRECTORY 指定额外的函数库搜索路径DIRECTORY。
-lLIBRARY 连接时搜索指定的函数库LIBRARY。
2. Main函数总是返回0
3. Hypot函数
原型:extern float hypot(float x, float y);
用法:#include <math.h>
功能: 计算直角三角形的斜边长
用法: double hypot(double x, double y);
例:
#include <stdio.h>
#include <math.h>
int main(void)
{
double result;
double x = 3.0;
double y = 4.0;
result =hypot(x, y);
printf("Thehypotenuse is: %lf\n", result);
return 0;
}
4. 定义结构体的方法:“struct 结构体名称{域定义};”花括号后还有分号
5. 往往用“typedef struct{域定义;}类型名;”方式定义一个新类型名,这一可以像原生数据类型一样使用这个自定义类型。
6. 注意避免溢出。
7. 谓词函数命名成is_xxx的形式;返回int值,非0为真,0为假
8. int is_prime(intx)
{
inti;
for(i=2;i*i<=x;i++)
if(x%i==0)return0;
return1;
}
9. assert()是一个诊断宏,用于动态辨识程序的逻辑错误条件。其原型是: void assert(int expression); assert只是对所给的表达式求值,就像if判断语句中一样,然后如果该值为真则正常运行,否则报错,并调用abort(),产生异常中断,exit出来。使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。
在调试结束后,可以通过在包含#include<assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下:
#include<stdio.h>
#define NDEBUG
#include<assert.h>
注意:assert是宏,而不是函数。在C的assert.h头文件中。
1)对非预期错误使用断言2)不要把需要执行的代码放入断言中
3)对来源于内部系统的可靠的数据使用断言,而不要对外部不可靠的数据使用断言,对于外部不可靠数据,应该使用错误处理代码。再次强调,把断言看成可执行的注释。
10.调用栈,由多个栈帧stack frame组成,每个栈帧对应着一个未运行完的函数。栈帧中保存了该函数的返回地址和局部变量,保证不同函数间的局部变量互不相干,因为不同函数对应着不同的栈帧。Gdb中可用backtrace命令打印所有栈帧,若要用p打印非当前栈帧的局部变量,可以用frame命令。
11.*a是指“a指向的变量”,而不仅是“a指向的变量所拥有的值”
用int*a声明的变量a是指向int型变量的指针。赋值a=&b的含义是把变量b的地址存放在指针a中,表达式*a代表a指向的变量,它既可以放在赋值符号的左边,也可以放在右边。
12.不要滥用指针,可能会把自己搞糊涂。
13.Unix/Linux可执行文件格式ELF,dos下是COM,COFF格式,windows下是PE。具有共同的概念--段。Segmentation是指二进制文件内的区域,所有某种特定类型信息被保存在里面。Size程序可以求各个段的大小
在可执行文件中,正文段(textsegment)储存指令,数据段(data segment)储存已初始化的全局变量,BSS段(BSS segment)储存未赋值的全局变量所需的空间。
堆栈段(运行时创建),存放调用栈和局部变量。如果越界访问,会出现段错误。栈帧过多,可能导致段溢出。
14.栈大小Linux下ulimit –a可显示当前栈大小,而ulimit –s 32768将把栈大小指定为32MB,windows使用gcc可指定可执行文件的栈大小,gcc –Wl,--stack=16777216,这样栈大小就变成了16MB
栈大小是有链接程序ld指定的,gcc编译参数-Wl的作用正是把其后的参数传递给ld
15.C语言程序设计奥秘
16.gcc 命令的常用选项
选项 解释
-ansi 只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色,
例如 asm 或 typeof 关键词。
-c 只编译并生成目标文件。
-DMACRO 以字符串“1”定义 MACRO 宏。
-DMACRO=DEFN 以字符串“DEFN”定义 MACRO宏。
-E 只运行 C 预编译器。
-g 生成调试信息。GNU 调试器可利用该信息。
-IDIRECTORY 指定额外的头文件搜索路径DIRECTORY。
-LDIRECTORY 指定额外的函数库搜索路径DIRECTORY。
-lLIBRARY 连接时搜索指定的函数库LIBRARY。
相关文章推荐
- 【算法竞赛入门经典】第三章:数组和字符串 代码和笔记
- 【算法竞赛入门经典】第二章:循环结构程序设计 代码及笔记
- 【算法竞赛入门经典】第四章:函数和递归笔记和代码
- 算法竞赛入门经典 第三章 学习笔记
- [算法]算法竞赛入门经典,笔记,见证成长。
- [算法]算法竞赛入门经典,笔记,见证成长。
- 算法竞赛入门经典 笔记(1)
- 算法竞赛入门经典 习题笔记
- 算法之路二:刘汝佳算法竞赛入门经典 组合数和素数判定
- 排序(permutation)-算法竞赛入门经典
- 算法竞赛入门经典 1.1 算术表达式
- 算法竞赛与入门经典 例题3-4 猜数字游戏的提示
- 算法竞赛入门经典 第二章 上机练习(C++代码)
- 算法竞赛与入门经典习题1-6 三角形(triangle)
- 算法竞赛入门经典习题2-4 子序列的和(subsequence)
- 算法 算法竞赛入门经典第二版 2-6 排列
- 算法竞赛入门经典-第二章源代码
- 算法竞赛入门经典 例题 3-2 蛇形填数
- 算法竞赛入门经典 第一章的练习题
- 算法竞赛入门经典第二版 第二章