嵌入式学习第六天:c语言第六章—循环控制 7-19

上节课补充:

条件运算符:“?”:

结构:逻辑/关系表达式1 ? 表达式2 : 表达式3

    如果表达式1为真,整个表达式的结果为表达式2
    如果表达式1为假,整个表达式的结果为表达式3.
一般写法:
  int main(void)
  {
  	int max,a=10,b=20;
  	if(a<b)
  	{
  	max=b;
  	}
  	else
  	{
  	max=a;
  	}
  	printf("%d\n",max);
  	return 0;
  }

运用条件运算符“?”的简化写法:

                            int main(void)
                           {
                           int max,a=10,b=20;
                           max = a>b ? a : b ;
                           printf("%d\n",max);                      
                           	return 0;
                           }
练习:三个数里找最大值:
int main(void)
{
	int a=10,b=20,c=15,max;
	//max = a>b?a:b;
	//max = max > c?max:c;   
	max=(a>b?a:b)>c?(a>b?a:b):c;
	//max=a>b?a:b>c?a>b?a:b:b;  //太复杂,难以看懂。
	printf("%d",max);

	return 0;
}

9、若有条件表达式(exp)?a++:b–,则以下表达式中能完全等价于表达式(exp)的是    。
(A)(exp== 0) (B)(exp!=0) (C)(exp==1)

条件表达式非0即为真,题目意思:exp==0,为假则执行b–,exp!=0为真则执行a++,代入各选项ABC得到正确答案选B
所以还是要深刻理解条件运算符的含义:表达式1为真(非0)即执行表达式2,表达式1为假(为0)则执行表达式3。

10、以下程序的运行结果是    。
main()
{
int k=4,a=3,b=2,c=1;
printf(“\n%d\n”,k<a?k:c<b?c:a);
}
(A)4 (B)3 (C)2 (D)1
答案:D

逻辑运算符优先级别:十三级

循环语句三要素:

										# 循环变量初始化语句
										# 循环的执行条件
										# 使循环趋于结束的语句

goto语句构成循环(大部分禁用):

goto循环结构:

在目标代码的上一行给目标代码定义一个名字(命名规则),加“:”,使用【goto 代码名:】后代码直接跳转到目标代码,跨过中间部分的代码。

int main(void)
{
	goto lable;//直接跳转到lable后一行(lable命名的代码)
	printf("w");
lable:
	printf("h");
	return 0;
}

使用goto求1~100之和:

int main(void)
{
int sum = 0 ,i =1 ;
loop:    //**
if(i <= 100)
{
sum +=i;
++i;
goto loop;   //**
}
printf("%d\n",sum);
return 0 ;
}

while循环:

while循环结构:

在这里插入图片描述

int main(void)
{
int sum = 0 ,i =1 ;
while(i <= 100)
{
sum +=i;
++i;
}
printf("%d\n",sum);
return 0 ;
}

while循环当while后的执行条件为真时,重复执行循环体,当判定while后的执行条件为假时,立刻中断执行循环。所以循环体执行的次数有可能是0。

do +循环体+while;循环:

在这里插入图片描述

do while 型循环先执行一次循环体语句再对while后的执行条件进行判断,当判断为真是返回继续执行循环体,以此往复,当判断执行条件为假时,此时循环结束。

特别注意:while(执行条件判断语句);这里的“;”不能省略。必须要有。

do while循环结构:

int main(void)
{
int sum = 0 ,i =1 ;
do
{
sum +=i;
++i;
}while(i<=100);
printf("%d\n",sum);
return 0 ;
}

do while循环,循环体至少会执行一次。

for循环(最为灵活的循环语):

for循环结构:

在这里插入图片描述

执行顺序:

在这里插入图片描述

循环最基础的遍历:

int main(void)
{
int i;
for(i=1;i<=100;++i)
{
printf("%d\n",i);
}
return 0;
}
循环结束时,循环变量的值一定是使循环执行条件为假时的值。代码中i最终为:101

计算1累加到100之和

