上节课补充:
条件运算符:“?”:
结构:逻辑/关系表达式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;
}

480

被折叠的 条评论
为什么被折叠?



