[TOC]
基础知识
算法
- 穷举法 对所有可能的情况逐一验证,直到全部情况验证完毕
- 迭代法 不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题
- 递归法 如果一个过程直接或间接地调用它自身,则称该过程是递归的
- 二分查找法 必须采用顺序存储结构,必须按关键字大小有序排列
- 回溯法 选优搜索法,又称为试探法
流程图
st=>start: 开始
e=>end: 结束
op1=>operation: 输入
cond=>condition: 判断
op2=>operation: 输出
st->op1->cond
cond(yes)->op2->e
cond(no)->op1
功能 | 图形 |
---|---|
开始/结束 | 圆角矩形 |
判断 | 菱形 |
输入/输出 | 平行四边形 |
运算 | 矩形 |
C语言特点
结构化:层次清晰,便于模块化组织,易于维护
语言简洁:适合作为入门语言可移植性好
功能强大:可用于系统开发,也可以做软件开发
开发工具
Visual Studio 新版本太大
VC++6.0年代太久远,与流行操作系统有冲突,不推荐
Code::Blocks 目前比较推荐的开源C/C++开发工具,CodeBlocks 安装文档及安装教程
备注:先编译,再执行
C语言基本结构
#
开头称为预处理器指令stdio.h
是standared input and output .header
标准输入/输出 头文件.h
可以是库里面的<>
,也可以是自定的""
main()
是程序起点,一个程序只有一个mainprintf
打印到屏幕上
所有符号要成对,所有字符必须是英文
注释 是有必要的编程习惯编码规范
编译与执行
- 编译 形成目标代码/文件,常见
.o
或者.obj
- 连接 将代码与C语言库连接一起
- 执行 生成可执行文件
编译预处理
主要是对其中的伪指令(以#
开头的指令)和特殊符号进行处理
- 宏定义指令
如#define Name TokenString
预编译所要做的是将程序中的所有Name
用TokenString
替换,但作为字符串常量的Name则不被替换;#undef
预编译将取消对某个宏的定义,使以后该串的出现不再被替换;
- 条件编译指令
如#ifdef,#ifndef,#else,#elif,#endif
等,这些伪指令的引入使得程序员可以通过定义不同的宏来决定编译程序对哪些代码进行处理;
- 头文件包含指令
如#include "FileName"
或者#include
等,在头文件中一般用伪指令#define
定义了大量的宏(最常见的是字符常量),同时包含有各种外部符号的声明;
- 特殊符号
预编译程序可以识别一些特殊的符号。例如在源程序中出现的LINE
标识将被解释为当前行号(十进制数)FILE
被解释为当前被编译的C源程序的名称,预编译程序对于在源程序中出现的这些串将用合适的值进行替换。
数据存储
计算机使用内存来记忆或存储计算时所用的数据,内存也叫主存或随机访问存储器RAMCPU频率基本为 GHz,速度很快,硬盘一般为 百M,所以内存作为桥梁
变量
计算机总一块特定的存储空间,涉及内存管理通过变量名可以快速找到内存总存储的数据
命名规则
- 首字母为字母或下划线
- 其他字符可以是字母、数字和下划线
- 不得使用关键字
主流命名法则
驼峰命名法 函数名中的每一个逻辑断点都有一个大写字母来标记,首字母小写
匈牙利命名法 在变量名前面加上相应的小写字母的符号标识作为前缀,标识出变量的作用域、类型等,便于维护
帕斯卡命名法 与驼峰命名法类似,不过帕斯卡命名法是首字母大写
下划线命名法
myData //驼峰命名法
iMyData //匈牙利命名法
MyData //帕斯卡命名法
my_data //下划线命名法
较短的单词可通过去掉“元音”形成缩写;较长的单词可取单词的头几个字母形成缩写;一些单词有大家公认的缩写,例如:temp->tmp
、标志寄存器->flag
、statistic->stat
、increment->inc
、message->msg
等;指针变量一般命名"p"+变量类型+名称:pfStat
;全局变量用g_开头;静态变量用s_开头;枚举变量全部用大写;结构体用S开头;联合体用U开头;
关键字
c语言共包含32个关键字,如下
//类型说明
int //定义整型变量或指针
long //定义长整型变量或指针
short //定义短整型变量或指针
float //定义单精度浮点数变量或指针
double //定义双精度浮点数变量
char //定义字符型变量或指针
unsigned //定义无符号的整型变量或数据
signed //定义有符号的整型变量或指针
const //定义常量或参数
void //定义空类型变量或空类型指针,或指定函数没有返回值
volatile //定义的值可能在程序的外部被改变
enum //声明外部变量或函数
struct //定义结构体类型
union //定义无符号的整型或字符型变量或指针
//语句定义
if //定义if语句或if-else语句
else //定义枚举类型
goto //定义goto语句
switch //定义switch语句
case //定义switch中的case子语句
do //定义do-while语句
while //定义while语句或do-while语句
for //定义for语句
continue //在循环语句中,回到循环体的开始处重新执行循环
break //跳出循环或switch语句
return //从函数返回
default //定义switch语句中default子语句
typedef //为数据类型定义别名
//存储类型
auto //指针变量的存储类型,是默认值
register //指定变量的存储类型是寄存器变量
extern //声明外部变量或函数
static //指定变量的存储类型是静态变量,或指定函数是静态函数
//长度运算符
sizeof //获取某种类型的变量或数据所占内存的大小,是运算符
- return
return
返回值的类型一般是函数定义的类型,如果return
后表示式的值类型和函数值的类型不一致,则以函数函数类型为准,即:函数类型决定返回值类型;return
不能返回指向局部变量的类型;
结束一个函数并返回其后面表达式中的值,需注意return
不能返回指向局部变量的类型;
- void
void
为空类型,void *
为空类型指针;void a;
是不允许的,每次定义一个变量,系统都会为其分配空间,而void类型无法确定,系统就不知道该为它分配多大的空间,显然是不合理的;void * p;
是允许的,因为这是一个指针变量,系统都是默认分配四个字节的空间,至于具体指向的空间总存放的数据类型,就由用户自行操作;
- const
constant的缩写,意为不变,即用const
修饰的变量的不允许改变的,也可称为只读变量。但是要注意一点,只读变量虽然值不能改变,但它还是变量,不是常量;
- break和continue
break
退出当前循环,continue
退出当次循环;break
可用于switch
语句,表示跳出整个switch
块,而continue
则不能用于switch
语句;它们都可用于循环语句的循环体;break
用于立即退出当前循环,而continue
仅跳过当次循环(本次循环体内不执行continue
语句后的其它语句,但下次循环还会执行)
数据类型
整型:短整型short
;整型int
;长整型long
;
浮点型:单精度float
;双精度double
;
字符型:char
构造类型:数组;结构体struct
;共用体union
;枚举类型enum
;
指针类型;
空类型void
;
变量声明
声明变量:数据类型 变量名
定义时初始化/定义后初始化变量名不要重复;一条语句可以声明类型相似的多个变量
占位符
-
%d
和%i
表示int型 -
%f
表示float型,float 32位,4个字节,7位有效数字,声明时需要在数值后面加f,打印时的%.2f
表示只保留两位小数(显示是这样,实际值并不是)默认精度是6位小数 -
%lf
表示double型浮点数,64位,8个字节,16位有效数字,正常小数形式的声明都是double型,打印时的%.2lf
表示double 型两位小数 -
char
8位,1个字节,%c
:单个字符%s
:字符串
sigend char有符号,范围-128~127
unsigned char无符号,范围 0~255
这个有无类型取决于编译器
常用ASCII码
值 | 符号 | 值 | 符号 | 值 | 符号 | 值 | 符号 | |
---|---|---|---|---|---|---|---|---|
0 | 空字符0 | 42 | * | 62 | > | 123 | { | |
32 | 空格 | 43 | + | 63 | ? | 124 | \ | |
33 | ! | 44 | , | 64 | @ | 125 | } | |
34 | " | 45 | - | 65 ~ 90 | A ~ Z | 126 | ~ | |
35 | # | 46 | . | 91 | [ | 127 | DEL(Delete键) | |
36 | $ | 47 | / | 92 | \ | |||
37 | % | 48 ~ 57 | 0 ~ 9 | 93 | ] | |||
38 | & | 58 | : | 94 | ^ | |||
39 | ' | 59 | ; | 95 | _ | |||
40 | ( | 60 | < | 96 | ` | |||
41 | ) | 61 | = | 97 ~ 122 | a ~ z |
小写字母与大写字母的ASCII码差一个空格(32)
转义序列
转义序列 | 名称 | 描述 |
---|---|---|
a | 蜂鸣警报 | 在一些系统中警报不起作用 |
b | 退格 | 将光标回退一格 |
f | 换页 | 将光标移动到下一页开始处 |
n | 换行 | 将光标移动到下一行开始处 |
r | 回车 | 将光标移动到当前行开始处 |
t | 水平制表 | 将光标移动到下一个水平制表位置 |
v | 垂直制表 | 将光标移动到下一个垂直制表位置 |
' | 单引号 | 用于打印 单引号 |
" | 双引号 | 用于打印 双引号 |
? | 问号 | 用于打印 问号 |
\ | 反斜线 | 用于打印 反斜线 |
scanf函数
C函数库包括多种输入函数,scanf
是最通用的一个,可以读取不同格式的数据sacanf
的使用与printf
函数类似,读取基本类型值时,变量前要加&
符号,转义字符一样
程序结构
C 程序主要包括以下部分:
- 预处理器指令
- 函数
- 变量
- 语句 & 表达式
- 注释
#include <stdio.h>
int main()
{
/* 我的第一个 C 程序 */
printf("Hello, World! \n");
return 0;
}
-
#include <stdio.h>
是预处理器指令,告诉 C 编译器在实际编译之前要包含 stdio.h 文件; -
int main()
是主函数,程序从这里开始执行; -
/*...*/
将会被编译器忽略,这里放置程序的注释内容; -
printf(...)
是C中另一个可用的函数,会在屏幕上显示消息"Hello, World!";
; -
return 0;
终止 main() 函数,并返回值 0。
编译 & 执行
- 打开一个文本编辑器,添加上述代码;
- 保存文件为
hello.c
; - 打开命令提示符,进入到保存文件所在的目录;
- 键入
gcc hello.c
,输入回车,编译代码; - 如果代码中没有错误,命令提示符会跳到下一行,并生成
a.out
可执行文件; - 键入
a.out
来执行程序; - 您可以看到屏幕上显示"Hello World"。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。