C语言复习笔记(二)顺序、选择、循环结构

今天我们来复习第二章 顺序、选择、循环结构。

第二章 顺序、选择、循环结构

上一章传送门:C语言概论初识

下一章传送门:数组

众所周知,本章有三大巨头,分别是if语句for语句,以及while语句,我们从这三个开始,因为太过简单,精通就直接跳过吧。

老大哥之if哥哥

if的一般形式

if (表达式) {
     语句1
}
[ else  语句2 ]

“表达式”可以是关系表达式逻辑表达式,甚至是数值表达式
方括号内的部分(即else子句)为可选的,既可以有,也可以没有
语句1和语句2可以是一个简单的语句,也可以是一个复合语句,还可以是另一个if语句。

二大哥之for哥哥

用for语句实现循环

for(表达式1;表达式2;表达式3){
		语句
}

使用时有如下注意事项:
1.表达式1”可以省略,即不设置初值,但表达式1后的分号不能省略。例如: for(;i<=100;i++)。应当注意: 由于省略了表达式1,没有对循环变量赋初值,因此,为了能正常执行循环,应在for语句之前给循环变量赋以初值。
2.表达式2也可以省略,即不用表达式2来作为循环条件表达式,不设置和检查循环的条件。此时循环无终止地进行下去,也就是认为表达式2始终为真。
3.表达式3也可以省略,但此时程序设计者应另外设法保证循环能正常结束。
4.甚至可以将3个表达式都可省略,即不设初值,不判断条件(认为表达式2为真值),循环变量也不增值,无终止地执行循环体语句,显然这是没有实用价值的。
5.表达式1可以是设置循环变量初值的赋值表达式,也可以是与循环变量无关的其他表达式。表达式3也可以是与循环控制无关的任意表达式。但不论怎样写for语句,都必须使循环能正常执行。
6.表达式1和表达式3可以是一个简单的表达式,也可以是逗号表达式,即包含一个以上的简单表达式,中间用逗号间隔。
7.表达式2一般是关系表达式或逻辑表达式,但也可以是数值表达式或字符表达式,只要其值为非零,就执行循环体。
8.for语句的循环体可为空语句,把本来要在循环体内处理的内容放在表达式3中,作用是一样的。可见for语句功能强,可以在表达式中完成本来应在循环体内完成的操作。
9.C 99允许在for语句的“表达式1”中定义变量并赋初值。

三大哥之while哥哥

while语句实现循环
例:求1+2+3+…+100的和

#include<stdio.h>
int main()
{
	int i=1,sum=0;			//定义变量i的初值为1,sum的初值为0  
	while(i<=100)				//当i>100,条件表达式i<=100的值为假,不执行循环体
	{						//循环体开始
		sum=sum+i;			//第1次累加后,sum的值为1
		i++;					//加完后,i的值加1,为下次累加做准备
	}						//循环体结束
	printf("sum=%d\n",sum);	//输出1+2+3…+100的累加和
	return 0;
}

注意事项:
(1) 循环体如果包含一个以上的语句,应该用花括号括起来,作为复合语句出现。
(2) 不要忽略给i和sum赋初值,否则它们的值是不可预测的,结果显然不正确。
(3) 在循环体中应有使循环趋向于结束的语句。如本例中的“i++;”语句。如果无此语句,则i的值始终不改变,循环永远不结束。

话说while还有一个小弟,就是do…while

用do⋯while语句实现循环
例:用do…while语句求1+2+3+…+100的和

#include <stdio.h>
int main()
{
	int i=1,sum=0;
	do 
	{
		sum=sum+i;
		i++;
	}while(i<=100);
	printf("sum=%d\n",sum);
	return 0;
}

注意事项:
在一般情况下,用while语句和用do…while语句处理同一问题时,若二者的循环体部分是一样的,那么结果也一样。 但是如果while后面的表达式一开始就为假(0值)时,两种循环的结果是不同的。
我们来详细看下这两个的区别,前者为先奏后斩,后者为先斩后奏
前者:
C语言复习笔记(二)顺序、选择、循环结构_第1张图片
后者:
C语言复习笔记(二)顺序、选择、循环结构_第2张图片

三大巨头说完了,我们再来说以下if…else语句的好兄弟,switch语句

为什么说switch是if…else的好兄弟呢?因为凡是if…else解决起来麻烦的事,几乎都是可以用switch来解决的,至少我们目前学到方面是这样的。
用switch语句实现多分支选择结构

switch(表达式)
{
case	常量1 : 语句1
case	常量2 : 语句2
    	    		
case	常量n : 语句n
default :	    语句n+1
}

