王道C语言督学营—初级阶段
提要:关系表达式与逻辑表达式、选择if-else语句、循环while、for、dowhile、switch语句、多层嵌套循环、continue与break语句
1.关系表达式与逻辑表达式
5>3&&8<4-!0
按照优先级,相同优先级自左向右结合
即:5>3逻辑值为1,!0逻辑值为1,4-1值为3,8<3逻辑值为0,1&&0逻辑值为0
2.if-else 语句
#include <stdio.h>
//练习if-else
int main() {
int i;
while (scanf("%d",&i))
{
if (i>0){
printf("Hello, World!\n");
}
else{
printf("hello\n");
}
}
return 0;
}
框架(if或else if或else语句只执行一个)
if(表达式1){
语句1;
}
else if(表达式2)
{
语句2;
}else{
语句3;
}
嵌套框架
if(表达式1)
{
if(表达式){
语句;
}
else{
语句;
}
}
else if(表达式2)
{
if(表达式){
语句;
}
else{
语句;
}
}
else{
if(表达式){
语句;
}
else{
语句;
}
}
3.while循环
可以简单理解为循环版的if语句。if语句是判断一次,如果条件成立,则执行后面的语句;while是每次判断,如果条件成立,则执行循环体中的语句,否则停止。
while语句用来实现“当型”循环结构
一般形式为"while(表达式)语句;",当表达式的值非0(即为真)时,执行while语句中的内嵌语句。
while语句的特点是:先判断表达式,后执行语句
#include <stdio.h>
//计算1到100的和
int main() {
int i=1;
int sum=0;
while(i<=100){
sum+=i;
i++;
}
printf("sum=%d\n",sum);
return 0;
}
while(表达式)后没有分号,加分号会导致死循环,后面是{},里面是需要执行的循环语句
4.for循环
基本思想:把控制循环次数的变量从循环体中剥离。
for循环使用最为灵活且广泛,可以用于不确定循环次数而只给出循环结束条件的情况,可以完全代替while循环语句。
for循环的一般形式为:
for (表达式1;表达式2;表达式3)语句;
for循环语句的执行过程:
(01)求解表达式01(只执行1次)。(10)求解表达式10,若值为真,则先执行语句,然后求解表达式11,若为假,结束循环,转到第(101)步。(11)求解表达式11。(100)转回第10步继续执行。(101)循环结束,执行for语句下面的语句。
for循环语句中必须且只能有2个分号,用于分割表达式1,表达式2和表达式3。
表达式1可以用逗号初始化多个变量,表达式2是判断条件,表达式3的作用是使表达式2趋近于假。
#include <stdio.h>
//for循环 从1加到100的和
int main() {
int i,sum=0;
for(i=1;i<=100;i++)//for的括号后不加分号
{
sum+=i;
}
printf("sum=%d\n",sum);
return 0;
}
for循环的可读性好于while语句,能使用for循环不要强制改为while循环。
5.do while循环
do while循环不常用。 do while语句与while语句非常相似。唯一的区别是,do while语句限制性循环体后检查条件。不管条件的值如何,我们都要至少执行一次循环。
6.switch语句
7.continue语句
continue语句的作用是结束本次循环,即跳过循环体中下面没有执行的语句,接着进行是否执行下一次循环的判断。可以直接跳到当前循环体的结尾。作用与if语句类似
#include <stdio.h>
//for循环 从1加到100的所有偶数和
//使用continue跳过循环
int main() {
int i,sum=0;
for(i=1;i<=100;i++)//for的括号后不加分号
{
if(i%2==0)
{
continue;//if成立,不执行continue以后的语句(循环里)
}
sum+=i;
}
printf("sum=%d\n",sum);
return 0;
}
当continue用于while和do while循环中时,注意不要跳过让循环趋近于假的语句
#include <stdio.h>
//计算1到100的和
int main() {
int i=1;
int sum=0;
while(i<=100){
if(i%2==0)
{
i++;
continue;//如果不在continue上面加i++,下面的i++会被跳过,变成死循环
}
sum+=i;
i++;
}
printf("sum=%d\n",sum);
return 0;
}
8.break语句
可以提前从循环中退出,一般与if语句搭配。
结束整个循环过程,不再判断执行循环的条件是否成立
#include <stdio.h>
//for循环 从1加到100的和,和到2000时停止
int main() {
int i,sum=0;
for(i=1;i<=100;i++)
{
if(sum>2000)
{
break;
}
sum+=i;
}
printf("sum=%d,i=%d\n",sum,i);
return 0;
}
输出结果
sum=2016,i=64
//64没有被加上去,在i等于64的时候if(sum>2000)成立,跳出循环,没有执行sum+=64的语句
9.循环嵌套(多层循环)
最常见的时两层for循环嵌套
#include <stdio.h>
int main() {
int i,j;
for(i=0;i<5;i++)
{
printf("%d\n",i);
for(j=0;j<5;j++)
{
printf("%d ",j);
}
printf("\n");
}
return 0;
}
//先执行外层for,输出0,再执行内层for循环,j从0到4;再返回外层循环,输出i为2......
输出结果:
0
0 1 2 3 4
1
0 1 2 3 4
2
0 1 2 3 4
3
0 1 2 3 4
4
0 1 2 3 4
进程已结束,退出代码为 0
输出一个三角形
#include <stdio.h>
int main() {
int i,j;
for(i=1;i<6;i++)
{
for(j=0;j<i;j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
*
**
***
****
*****
进程已结束,退出代码为 0
例题
//判断是否为对称数
//将这个数逆置,如果逆置结果与原数相等则为对称数
#include <stdio.h>
int main() {
int a,b,backup_a;
scanf("%d",&a);
backup_a=a;//备份a的值
b=0;
while(a)
{
b=b*10+a%10;
printf("%d\n",b);//了解具体的逆置过程
a=a/10;
//b从0开始,第一次循环b=0*10+a%10,即a对10取余后加0,比如12321,此时a%10为1,b=0+1=1,然后a/10,得到1232,
再次循环,b=1*10+a%10,a%10=2,b=10+2=12,a/10得到123,
重复此过程,b=12*10+a%10,a%10=3,b=12*10+3=120+3=123,a/10得到12,
a%10=2,b=123*10+2=1232,a/10得到1,
a%10=1,b=1232*10+a%10=12320+1=12321,a/10得到0,
循环结束
}
if(b==backup_a)
{
printf("yes\n");
}
else
{
printf("no\n");
}
return 0;
}
运行结果
12321
1
12
123
1232
12321
yes
进程已结束,退出代码为 0