二级考试内容之C和Python

——————————C部分——————————

C1 C语言程序的结构

计算机是一种具有内部存储能力、由程序自动控制的电子设备。
人类用程序设计语言(C语言等高级语言,此处以C为例)编写出.c格式的源程序后,再经过编译器使用编译程序编译成二进制形式的机器指令(或.obj格式的目标程序),计算机就会按照目标程序中的指令顺序自动工作。
然后,连接程序(Link)将目标程序与C语言提供的各种库函数连接起来,最终生成可运行的.exe格式的可执行文件
通常,人们把每个可进行单独编译的源文件叫做一个编译单位
程序设计的步骤:确定数据结构、确定算法、编码/编程、在计算机上调试程序、整理并撰写文档资料。
算法是为解决某个特定问题而采取的一系列步骤,它具有步骤有穷性、确定性、可行性、有输出性。
伪代码是一种近似于高级语言但又不受语法约束的一种语言描述形式,欧美喜欢用。
我国喜欢用的是流程图,它具有圆角起止框、矩形处理框、平行四边形输入输出框、菱形判断框、流程线、连接点(就像负反馈那种)、注释等元素和顺序、选择、循环等结构。
这三种基本结构可以组成解决任何复杂问题的算法,由它们组成的程序/算法称为结构化程序/算法。
此外还有一种N-S流程图,它有点像scratch那种用表达式拼凑成的图块。
在需要计算机处理复杂任务时,可以将其分解为若干个子任务,每个子任务又可以分为只完成一项简单功能的小任务。
将多个小模块组合起来实现复杂的功能的自顶向下、逐步细化的程序设计方法被称为“模块化程序设计”,这些小模块也称为模块化结构。
C语言就是一种结构化程序设计语言,它没有子程序的概念,其函数可以完成子程序的所有功能。
C语言也允许对函数单独进行编译,从而实现模块化,而且它还具有丰富的数据类型。

——C语言程序的组成部分为:
首先是导入.h格式的头文件,如#include
然后是宏定义,如#define PI 3.114514。宏定义的变量最好大写。
之后是一些函数和对象的定义
最后是必运行的主函数,即int main(){……return 0;}。这里的0一般它return不return都行。
再之后可能还有函数定义。
其中不乏有//注释/*注释*/等形式的注释

C2 数据类型及其运算

变量、函数等的标识符只能由数字、字母和下划线组成,且首字符不能为数字,大小写有区分,标识符不能过长。它包含不能更改的关键字、可以重载的预定义标识符用户标识符

不能更改的量为常量,如长/短整形常量(int)、实型常量(float/double)、字符常量(char)、字符串常量(char[])。
yz可以宏定义出符号常量,如上文中的PI
可以更改的量为变量,也有这几种,但必须先声明/定义再使用。
C语言中定义的变量代表内存中的一个存储单元。
sizeof(数据类型)可以求某种数据类型的字节长度。

整型常量可加二进制的0b/0B、8进制的0或16进制的0x/0X前缀,16进制整数中的A~F也不分大小写。在C语言中,非十进制数只能是正整数。整型变量定义如int a1,a14=5,a=14,其它类型变量同理。
整型量默认为4字节的有符号长整型量(signed long int),而短整型占2字节,地址量占8字节。
在常量后面加U/u代表无符号型,加L/l代表长型。
有符号型常量的第一位为符号位,且以补码形式储存。
正数的补码等于其原码,负数则先将原码的数值位取反得到反码,然后再+1(即绝对值-1)得到补码。

实型常量则必有小数点,如1.0,用带E/e的科学记数法表示数必为实型量。
单精度实型常量(float)为4字节长,双精度实型常量(double)为8字节长。
数字之间的基本运算符有+加、-减、*乘、/除、%余,但C语言中两个整型量相除得到的是整商,且整型量之间才能求余数。
整型与实型相计算时,整型会被转换成实型。
小数点前/后内容省略代表为0,但不能前后都省略,光剩个小数点。

在ASCII码中,'0'=48,'A'=65,'a'=97,同一个字母的小写的ASCII码比其大写多32。
C语言中,'1'字符/char"114514"字符串/char[],它们的一个字符都只占一个字节。
调用C语言提供的对字符进行处理的库函数时,要#include
字符(串)中,转义符\n为换行,\t为制表符,\'``\\等为不转义。
\0等为以8进制ASCII码转义,\x数字为以16进制ASCII码转义。
字符和0~127之间的整数可以互换。
scanf("%c……",&a,&b,……)读入字符时,不能用空格或回车分割,若指定了字符输入宽度则需左对齐输入。
getchar()返回从终端输入的一个字符,putchar(字符)则向终端输出一个字符。
isalpha(字符)判字母,isdigit(字符)判数字,isspace(字符)判空格,isupper(字符)判大写,islower(字符)判小写。

C语言中的量可以被存储为默认的自动型/auto静态型/static
局部变量可以说明成自动型或静态型,而全局变量只能是静态型。
存储类别确定了对象在内存中的存储位置,从而确定了对象的作用域和生存期。
一个C程序在内存中的存储映像依次为动态存储区(堆栈)-静态存储区-程序代码区。
动态存储区用来存储函数调用时的返回地址、auto型局部变量等。
静态存储区用来存储全局变量和static型局部变量。
进入函数或复合语句时,系统自动为auto变量分配存储单元,退出时自动释放这些存储单元。
auto型变量可在各函数之间隔离信息,不同函数中同名变量互不影响,可以避免不慎赋值所导致的错误。
register型变量在auto型的基础上直接将变量存储在CPU的寄存器中,有助于提高程序的运行速度。
CPU的寄存器数量有限,所以只能说明少量的register变量,CPU蚌埠住时则按auto型变量处理。
static型局部变量赋值时只在编译期间赋值一次。
退出函数时,static型局部变量的存储空间不会释放,所以其值得以保留,其生存期也会延长到程序结束。
全局变量是在函数外部任意位置定义的变量,其作用域从变量的定义开始,直到程序结束为止。
若全局变量和某个局部变量同名,则在该局部变量的作用域内,局部变量说了算,全局变量说了不算。
一般不提倡使用全局变量,因为:
(1)全局变量在整个程序运行期间都占用内存空间;
(2)全局变量必须在函数以外定义,降低了函数的通用性和独立性。
(3)使用全局变量容易因疏忽或使用不当而导致全局变量中的值意外改变,产生副作用或难找的错误。
当全局变量定义在使用它的函数之后时,需在该函数中用extern说明该变量,类似于python中的global
在定义全局变量时不能说明extern,在使用时才能说明,此时该变量的作用域为extern处至函数末尾。
如果要把一个编译单位里的变量带到另一个编译单位中接着用,则需要在另一个编译单位中用extern说明该变量。
外部函数:函数默认为extern型,这种函数在其它编译单位中也可以调用。
内部函数:如果定义了static型函数,那么它只能在同一编译单位中调用。

