什么是语句

c语言中由一个分号“;”隔开就是一条语句。例如:

  1. printf("HelloWorld");
  2. 1+1=2;
  3. ;(空语句)

分支语句(选择结构)

if语句

语法结构:

if(表达式)
语句:

单分支:

if(表达式)
语句;

双分支:

if(表达式)
语句1;
else
语句2;

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int age=20;
  5. if(age<18)
  6. {
  7. printf("未成年");
  8. printf("不能上网"); //存在多条语句时应该用“{}”
  9. }
  10. else
  11. printf("成年");
  12. return 0;
  13. }

多分支:

if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int age=60;
  5. if(age<18)
  6. printf("少年\n");
  7. else if(age>=18&&age<26)//注意:
  8. printf("青年\n"); //18<=age<26写法是错误的
  9. else if(age>=26&&age<40)
  10. printf("中年\n");
  11. else if(age>=40&&age<60)
  12. printf("壮年\n");
  13. else if(age>=60&&age<100)
  14. printf("老年\n");
  15. else
  16. printf("神仙!\n");
  17. return 0;
  18. }

c语言表示真假:

c语言用0和1来表示语句的真假

非0就是

0 表示

悬空else

例:
image.png

结果什么都没有打印

:::danger 注意:else与最近的if进行配对! :::

image.png

练习:

①判断一个数是否为奇数

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int a;
  5. printf("请输入一个数字:\n");
  6. scanf("%d",&a);
  7. if(0==a%2)
  8. {
  9. printf("这个数是偶数\n");
  10. }
  11. else
  12. {
  13. printf("这个数是奇数\n");
  14. }
  15. return 0;
  16. }

②输出1~100之间的奇数

方法一:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i;
  5. for(i=1;i<=100;i++)
  6. {
  7. if(1==i%2)
  8. {
  9. printf("%d\n",i);
  10. }
  11. }
  12. return 0;
  13. }

方法二:

  1. //自己加的方法
  2. #include <stdio.h>
  3. int main()
  4. {
  5. int i;
  6. for(i=1;i<=100;i+=2)
  7. {
  8. printf("%d\n",i);
  9. }
  10. return 0;
  11. }

switch语句

switch语句也是一种分支语句,常常用与多分支的情况

例如:

输入1,输出星期一 输入2,输出星期二 输入3,输出星期三 输入4,输出星期四 输入5,输出星期五 输入6,输出星期六 输入7,输出星期天

如果用if…else… if…else… 的形式太过于复杂,可以用switch语句

switch(整型表达式)
{
语句项;
}

语句项:

case 整型常量表达式:
语句;

break用法1:

在switch语句中,我们没有办法直接实现分支,搭配break使用才能实现真正的分支

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int day=0;
  5. scanf("%d",&day);
  6. switch(day)//day必须为整型,不能定义为浮点型
  7. {
  8. case 1://case后面必须是常量值,可以是常量表达式,不可以是变量n
  9. printf("星期一\n");
  10. break;
  11. case 2:
  12. printf("星期二\n");
  13. break;
  14. case 3:
  15. printf("星期三\n");
  16. break;
  17. case 4:
  18. printf("星期四\n");
  19. break;
  20. case 5:
  21. printf("星期五\n");
  22. break;
  23. case 6:
  24. printf("星期六\n");
  25. break;
  26. case 7:
  27. printf("星期天\n");
  28. break;
  29. }
  30. return 0;
  31. }


break用法2:


  1. #include <stdio.h>
  2. int main()
  3. {
  4. int day=0;
  5. scanf("%d",&day);
  6. switch(day)
  7. {
  8. case 1:
  9. case 2:
  10. case 3:
  11. case 4:
  12. case 5:
  13. printf("工作日\n");
  14. break;
  15. case 6:
  16. case 7:
  17. printf("休息日\n");
  18. break;//工作好习惯,需写(可以不写)
  19. }
  20. return 0;
  21. }

default

