Part 1:C语言一些基本常识:
===================================================
(一)C语言教材
最著名的教材是〈C Programming Language〉<C程序语言>,
(二)C/C++语言编译器:
可以使用DEV-CPP,
DEV-CPP官方网站:
http://www.bloodshed.net/devcpp.html
(三)算法和数据结构相关教材
以C/C++为代码的书我目前只知道一本:
〈数据结构〉//清华大学出版社
================================================
Part 2:C语言的一些函数使用技巧:
<stdio.h>标准输入输出类
scanf()函数,
该函数是C语言的标准输入输出函数,简单的用法大家都会,下面介绍一些特殊的:
输入一行字符串到s[],字符串中可能有空格
scanf("%[^\n]",s);
解释:%[^\n]表示输入字符串中的字符属于一个集合,这个集合包含了除'\n'换行外的所有字符,于是输入字符就到换行结束,输入一行
上面的用法可以推广到其它用法.
sscanf()函数和sprintf()函数
这两个函数很实用,大家知道fprintf是对文件进行输出,而f对应file,这里的s对应string,也就是sprintf的输出对象是字符串,这个函数就可以把整型转化为字符串,而sscanf则是以字符串为输入对象,可以把字符串转化为如数字
例子:
int n;char s[]="1234";
sscanf(s,"%d",&n);这样n的值就是1234
<string.h>字符串处理库
这一个库里面的字符串处理函数想必大家都比较熟悉,现在要讲的是另外一类对内存处理的函数mem*,这些函数在OI中很有用,在初始化和内存复制,移动方面效率很高,这一类为什么也在sting.h里面呢?是因为他们都是把数组当成了字符串来处理
(1)memset(数组名 ,要初始化的数, 数组长度)
数组初始化,相当于FP中的fillchar,
例子:把a[]数组清0
memset(a,0,sizeof(a));注意这里面参数顺序和fillchar的区别,前面说过mem*系列是把数组当成了字符串来处理,所以处理的对象是每个字节,所以如果是int数组,除了清0和全部清为-1以外(-1的补码是全1), 其它初始化操作慎用.
(2)memcpy(目标数组, 被拷贝数组, 要拷贝长度)
数组复制,
C语言中不提供直接的等号数组复制,但是通过它能够快速复制数组
例子:把a[]复制到b[]中
memcpy(b,a,sizeof(a));
(3)memcmp(数组1,数组2,要比较长度L)
数组比较,:把两数组的前L个字节看成是两个字符串做strcmp一样的比较
该函数在一些数组比较判重的时候比较高效率
(4)memmove(目标数组,被拷贝数组,要拷贝长度)
数组复制,它和memcpy不同的是两数组可以有重叠部分,也就是可以实现fp中move的作用
例子:把a[]从第a[i]个开始后面的K个数据都后移一位
memmove(a+i+1,a+i,sizeof(a[0])*K);
<stdlib.h>
在这里主要说的是abs函数,学过P的人都知道这是一个取绝对值的函数,但是要注意它和PASCAL中abs函数的区别,在C中的abs函数只适用于整型,而实型变量取绝对值则需要<math.h>中的fabs
还值得一提的是这里面有现成的快排函数,当然我个人认为还是自己写,反正浪费不了多少时间,函数名为qsort
随机数函数的介绍:
srand( (unsigned)time( NULL ) );
rand()
rand不接受参数,一般是返回一个unsigned类型的。可以用取模来得到想要的随机数在同一次运行中,初始化种子后得到的rand()是相同的。这样更加方便调试。
如果想得到不相同的就要在一开始就初始化一次,仅仅初始化一次!
srand( (unsigned)time( NULL ) );
rand()
rand不接受参数,一般是返回一个unsigned类型的。可以用取模来得到想要的随机数在同一次运行中,初始化种子后得到的rand()是相同的。这样更加方便调试。如果想得到不相同的就要在一开始就初始化一次,仅仅初始化一次!
<limits.h>
这个库里面没有函数,但是有一些常用的极限,比如INT_MAX(int变量的上限)LONG_MAX,ULONG_MAX(unsigned long的上限)等等,所以是很有用的
<math.h>
这个库里面用到的是数学函数,值得注意的函数有:
pow是个鸡肋,一般不要使用
gets和puts分别是整行读入和输出字符串。gets由于可能会导致意外结果的发生,通常不推荐使用,但是若给定了字符串最大长度,使用起来还是安全的。同样的还有fgets(和gets用法不同)和fputs。据说gets/puts系列比scanf("%s")和scanf("%[^\n]")要快不少