等号“=”用于赋值,C语言也有+=、-=、*=、/=……,也可以连等。连用时自右向左运算。
但=、+=类运算符的左边或++类运算符的主题只能是变量,不能是常量或表达式。
等号右边的值会自动转换成左边的形式,比如左short右long的会截去long的高16位,右变量的符号位也会按左变量转换。
+=、-=也可以连用,如a+=b=a-=c;等价于a-=c,b=a,a+=b;。逗号可以按顺序执行一堆小表达式。
含等号的表达式后加;则为赋值语句,声明时不赋值则自动赋0。

a++代表先用后自增,++a代表先自增后用!!! 比如在int a=114514;之后,表达式a++的值为114514,但a便乘114515;若为表达式++a,则其值和a的值都为114515。

各种运算符的优先关系为自增/自减/正负/取地址>算术运算>移位>比较>位运算>逻辑运算>三目运算符>赋值>逗号。
C语言中,输入00.0'\0代表逻辑假,其它值为逻辑真。
表达式逻辑为真时输出1,逻辑为假时输出0。
C语言的关系运算符<><=>===!=,最好不要对浮点数使用==!=
C语言的比较符可以连用,但最好不要连用,因为连用时它只是算出逻辑值,然后将逻辑值再往下比较。
若比较符一侧有浮点数,则两边的数都会被转化为浮点数,之后再做比较。
C语言的逻辑运算符&&与、||或、!非,其优先关系为!>&&>||
C语言的与/或运算具有短路特性,即与前为0、或前为1时就跳过后者,直接得出结果。
C语言的硬跳转语句为从goto 标号跳转到标号:,非必要憋用,标号可以和变量重名。

可以在量前面加带括号的类型名以对其进行强制类型转换

C3 基本语句

把数据从计算机内部输出到外部设备的过程是为“输出”也。
C语言本身无输入输出语句,所以要#include ,通过它提供的丰富的函数实现输入输出。

printf("字符串",变量)是C语言提供的标准输出函数,用于在终端设备上按指定格式进行输出。
该函数的返回值为输出的字符值,含\n\t等。
若参数比变量少,则从左到右依次格式化变量。该函数中的变量若含表达式,则从右往左处理。

——字符串中的参数如下:
%d/%i/%ld/%li为输出有符号长整型量,%hd/%hi输出有符号短整型量。
%u/%lu为输出无符号长整型量,%hu输出无符号短整型量。
%o为以八进制输出,%X/%x为以16进制大/小写输出,最好是正整数,输出时省略00x
%f为直接输出浮点数,%E/%e为以大/小写科学记数法形式输出浮点数,E/e后输出三位次数。
%G/%g为在保证输出6位有效数字的情况下自动选择直接输出还是以科学记数法形式输出浮点数,优先用前者。
%c为输出单个字符,%s为输出以\0结尾的有限长度的字符串。
%p输出变量的内存地址,%%为直接输出%符号。
如果在参数的百分号之后、字母之前加上n1.n2,则代表最小输出宽度为n1,浮点数小数点后输出n2位数字;若n1前有0则代表空格由0补足。
想给正数带正号就在这其中加个参数+,默认输出为右对齐,想左对齐就在%和n1.n2之间加个参数-

scanf("字符串",&变量)与printf类似,但它的参数是用于给后边的已声明过的变量进行赋值,且字符串之后跟的必须是变量的地址。
多次使用scanf和一次使用scanf检测多个变量效果相同。
该函数的返回值为成功转换的变量个数。
该函数输入的空格和回车会自动用于分割并转换输入字符串中的常量,在参数中指定了变量宽度时则不用分割它。
如果参数比变量多,则多余的参数被无视。
在参数比变量少时,可以在参数的百分号和数字/字母之间加*以跳过对它的解析。
如果有scanf("%d,%d",a,b);,则必须输入114,514114,(若干空格或回车)514,但这些空格必须在逗号之后。
此外,输入的短整型或双精度浮点数对应的参数必须是%hd/%hi%lf/%lE/%le

{}括起来的语句被称为复合语句或语句块,其中的所有语句在语法上皆被视作一条语句。
{}中如果只有一条语句,那去掉花括号也罢。
;则为空语句。

C4 选择结构程序设计

——C语言的三种选择结构
if-else型:if(表达式){……} else if(表达式){……}相邻的一套if和else在一起运行
switch-case型:switch(表达式){case(表达式1):{操作1} case(表达式2):{操作2}……}
switch表达式里可以是整型量和字符量,但不能是实型量。
如果case匹配不到switch的表达式,就会去找default去运行。
如果case里没break,就会在匹配完后就会继续运行下一种情形 。
三目运算型:(表达式)?{为真时的操作}:{为假时的操作}

C5 循环结构程序设计