当不能与case进行匹配时,用default选项

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int day=0;
  5. scanf("%d",&day);
  6. switch(day)
  7. {
  8. case 1:
  9. case 2:
  10. case 3:
  11. case 4:
  12. case 5:
  13. printf("工作日\n");
  14. break;
  15. case 6:
  16. case 7:
  17. printf("休息日\n");
  18. break;//工作好习惯,需写(可以不写)
  19. default:
  20. printf("输入错误!");
  21. break;
  22. }
  23. return 0;
  24. }

:::danger 注意:当case语句与default之间符合需求时,书写顺序不影响结果(习惯放在最后) :::

例:计算以下代码运行的结果

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int n = 1;
  5. int m = 2;
  6. switch(n)
  7. {
  8. case 1:m++;
  9. case 2:n++;
  10. case 3:
  11. switch(n)
  12. {
  13. case 1:n++;
  14. case 2:m++;n++;
  15. break;
  16. }
  17. case 4:
  18. m++;
  19. break;
  20. default:
  21. break;
  22. }
  23. printf("m=%d,n=%d\n",m,n);
  24. return 0;
  25. }

m=5,n=3

循环语句

while循环

语法结构

while(表达式)
循环语句;

选择语句和循环语句 - 图3

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i = 1;
  5. while(i<11)
  6. {
  7. printf("%d\n",i);
  8. i++;
  9. }
  10. return 0;
  11. }

辨析:break与continue在while循环中的区别

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i = 1;
  5. while(i<11)
  6. {
  7. if(i == 5)
  8. //在while循环中,break用以永久的终止循环
  9. break;
  10. printf("%d\n",i);
  11. //打印出1234
  12. i++;
  13. }
  14. return 0;
  15. }

image.png

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i = 1;
  5. while(i<11)
  6. {
  7. if(i == 5)
  8. continue;
  9. //跳过本次循环(continue后面的代码),直接去判断部分,看是否要继续下一次判断
  10. printf("%d\n",i);
  11. i++;
  12. }
  13. return 0;
  14. }

image.png

总结:break在while循环中的作用

循环中只要遇到break,就体质后期的所有循环,直接终止循环,所以,while中break是用于永久终止循环的。

getchar()

getchar()字符输入函数,没有参数,从输入缓冲区里面读取一个字符(一次只能读取一个字符 )
EOF(-1)end of file 文件结束标志 ;需要从 键盘上用 ctrl + z 实现

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int ch = 0;
  5. while((ch=getchar()) != EOF)
  6. //EOF文件结束标志
  7. putchar(ch);
  8. return 0;
  9. }

image.png

注意区分 getchar 和 scanf
对于 scanf 函数,’\n’ 会触发 scanf 读取输入缓冲区的内容,但遇到 ‘\n’ 或空格 ‘ ‘ 会停止读取,而 getchar 会直接读取 ‘\n’ 和空格

例:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. char password[20] = { 0 };
  5. int ch = 0;
  6. printf("请输入密码:");
  7. scanf("%s", password);
  8. printf("请再次确认密码(Y/N):");
  9. ch = getchar();
  10. if(ch == 'Y')
  11. {
  12. printf("确认成功\n");
  13. }
  14. else
  15. {
  16. printf("确认失败\n");
  17. }
  18. return 0;
  19. }

①出现错误:
image.png
直接跳过,确认失败

原理分析:输入时需要进入缓冲区,有’\n’
选择语句和循环语句 - 图8

解决方法:getchar()清除缓冲区

  1. #include <stdio.h>
  2. int main()
  3. {
  4. char password[20] = { 0 };
  5. int ch = 0;
  6. printf("请输入密码:");
  7. scanf("%s", password);
  8. printf("请再次确认密码(Y/N):");
  9. //清理缓冲区
  10. //getchar();//处理'\n'
  11. //清理缓冲区的多个字符
  12. int tmp = 0;
  13. while((tmp = getchar()) != '\n')
  14. {
  15. ;
  16. }
  17. ch = getchar();
  18. if(ch == 'Y')
  19. {
  20. printf("确认成功\n");
  21. }
  22. else
  23. {
  24. printf("确认失败\n");
  25. }
  26. return 0;
  27. }
  1. #include <stdio.h>
  2. int main()
  3. {
  4. int ch = 0;
  5. while((ch =getchar()) != EOF)
  6. {
  7. if(ch < '0' || ch>'9')
  8. continue;
  9. putchar(ch);
  10. }
  11. return 0;
  12. }

