第三章 选择与循环

程序员必备技能(思想):增量编写法。每写一部分代码要及时运行看结果是否正确,对于复杂程序很重要。

常用的运算符优先级:

逻辑非 !> 算术运算符 > 关系运算符 > && > || > 赋值运算符

  • 单目运算符 逻辑非 !
  • 算术运算符 +、-、×、/、%
  • 关系运算符 >、<、>=、<=、==、!=
  • 逻辑运算符 &&、||

由于初试中大题极大概率会用到算术运算符、关系运算符和逻辑运算符,因此三者的优先级顺序必须牢记。算术运算符的优先级高于关系运算符、关系运算符的优先级高于逻辑与和逻辑或运算符,相同优先级的运算符从左至右进行结合

if语句

选择结构程序中 if( 表达式 ) 括号中的表达式99%的情况下都是填关系表达式或逻辑表达式。剩下1%的情况是直接放入一个值,如 if(i),如果 i 非零则为真,条件满足,进入if语句;如果 i 为0则为假,条件不满足,不会进入if语句[C语言中0代表假,非零代表是真];类似的也可以写 if( i + 3 )。

一个表达式中优先级最低的运算符是什么,则该表达式就是该运算符表达式。如5>3&&8<4-!0 其中优先级最低的是逻辑与运算符,所以这是逻辑表达式。该表达式的计算过程如下图:

第三章 选择与循环_第1张图片

不是说逻辑非 ! 的优先级是这里最高的吗?为什么还先算5>3?

原因在于这是一个短路运算。短路运算一般有:&&、||,其原理是:当有多个表达式时,左边的表达式值可以确定结果时,就不再继续运算右边的表达式的值。所以需要先算左边表达式的值,左边表达式值为1,又这是逻辑与&&运算符,确定不了最终结果,所以需要继续计算右边的表达式。【注:短路运算初试不考,故了解即可】

判断闰年:闰年指能被400整除或者能被4整除但不能被100整除。具体的表达式为year%4==0&&year%100!=0||year%400==0,也可以写成(year%4==0&&year%100!=0)||year%400==0,后者虽然可行,但括号显然是多余的,因为逻辑与的优先级是比逻辑或的优先级高。

练习使用if语句:

int main(){
	int i;
	while (scanf("%d", &i) != EOF)
	{
		if (i > 0) //在if的括号后面不可以加"分号 ; ",这会造成表达式无论是真还是假,都会执行后面的语句
		{
			printf("i is bigger than 0\n");
		}else{
			printf("i is not bigger than 0\n");
		}
	}
	
}

if语句和else语句也可以多个同时使用(多分支语句),如图所示。

第三章 选择与循环_第2张图片

但是无论有多少各if语句或else if语句,程序都只会执行其中的一个语句

练习多分支语句:

int main(){
	int number;
	float cost;
	scanf("%d", &number);
	if (number > 500)
	{
		cost = 0.15;
	}else if (number > 300){
        //程序从上至下依次执行,当执行到这里时就说明number已经<=500了,所以不必再判断number<=500
		cost = 0.10;
	}else if (number > 100) {
		cost = 0.075;
	}else {
		cost = 0;
	}

	//%0.2f表示小数点后保留两位
	printf("电费单价cost=%0.2f\n", cost);
}

if语句也支持多层嵌套,在if语句中又包含一个或多个if语句称为if语句的嵌套,如下图所示:

第三章 选择与循环_第3张图片

if语句嵌套练习:

int main(){
	int i;
	if (i > 1)
		if (i < 10)
			printf("i > 1 and i < 10\n");
		else
			printf("no,they are not\n");
	
	/*
	“就近原则”:else子句从属于最靠近它的不完整的if语句。上例中的else子句从属于第二个if语句,
	如果想让它从属于第一个if语句,可以用一个花括号把第二个if语句包含在一个单独的代码块内,	如下所示

	在编写代码时应遵守规范,都加上{}
	*/

	if (i > 1){
		if (i < 10)
			printf("i > 1 and i < 10\n");
	}else
		printf("no,they are not\n");
}

while循环

while语句用来实现“当型”循环结构,其一般形式为“while(表达式) 语句”,当表达式的值非0时(即条件为真时),执行while语句中的内嵌语句。其特点是:先判断表达式,后执行语句

第三章 选择与循环_第4张图片

当控制台(黑窗口)卡住后,只有两种情况,一种是卡在scanf了(这种情况下键盘输入内容是可以输入进去的);另一种情况是死循环,死循环在控制台(黑窗口)中是输入不进去内容的。