for循环的格式:for(初始条件;循环条件;循环末尾操作){操作},循环条件省略时为死循环,顿号不能省。
while循环的格式:while(循环条件){操作},先判断后操作,循环条件不可省略。
do-while循环的格式:do{操作}while(循环条件);,先操作后判断,注意末尾有顿号。
break可以脱出switch语句块和循环,continue则可跳过一次循环。

C6 函数

C语言提供了丰富的库函数,但用户仍需编写大量的函数来满足特定的需求。
定义函数的格式形如int f(int a,double b){double s;s=a*b;return s;},返回值类型必须等同于函数的类型。
C语言规定:不能在函数内部定义函数。
函数的类型默认为int型。
函数语句块之前的部分称为函数的首部,语句块中则有说明部分、语句部分、返回语句等。
函数可以没有形参或操作语句,但不能省略圆括号花括号
void型函数无返回值,也可以不写return,写了就只能写return ;代表直接返回。
返回语句可以是C式的return(表达式),也可以是py式的return 表达式
函数调用的方式为函数(各形参对应的表达式),如果是把某些void函数当语句使,可在后面加顿号。
除了int和char型函数,函数必须先定义-后调用,或者先说明-后调用-最后定义
函数的说明可以是一条独立的语句,也可以和同类型的变量在同一语句里一起定义。
说明不用带语句块,括号里也不用带参数名,但是要给齐参数数量和类型。
C语言的实参可以控制形参,而形参无法影响实参。

main函数可以加两个参数,格式为main(int argc,char** argv)main(int argc,char* argv[]),其中argc和argv两个变量的名称可变。
若源代码被编译成名为“file.exe”的文件,那么在命令行输入file a b c即可运行该文件,此时a、b、c即为该文件的命令行参数,且*argv[]将被赋值为{"file","a","b","c"},而argc则为该字符串数组的长度,在此处为4。
命令行中,上述的file、a、b、c也可以用制表符隔开。

函数也可以自己调用自己,是为递归也,一个问题必须满足以下三个条件才能使用递归法解决:
(1)可以把原问题转换成一个和原来解法相同的新问题,其中只是所处理的对象有规律地递增或递减
(2)可以应用这个转化过程使问题得到解决
(3)必须有一个明确的结束递归的条件(石榴煎酒警告)
不同的函数之间也可以互相调用。

——可以导入math.h进行更多数学函数用于计算,其中:
abs(整型)求整型的绝对值,fabs(实型)求实型的绝对值。
pow(a,b)求出来的是实型幂。
sqrt(x)用于开根号,需要x≥0。
sin(x)求正弦、cos(x)求余弦……此处的x为弧度制。

C7 地址和指针

若在程序中定义了一个变量,C语言的编译系统就会根据该变量的类型分配一定字节长度的存储单元
存储单元的字节长度由相应指针的类型决定。
每个存储单元都有一个首字节地址,可以不用指出变量名,而对其地址进行直接存取
定义指针的格式为类型* 指针变量名类型 *指针变量名
&x代表求x的地址,*x代表求地址x中存储的数据。
指针可以赋地址值,如p=&x;也可通过取指针地址的方式给存储单元赋值,如*p=x;
除此之外,也可以给指针变量赋NULL值,它在stdio.h中被定义为0,但不代表该指针的地址为0,而是代表它为空指针。

假设有函数int f(double x),想要把函数名用来传递,可以定义指向函数f的指针fp:
int(*fp)(double)=f;int(*fp)(double);fp=f;,此时f等价于(*fp)。
在函数里也可以再用函数指针,参数和上面写法一样,此时语句块中fp所指的函数名也需写作(*fp)。
此时调用函数f的语句y=f(x);就可换成y=(*fp)(x)
如果a是指针的指针(指针针),比如二维数组首地址,应将其定义为**a/*a[]/a[][]
将指针变量+n(-n)代表将其所指的地址+n(-n)。
如果想在函数中用形参控制该函数外的参数,就只能通过摆弄指针的方式了。比如有int x=0,想用void型函数将它+1,可以用*px=&x;定义其地址,然后在函数中取址+1,如void f(int *p){++*p;}
*&++--等运算符的优先级相同,它们在表达式中混用时将从右向左计算。

C8 数组的定义和引用

一维数组的定义或赋值:数组类型 数组名[整型常量表达式]={数1,数2,…}),如int a[4]={11,4,51,4}
数组的下标从0开始。
当系统在内存中为所定义的数组开辟一串连续的存储单元时,并没有为它们赋确定的值(初值)。
数组的类型等于数组中所有元素的类型,若在python里的话类型就随便。
数组名是一个地址常量,定义之后不能重新赋值,也不能再用新指针去指向该数组(的首地址)。
a[N]代表数组a的第N个元素,数组名也是指向数组首地址的指针,因此a[N]*(a+N)相互等价。
C语言很屑的一点是数组的索引符必须是整型常量,想用变量n索引a[n],建议用指针,如*(a+n)
同理,想用变量定义数组,建议用calloc函数。
若给数组所赋初值的数量少于定义的数组个数时,之后的元素将被自动赋予初值0。
若给数组所赋初值的数量多于定义的数组个数时,编译时将报错。
想要给一个一维数组全赋初值0,至少要输入int a[N]={};
定义数组时也可将数组长度留空,此时数组长度则为赋予其的初值数组的长度,初值数组里可以有变量。
函数中的形参若为一维数组时,定义时可写作a[N]*a
函数中的形参引用一个数组时,它存储的是数组的首地址而不是数组中的元素。

二维数组的定义或赋值:数组类型 数组名[整式][整式]={数1,数2,…},也可赋{行1,行2,…}
定义多维数组时只有第一个索引方括号里的数字可以省略,其它索引数不能省略。
为二维数组赋初值时,每个内层花括号被看做“一行”,每行元素不足列数时自动补0。
为二维数组赋初值时,如果没有内层花括号,则按顺序给每个元素赋值,不足的“行”或“列”补0。
二维数组的变量指向存储各行首地址的数组,各行首地址才指向相应的行数组。
索引二维数组的格式为a[i][j](*(a+i))[j]*(a[i]+j)*(*(a+i)+j)*(a[0]+i*M+j)等。
函数中的形参若为二维数组时,其本身必须是一个行指针变量,定义时可写作(*a)[N]a[M][N]a[][N]
函数中的形参若为指针数组时,定义时可写作*a[N]*a[]**a

C语言的字符串以字符数组(char*/char[])的形式存储,并规定以字符\0作为字符串的结束标志
\0不计入字符串的实际长度,除非对它使用sizeof()
定义字符串之后,C编译程序会自动在其末位加上\0
在定义字符串时,如果所赋字符串初值比其长度小,则不足的部分会被\0填充,反之则自动截断。
如果人为在字符串中间加上\0,系统将从此处自动截断它。
字符串在定义时赋值的方式有char s[]={"114"}char *s={"514"},大括号可以省略。
char s[]="114;"等价于char s[];s="114";char *s="514";等价于char *s;s="514"
但是,若以char s[]={'1','1','4','\0'}的方式定义字符串时必须人为加'\0',因为此时系统不会自动加'\0'
为了避免其它数据被破坏,在定义字符串长度时应预留位置或不填长度,让机器在后面补'\0'
在定义好字符串之后就不能直接用s[]="514"的方式再给它赋值,但可以通过其地址一个个字符地赋。