for循环

语法:

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

表达式1位初始化部分,用于初始化循环变量,表达式2位条件判断部分,用于判断循环终止,表达式3位调整部分,用于循环条件调整。

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i;
  5. //for(i=1/*初始化*/;i<100/*判断部分*/;i++/*调整部分*/)
  6. for(i=1;i<101;i++)
  7. {
  8. printf("%d\n",i);
  9. }
  10. return 0;
  11. }

选择语句和循环语句 - 图9

for语句的循环控制变量

  1. 不可在for循环体内循环变量,防止for循环失去控制
  2. 建议for循环语句的循环控制变量的取值采用“前闭后开区间”写法。

for循环特殊情况

  • for(;;)
  1. #include <stdio.h>
  2. int main()
  3. {
  4. //判断部分省略-判断部分恒为真
  5. for(;;)
  6. {
  7. printf("abc\n");
  8. }
  9. return 0;
  10. }

image.png
死循环

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i=0;
  5. int j=0;
  6. for(; i<3;i++)
  7. {
  8. for(;j<3;j++)
  9. {
  10. printf("abc\n");
  11. }
  12. }
  13. return 0;
  14. }

image.png
只打印3次

原因:因为当i=1时,再此进入j的循环(因为此时j已经变成了3),因为省略了j=0,无法初始化j,所有j就按3继续运行,但是不满足j<3。所以只打印了3次。

  • for(x=0, y=0; x<2 && y<5; ++x,y++) ```python

    include

int main() { int x,y; for(x=0, y=0; x<2 && y<5; ++x,y++) { printf(“abc\n”); }

  1. return 0;

}

  1. ![image.png](https://cdn.nlark.com/yuque/0/2022/png/1315343/1649835666335-84d14cdf-9e1f-471c-9412-3a417dead1fd.png#clientId=u80b6888d-8eb7-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=159&id=u9766666f&margin=%5Bobject%20Object%5D&name=image.png&originHeight=280&originWidth=811&originalType=binary&ratio=1&rotation=0&showTitle=false&size=16198&status=done&style=shadow&taskId=uaae3bbc0-b464-4092-b9fb-e4064f7b92b&title=&width=461.79998779296875)
  2. 例:
  3. ```python
  4. #include <stdio.h>
  5. int main()
  6. {
  7. int i=0,k=0;
  8. //判断部分为赋值语句,即k=0,所以为假,不执行
  9. for(i=0;k=0;i++,k++)
  10. k++;
  11. return 0;
  12. }

do…while循环

语法格式:

do
循环语句
while表达式()

do语的特点:
循环至少执行一次

执行流程
选择语句和循环语句 - 图12
do语句执行流程

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i = 0;
  5. do
  6. {
  7. printf("%d\n",i);
  8. i++;
  9. }while(i<10);
  10. return 0;
  11. }

image.png

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i = 0;
  5. do
  6. {
  7. if(i == 5)
  8. break;
  9. i++;
  10. printf("%d\n",i);
  11. }while(i<10);
  12. return 0;
  13. }

image.png
循环到5跳出

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i = 0;
  5. do
  6. {
  7. if(i == 5)
  8. continue;
  9. i++;
  10. printf("%d\n",i);
  11. }while(i<10);
  12. return 0;
  13. }

image.png
死循环

习题

