Pre>杂点
C语言特点
语言简洁、方便灵活;运算符、数据类型丰富
具有结构化控制语句、自由度大、可直接访问物理地址
可移植性好、执行效率高
算法评价的四个维度
可读性、正确性、健壮性、高效性(时间空间复杂度)
算法的五个基本特性
输入、输出、有穷性、确定性、有效性
数据
数据:就是“信息” 的统称
数据对象:该数据所对应的“信息” 所研究的对象
数据元素:
数据项:
Part1> 宏
“#” 打头系列都叫“宏”
常见宏
#include系列为 头文件引用系列
#include<iostream>// <> 调用的是系统头文件,
#include "algorithm" // " " 优先调用自备头文件,如果没有,则调用系统头文件
#define 为字符代换系列
#define add(x,y) x+y // 是一个“完全”的字符替代,
//eg 5*add(3,4)
//结果为 5*3+4 = 19
换句话说,#define不改变计算优先级
其他
#if 0
#endif
头文件的作用
1> 调用库功能
2> 可加强安全检查;当某个端口被调用时,可被察觉与检测。
Part2> 输入输出
1. 字符常量
\n 回车 \? 字符?
\t tab键 \" 字符"
\b 退格键 \' 字符'
\\ 字符“\”
2. scanf 与 printf
格式
scanf()
包含两个部分:格式控制部分,变量地址部分。使用时必须指明被输入变量的地址。
printf()
格式控制部分。
类型符
%d int类型 %s string类型
%ld long类型 %e 指数形式(类似于 1e9 这种)
%f float类型 %c char类型
%% 字符 % %.2f 保留两位小数
补位输出
% 对齐符 补位符号 补位长度 数据类型
默认:右对齐 ; 空格补位
右对齐符号:“-”
eg> %6d
int类型,长度6位,缺位则用空格补位置,右对齐。
eg>%-06d
int类型,长度6位,缺位则用0补位,文本信息左对齐。
按位输入
% 输入位数 数据类型
eg> scanf( "%2d",&x);
从当前位置开始,顺序读取两位长度的数字,将其存为int。
3. 字符串输入输出
gets(name)
读取字符串,以\n
为输入终止标志
puts(name)
输出字符串,自动输出\n
scanf("%s",&name)
读取字符串,以空格
为输入终止标志
printf("%s",&name)
输出字符串。
Part3> 运算
1. 类型转换
强制类型转换方式:(typename) name
long long a;
(int)a//表示强制转换为int类型的a
自动类型转换规则: 向最高精度对齐
常见类型的精度排序: long double > double > long long > int > float > char > bool
long > int >short ; double > float ;
2. 运算符
算术运算符:
+ - * / % 加减乘除、取模
+= -= *= /= %=
a++ a--,先参与其他运算,后自加
++a --a,先自加,后参与其他运算
位运算
>> >>= << <<=
& | ^ 与、或、异或
关系运算符
> >= < <=
==
!=
逻辑运算符
&& 且 ||或 !非
条件运算式
语句A ? 语句1:语句2
如果语句A==真,则返回语句1;否则返回语句2。
※※ 运算优先级
括号 > 算术 > 关系 > 逻辑 > 赋值
算术运算符: 位运算 > 乘除、取模 > 加减
关系运算符: 顺次
逻辑运算符:非 > 且 > 或
短路现象:
语句a && 语句b, 如果语句a为假,则不会执行语句b
语句a || 语句b, 如果语句a为真,则不会执行语句b
Part4> 条件语句
易错集合
易错1: switch
语句的执行逻辑是:到达某个case
时发现为真,则将该case
及其之后所有case
的语句全部执行。
易错2: break
语句:可用于switch
、while
、for
语句,用于终止当前层的语句结构(只终止最内层循环)
易错3:continue
语句:用于while
和 for
语句,用于跳过当前层的当前步骤(对最内层循环有效)
易错4: do while
和 while
的终止条件的判断
switch条件结构
switch语句的执行逻辑是:到达某个case时发现为真,则将该case及其之后所有case的语句全部执行。
switch(条件语句){
case 1: 值1
语句组1
case 2: 值2
语句组2
break;//可有可无
case 3: 值3
语句组3
...
default://上述条件都未满足时
语句组n+1
}
Part5> 变量声明与使用
1. typedef的用法
typedef struct {
//number list
int a,b,c;
char c,d,f;
}STU;
STU list,*head;
即:typedef是个使动词,typedef type-model type-name即 使type-model被称为 type-name
2. 指针
(1)定义
指针即一种变量,这种变量的值=一个存储数据的空间的地址
⇒ 不管一个指针指向的变量的类型是什么,指针自己、指针这个数据本身所占的空间大小均一致
(2)基础逻辑
(int *) 整体可以视为是一个数据类型,这个数据类型是一个指针,这个指针指向的地址是用于存储int类型的数据的。(char *) (struct *) 等同理
(3)赋值
空指针无法赋值
只能赋值为地址类型的数据
(4)指针数组与数组的指针
指针数组
int *p[n];
为指针数组,表示一个数组,其中的每个元素都是一个独立的指针。
int *(p[n]);
即:p为这个数组的名字,(int *)这个整体的含义是这个数组的类型(即指针类型)
数组的指针
int a[n];
是个整型数组,直接一个a
可表示a[0]
的地址 (指针),数组地址连续,所以指向a[i]
的地址的指针可用 (a+i)
表示
int a[n][m]
是个整形二维数组,直接a
可表示指向a[0][0]
的地址指针,a[i][j]
的地址可以用指针a+(i-1)*m+j
表示;同时,二维数组相当于每个元素都是一个一维数组 的 一维数组,所以 a[i]
可以视为一维数组a[i][0~n]
的数组名称,因而a[[i]
也可以作为常量指针,指向a[[i][0]
的地址。
(※)注:单独的数组名称可以被视为该数组的指针,指向该数组[0]下标的元素的地址,且是一个指针常量,不参与任何计算
int (*p)[n]
一个奇怪的表示方法…目前还没有弄清它的本质逻辑。但是它可以通过 int a[n][m];
p=a;
实现 p[i]
指向 a[i][]
这个一维数组
详细解释链接
(5) 指针函数与函数的指针
指针函数
int * function()
即这是一个函数,其返回值为指针
函数的指针
int (*p) ( )
即这是一个指针,其指向一个函数
3. 全局变量与局部变量的主要区别
1> 生命周期不同。 是否会自动释放。
2> 可使用的范围不同。 任意位置可使用vs某一语句块内使用。
特殊的局部变量
extern
在局部位置声明变量时,如果前面加extern
,
如extern int name
则表示该变量名name
并不是代表局部变量,
而是表示 该变量名name
为一个全局变量,且已被声明或将被声明;
static
4. 字符数组、字符串、字符数组表字符串
-------字符串----------
string a;
类型:支持单点修改,可以整体赋值
直接赋值 / 定义:string a=dsafasdfew";
单点修改: a[i]='Z';
函数调用:字符串名称.函数名称()
字符串各个位置的初始默认值=字符串结尾符:\0
常用函数:
int len = a.length()
字符串长度
--------字符数组--------
char a[N];
类型:支持单点修改,定义时可整体初始化,赋值时不能整体赋值。
单点修改:a[i]='Z';
[作为普通数组] 定义初始化: char a[]={'a','d','z','c' }
,表长=字母个数,即是个数组,元素为char
类型。
[作为字符串] 定义初始化:char a[]={“adfasdfer”}
,表长=字母个数+1,最后一个字母后面会自动补一个'\0'
作字符串结尾符;即是个字符串,只不过是以字符数组的形式表示。
[固定表长] 定义初始化: char a[N]={ }
,无论括号里写什么,表长=N。数组初始值默认为(int)0
,也相当于(char) \0
常用函数
int dis=strcmp(s1,s2);
比较s1和s2是否相同,如果相同,返回值为0。可以简单地理解成 strcmp(s1,s2) = s1 - s2;
int length = strlen(s1)
字符数组s1的长度
`
Part6> 文件
打开、创建、关闭
FILE *fp = fopen( "文件名 或 文件路径",操作方式);
其中,fp为文件指针
fclose(fp);
关闭文件
三大类操作方式: | 文本文件 | 二进制文件 | 追加 | 是否保留原内容 | 初始指向位置 |
---|---|---|---|---|---|
读 | ”r“ 只读 | "rb"只读 | “r+” 打开文件、读或写 | 不删除文件内原内容 | 文件头部 |
写 | "w"只写 | ”wb“只写 | ”w+“ 新建文件、读或写 | 删除文件内原内容 | 文件头部/尾部 |
追加 | ”a“读写 | ”ab“读写 | ”a+“ 打开文件、读、写、追 | 不删除文件内原内容 | 文件尾部 |
常见函数
记忆方法:整体形式与非文件函数类似,再加上文件指针的位置即可
fputc(ch,fp) | 字符输出 |
char ch = fgetc(fp) | 字符输入 |
fgets(str,n,fp) | 字符串输入(n-1)位 |
fputs(str,fp) | 字符串输出 |
fscanf(fp,"格式",变量地址) | 输入 |
fprintf(fp,"格式",变量名)" | 输出 |
fread(变量地址,sizeof(变量类型),变量个数,fp) | 整块读入 |
fwrite(变量地址,sizeof(变量类型),变量个数,fp) | 整块输出 |
feof(fp)
当前文件中的操作位置是否达到结束的位置
Part7> 命令
int main(int argc,char *argv[])
其中 argc
表示命令行参数个数
argv[]
表示指向命令行参数内容的指针 的数组