输入/出字符串时,输入/出项可以是字符串常量、数组名或指向字符串的字符指针变量。
输入字符串时,若传入字符串数组地址或指针地址,则从该地址往后读到'\0'为止。
scanf()函数无法从终端读入\0,且读入字符串时也会将空格和回车作为分隔符而不读入。
可以用gets(字符串)puts(字符串)函数直接输入或输出字符串,这样可以读入空格,而回车会转换为\0
字符串数组又可以当作一个二维数组使用,当然其每行必须有个'\0'

——导入头文件string.h之后,其中的函数可以对字符串进行整体操作:
strcpy(a,b)用于把字符串s2的内容复制给s1,前提是s1的存储空间足够。
strcat(a,b)用于把s2的内容从s1'\0'开始加在它后面,并返回s1的首地址。
strlen(字符串)用于求字符串的长度,在C语言中为其首地址到'\0'之前的字节数。
strcmp(a,b)用于比较两个字符串的ASCII码大小,前者大时返回1,一样时返回0,后者大时返回2。

C9 编译预处理

导入库的格式如#include "stdio.h"#include

宏定义一般写在程序开头,有宏替换(不带参数的宏定义)和含参宏定义两类,且常用大写。
宏替换是在编译前由预处理程序完成的,因此宏替换不占运行的时间。
宏替换的格式为#define 宏名 替换文本,即使后面还有宏替换,也会替换其内容。
宏替换的文本如果一行写不下,可以用\换行。
不能对已定义的宏替换重复定义,且宏替换对字符(串)或标识符无效。
含参宏定义的格式为#define 宏名(参数表) 表达式,它只管替换,而不管变量类型或计算结果。
使用#undef 宏名可以解除对某个符号的宏替换。

——动态存储分配函数:
使用前需要导入头文件stdlib.h
malloc(n)用于为指针分配n个字节的存储区,且该函数为void*型,n参数为unsingned int型。
譬如要为float*型指针p分配4字节空间,则其分配格式为p=(float*)malloc(4);
之后若要为p所指的空间存放114.514,则输入*p=114.514;即可。
这样分配到的存储空间的初值是不确定的。
calloc(n,size)则可为n个同一类型的数据分配连续的存储空间,且每个子空间长size字节。
calloc的使用方法和malloc一样,只是从单个变量变成了变量数组而已。
free(p)用于释放指针p所指的存储空间。

C10 结构体与共同体

C语言允许用typedef 允许给已有的类型说明一个新名称,其用法为typedef 原类型 新名字,新名称一般大写。
typedef char* C;C p;等价于char* charp,跟宏替换倒是有那么一点像。

一个结构体类型/struct可以由若干成员组成,各成员的类型可以不同。
struct可以定义一个结构,格式如struct s{int a;double b}
在说明struct time{int h,m,s;};之后,说明struct day{int y,m,d;struct time t;};相当于struct day{int y,m,d;struct{int h,m,s;}t;};
结构体也可以套娃,但ANSI C标准规定结构体至少允许嵌套15层。
在定义结构体时也可定义属于该类的变量,如struct time{…} a;
在定义struct time后,可用struct time a/struct time b[3]/strcut time *c定义结构体类型的变量/数组/指针。
还可以为无名结构定义变量,如struct {char c[];}s;
定义结构体数组时必须写出数组长度。
也可用typedef把上述的struct time等结构体类型说明一个新的名称。
为结构体赋初值时要写成由各成员初值组成的数组,且系统会自动为结构体中未赋初值的变量赋0。
给结构体数组赋初值时则需要赋二维数组,该数组的的每个元素又是一个由结构体各成员组成的数组。
引用结构体中的成员的格式为结构体变量名.成员名结构体指针变量名->成员名(*结构体指针变量名).成员名,嵌套结构体同理,除了引用,对它们操作也可。
点号/箭头比星号/自增的优先级高,所以(*a).b不能写作*a.b,且++a->b等价于++((*a).b)
若对同类结构使用a=b的方式赋值,则将b中各成员的值赋给a中对应的成员。
通过结构体构成链表,单向链表的建立,结点数据的输出、删除与插入。
在函数的参数中定义结构体变量时,需把相应各成员的变量类型也写上去,所以最好用typedef进行代换。