题1:计算n的阶乘

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i=0,n=0,sum=1;
  5. printf("请输入一个数:");
  6. scanf("%d",&n);
  7. for(i=1;i<=n;i++)
  8. {
  9. sum = sum*i;
  10. }
  11. printf("这个数的阶乘为%d\n",sum);
  12. return 0;
  13. }
  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i=0,n=0,sum=1;
  5. printf("请输入一个数:");
  6. scanf("%d",&n);
  7. do
  8. {
  9. i++;
  10. sum=sum*i;
  11. }while(i<n);
  12. printf("这个数的阶乘为%d\n",sum);
  13. return 0;
  14. }

题2:计算1!+2!+…+10!

计算1到10的阶乘的和

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i=0,j,ret=1,sum=0;
  5. for(j=1;j<=10;j++)
  6. {
  7. for(i=1;i<=j;i++)
  8. {
  9. ret=ret*i;//每次循环后ret值都变大了
  10. }
  11. sum =sum+ret;//sum加的ret是上一次ret的和
  12. ret=1;//每次循环,应该将ret初始化
  13. }
  14. printf("%d",sum);
  15. return 0;
  16. }
  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i=0,ret=1,sum=0;
  5. for(i=1;i<=10;i++)
  6. {
  7. ret=ret*i;
  8. sum=sum+ret;
  9. }
  10. printf("%d",sum);
  11. return 0;
  12. }

题3:

在一个有序数组中查找具体的某个数字n。编写int binsearch(int x,int v[],int n);功能:在v[0]<=v[1]<=v[2]<=...<=v[n-1]的数组中查找x

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int arr[] ={1,2,3,4,5,6,7,8,9,10};
  5. int k=7;//要查找的数字
  6. //在arr这个有序的数组中查找k7)的值
  7. int sz = sizeof(arr)/sizeof(arr[0]);//数组元素的个数
  8. int left = 0;
  9. int right =sz -1;
  10. while(left<=right)
  11. {
  12. int mid =(left+right)/2;
  13. if(arr[mid]<k)
  14. {
  15. left =mid +1;
  16. }
  17. else if(arr[mid]>k)
  18. {
  19. right = mid-1;
  20. }
  21. else
  22. {
  23. printf("找到了下标是%d\n",mid);
  24. break;
  25. }
  26. }
  27. if(left>right)
  28. {
  29. printf("找不到\n");
  30. }
  31. return 0;
  32. }

image.png

题4:编写代码,演示多个字符从两端移动,向中间汇聚。

  1. //what is your name?
  2. //##################
  3. //w#################
  4. //wh################
  5. //wha###############
  6. //...
  7. //what is your name?
  8. #include <stdio.h>
  9. #include <string.h>
  10. #include <Windows.h>
  11. int main()
  12. {
  13. char arr1[] ="what is your name?";
  14. char arr2[] ="##################";
  15. int left = 0;
  16. int right = strlen(arr1)-1;
  17. while(left<=right)
  18. {
  19. arr2[left] =arr1[left];
  20. arr2[right] =arr1[right];
  21. printf("%s\n",arr2);
  22. Sleep(1000);//单位是毫秒
  23. left++;
  24. right--;
  25. }
  26. return 0;
  27. }

image.png
image.png

题5:编写代码实现,模拟用户登录情景,并且只能登录三次(只允许输入三次密码,如果密码正确则提示成功登录,如果三次均输入错误,则退出程序)

  1. #include <stdio.h>
  2. #include <string.h>
  3. int main()
  4. {
  5. int i;
  6. //假设正确的密码是"123456"
  7. char password[20] ={0};
  8. for(i=0;i<3;i++)
  9. {
  10. printf("请输入密码:");
  11. scanf("%s",password);
  12. //if(password == "123456")//两个字符串的比较使用==,应该使用strcmp
  13. if(strcmp(password,"123456") ==0 )
  14. {
  15. printf("登录成功\n");
  16. break;
  17. }
  18. else
  19. {
  20. printf("密码错误,请重新输入\n");
  21. }
  22. }
  23. if(i==3)
  24. printf("三次密码均错误,退出程序\n");
  25. return 0;
  26. }

