C语言学习笔记
之 输入输出与程序设计结构之美
看看今天的菜是什么:printf()与scanf();if语句开关switch 三种循环结构。看到这些东西,如果你曾经学完过C,你是不是有点怀念?如果你是初学者,你是不是感到头疼?
你是不是感觉到它们很简单,因为它们都是最基本的知识,但是,我说正是因为它们基础,所以它们才博大精深,因为把他们按照自己的思路拼凑在一起会形成不同风格的程序。
即使是如此的简单,你是不是因为pirntf(“%5d”,a);中的5而感到疑惑?会不会因为scanf(“%d”,&a)中的输入格式无从下手? 有没有因为swich中的break而查阅过好多资料?更不用说大家肯定都会动脑子想想循环结构的逻辑思路。
如果大家对我说的还有一定疑惑的话,那就跟着小编一起走一段路吧!
一:格式输出printf()
1.格式:printf(格式控制,输出列表);
(1)格式控制是用双引号引起来的字符串,也叫:转换控制字符串。它包括两种信息
格式字符串:由%和格式字符组成,作用是将输出的数据转换为指定的格式输出
普通字符,即需要原样输出的字符。
(2)输出列表是需要输出的一些数据,也可以是表达式
(3)printf函数的一般形式可以表示为
Printf(参数1,参数2....参数n) 功能是将参数2~参数n按参数1给定的格式输出
2.我们主要来看一下格式控制中的格式字符串的形式,我们已经说过,它是有%和格式字
符组成,也就是大家常用的 “%d”等。但是这个格式字符的种类可是有好多的分类:
格式字符 |
作用 |
描述 |
d(或i) |
用来输出十进制整数 |
①%d,按整型数据的实际长度输出。 ②%md,m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空,若大于m,则按实际位数输出。%5d。 ③%ld(%mld 也可),输出长整型数据。
|
o |
以八进制数形式输出整数 |
%o,%mo,%lo,%mlo都可 |
x(或X) |
以十六进制数形式输出整数 |
%x,%mx,%lx,%mlx都可 |
u |
输出unsigned型数据,即无符号数,以十进制数形式输出 |
%u,%mu,%lu都可 |
c |
输出一个字符 |
%c,%mc都可 |
s格式 |
输出一个字符串。 |
%s,%ms,%-ms,%m.ns,%-m.ns都可 |
f格式符 |
输出实数(包括单、双精度),以小数形式输出 |
%f,%m.nf,%-m.nf都可 注意:单精度实数的有效位数一般为7位,双精度为16位。 |
注:字符l用于长整型整数,可加在格式符d、o、x、u前面;
m代表一个正整数,表示数据最小宽度
N代表一个正整数,表示对实数表示输出n位小数,对字符串,表示截取的字符个数
3.疑惑
(1)如果要输出%怎么办?我们知道“%+格式字符”是一种形式,但是要输出%怎么办?
应该在“格式控制”字符串中用连续两个%表示 ,比如:printf(“%f%%”,a);
(2)在格式控制 字符串内是可以包含转义字符的,如\n(换行)
二:格式输入scanf()
1.格式:scanf(“格式控制”,地址表列);
格式控制的作用与printf函数相同,但是不能显示非格式字符串,
地址表列中是各变量的地址,地址由&(地址运算符)个变量名组成。&a
2.“*”
表示该输入项,读入后不赋予相应的变量,即跳过该输入值
比如:scanf(“%d%*d%d”,&a,&b);当输入为123时,把1给a,2被跳过,3给b
3.scanf()函数和printf()函数的格式控制字符基本上是一样的,也分为%d%5d等等,但是scanf中没有精度控制,比如scanf(“%5.2f”,&a)是错误的。
4. 格式控制字符串与输入格式,两者格式是一样的。
比如:scanf(“%d,%d %d%d”,&a,&b,&c,&e);//3个%d之间一个逗号,一个空格,一个什么都没有。则输入的时候就应该按照这样的格式输入:d,e fg。
如果不按照控制字符的格式输出呢?
比如:scanf(“%d%d%d”,&a,&b,&c)
输入 d e f 在格式控制字符窜中3个%d之间什么都没有,但是在输入的的abc之间都加了一个空格,很明显两者的格式没有统一起来。那么:
d给a,空格给b,e给c。
三:if语句嵌套之美
if是选择语句,我认为里面实在没有什么难点和应该注意的地方,硬要说的话,就是if语句的嵌套层次。需要注意它们的格式,不要乱写if.
if(条件) 语句; else 语句; |
if(条件) 语句; else if(条件) 语句; else if(条件) 语句; .. .. else 语句; |
在if 中,可以写成条件运算符的形式。下述两种语句表达的是一个意思
if(a>b) Max=a; else Max=b; |
Max=a>b? a:b |
四:switch语句
Switch又称为开关语句
基本形式是
switch(表达式) { case 值1:语句1;[break;] case 值2:语句2;[break;] ..... [default:语句;] } |
需要注意的是switch()中的表达式的数据类型只能是整型或字符型。
有关break的详解,请继续往下看
五:三种循环结构
while(表达式) { 语句序列; } |
do{ 语句序列; }while(表达式); |
for(表达式1;表达式2;表达式3) { 语句序列; } |
3中循环结构以for循环最为重要。
while和do..while的区别在于:while是先判断再执行;do...while是先执行后判断。
for循环中的表达式1为初始条件,符合表达式2的判断,执行语句,然后执行表达式3,再根据表达式2进行判断,执行语句。
关于for循环的嵌套:程序实例:打印九九乘法表。
#include |
六:终止语句:break和continue语句的区别
1.break语句
(1)break语句只能用于循环语句或者switch语句中。即使有这样的语句
If(...) break; 那么这个if语句也一定位于循环体或者swich语句之中。
(2)break语句的作用是跳出(终止)它所在的循环。而且不能同时跳出多层循环。
比如:
for(){ 第一个for循环 for(){ 第二个for循环 语句1; break; 语句2; } 语句3; } |
上述中break终止的只能是第二个for循环,即程序运行到break时,就跳出第二个for循环,然后执行语句3,执行完语句3后开始循环执行第一个for循环。就当第二个for不存在一样。
但是需要注意的是,语句1执行了一次,语句2一次也没有执行。语句3执行了n次(n为第一个for循环的循环次数)
(3)程序实例验证(2)
#include |
2.continue语句
(1)continue语句与break语句一样,都必须在循环中。
(2)continue语句的不同之处在于它的作用是结束本次循环,即跳过本层循环体中余下尚未执行的语句,接着再一次进行循环的条件判断。也就是说执行continue语句并没有使本次循环结束。
比如:
for(){ 第一个for循环 for(){ 第二个for循环 语句1; continue; 语句2; } 语句3; } |
上述程序中,执行到continue时,第二个for循环的这一次循环终止,进行第二个for循环的下一次循环,也就是说,语句2不执行了,再进行新的一轮循环。只是continue之后的语句不执行了,然后再进行第二个for循环中的下一次循环。
在上述程序中,语句1执行了n次(n为第二个for循环循环的次数),语句2一次也没有执行,语句3执行了m次(m为第一个for循环循环的次数)
(3)一个程序实例验证(2):
#include |