若结构体中有成员是一个指针,它指向另一个结构体变量的地址,那么这些结构体就会形成链表
链表中的每个结构体变量被称为结点,最开始的结点则称为“头结点”,指向它的则为“头指针”。
链表结点的定义形如struct node{int data;struct node* next;};
结构体变量的指针成员可以指向该变量的地址,形成自指链表。
C语言中的动态存储分配可以在程序执行过程中根据需要随时开辟存储单元,不需要时则将它释放。
动态链表的每个存储单元都由动态存储分配获得,它的结点没有名字,只能靠指针维系结点之间的连续性。
一旦动态链表某个结点的指针断开,后续结点将无法被找到。

共用体(union)的类型说明和变量定义的方式与结构体的完全相同。
结构体变量中的成员各自占有自己的存储空间,而共用体变量中的所有成员占用同一个存储空间。
共用体变量所占内存字节数等于其成员中所占内存的最大值,且该变量的首地址等于它的所有成员的首地址。
共用体变量在定义时只能用第一个成员的类型的值进行初始化。
共用体变量中,只有最后一次存入的变量的值能起作用,且每次存入变量。

C11 位运算

&按位与,|按位或,^按位异或,~x按位反。
x=x</x<<=n左移n位,低位补0;x=x>>n/x>>=n右移n位,高位补符号位。
位运算符的优先级为~><</>>>&>^>|
short量和long量进行位运算时,正short前面会用0补成long,负short前面会用1补成long。

C12 文件操作

文件是记录在外部介质上的数据的集合。
C语言中的数据都按数据流的形式处理,输入数据时逐一读入数据,直到遇到EOF或文件结束标志时停止;输出数据时,系统不添加任何信息。
C程序中的输入输出文件都以数据流的形式存储在介质上。
顺序存取文件时,总是从文件的开头开始,从头到尾地读或写。
直接存取文件又称随机存取文件,它可以调用C语言的库函数去指定开始读或写的字节地址。
以文本形式读写的数据按ASCII码读写,而以二进制形式读写文件时则不经转换地直接读写。
ANSI规定,在输入输出文件时,系统会为之开辟一块缓冲存储区。读文件时,将文件中的数据一批批地先放入缓冲区,再从此读入数据;写文件时,也先向缓冲区写文件,当缓冲区写满后再将其中的内容一次性输出到文件中。
缓冲区设立之后,系统不用在读写文件时频繁地访问外设,从而提高了读写速度。
当运行C程序时,系统将自动打开标准输入文件、标准输出文件和标准出错文件,stdio.h定义它们对应的文件指针常量为stdinstdoutstderr
通常情况下,stdin与键盘连接,stdoutstderr与终端屏幕连接。
因此,将文件指针赋予stdin值时代表从键盘输入,赋予stdout值时代表从屏幕输出。

——stdio.h中已经定义了下列各种文件操作:
文件类型指针/FILE的定义方式为FILE* 指针名;,它用于通过fopen()函数将文件联系起来。
文件指针=fopen(文名,参数)用于打开文件,出错时该函数会返回NULL
该函数中,参数"r"为读,"w"为写,"a"为追加写;参数后加"b"为以二进制方式打开,加+为读写双全。
fclose(文件指针)用于关闭该指针对应的文件,使文件指针与相应的文件分离。
该函数在成功关闭文件时返回0,否则返回1。
在完成了对文件的操作之后,应当关闭文件,否则文件缓冲区中的剩余数据将丢失。

——文件的读写:
文本文件的结尾标志为EOF,其值为-1,读文件时只要遇到它就结束读入。
feof(文件指针)可以判断文件位置指针是否已经到文件末尾。
getc(字符,文件指针)fgetc(字符,文件指针)返回从文件中读入的一个字符,读完后文件位置指针自动后移
putc(字符,文件指针)fputc(字符,文件指针)用于向文件输出字符,若输出成功则返回该字符,否则返回EOF。
fgets(字符串变量,n,文件指针)用于从文件中读入不超过(n-1)个字符,并将它们赋给字符串变量,读入后返回该变量。
fputs(字符串变量.文件指针)用于向文件写入字符串,输出成功时返回1,否则为-1。
fscanf(文件指针,格式控制字符串,各输入变量地址)用于从文件中按格式输入字符串。
fprintf(文件指针,格式控制字符串,各输出变量)用于将格式化字符串输出到文件中。
fread(p,size,n,文件指针)用于从文件中读入n个size字节大小的数据,并将它们分别存入p[0],p[1],…,p[n-1]。
fwrite(p,size,n,文件指针)用于将p[0],p[1],…,p[n-1]中的n个size大小的数据写入文件。

——文件的定位:
文件位置指针用于指示当前在读或在写的数据在文件中的位置。
fseek(文件指针,x,原点)用于移动文件位置指针到原点+x的地方,x为相对原点位移的字节数。
原点=SEEK_SET或0代表文件的开始处。
原点=SEEK_CUR或1代表文件当前位置,这时主要用该函数的相对位移功能。
原点=SEEK_END或2代表文件的末尾,它和ftell()结合可以求文件大小。
ftell(文件指针)用于求文件位置指针相对于文件开头处的字节数,若出错则返回-1。
rewind(文件指针);等价于fseek(文件指针,0,0);,且无返回值。


——————————Python部分——————————


P1 程序设计基本方法

程序设计语言又名编程语言,是计算机能够理解和识别用户操作意图的一种交互体系,它按照特定规则组织计算机指令,使计算机能够自动进行各种运算处理。自然语言不严密、模糊,而编程语言定义准确,规则严格,由低级到高级为机器语言-汇编语言-高级语言。C、java等静态语言采用编译方式执行,它将源代码转换为可执行的目标代码;python等脚本语言采用解释方式执行,它的解释器在每次执行程序时逐条运行用户编写的代码,性能比编译式语言略低,但十分有利于升级和维护,适合于性能不关键的程序。

