王道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趋近于假。

alt

#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

例题 alt

//判断是否为对称数
//将这个数逆置,如果逆置结果与原数相等则为对称数
#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