while循环练习:

//从1加到100
int main(){
	int i = 1;
	int total = 0;//存储最终的和
	while (i <= 100)//while后面不能加“分号;”,否则会死循环
	{
		total = total + i;
		i++;
	}
	printf("total=%d\n", total);
}

while循环出现死循环的常见的原因有:

  1. while( ) 后面加了分号。
  2. while语句体内没有让表达式趋近于假的操作。(如在上面的代码中将i++去掉即是这种情况,while语句体内没有让表达式趋近于假的操作,所以陷入死循环。亦或者判断条件错写为i >= 0,则也会陷入死循环)。

for循环

for循环的一般形式为:

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

第三章 选择与循环_第5张图片

for循环练习:

//从1加到100
int main(){
	int i, total;//total存储最终的和

	//for语句中只能有两个分号 
	for (i = 1, total = 0; i <= 100; i++){
		total = total + i;
	}

	printf("total=%d\n", total);
}

continue

continue的作用提前结束本轮循环,直接开始下一轮循环。

在for循环中练习continue:

//从1到100之间奇数求和
int main(){
	int i, total;//total存储最终的和

	//for语句中只能有两个分号 
	for (i = 1, total = 0; i <= 100; i++){

		if (i % 2 == 0)//i是偶数
		{
			continue;//continue的作用提前结束本轮循环,直接开始下一轮循环
		}
		total = total + i;
	}

	printf("total=%d\n", total);
}

在while循环中练习continue:

//从1到100之间奇数求和
int main() {
	int i = 0;
	int total = 0;//存储最终的和
	while (i <= 100)//while后面不能加“分号;”,否则会死循环
	{
		if (i % 2 == 0)
		{
			i++;
			continue;
		}
		total = total + i;
		i++;
	}
	printf("total=%d\n", total);
}

break

break语句的作用是结束整个循环过程,不再判断执行循环的条件是否成立。

break练习:

//从1加100,当和大于2000,就终止循环
int main() {
	int i, total;//total存储最终的和

	//for语句中只能有两个分号 
	for (i = 1, total = 0; i <= 100; i++) {

		if (total > 2000)
		{
			break;//当求和大于2000,就终止循环
		}
		total = total + i;
	}

	printf("total=%d,i=%d\n", total,i);
}

作业练习:

Description:

输入一个整型数,判断是否是对称数,如果是,输出yes,否则输出no,不用考虑这个整型数过大,int类型存不下,不用考虑负值;

例如 12321是对称数,输出yes,124421是对称数,输出yes,1231不是对称数,输出no

[分析]:把最初输入的整型数a,反过来后再存到另外一个整型数b中,判断a和b是否相等,如果相等就输出yes,不相等输出no。

实现整型数反转的方法:

int main() {
    int a;
	scanf("%d", &a);
	printf("a=%d\n", a);

	/*
	如果输入的是1234,那么现在将让输出4321,该如何操作?
	思路如下:1234%10=4,余数是4,商是123;得到的商再重复%4,余数得到3,商是12,重复上述步骤;
	当商为0时,跳出循环.(最后是1%10,余数是1,商是0,此时可以结束循环了)。
	*/

	//对于循环结束条件不知道如何写,可以先写循环体,等循环体写好了,循环结束条件也就大概知道了
	while (a!=0) //当a不等于0时就可以进入循环
	{
		printf("%d", a % 10);
		a = a / 10;
	}
}

完整的代码实现:

int main() {
	int a,b,c,tmp;
	scanf("%d", &a);
	b = 0;//将输入的整型数a进行反转之后存到整型数b中
	c = a;//将输入的整型数a暂存到整型数c中

	/*
	while (a != 0)也可以用while(a)替代,当循环判断条件是"某个变量不是0时"都可以用"直接填该变量"的方法
	进行替代,因为在C语言中任何非0值都是真,只有0为假。
	*/

	while (a != 0) //当a不等于0时就可以进入循环。  
	{
		tmp = a % 10;
		b = b * 10 + tmp;//将a进行反转之后存到b中需要借助中间变量tmp。可以借助例子 输入1234,进行反转将4321赋值给b
		a = a / 10;
	}
	if (c == b)
	{
		printf("yes\n");
	}
	else {
		printf("no\n");
	}
	return 0;
}

你可能感兴趣的:(C语言学习笔记,c语言,数据结构)