C语言复习笔记 4
2017-04-08 13:30
281 查看
C语言输入输出和程序结构
C语言输出数据
puts():仅输出字符串putchar():输出单个字符
printf():多种格式输出
C语言输入数据
gets():获取一行数据,并作为字符串处理。会读取用户输入的整行内容,包括空格。getchar()、getche()、getch():这三个函数都用于输入单个字符
scanf():多种格式输入字符。需要注意的是,scanf()遇到空格就结束读取,也就是说,使用scanf()读取的字符串中永远不会包含空格。
字符串常量的存储位置
char s1[] = "aaaaaaaaaaaaaaa"; //数组和字符串都在栈 char *s2 = "bbbbbbbbbbbbbbbbb"; //指针在栈,字符串在常量区 aaaaaaaaaaa是在运行时刻赋值的; 而bbbbbbbbbbb是在编译时就确定的; 但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。
//转义字符 \a 响铃 \b 退格,将当前位置移到前一列 \n 换行,将当前位置移到下一行开头 \r 回车,将当前位置移到本行开头
分支结构
//简单的if-else分支语句 if (判断条件) { 语句块1; } else { 语句块2; }
//多个if-else分支语句 if(判断条件1) { 语句块1; } else if (判断条件2) { 语句块2; } else if (判断条件3) { 语句块3; } else { 语句块4; }
意思是从上到下,依次检测判断条件,当某个判断条件成立时,则执行其对应的语句块,然后跳到整个if else语句之外继续执行其他代码,如果所有判断条件都不成立,则之后最后else的语句块4(n),然后继续执行后续代码。
也就是说一旦遇到能够成立的判断条件,则不再执行其他的语句块,所以最终只能有一个语句块被执行。
#include <stdio.h> int main (void) { char ch; ch = getchar(); if (ch < 32) { puts("ch is a control character."); } else if (ch >= 48 && ch <= 57) { puts("ch is a number."); } else if (ch >= 65 && ch <= 90) { puts("ch is a capital character."); } else if (ch >= 97 && ch <= 122) { puts("ch is a small character."); } else { puts("ch is other character."); } return 0; }
if语句的嵌套调用
#include <stdio.h> int main (void) { char ch; ch = getchar(); if (ch < 32) { puts("ch is a control character."); } else if (ch >= 48 && ch <= 57) { puts("ch is a number."); if (ch == '9') { puts("ch is number nine."); } else { puts("ch is other number."); } } else if (ch >= 65 && ch <= 90) { puts("ch is a capital character."); } else if (ch >= 97 && ch <= 122) { puts("ch is a small character."); } else { puts("ch is other character."); } return 0; }
if 语句嵌套时,要注意 if 和 else 的配对问题。C语言规定,else 总是与它前面最近的 if 配对,例如:
if(a!=b) // ① if(a>b) printf("a>b\n"); // ② else printf("a<b\n"); // ③ //③和②配对,而不是和①配对。
运算符——按操作数的个数分:
1. 单目运算符:++,–
2. 双目运算符:+ - * /
3. 三目运算符:
?:比如
a>b?a:b;
逻辑运算符
为什么有了逻辑运算符——前面学到if-else结构,当一个if语句里面嵌套了多个判断条件就需多个if语句,显然这样的代码不够清晰。利用逻辑运算符可以整合判断条件。
各运算符优先级:
赋值= < &&和|| < 关系运算符 < 算术运算符 < 非
switch语句
为什么会有switch语句,主要是当有多个if语句时,代码不够清晰且易错,尝试写下面的代码就能感受的到
#include <stdio.h> int main (void) { int a; scanf("%d", &a); if (a == 1) { puts("Today is Monday."); } else if (a == 2) { puts("Today id Tuesday."); } else if (a == 3) { puts("Today is Wednesday."); } else if (a == 4) { puts("Today is Thursday."); } else if (a == 5) { puts("Today is Friday."); } else if (a == 6) { puts("Today is Saturday."); } else if (a == 7) { puts("Today is Sunday."); } else { puts("A illegal number.\nPlease input a number between 1 and 7...."); } return 0; }
关于switch语句
switch结构1:
switch(表达式){ case 整型数值1: 语句 1; case 整型数值2: 语句 2; ...... case 整型数值n: 语句 n; default: 语句 n+1; }
它的执行过程是:
1) 首先计算“表达式”的值,假设为 m。
2) 从第一个 case 开始,比较“整型数值1”和 m,如果它们相等,就执行冒号后面的所有语句,也就是从“语句1”一直执行到“语句n+1”,而不管后面的 case 是否匹配成功。
3) 如果“整型数值1”和 m 不相等,就跳过冒号后面的“语句1”,继续比较第二个 case、第三个 case……一旦发现和某个整型数值相等了,就会执行后面所有的语句。假设 m 和“整型数值5”相等,那么就会从“语句5”一直执行到“语句n+1”。
4) 如果直到最后一个“整型数值n”都没有找到相等的值,那么就执行 default 后的“语句 n+1”。
需要重点强调的是,当和某个整型数值匹配成功后,会执行该分支以及后面所有分支的语句。
break是C语言的一个关键字,专门用于跳出switch语句,所谓跳出,是指一旦遇到break,就不再执行,switch中的任何语句,包括当前分支中的语句和其他分支中的语句;也就是说,整个switch执行结束了,接着会执行整个switch后面的代码。
switch语句结构2:
switch(<条件>) { case 1:<语句体>;break; case 2:<>;break; ...... default:<>;break; }
需要注意的是:
1. 只能针对基本数据类型使用;其他类型必须用if
2. case 标签必须是常量表达式(整数或字符)
3. 由于 default 是最后一个分支,匹配后不会再执行其他分支,所以也可以不添加break;语句。
4. default 不是必须的。当没有 default 时,如果所有 case 都匹配失败,那么就什么都不执行。
条件运算符
表达式1?表达式2:表达式3
首先判断表达式1,若为真,则将表达式2的值作为整个条件表达式的值;若为假,则将表达式3的值作为整个条件表达式的值。条件表达式通常用于赋值语句中。
需要注意的是:
1. 条件运算符的优先级是小于关系运算符和算术运算符的,高于赋值运算符:
max = (a>b)?a:b等价于
max = a>b?a:b
2. 条件运算符的结合方向是自右向左的,条件表达式嵌套的理解:
a>b?a:c>d?c:d;等价
a>b?a:(c>d?c:d)
在C语言中,共有三大常用的程序结构:
顺序结构:代码从前往后执行,没有任何“拐弯抹角”;
选择结构:也叫分支结构,重点要掌握 if else、switch 以及条件运算符;
循环结构:重复执行同一段代码。
循环结构
循环结构while 循环
while(表达式) { 语句块; }
执行过程是:先计算表达式的值,若为真,执行语句块;再计算表达式的值,若为真,继续执行语句块,再计算表达式的值,直到表达式的值为假,就退出循环,执行while后面的代码。
while 循环的整体思路是这样的:设置一个带有变量的循环条件,也即一个带有变量的表达式;在循环体中额外添加一条语句,让它能够改变循环条件中变量的值。这样,随着循环的不断执行,循环条件中变量的值也会不断变化,终有一个时刻,循环条件不再成立,整个循环就结束了。
for循环的产生
#include <stdio.h> int main(){ int sum = 0; int i = 1; //语句① while(i <= 100 /*语句②*/ ){ sum += i; i++; //语句③ } printf("%d\n", sum); return 0; }
可以看到,语句①②③被放到了不同的地方,代码结构较为松散。为了让程序更加紧凑,可以使用 for 循环来代替,如下所示:
#include <stdio.h> int main(){ int sum = 0; for(int i = 1/*语句①*/; i <= 100/*语句②*/; i++/*语句③*/){ sum += i; } printf("%d\n", sum); return 0; }
for循环的一般形式是
for (表达式1; 表达式2; 表达式3) { 语句体; }
运行过程:先计算表达式1,再计算表达式2,若表达式2的值为真,则执行语句体,再计算表达式3,再计算表达式2的值,若为真,执行语句体;若为假,结束整个for循环语句。
“表达式1”仅在第一次循环时执行,以后都不会再执行,可以认为这是一个初始化语句。“表达式2”一般是一个关系表达式,决定了是否还要继续下次循环,称为“循环条件”。“表达式3”很多情况下是一个带有自增或自减操作的表达式,以使循环条件逐渐变得“不成立”。
C语言跳出循环
使用while和for循环时,如果想提前结束循环(在不满足结束条件的循环下结束循环),可以使用break或continue关键字
break关键字:
之前有学到,用于跳出switch语句;
用于while 、 for循环时,会终止循环而执行整个循环语句后面的代码,break关键字通常和if语句一起使用,即满足条件时,便跳出循环。
在多层循环中,一个while语句只跳出一层循环
continue关键字:
continue 语句的作用是跳过循环体中剩余的语句而强制进入下一次循环。continue语句只用在 while、for 循环中,常与 if 条件语句一起使用,判断条件是否成立。
break与continue的对比:break 用来结束所有循环,循环语句不再有执行的机会;continue 用来结束本次循环,直接跳到下一次循环,如果循环条件成立,还会继续循环
循环结构的嵌套
//输出一个4x4的矩阵 #include <stdio.h> int main(void) { for (int j = 1; j <= 4; j++) { for (int i = 1; i <= 4; i++) { printf("%d ", i*j); } printf("\n"); } return 0; }
//输出九九乘法表 #include <stdio.h> int main(void) { for (int i = 1; i <= 9; i++) { for (int j = 1; j <= i; j++) { printf("%d*%d=%-4d", i, j, i*j); } printf("\n"); } return 0; }
相关文章推荐
- c语言复习笔记(1)--从HelloWorld说起
- C语言复习串讲课堂笔记
- 自学笔记-C语言复习2015年7月3日
- c语言复习笔记1
- C语言学习笔记 lesson5 浮点数类型及复习
- C语言复习笔记二:输入输出
- C语言复习笔记 3
- 自学笔记-C语言复习2015年7月1日
- 自学笔记-C语言复习2015年6月25日
- C语言复习笔记 1
- C语言复习串讲课堂笔记
- C语言复习笔记-17种小算法-解决实际问题
- C语言复习笔记--static 全局变量和普通全局变量
- 自学笔记-C语言复习2015年7月2日
- C语言复习笔记(三)
- c语言复习笔记(2)--标准库中的I/O
- c语言复习笔记——内存分配问题
- 我的c语言复习笔记1-说说for循环
- 自学笔记-C语言复习2015年7月8日
- C语言复习笔记 2