Guido van Rossum在1991年开发了非常滴开源、非常滴免费的python。2000年,py2.0的发布开启了python广泛应用的新时代,2010年,py2.x发布了最后一个版本——py2.7。而2008年诞生的py3.0的解释器内部完全采用面向对象方式实现,在语法层面做了很多种大改进,但也使得py3.0无法向下兼容py2.0的语法。到2016年,python的重要标准库和第三方库都已经在py3.x版本下发展,python语言版本升级过程便结束辣。

运行python程序的关键是安装python语言解释器,开发python程序则可使用其安装包自带的IDLE编辑器(交互式运行环境)进行代码开发,有**命令提示符>>>**时为输入,反之为输出,玩累了就输入exit()quit()直接爬。不过一般都用jupyter和pycharm。开发完之后可以用pyinstaller打包,也叫“程序发布”。

程序的基本编写方法为IPO方法:I为输入,P为处理(process),O为输出

python的特点:语法简洁,生态丰富,多语言集成,平台无关性(指代码不经修改就可在任何装有python解释器的平台上运行),基于缩进的强制可读性,支持中文,模式多样,调库方便,适宜数据分析、机器学习、人工智能、web开发等具体的技术领域……

P2 Python语言基本语法元素

python注释主要用#注释,也可用"""注释""";变量则可随时命名、随时赋值、随时使用
变量命名时,一般只要不是数字或打头,名称中不出现非'_'标点都行。
赋值、比较和C语言差不多。虽然python没有++和–,也不能连等,但是可以连续比大小。
字符串/组合数据[a=0:b=末:step=1]中,只有a为索引,有a,b为切片,有a,b,step为以step为步数切片。
a和b≥0时代表离首位有几个元素,<0代表离末位有几个元素。step<0代表从后往前切。
——基本内置函数:
input(str)输入,print(……,end='')打印,eval(str)计算表达式字,exec(str)运行语句。
len()可求字符串或组合数据的长度,type()可判断数据的类型,help()可查看关键字、函数等的说明。
int()float()complexbool()str()set()list()tuple()dict()可产生或转换数据类型。
abs(x)能求绝对值,max()/min()能求最值,round(x,n=0)能四舍五入n位小数,divmod(a,b)能求商和余数、pow(a,b,c=None)=a**b%c是幂……

P3 基本数据类型

整数类型/int在python中无大小限制,可正可负。0b/0B二进制,0o/0O八进制,0x/0X十六进制。
十六进制数中的a,b,c,d,e,f大小写随便。bin()oct()hex()可将整数转换为表示相应进制数字的字符串。
浮点类型/float有小数点、大小限制和精度限制。即使1.0也是浮点数,114e514-1.9E-19等科学记数法表示数也会变成浮点数。
复数类型/complex实部可省略,但虚部必带j/J,且实虚部都以浮点数储存。可用complex(Im,Re)定义,用z.real/z.imag求实部/虚部。
对数字的通用操作:+加/正,-减/负,*乘,/除,//商,%余,**乘方。
布尔类型/bool就True和False,一般由各种条件判断式产生,andornot非。
看做布尔变量时,00.00.0+0.0j''set()[](){}False,其它数据皆为True
字符串/str是字符的序列,'str'/"str"为单行字符串,'''str'''/"""str"""为多行字符串。
python字符串用unicode编码,中文、英文、外星文都是一字一符。(某些语言一字两符)
\转义,\n换行,\t制表,\\\'等代表仅将符号看做字符。字符串前加r代表全部转义。
字符串也有某些组合数据类型的操作,如+并,*重复,in属于,not in不属于。
字符串用format格式化时,'{{/}}代表转义大括号,大括号内要么全加序号,要么全不加。
大括号内为{(序号):(填充字符)(对齐模式=<)(格式槽最小长度)(千位分割符=None).(小数点后位数/格式槽最大长度)(数字类型)}。各参数之间存在制约。
对齐模式为<左对齐,^居中,>右对齐;整数类型b/o/x/X代表2/8/小写16/大写16进制,c为输出整数对应的unicode字符,e/E为输出小/大写科学记数法形式,f为输出浮点数,%为输出百分比。
比如'{0:-^50,.2%}'.format(114514)对应-------------11,451,400.00%-------------
chr(int)ord(str)可将字符和相应的unicode编码互相转换。
——字符串的方法:
.split(x=' ')分割,连接字符.join(组合数据)连接,.strip(字符)去除,.replace(旧,新)替换。
.count(str)计数,.center(宽度,填充=' ')居中,.lower()全小写,.upper()全大写。

P4 程序的控制结构

程序流程图的基本元素:圆角起/止框、平行四边形的输入/输出框、矩形处理框、菱形判断框、注释、流向线、连接点……
程序有三大控制结构:顺序结构、分支结构、循环结构。多分支结构通常用于判断同一个条件或同一类条件的多个执行路径。
python中,用缩进量来区分代码结构,每四个空格或每个\t为一层。
单分支是if,二分支是if-else,多分支是if-elif-else,遍历是for,死循环是while
for循环和while循环后可跟else,只有在循环正常结束时才运行其中的内容。
break跳出循环,continue跳过一次循环,try判断异常,except处理异常,except 异常类型处理特定类型异常。

P5 函数和代码复用

函数是一段具有特定功能的可复用代码,它可以降低编程难度,提高代码复用率,减少代码行数,降低代码维护难度。
——函数的定义:

def 函数名(必参(=默认值),*选参(=默认值),**键参=相应值):
	函数体
	return (返回值)

——函数的调用:函数名(参数)
函数中的变量分为局部变量和用global声明的全局变量
python中函数最多能递归1000层。在函数内定义的函数只能在函数内调用。
pass啥都不干,就搁那占个位。
模块化设计函数式编程好。
模块化设计有两个基本要求:紧耦合松耦合。紧耦合中功能块内部耦合紧密,存在较多或复杂的相互调用,但也容易牵一发而动全身;松耦合中模块间的关系简单,一般基于消息或协议实现。

P6 组合数据类型

