1. 四舍五入

1
2
3
4
单精度保留小数点后两位:a = (int)(a*100+0.5)/100.0;
双精度保留小数点后两位:a = (int)(a*10000+0.5)/10000.0;
正整数:(int)(a+0.5),负整数把+换成-;
math.h头文件里有round(...),可直接四舍五入

2. 输出确定位数的小数

1
2
3
%.1f   %.1lf

%.2f %.2lf

在%后加上点和位数表示要保留小数点后几位

3. 输出返回值

1
2
3
4
5
6
7
8
# include <stdio.h>
int main ()
{
int a=printf("Hello world!");
printf("\n");
printf("%d",a);
return 0;
}

打印函数的返回值就是字符个数,\n是一个字符,要单独打印

4. 域宽

指存放输出数据的宽度

1
printf("%10d",a);

printf可以使用使用格式控制串“%md”输出域宽为m的十进制整数

m前有0则会在空位补零

如果要把生日分隔成年月日,可以这样写

1
2
3
4
5
6
7
8
9
#include <stdio.h>
int main ()
{
int y,m,d;
scanf("%4d%2d%2d",&y,&m,&d);
printf("year=%04d\n",y);
printf("month=%02d\n",m);
printf("date=%02d",d);
}

%0指的是在单个数字前补零,如果不用,单个数字前会有空格

这里没有return 0也能运行,可能是编译器允许的唯一特例。

5. 进制的前导

H表示的是Hex,表示是16进制数。前导标志是0x;
B表示的是Bit,表示是二进制.无前导标志;
O表示的是Octal,也可简写为OCT表示是八进制,前导为0;
D表示是Decem,表示十进制。无前导标志;

原题让输出1234的八进制与十六进制(大写)

1
2
3
4
5
6
7
#include<stdio.h>
int main()
{
printf("%#o %#X",1234,1234);//用前导控制符
//printf("0%o 0X%X",1234,1234);//自己写前导
return 0;
}

用#可以使前导显示,结果的大小写取决于%后x的大小写

6.数据类型强制转换

1
2
3
4
5

b=(int)a;
b=(char)a*10;
b=(float)a%10;
等等,要赋值给另一个变量,如果直接打印就不用了

7.次方

用到了pow函数

pow函数用来求x的y次幂

如pow(5,2);

结果为25

8.根号

形式:sqrt(…)

海伦公式:

d=(a+b+c)/2;

e=sqrt((d(d-a)(d-b)*(d-c)));

9.EOF

在stdio.h中就规定了EOF就是-1,EOF即END OF FILE,在while循环中以EOF作为文件结束标志

我们常见到while(scanf(“%d”,a)!=EOF){…}

可用于多组输入

10.位移运算符

<<和>>,通过箭头方向可以很好的辨别,分别是C语言位运算符中的左移运算符和右移运算符,如表达式13<<2,它的运算过程为:

13的用二进制(四个字节,不考虑符号)表示为,0000 0000 0000 0000 0000 0000 0000 1101,那么向左移两位,右侧补0,则变为0000 0000 0000 0000 0000 0000 0011 0100 换成十进制即变为52

同理,再举一个例子,如表达式25>>3,表示25的二进制位向右移三位,由

0000 0000 0000 0000 0000 0000 0001 1001 变为0000 0000 0000 0000 0000 0000 0000 0011 即十进制3

1
2
3
4
5
6
7
8
9
#include<stdio.h>
int main()
{
int a,b;
a=13<<2;
b=25>>3;
printf("a=%d,b=%d\n",a,b);
return 0;
}

输出为a=52,b=3

应用:

1.左移N位的本质是乘以2的N次方

2.右移N位的本质是除以2的N次方