一、输入输出
格式化操作函数:
1.****printf //格式化输出函数
int printf(const char *format, ...); //... 表示可变参数 --参数的数量可以变
int printf(格式控制字符串,输出列表);
printf("a = %d\n",a);
格式控制字符串:
占位符 //将来要被 后面的参数值 替换掉 --格式转换
整型类型:
%d 以有符号十进制格式输出
%u 以无符号十进制格式输出
%o 以八进制格式输出
%x 以十六进制格式输出
%X 大写 表示 输出的十六禁止中的 字母 大写
浮点类型:
%f 以十进制形式的小数输出,默认保留6位小数
%e 以科学计数法的形式输出
%g 以%f 和 %e 更简洁的方式输出 ,输出结果中不会保留没有意义0
字符型:
%c 以字符形式输出
%s 以字符串形式输出
辅助控制符
# %#o //以八进制格式输出,前面带一个0
%#x //以十六进制格式输出,前面带上0x
eg: m.n
(1) m 表示输出的宽度 //列数
如果数据本身宽度 < m //输出结果默认右对齐,前面默认补空格,前面空出来的还可以补0
%5d //默认前面补空格
%05d //前面空出来的补0
%-5d // - 号 表示左对齐
如果数据本身宽度 >= m //此时 以数据实际宽度输出
(2).n
浮点数 保留n位小数
%.2f //表示保留两位小数
字符串
保留 前n个字符
l // %ld -- long
// %lld -- long long
// %Lf // 表述输出 long double 注意 L 要大写
注意:
1.一个占位符,只能匹配一个参数
2.占位符匹配,是按顺序一次匹配的。
2.****scanf //格式化输入函数
int scanf(const char *format, ...);
scanf格式:
scanf("格式控制字符串",地址列表);
功能:
将键盘获得到的数据,转换成指定的格式,给到地址对应的空间
int a;
scanf("%d" ,&a);
参数:
(1).格式控制字符串
普通字符
scanf("a=%d",&a); //要求,原样输入
占位符
整型
%d --- 将输入的数据 转换为 十进制格式
%x --- 将输入的数据 转换为 十六进制格式
%o --- 将输入的数据 转换为 八进制格式
浮点型
%f --- 将输入的数据 转换为 小数格式
可以识别,十进制形式的小数,科学计数法形式的数据
%lf --- 表示将输入的 浮点形式的数据,转换为double类型
%e
%g //都能转换 浮点行书的数据
//默认可以转换 为 float类型
%le //可以转换double
%lg //可以转换double
字符型
%c --- 将输入的数据,转换为 字符数据
%s --- 将输入的数据,转换为 字符串数据
辅助控制符:
(1) m //宽度 -- 在输入时,表示指定了输入数据的宽度
//一旦达到宽度时,表示,此次输入结束
eg:
scanf("%3x",&a); //如果输入的数据,已经匹配了3个字符宽度,则表示scanf结束
123456 //m相当于限定了输入数据的长度
12\n //12读走了
//.n //输入时,不能指定所谓 精度
(2)
l
ll
%f
%lf //表示给double 输入数据
%Lf //表示给long double 输入数据
%ld //表示给long类型输入数据
%lld //表述给long long类型输入数据
注意:
1.scanf使用时,格式控制字符串中,尽量不出现“普通字符”,主要写 占位符
2.输入多个数据时,数据间,可以使用"空白符"分割
空白符 -- (回车,空格,tab键)
3.scanf注意Segmentation(分段) fault (core dumped) //段错误
错误的原因:代码试图访问不能访问的内存空间。
4.一般使用
scanf中 占位符 与 地址列表中的个数 要匹配
scanf中 地址列表中注意一定得是有效地址
eg:
int a = 10;
scanf("%d",a); //此时a被当做地址用了,这不是一个有效的地址---访问到了 不能访问的空间(非法内存)
练习:
2.编写程序从终端输入数据给到变量,
并打印变量的值
a = 3 b = 5 x = 8.5
y = 71.82 c1= 'A' c2 = 'a'
输入缓冲区://缓冲区其实是一块内存
[3 5 8.5 71.82 A B\n] //缓冲区
[ B\n] //缓冲区
scanf("%d%d%f%f%c%c",&a,&b,&x,&y,&c1,&c2);
问题:
1. %c --- 识别字符 ---只要是字符都能被识别
空白符 (回车,空格,tab)
2. 输入的数据,都是先到了输入缓冲区的,scanf去其中进行数据匹配
//缓冲区中有上一次输入残留下的空白符
注:
%*c // 可以 匹配一个 数据项 ,匹配走之后,并不给到任何变量中
scanf("%d ");
scanf("%d\n"); 如果出现空白符,表示 从输入中匹配任意多个空白符
scanf匹配结束的情况:
1.遇到空白符 (回车,空格,tab)
scanf("%d%d",&a,&b);
123 456 //
2.到达指定的宽度
scanf("%3d",&a); //12345 --- 最终a只能读到123
3.遇到非法字符
scanf("%d%d",&a,&b); // 123a456
123 -- a对于%d来说就是非法字符
4.scanf返回值表示,成功匹配到的数据的个数
[a 1 2\n]
%d%d%d
练习:
三角形三边,求三角形面积
sqrt(数据);
二、流程控制
选择 (分支控制)
循环
//1.准备数据
//2.处理数据
//3.输出结果
//顺序结构
//分支结构
//循环结构
任何一个程序,都可以是这三种结构的组合。
选择(分支):
从众多情况中,选择一种
C语言中实现选择:
1.if语句 //if-else语句
2.switch语句
C语言中实现选择,需要构造选择的条件?
选择的条件的构造:
关系运算: //大小关系
运算符:
>
>=
<
<=
==
!=
运算:
int a = 1;
int b = 2;
a > b
关系运算的结果 --反映关系成立与否?
//布尔类型
true
false
c语言中,用int型 来记录 关系运算的结果
关系成立 真 结果 1
关系不成立 假 结果 0 //逻辑值
逻辑运算
与 &&
运算规则:
一假则假
运算特性: 截断特性(短路特性)
运算的顺序,始终先算 左边的第一个表达式
或 ||
运算规则:
一真则真
也有短路特性
非 !
运算规则:
真假相对
逻辑运算
表示 多个表达式之间的关系
表示:
b比a大并且比c小
a< b && b< c // 对应数学上的 a<b<c
C语言中如何表示“真”和“假”?系统如何判断一个量的“真”和“假”?
c语言中用 0 表示 假
1 表示 真
c语言规定,
如果一个量对应的数值 是 0 则为假
如果非0,则为 真
0 --- 假
'a' --- 真
-1 --- 真
1.23 --- 真
三、练习