python组合类型包含集合类型(set)、序列类型(list、tuple)和映射类型(dict)。
set()为空集合,[]/list()为空列表,()/tuple()为空元组,{}/dict()为空字典。
——集合/set的运算与方法:
&交,|并,-补,^差,add添,remove去,clear清
——列表/list的操作与方法:
+并,*重复,=替身;copy复制,count求出现次数,index求序号。
append添,insert插,pop(*n=末位)取,reverse倒,remove去,clear清。
——元组/tuple同理,但只读,元组套列表,又可改。python可以把用逗号分隔的变量看成元组。
——字典/dict的方法:
keys键表,values值表,items键值对,update并。[]键索引,无键则增。
get(键,*默认值)查,pop(键,*默认值)取,popitem随机取,clear清。
字典的键不能为可变类型数据。
——内置函数/保留字的用法:
del去,in属于,not in不属于,len求长,max最大,min最小,sorted排序。
.sort(key=lambda x:x[n],reverse=False)按第n列从小到大排序。

P7 文件和数据格式化

文件是存储在辅助存储器上的一组数据序列,可以包含任何数据内容。概念上,文件是数据的集合和抽象。文件包括文本文件和二进制文件两种类型:
文本文件可被看做是存储在磁盘上的长字符串,一般由某种特定编码的字符组成,如UTF-8编码,内容容易统一展示和阅读,如txt、csv等类型的文件。
二进制文件由0和1组成,其信息按照特定格式形成文件,如png、avi等格式。它没有统一的字符编码(指拿记事本打开是乱码),只能当做字节流。
两类文件都可以以文本文件方式二进制文件方式打开,但打开后,前者将文件编码为字符串,后者将文件解析为字节流。
——文件的使用:
file=open('a.txt',参数='r')用于打开文件,参数为下列字符或其组合。file.close()用于释放该文件,释放后不可再操作该文件。
参数'r'为只读,找不到文件会报错FileNotFoundError
参数'w'为覆盖写,找不到文件会新建,找到了会完全覆盖该文件。
参数'x'为创建写,找不到文件会新建,找到了会报错FileExistsError
参数'a'为追加写,找不到文件会新建,找到了会在文件后面“追加写”。
参数't'为以文本文件方式打开,也是默认打开方式。
参数'b'为以二进制文件方式打开。
参数'+'代表可以同时读写。
file.read(n=-1)用于读取整个文件的内容,或读取前n个字节的字符串或字节流。
file.readline(n=-1)用于读取文件中的一行,或读取该行前n个字节的字符串或字节流。
file.readlines(n=-1)用于读取该文件的“行表”,或只读取该文件的第n行。
file.write(str)用于向文件写入字符串或字节流str。
file.writeline(list)将列表list中的各元素相连并写入文件。如果要分行写,需在各元素末尾带'\n'
file.seek(n)用于改变文件操作指针的位置,n=0跳到文件开头,n=2跳到文件结尾。

P8 Python计算生态

计算思维的本质是抽象自动化
设计程序时,首先自顶向下设计:先将算法表达为一系列小问题,然后为每个小问题设计接口,
之后通过将算法表达为接口关联的多个小问题来细化算法,最后为每个小问题重复上述过程。
然后自底向上执行,小规模程序可直接运行,而调试大规模程序时需要先将程序分成小部分逐个测试。比如先测试每一个基础函数,再测试由基础函数组成的整体函数,这样有助于定位错误。
个别生僻内置函数:all()any()exec()float()pow()reversed()round()sorted()sum()

P9 Python的标准库

python标准库是随python安装包一起发布的计算生态,用户可以随时使用。
optparse是python的一个标准库。
库的三种导入方法:import numpyimport numpy as npfrom numpy import *

turtle库

turtle库能进行基本的图形绘制,它的概念诞生于1969年,成功应用于LOGO编程语言。
由于turtle图形绘制概念十分直观且流行,python接受了这个概念并将它作为一个标准库。
turtle画布中,屏幕正中央为坐标原点,x右y上为正,龟朝右为0°,逆时针为正
——窗体函数:
turtle.setup(w,h,*x,*y)用于设置宽为w,高为h,与屏幕左侧距离为x,与屏幕上侧距离为y的窗体。
如果不填x和y,则窗体在屏幕中央。
——画笔状态函数:
turtle.pensize()设置画笔粗细。
turtle.pencolor(颜色)设置画笔颜色。
turtle.pendown()落笔,turtle.penup()抬笔。
turtle.write(str,font=None)写字。
turtle.color(颜色)设置填充颜色。颜色可以是 'black'(114,51,4)#66CCFF……
turtle.begin_fill()启用填充,turtle.end_fill()结束填充。
turtle.filling()判断是否在填充。
turtle.clear()清空,turtle.reset()清空且复位龟。
turtle.screensize(w,h,color)用于设置窗口尺寸和背景颜色。
turtle.showturtle()显龟,turtle.hideturtle()隐龟。
turtle.isvisible()判断龟的显隐。
——画笔运动函数:
turtle.forward(x)turtle.fd(x)前进距离x,turtle.backward(x)turtle.bk(x)后退距离x。
turtle.left(x)左旋角度x,turtle.right(x)右旋角度x,turtle.setheading(x)turtle.seth(x)设置龟朝向角。
turtle.setx(x)设置x坐标,turtle.setx(y)设置y坐标,turtle.goto(x,y)设置绝对坐标。
turtle.home()使龟的位置和朝向复位。
turtle.circle(r,θ=360)逆时针绘制半径为r(且弧度为θ)的圆(弧)。(r<0时顺时针画,θ<0时倒退着画)
turtle.dot(d,颜色==black)绘制直径为d的圆点。
turtle.undo()撤销上一部动作,turtle.speed()设置龟速。

random库

