《算法笔记》学习 01&02.基础和C/C++快速入门

第一章 如何使用本书

1.1 基本内容概括:

  • 1 - 3 章 入门模拟
  • 4 章 算法初步
  • 5 章 数学问题
  • 后略 …

1.2 OJ及评测标准

  1. VC6.0标准古老,尽量用其他的编译器
  2. OJ评测分为单点测试和多点测试
  3. 常见的评测结果分为
    AC:正确 (Accepted)
    CE:编译错误 (Compile Error)
    WA:答案错误 (Wrong Answer)
    TLE:运行超时 (Time Limit Exceeded)
    RE:运行错误 (Runtime Error)
    MLE:内存超限 (Memory Limit Exceeded)
    PE:格式错误 (Presentation Exceeded)
    OLE:输出超限 (Output Limit Exceeded)

第二章 C/C++快速入门

2.1 C/C++基础知识

  1. 头文件:一般用:
    #include
    #include
    #include
    且一般文件保存为 .cpp 格式
  2. 命名规则:
    第一个字符 为 字母或下划线 此外 其他字符为字母数字或下划线
  3. 数据类型:

类型 位数 输入 输出 范围或注意事项
int 32位 %d %d -231 ~ 231-1 大致109范围内用
long long 64位 %lld %lld -263~263-1 大致109 ~ 1018范围内用
float 32位 %f %f 规格化正数范围 2-126~2127*(2-2-23), 最小非规格化正数是2-149
double 64位 %lf %f 规格化正数范围 2-1022~21023*(2-2-52), 最小非规格化正数是2-1074
char 8(7)位 %c %c 读入空格和回车 0:48 A:65 a:97
char[] 字符数组长 %s %s 输入不需要取地址

ps:

  • 大于int型的值的long long型值需要后面加上LL

  • 尽量不用float,用double

  • 关于最小正非规格化float:
    2-149 = 1.4012910-45

	typedef struct float{
	int l : 24;
	int h : 8;
	}Float;
	int main(){
		Float obj;
		obj.l = 0x000001;
		obj.h = 0x00;
		printf("%.200f", *(float*)(&obj));
		system("pause");
		return 0;
	}

min_float

  1. 转义字符:
    \n : 换行
    \0 : 空字符 NULL
    %% : %
    \\ : \

  2. 符号常量 : #define ADD(a,b) ((a)+(b))注意括号
    精确定义pi : const double pi = acos(-1.0);

  3. 位运算符:
    左右移位x a<>x
    与运算 a&b
    或运算a|b
    异或运算a^b
    取反运算~a

  4. 输入输出格式:

    输出格式 :
    printf("%#n.mf");
    填充字符 #
    位宽 n (超过则按超过表示)
    保留小数位数 m(四舍六入五成双)

    输入格式 :
    scanf("%#nd");
    与之前相同,

  5. 常用数学函数:
    fabs(double x) 求绝对值
    floor(double x) 上取整
    ceil(double x) 下取整
    pow(double r,double p) rp
    sqrt(double x) 开方
    log(double x) lnx
    sin(double x) cos(double x) asin(double x) acos(double x) atan(double x)
    round(double x) 四舍五入

  6. 注意的选择结构:
    switch格式使用:
    switch(expression){
    case constant1 : break;
    case constant2: break;
    default: ;
    } 1

    do while格式使用:
    do
    { …;
    }while(bool) ;//注意分号

    c++中for语句中可以自定义变量(.cpp) 而c语言不可以(.c)

2.2 C/C++基础知识 (数组 到 黑盒测试)

  1. 数组:
    没有初始化:全部是随机数
    部分初始化:未初始化的部分默认为0
    初始化为零:int a[10] = {}; int a[10] = {0};

    递推分顺推和逆推

    数组大小大于10^6则放在主函数外定义来调用静态存储区,放在主函数内定义则调用系统栈(空间小)

  2. 冒泡排序:

	for(int i=0;i
  1. memset()函数:(#include):
    memset(数组名,值,sizeof(数组名));
    按字节赋值[-1]补=0xffffffff , [0]补=0x00000000,
    若是1 = 按最低位01字节赋值为0x01010101=16843009出现错误
    所以只赋值0或-1 其他则用fill()函数
template 
  void fill (ForwardIterator first, ForwardIterator last, const T& val)
{
  while (first != last) {
    *first = val;
    ++first;
  }
}
  1. 字符数组:
    字符数组初始化时可以用字符串(仅初始化时)
    最后一个元素是’\0’,
    %s 和 gets()会自动添加 ,其他情况注意大小+1

  2. 字符数组输入输出
    putchar(char[i]); 输出一个字符
    char[i]=getchar(); 输入一个字符
    puts(charname)输出一行\0字符串,默认添加\n在最后
    gets(charname); 输入一行字符串,识别\n结束,\n被丢弃不在buffer中 ,自动添加\0到末尾
    scanf("%d…"); 忽略空白符(空格,tab,\n),格式读取字符
    scanf("%c"); 格式读入char,不忽略空白符

	char a[15] = {};
	int n = 0;
	char temp = ' ';
	scanf("%d", &n);//产生问题
	//scanf("%d\n", &n); //解决方法1
	//scanf("%c", &temp);//解决方法2
	//getchar();//解决方法3
	gets_s(a);
	printf("%s", a);
  1. 函数:
    strlen(str) :\0之前的字符个数
    strcmp(str1,str2) :比较字典序返回1 0 -1
    strcpy(str1,str2) :将str2复制给str1 包括\0
    strcat(str1,str2) :将str2添加到str1后面

  2. 字符串格式输入输出
    sscanf(str,"%…",&n) :将str中的内容以某种格式写到到n中
    sprintf(str,"%…",r) :将r中内容以某种格式写到str中

  3. 值传递、指针传递和引用传递区别:
    值传递:副本改变
    指针传递:指针是副本,可以改变指针所指的内容
    引用传递:相当于起了别名,不产生副本,改变本身
    引用指针:可以改变指针本身 int* &p = &n; 将&去除后可以更好理解

    交换方法:指针交换,引用交换,指针引用交换

  4. 指针:无符号整性数
    p+1:下一个类型的地址 实际上是 p+sizeof(int)
    字符数组名为首地址
    指针相减之差为元素类型的单位差

  5. 结构体:

	struct name{int a;}   varname1 , varname2[100] , *varname3;  
	//类似于
	int a1,a2[100],*a3;
	
	typedef  struct name{int var;} a;
	a a1;
	//类似于
	typedef int b; 
	b b1; 

\
(*p).a 就是 p->a
c++中struct就是特殊的class,可以通过默认函数初始化或者初始化列表初始化内部变量

  1. 浮点数比较:
    const double eps = 1e-8;

    == : #define Equ(a,b) (fabs(((a)-(b)))<(eps))
    > : #define More(a,b) (((a)-(b))>(eps))
    >= : #define MoreE(a,b) (((a)-(b))>(-eps))

  2. 黑盒测试:
    单点测试:
    正常写
    多点测试:
    while(scanf("%d",&n)!=EOF){ …;break; }
    while(gets(str)!=NULL){ …;break; }
    while(T–){}
    最后末尾的格式可以通过判定条件来设置


  1. switch is limited to compare its evaluated expression against labels that are constant expressions.It is not possible to use variables as labels or ranges. 来自www.cplusplus.com/ ↩︎

你可能感兴趣的:(算法笔记,算法笔记)