这里做一些C语言的语法的总结。
1.输出数字类型
printf("%d ",2);
2.保留小数点后一位,示例为1 不是 L
printf("%.1f ",8.0/5.0);
3.整数值用 %d,实数用 %f 输出。
4.开平方,需要引入 #include<math.h>
sqrt(3)
5.scanf中的占位符和变量的数据类型应一一对应,且每个变量前都需要加&符号。
6.输入两个实数(含小数):这里是两个L,即为 lf , 这里要注意,输入实数采用的是 “%lf ” 而不会 “ %f ”
scanf("%lf%lf",&r,&h);
7.用const关键字声明常数
const double pi = acos(-1.0);
8.要把25输出为025,可以使用 %03d 即可。
printf("%03d ", m);
9.在C99中,double的输出必须用 %f , 而输入需要用 %lf
10. 怎么输出 , 可以 用“\n”
11.怎么输出 %d , 可以用 “%%d”
12. 在定义变量时,最好尽量缩小变量定义的范围。
13. 浮点数的运算有可能存在误差。那么怎么避免呢?
为了减小误差的影响,一般改成四舍五入,即 floor(x+0.5)。
14. 浮点运算可能存在误差。在进行浮点数比较时,应考虑到浮点误差。
15. 在大多数平台中,int都是32位整数,范围是 -2147483648 ~ 2147483647 。要注意int类型溢出问题。
16. 要计算只包含加法,减法和乘法的整数表达式除以正整数n的余数,可以在每步计算之后对n取余,结果不变。
17. 可以使用time.h和clock()函数获得程序运行时间。常数CLOCKS_PER_SEC 和 操作系统,
请不要直接使用clock()的返回值,而应总是除以CLOCK_PER_SEC。
printf("Time used = %.2f ", (double)clock()/CLOCKS_PER_SEC);
18.变量在未赋值之前的值是不确定的。
19. 使用文件最简单的方法是使用输入输出重定向
freopen("input.txt","r", stdin); freopen("output.txt","w",stdout);
20.#ifdef 和 #endif 如果怎样就执行
#define LOCAL ... int main() { #ifdef LOCAL printf("test"); #endif }
21.如果要求用文件输入输出,但是禁止使用重定向的方式,可以如下
#include<stdio.h> #define INF 100000000 int main() { FILE *fin,*fout; fin = fopen("data.in","rb"); fout = fopen("data.out","wb"); int x,n=0,min = INF,max=-INF,s=0; while(fscanf(fin,"%d",&x)==1){ s += x; if(x<min) min=x; if(x>max) max = x; n++; } fprintf(fout,"%d %d %.3f ",min,max,(double)s/n); fclose(fin); fclose(fout); return 0; }
可以看出,先声明变量 fin 和 fout, 把 scanf 改成 fscanf ,第一个参数为 fin ;
把 printf 改成 fprintf,第一个参数为 fout ,最后执行 fclose,关闭两个文件。
22.输出精确到小数点c为的实数。
printf("%.*lf ",c,(double)a/(double)b);
而对下面用法,前面的*定义的是总的宽度,后面定义的是输出个数,分别对应外面的参数m,n
printf("%*.*s ",m,n,ch);
23.一维数组定义
int a[maxn]
24.数组a可以被声明在main里面也可以在外面。只有在外面时,数组a才可以开的很大;放在main函数里面,数组稍大就会异常退出。
25. 数组不能够进行赋值操作,如果要从数组a复制k个元素到数组b,可以这样做:
memcpy(b,a,sizeof(int)*k)
当然,如果数组a和b是浮点型的,复制时要写成
memcpy(b,a,sizeof(double)*k)
使用memcpy函数,需要包含头文件 string.h。
如果要把数组a全部复制到数组b中,可以这样
memcpy(b,a,sizeof(a))
26. 把数组清零
memset(a,0,sizeof(a));
27.二维数组
int a[maxn][maxn];
28. 读入一个不含空格、TAB和回车符的字符串,存入字符数组s
scanf("%s",s);
它遇到空白字符会停下来。
29.把数字输入到字符数组中
sprintf(buf, "%d%d%d%d%d",abc,de,x,y,z);
30.判断buf中的指定位置的字符是否包含在字符数组s中,如果不包含则为NULL
if(strchr(s,buf[i])==NULL) ok = 0;
31.在一个字符串中查找单个字符: strchr
32. strlen(s) 返回的是结束标记之前的字符个数。
33. 由于字符串的本质是数组,它也不是一等公民,只能用strcpy(a,b),strcmp(a,b), strcat(a,b)来执行赋值,比较,和连接操作。
34. 对于由空格的字符串输入,可以使用 fgetc(fin), 它读取一个打开的文件 fin,读取一个字符,然后返回一个 int值。
如果要从标准输入读取一个字符,可以用getchar,它等价于 fgetc(stdin)。
第二种方法是使用 fgets(buf, maxn,fin) 读取完整的一行。
fgets(buf,maxn,fin) 将读取完整的一行放在字符数组 buf 中。应该保证 buf 能够存放下文件的一行内容。
fgets的标准输入版 gets , gets没有指明读取的最大字符数。
gets已经被废除了。
C语言中的 gets(s) 存在缓冲区溢出漏洞,不推荐使用。
while((c=getchar()) != EOF){ ... }
35. 常量数组
char s[] = "1234567890"
36.找字符在常量数组中的位置
while((c=getchar()) != EOF ) { for (i=1;s[i] && s[i] != c ; i++); }
37. isalpha 判断字符是否是字母,类似的 isdigit , isprint 等,都是定义在头文件 ctype.h
而 toupper, tolower 等可以用来转换大小写。