random库采用梅森旋转算法基于“种子”生成伪随机数序列,可用于除随机性要求更高的加解密算法外的大多数工程应用。
——常用random函数
random.getrandbits(n)用于生成n bit的随机整数,或者说用于生成[0, 2n-1]的随机整数。
random.randint(a,b)用于生成[a,b]之间的随机整数。
random.random()用于生成(0,1]之间的随机小数,其它随机函数基于该函数实现各自的功能。
random.randrange(a,b,*n=1)用于生成[a,b)之间以n为步长的随机整数,如a、a+n、a+2n、a+3n……
random.seed(*n=None)用于初始化随机种子,默认值为当前系统时间,也可以是小数。只要种子和代码相同,random库函数的计算结果也相同。
random.uniform(a,b)用于生成[a,b]之间的随机小数。
——常用random组合数据函数
random.choice(A)用于随机挑选组合数据A中的一个元素。
random.sample(A,n)用于从组合数据A中随机挑选n个元素。
random.shuffle(A)用于打乱组合数据A中元素的顺序。

time库

time库提供系统级精确计时器的计时功能,可以用来分析程序性能,也可让程序暂停运行时间。
——时间获取函数:
time.time()用于获取当前时间戳,它是一个从1970年开始至今的秒数,也是小数。
time.ctime()用字符串显示当前的日期和时间。
time.gmtime()用于显示当前时间对应的时间对象(struct)。
time.localtime()用于显示经过当地UTC修正后的当前时间对应的对象。
——时间对象的元素:
tm_year是年,tm_mon是月,tm_mday是日,tm_hour是时,tm_min是分,tm_sec是秒。
tm_wday是星期(0123456=一二三四五六日),tm_yday代表今天是今年的第几天。
tm_isdst=1代表是夏令时,=0代表不是夏令时,=-1代表不到啊。
——时间格式化函数:
time.mktime(timestruct)用于将时间对象转换为时间戳。
time.strftime(格式,timestruct)用于将时间对象转换为格式化时间字符串。
time.strptime(str,格式)用于将格式化时间字符串转换为时间对象。
格式化参数:
%Y是年,%m是月,%d是日,%H是时24%I是时12%M是分,%S是秒;
%B是月的英文,%b是月英缩写,%A是星期的英文,%a是星英缩写,%p是AM或PM。
——计时函数:
time.monotonic()time.perf_counter(n)也是某种每秒自动加1的小数。
time.sleep(n)用于延时n秒。

P10 Python的第三方库

第三方库需要额外安装。

pip工具(命令提示符)

Python第三方库安装的三种方法:
——pip工具安装
最主要、最优先的安装方式,可以安装95%以上的库,安装命令为pip install 库

——自定义安装
按照库文档提供的步骤和方式安装,适用于在pip中尚无登记或安装失败的库。
——文件安装
由于某些库只提供源代码,所以在pip安装库时Windows可能无法编译,可先下载.whl文件后用pip安装,安装命令为pip install .whl文件的路径

其它pip命令:
pip -h用于列出常用pip命令。
pip download用于下载库的安装包,但只下载不安装
pip list用于列出已安装的库。
pip show 库用于列出库的详细信息。,### pyinstaller库(命令提示符)
pyinstaller可以在Windows、Linux、MacOS X等操作系统下将.py文件针对不同的操作系统打包成相应的可执行文件
打包后的程序可以在无Python的环境中运行,也可以作为一个独立文件管理和传递。
通过pip install pyinstaller命令可将该库自动安装到python解释器目录,与pip或pip3命令路径相同,可以直接在命令行调用。
使用pyinstaller打包.py文件的命令为pyinstaller .py文件
使用该库时,文件路径中不能出现空格( )和句号(.),源文件必须是UTF-8编码。
打包后,.py文件所在目录将生成两个文件夹:
build文件夹中为可删除的临时文件;
dist文件夹中,与.py文件同名的子文件夹中为已打包的程序,其他文件则为可执行文件的动态链接库。
不过,可执行文件本身不用依赖任何库就可以运行。

pyinstaller的几个参数:
--clean用于清理打包过程中的临时文件
-D为默认值,生成dist目录
-F .py文件用于使dist文件夹中只生成独立的打包文件
-h用于查看帮助
-i .ico文件用于指定打包程序的图标
--path用于指定代码所依赖的非标准库的路径

jieba库

jieba库可以将一段中文文本分割成中文词语序列,它将文本与一个中文词库进行比对,通过图结构和动态规划方法找到最大概率的词组。该库还支持添加自定义词语。它支持三种分词模式:
——精确模式
将句子精确划分为词语,适合文本分析。
输入jieba.lcut('全国计算机等级考试'),可得到['全国','计算机','等级','考试']
——全模式
检索句子中所有可以组词的成分,速度快但容易产生歧义。
输入jieba.lcut('全国计算机等级考试',cut_all=True),可得到['全国',‘国计’,'计算‘,’计算机',‘算机’,'等级','考试']
——搜索引擎模式
它在精确模式的基础上再次切分长词语以提高召回率,适用于搜索引擎,但也会有一些冗余词语。
输入jieba.lcut_for_search('全国计算机等级考试',cut_all=True),可得到['全国','计算‘,’计算机',‘算机’,'等级','考试']
增加新词语则输入jieba.add(新词语)

numpy库

阿巴阿巴

其它只要求了解的库

网络爬虫:requests、scrapy
数据分析:numpy、scipy、pandas
文本处理:pdfminer、openpyx1、python-docx、beautifulsoup4
数据可视化:matplotlib、TVTK、mayavi
用户图形界面:PyQt5、PyGTK、wxpython
机器学习:scikit-learn、tensorflow、theano
Web开发:django、pyramid、flask
游戏开发:pygame、panda3d、cocos2d
其它:
PIL-图像处理,sympy-符号数学,NLTK-自然语言处理,werobot-微信公众号开发,myQR-生成二维码……

你可能感兴趣的:(信息,开发语言,后端,python)