int main(void)
{
int i,sum=0;
for(i=1;i<=100;++i) //这里使用++i而不用i++是因为前者的运行效率高于后者。
{
sum+=i;
}
printf("%d\n",sum);
return 0 ;
}

遍历:打印从1到100之间所有能够被3整除的数:

在这里插入图片描述

int main((void)
{
int i;
for(i=1;i<=100;++i)
{
	if(i%3==0)
	{
	print("%d\n",i);
	}
}
return 0;
}

统计:编写程序统计从1到100之间能够被3整除的数的个数:

int main(void)
{
int i;
int counter=0;
for(i=1;i<=100;++i)
{
	if(i%3==0)
	{
	counter+=1;
	}
}
printf("%d\n",counter);  //循环结束以后再打印统计的个数。
return 0;
}

编写程序打印从1900年到2100年所有的闰年和平年:

int main(void)
{
int i;
for(i=1900;i<=2100;++i)
{
	if(i%4==0&&i%100!=0||i%400==0)
	{
	printf("  闰年%d\n",i);
	}
	else
	{
	printf("平年%d\n",i);
	}
}
return 0;
}

输入两个年份,打印这两个年份之间的平年和闰年;

int main(void)
{
int begin,end;
printf("输入两个年份,分别是:开始年份和结束年份:");
scanf("%d",&begin);
scanf("%d",end);
for(begin;begin<=end;++begin)
{
	if(begin%4==0&&begin%100!=0||begin%400==0)
	{
	printf("闰年:%d\n",begin);
	}
	else
	{
	printf("平年:%d \n",end);
	}
}
return 0;
}

输出所有的水仙花数,水仙花数:三位数,水仙花数各位数的平方和等于水仙花数本身。(遍历)

int main(void)
{
int i;
	for(i=100;i<1000;++i)
	{
	int a,b,c;
	a=i%10;
	b=i/10%10;
	c=i/100;
		if(a*a+b*b+c*c==i)
		{
		printf("%d\n",i);  //水仙花数
		}
	}
return 0;
}

实现类似于判断的功能:

判断输入的一个数是否是回文数:

回文数:一个数的各位数逆序排列成新的数,看新数与这个数是否一致,若一致则为回文数。
回文数的算法思想:利用while循环(满足循环条件重复执行循环体,当不满足时立即退出),看新数与这个数是否一致,若一致则为回文数(if语句)。

在这里插入图片描述

int main(void)
{
int i;
int m;
int n=0;
scanf("%d\n",&i);
m=i;
while(m>0)
{
n=n*10+m%10;
m/=10;
}
if(n==i)
{
printf("输入的数:%d为回文数\n",i);
}
else
{
printf("输入的数:%d不是回文数\n",i);
}
return 0;
}
// 注意:需要给n赋初值,若不赋初值,n一开始取随机数,运算出错。

循环允许嵌套,当两个循环嵌套时,内层循环结束比外层循环更快。

编写程序,找出[1,10000]的所有的回文数:

思想:需要遍历[1,10000]的每一个数字,并且对每个数字进行判断是否为回文数(嵌套)
int main(void)
{
int i;
for(i=1;i<=10000;++i)
{
int n=0;
int m;
m=i;
	while(m)
	{
	n=n*10+m%10;
	m/=10;
	}
	if(n==i)
	{
	printf("%d\n",i);
	}
}
return 0;
}
//  充分理解循环内变量的赋值影响,例n放在for循环内外造成的影响。

打印斐波拉数列的前n项 斐波拉数列

int main(void)
{
	int x=1,y=1,i;
	int n=10;
	printf("%d\n",x);
	printf("%d\n",y);
	for(i=2;i<n;++i)
	{
		int t =x+y;
		printf("%d\n",t);
		x = y ;
		y= t ;
	}
	return 0;
}

break语句:

 int main(void)
 {
 int i;
 for(i=0;i<10;++i)
 {
 if(i>4)
 {
 break;
 }
 
 printf("%d\n",i);
 }
 printf("i=%d\n",i);
 return 0;
 
 }
 

运行结果:在这里插入图片描述

当i=5时,i>4,break,++i不再执行,这里break执行后立即打断了终止了该break所在的for循环

编写程序判断输入的一个数是素数还是和数:

判断方法:当满足if条件break跳出循环时 i<input 仍然为真,此时将此性质加入if条件,即可判断该数为素数,否则为和数。

int main(void)
{
	int input,i ;
	scanf("%d",&input);
	for(i=2;i<input;++i)
	{
		if(input%i==0)
		{
			break;
		}
	}
	if(i<input)        //!!!!
	{
		printf("输入的数为和数\n");
	}
	else
	{
		printf("输入的数为素数\n");
	}
	return 0;
}

编写代码将[1,100]内所有的素数打印出来:

int main(void)
{
	int n;
	for(n=1;n<=100;++n)
	{
		int i;
		for(i=2;i<n;++i)
		{
			if(n%i==0)
			{
				break;
			}
		
		}
		if(i==n)  // 当i==n时,循环正常结束,表示该数为素数。
		{
			printf("%d\n",n);
		}

	}
		
		
	return 0;
}

作业解析:

2、设x、y和z是int型变量,且x=3,y=4,z=5,则下面表达式中值为0的是(d )。
A) ‘x’&&‘y’ // ‘x’=51, ‘y’=53,都非0,A结果为1
B) x<=y
C) x||y+z&&y-z
D) !((x<y)&&!z||1)

