- 流程图包含:顺序、选择和循环结构
- 当型循环结构:某个条件成立时,重复执行循环体
- 直到型循环结构:重复执行循环体,到条件成立时退出
- 流程图分类及优缺点
- 传统流程图:不易表示层次结构、模块调用关系等
- 结构化流程图(NS图):不破坏结构化原则、功能域明确、层次及嵌套明确
- 流程的表示
- 传统流程图
- NS图
- 自然语言
- 算法描述语言
- 编程语言
- 进制转换
- 十进制小数转为二进制(其他任意进制):每次乘2取整,取整结果从上到下保留(整数部分的转换是取余,而且从下到上保留)
- 十进制小数转为其他进制时,不一定能够完全准确地转化,需要根据精度要求进行保留
- 原码、反码、补码、偏移码
- 正数:反码、补码均与原码相同,补码符号位取反即为偏移码。
- 负数:
- 反码:原码除符号位外各位取反
- 0可以由00000000,11111111两种情况表示
- 补码:反码的最后一位加1
- 偏移码:补码的符号位取反
- 反码:原码除符号位外各位取反
- 补码和偏移码:使得正负数的加减法同普通数一样,不需要考虑符号位
- 算数类型
- 整型:基本整型、长整型、短整型、无符号整型;不同进制表示(int 占4字节)
- 实型:十进制形式、指数形式、单精度和双精度
- 字符型:转义字符(char 占1字节)
- 枚举类型
- void 类型
- 格式输出:自动突破场宽限制
- 整型(十进制)
- %d 整型
- %ld 长整型
- %u 无符号整型
- 整型(八进制)
- %o 八进制整型
- 整型(十六进制)
- %x 十六进制整型
- 实型:
- 十进制:%f
- 指数形:%e
- 单精度:%f
- 双精度:%lf
- 字符型:%c
- 注意:调用printf函数时,参数是从右到左传递的
- 整型(十进制)
- 格式输入
- 格式说明符与输出部分的完全一致
- 定义为双精度的变量必须输入时说明符为:%lf,否则出错
- 字符输出函数:putchar(c),c可以是字符型、整型变量或常量或表达式
- 字符输入函数:getchar(),接收从键盘输入的一个字符
- C语言中,在连续有几个&&的表达式中,从左至右只要有一个运算为假,整个结果均为假,不再执行后面的运算。
- 同样,对于||的表达式,从左至右有一个结果为真,则结束判断
- 字符串连接:如下a##x,x为a的角标。
#include <stdio.h>
#define MP(x) printf("%d", a##x)
main( )
{
int a1=2, a5=4;
MP(1);
MP(5);
}
-
宏定义
- #define:宏定义
- #define,一行写不完时,行尾加上续行符“\”
- #undef 使已经定义的标识符变为未定义
- #define:宏定义
-
文件包含定义
- #include <>
- #include ""
-
条件编译命令
- 第一种形式: 如果标识符已经定义,则程序段1编译,程序段2不编译; 如果标识符没有定义,则程序段2编译,程序段1不编译。 标识符的定义往往用#define命令定义
#ifdef //标识符 //程序段1 #else //(这部分可以省略) //程序段2 #endif
- 第二种形式: 如果标识符没有定义,则程序段1编译,程序段2不编译; 如果标识符已经定义,则程序段2编译,程序段1不编译。
#ifndef //标识符 //程序段1 #else //(这部分可以省略) //程序段2 #endif
- 推广形式:最靠前的常量表达式值为真的部分被编译(从n+1个程序段中选择一段参加编译)
#if 常量表达式1 程序段1 #elif 常量表达式2 程序段2 …… #elif 常量表达式n 程序段n #else 程序段n+1 #endif
-
#pragma命令
- 作用是只是编译器如何进行编译
- #pragma once是将指定文件在编译器中只包含一次,防止重复定义
#if _MSC_VER > 1000 #pragma once #endif #include <stdio.h> //stdio.h头文件只会被编译一次 #include <stdio.h> #include <stdio.h> ……
-
#line命令
- #line 数字x "文件名":显示文件中第x行开始的计数
- while(条件表达式)···循环体
- do···while(条件表达式)
- for语句循环体
- break:退出循环体
- continue:结束本次循环,但不退出循环结构
- C语言允许定义空函数,但不允许嵌套定义函数
- C语言中函数只能通过函数名返回一个值;如果有多个值,可以使用结构体等形式的变量作为返回值
- 函数的参数传递:形参与实参结合
- 当调用一个函数时,不是将调用模块中的实参值直接传送给被调用函数的形参,而是将存放实参的地址传给形参。
- C语言函数参数的传递是通过栈来实现,并且是单向传递
- 函数压栈顺序为:参数从右向左传递
- 函数可以通过参数将变量值传递给被调用函数,但被调用函数不能通过参数将变量值传回调用的函数。
- 变量的作用范围
- 局部变量:函数内部定义的变量,只在函数范围内有效
- 全局变量:在函数外定义的变量,从定义位置到文件结束都有效
- 局部变量与全局变量同名时,全局变量被局部变量掩蔽
- 变量的存储类型
- auto:自动类型
- static:静态类型:函数调用结束后值不会消失而保留原值
- register:寄存器类型
- extern:外部类型,全局变量
- 函数的类型
- 内部函数:只能把本文件函数调用
- 外部函数:能被其他文件函数调用
- 递归调用:递归函数(自己调用自己)
- 直接递归
- 间接递归(通过调用其他函数来调用自身)
- 递归调用可以代替循环语句
- 字符数组与字符串的输入与输出
- %c 用于输入输出单个字符
- %s 用于输入输出一个字符串
- 在使用格式说明符号%s为字符型数组输入数据时,字符串的分隔符是空格符,因而输入的字符串包含空格符时,只截取空格前的部分作为字符串赋给字符数组。
- 字符型中包含一个字符串结束符,不计入字符串的长度,但需要另外占用1字节空间。
- 常用字符串处理函数
- puts(s) 输出字符串s
- gets(s) 从终端读入一行字符到字符数组
- strcat(s1,s2) 将字符串s2接到字符串s1的后面,返回字符串s1的地址
- strcpy(s1,s2) 将字符串s2拷贝到s1中
- strcpy(s1,s2,n) 将字符串s2的前n个字符拷贝到s1中
- strcmp(s1,s2) 按字典序比较两个字符串大小。若返回值大于0,则s1的字典排序更靠后
- strlen(s) 求字符串s的长度,不包含结束符
\0
- strlwr(s) 将字符串s中的大写字母转换成小写字母
- strupr(s) 将字符串s中的小写字母转换成大写字母
- sprintf(s,"输出格式",变量列表)
- sscanf(s,"输出格式",变量列表)
- 有序表的二分查找:
- 只适用于顺序存储的有序表
- 有序表:元素非递减排列
- 冒泡排序:
- 逐次比较相邻元素大小
- 若前面元素大于后面的则互换位置,消除了一个逆序
- 选择排序:
- 扫描线性表,选出最小元素,交换至最前面
- 再对剩下的子表扫描选最小
- 插入排序:从后面开始,想象整理扑克牌
- C语言中,对内存数据存取的方法:
- 直接存取:直接用变量名存取变量所占内存单元中的内容
- 间接存取:从存放变量地址的指针变量中取得该变量的存储地址,再从该地址存取该变量值
- 指针的基本概念:
- 用途:专门用以存放其他变量所占存储空间的首地址
- 指针变量的值是地址,普通变量的值是数据
- 指针的相关操作:
- 可以对指针变量进行初始化
- 可以作为函数的参数,实现调用函数与被调用函数之间数据的双向传递
- 指向指针的指针:
- 指针:一级间接访问
- 指向指针的指针:二级简介访问
- 当p指向数组a的首地址时,p+i指向数组的元素a[i]
- 指针数组:每个元素均为指针类型的数组
- C语言动态内存分配
- 内存申请malloc
#include <stdlib.h> #include <malloc.h> …… char *p;float *q; p = (char *)malloc(sizeof(char) * 10); q = (float *)malloc(sizeof(float) * 10);
- 内存释放
free(p);
- 结构体类型数据:
- 结构体类型是用户根据数据处理的需要临时定义的一种类型
- 初始化时,将所有的成员数据用花括号括起来
- 结构体类型也可以形成数组、指针、指针数组等
- 结构体变量的大小
- 字节对齐问题:默认以结构体最长的成员对齐,不够的自动补齐
- 可以更改对齐
#include <stdio.h> #pragma pack(4) ……
- 文件:存储在外存储器上数据的集合
- 文本文件:每个字节存放一个字符的ASCII值
- 二进制文件:每个字节不代表一个字符
- 文件类型指针:
- C语言的缓冲文件系统中,用文件类型指针标识打开的文件
- 一般操作:
- 打开文件
- 文件操作:读与写
- 关闭文件
- 文件的读写函数:
- 字符:fgetc()、fputc()
- 字符串:fgets()、fputs()
- 数据块:fread()、fwrite()
- 格式读写:fscanf()、fprintf()
- 判断文件结束:feof()
- 文件的定位函数:
- rewind():将读写指针移动至文件开头
- fseek():将文件读写指针移动到指定位置
- ftell():返回文件当前的读写位置
- fflush():清空文件的输入输出缓冲区流
- clearerr():清除由于读写等操作失败引起的文件输入输出缓冲区的错误状态
clearerr(fp);//先清除错误状态 fflush(fp);//刷新
- 六种基本的位运算:
- 按位与
- 按位或
- 按位异或
- 按位取反
- 左移:左移k位,相当于该整数乘2^k
- 右移:右移k位,相当于该整数除以2^k