注意事项:
(1) 括号内的“表达式”,其值的类型应为整数类型(包括字符型)
(2) 花括号内是一个复合语句,内包含多个以关键字case开头的语句行和最多一个以default开头的行。case后面跟一个常量(或常量表达式),它们和default都是起标号作用,用来标志一个位置。执行switch语句时,先计算switch后面的“表达式”的值,然后将它与各case标号比较,如果与某一个case标号中的常量相同,流程就转到此case标号后面的语句。如果没有与switch表达式相匹配的case常量,流程转去执行default标号后面的语句。
(3)可以没有default标号,此时如果没有与switch表达式相匹配的case常量,则不执行任何语句
(4) 各个case标号出现次序不影响执行结果。
(5) 每一个case常量必须互不相同;否则就会出现互相矛盾的现象
(6) case标号只起标记的作用。在执行switch语句时,根据switch表达式的值找到匹配的入口标号,在执行完一个case标号后面的语句后,就从此标号开始执行下去,不再进行判断。因此,一般情况下,在执行一个case子句后,应当用break语句使流程跳出switch结构。最后一个case子句(今为default子句)中可不加break语句。
(7) 在case子句中虽然包含了一个以上执行语句,但可以不必用花括号括起来,会自动顺序执行本case标号后面所有的语句。当然加上花括号也可以。
(8) 多个case标号可以共用一组执行语句。

提到switch语句,就不得不说说他说的好基友break;(哈哈哈,感觉自己被套路了,还没完了还。)

用break语句提前终止循环
例:在全系1000名学生中举行慈善募捐,当总数达到10万元时就结束,统计此时捐款的人数以及平均每人捐款的数目。

#include <stdio.h>
#define SUM 100000	//指定符号常量SUM代表10万
int main()
{
	float amount,aver,total; 
	int i;
	for (i=1,total=0;i<=1000;i++)
	{
		printf("please enter amount:");
		scanf("%f",&amount);
		total=total+amount; 
		if(total>=SUM) break; 
	}
	aver=total/i;
	printf("num=%d\naver=%10.2f\n",i,aver); 
	return 0;
}

解析:
for语句指定执行循环体1000次。每次循环中,输入一个捐款人的捐款数,并累加到total中。设置了if语句,在每一次累加捐款数amount后,立即检查累加和total是否达到或超过SUM(即100 000),若超过就执行break语句,流程跳转到循环体的花括号外,提前结束循环。

不知足下可曾听闻break的异父异母亲兄弟(哈哈哈,快完了快完了,坚持一下下)

用continue语句提前结束本次循环
例:要求输出100~200之间的不能被3整除的数

#include <stdio.h>
int main()
{	int n;
	for (n=100;n<=200;n++)
	{	if (n%3==0)
			continue;
		printf("%d ",n);
	}
	printf("\n");
	return 0;
}

解析:
当n能被3整除时,执行continue语句,流程跳转到表示循环体结束的右花括号的前面(注意不是右花括号的后面),从而跳过printf函数语句,结束本次循环,然后进行循环变量的增值(n++),只要n<=200,就会接着执行下一次循环。
由于这俩过于亲密(都说是异父异母的亲兄弟了),所以导致很多可怜的小伙伴分不清楚他们,下面我就把我的火眼金睛传授给你们
break是提前终止循环,注意终止俩字,就是此次循环后边的就不做了。比如你打算今天上最强王者,然后开始一遍一遍的排位,突然,你妈叫你回家吃饭,并对你说一会儿带你去干活,你就只能去吃饭了,还得干活,今天的王者计划泡汤了。你妈叫你回家吃饭并对你说一会儿带你去干活,就是函数在执行中遇到的break
continue是语句提前结束本次循环,注意本次俩字,就是仅本次循环不做了,下一轮循环继续。就像你今天又在上王者,不上王者不罢休(这次妈妈不在家),你打的正快乐时,你家小可爱来电话了,你不得不去接电话,并且后半场不会再操作了,等哄完小可爱,继续开下一场,继续上分。你家小可爱给你来电话了,就是函数在执行中遇到的continue

下边就是一些琐碎的知识点了

2.1. 字符的输入和输出
①getchar(),作用是向终端输入一个字符
②putchar(ch),作用是向终端输出一个字符
注:getchar()函数没有参数,函数值就是从输入设备得到的字符
拓:char str[100]; gets(str);
getchar()注意事项:
函数没有参数
函数的值就是从输入设备得到的字符。
只能接收一个字符
如果想输入多个字符就要用多个函数
不仅可以从输入设备获得一个可显示的字符,而且可以获得控制字符。
用getchar函数得到的字符可以赋给一个字符变量或整型变量,也可以作为表达式的一部分。如,putchar(getchar());将接收到的字符输出。

2.2. 格式化输入输出
① printf函数格式为:printf(输出控制,输出列表)。输出控制是用一对双引号括起来的,包含格式说明和原样信息。输出列表包含若干输出项。

② printf函数中格式说明**%d对应整型**,%f对应单精度实型%c对应字符型%o对应八进制无符号整型%x对应无符号十六进制整型%u对应无符号整型%e对应指数型%s对应字符串型。可在%和格式字符之间加一个数来控制数据所占的宽度和小数位数。

③ scanf函数输入项要求带取地址符&。当用键盘输入多个数据时,数据之间用分隔符分隔符包括空格符、制表符和回车符但不包括逗号。(字符串去除空格)

条件运算符和条件表达式

表达式1 ? 表达式2 : 表达式3
通俗的意思就是,表达式1一般是判断语句的,如果是true,则返回表达式2,否则返回表达式3 举个列 (1>2)?1:2 因为1<2的,结果是false,所以返回表达式3, (1>0)?2:2 因为1>0的,结果是true,所以返回表达式2。

今天就复习完了,大家加油啊!!!

你可能感兴趣的:(笔记)