image.png

题六写一个猜数字游戏

  1. 自动产生一个1~100之间的随机数
  2. 猜数字
    1. 猜对了,游戏结束
    2. 猜错,猜大/小了,继续
  3. 一直猜,直到退出游戏 ```python

    include

    include

    include

void menu() { printf(“*\n”); printf(“1.pay**\n”); printf(“0.exit*\n”); printf(“*\n”); }

void game() { //猜数字的实现 //1.生成随机数 //rand函数返回了一个0~32767之间的数字 int ret = rand()%100;//%100的余数是0~99,然后+1,范围就是1~100 //printf(“%d\n”,ret); //2.猜数字 while(1) { int guess; printf(“请猜数字:>”); scanf(“%d”,&guess); if(guessret) { printf(“猜大了\n”); }

  1. else
  2. {
  3. printf("恭喜你答对了!\n");
  4. break;
  5. }
  6. }

}

int main() { int input=0; //传入时间(时间戳),可以发生时间改变的量 srand((unsigned int)time(NULL)); do { menu(); printf(“请选择:>”); scanf(“%d”,&input);

  1. switch(input)
  2. {
  3. case 1:
  4. game();
  5. break;
  6. case 0:
  7. printf("退出游戏\n");
  8. break;
  9. default:
  10. printf("选择错误!请重新选择\n");
  11. break;
  12. }
  13. }while(input);
  14. return 0;

}

  1. ![image.png](https://cdn.nlark.com/yuque/0/2022/png/1315343/1650766353457-23e94b43-61e8-4bd8-a312-6bdfa1fe0921.png#clientId=u2b98bdb6-ac2f-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=401&id=uccbcfa19&margin=%5Bobject%20Object%5D&name=image.png&originHeight=501&originWidth=382&originalType=binary&ratio=1&rotation=0&showTitle=false&size=26464&status=done&style=shadow&taskId=u7d4be89f-8d80-4e45-bdda-7982448ba70&title=&width=305.6)
  2. <a name="zS0us"></a>
  3. # goto语句
  4. C语言中提供了可以随意滥用的goto语句和标记跳转的标号。<br />从理论上goto语句是没有必要的,实践中没有goto语句也很容易写出代码。<br />但在写场合下goto语句还是用的着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程,例如一次跳出两层或多层循环。<br />这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层循环<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/1315343/1650866693281-e643eb70-880a-4c01-ba8a-6646e049333b.png#clientId=u7bb8a200-edea-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=138&id=u8ceb8368&margin=%5Bobject%20Object%5D&name=image.png&originHeight=172&originWidth=667&originalType=binary&ratio=1&rotation=0&showTitle=false&size=23025&status=done&style=shadow&taskId=u192caa2b-fca5-47d5-bbad-2299a609fb3&title=&width=533.6)
  5. ```python
  6. #define _CRT_SECURE_NO_WARNINGS
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. int main()
  11. {
  12. char input[20] = { 0 };//存放输入信息
  13. system("shutdown -s -t 60");
  14. again:
  15. printf("请注意,你的电脑将在1分钟内关机,如果输入:我是猪,就取消关机\n");
  16. scanf("%s", input);
  17. if(strcmp(input,"我是猪") == 0)
  18. {
  19. system("shutdown -a");
  20. }
  21. else
  22. {
  23. goto again;
  24. }
  25. return 0;
  26. }

image.png

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. int main()
  6. {
  7. char input[20] = { 0 };//存放输入信息
  8. system("shutdown -s -t 60");
  9. while (1)
  10. {
  11. printf("请注意,你的电脑将在1分钟内关机,如果输入:我是猪,就取消关机\n");
  12. scanf("%s", input);
  13. if (strcmp(input, "我是猪") == 0)
  14. {
  15. system("shutdown -a");
  16. break;
  17. }
  18. }
  19. return 0;
  20. }

注:goto语句只能在一个函数范围内跳转,不能跨函数。