答案:D
与(&&)运算左边为假(&&)右边截断,或(||)运算左边为真(||)右边截断。

3、设有:int a=1,b=2,c=3,d=4,m=2,n=2;
执行(m=a>b)&&(n=c>d)后n的值为 //关系运算符优先级大于赋值运算符B   。

		A)1		B)2		C)3		D)4          答案:B

与(&&)运算左边为假(&&)右边截断

4、执行以下语句后a的值为【1】,b的值为【2】。
int a,b,c;
a=b=c=1;
++a||++b&&++c;
【1】 A)错误 B)0 C)2 D)1
【2】 A)1 B)2 C)错误 D)0
考察点:||的截断,注意这里++c也不执行。可参考谭书第三版94页

或(||)运算左边为真(||)右边截断。
答案:CA

6、以下程序的运行结果是( )。
main()
{
int m=5;
if(m++>5) printf(“%d\n”,m);
else printf(“%d\n”,m–);
}
A)4 B)5 C)6 D)7
考察点:考察自增自减运算,自增自减总共有四个,这四个无论在哪里出现都会改变相应变量的值。对于前++和后++究竟该如何去记忆,给大家一个小技巧,假设变量为m,看变量在前还是++在前,谁在前先算谁:
m++变量在前,那表达式就是m的值;
++m,++在前,m就先加1再说,表达式的值即为m+1。
还有一点大家可能对把m–放在printf里面又感觉奇怪了,这个和上面的原则是一样的,因为是m–,m在前,先把m当参数传递过去再说,然后再自减1;

1、以下程序的运行结果是    。
#include <stdio.h>
void main(void)
{
int x=1,y,z;
x*=3+2;
printf(“%d\t”,x);
x*=y=z=5;
printf(“%d\t”,x);
x=y==z;
printf(“%d\n”,x);
}
答案:5 25 1

第一个x:“*=”是一个赋值运算符,赋值运算符优先级小于加减乘除运算符,所以x=(3+2)*5
第二个x:赋值运算符优先级都一样,结合顺序从右往左,最终x=5x=25
!!!第三个x:关系运算符的优先级大于赋值运算符,关系运算符结果为真则为1,为假即为0,所以x=1。

2、以下程序的运行结果是    。
main()
{
int x,y,z;
x=1; y=1; z=0;
x=x||y&&z;;
printf(“%d,%d”,x,x&&!y||z);
}
答案:1 ,0

2、输入1个四位数,求各位数字的平方和。
例如:输入 1234,输出30。

int main(void)  //起:求一个数的各位数平方和
{
	int n=1234,s,a,b,c,d;
	a = n%10;
	n/=10;
	b = n%10;
	n /=10;
	c = n%10;
	n/=10;
	d = n %10;
	s=a*a+b*b+c*c+d*d;
	printf("%d\n",s);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值