什么是语句
c语言中由一个分号“;”隔开就是一条语句。例如:
printf("HelloWorld");1+1=2;;(空语句)
分支语句(选择结构)
if语句
语法结构:
if(表达式)语句:
单分支:
if(表达式)
语句;
双分支:
if(表达式)
语句1;else
语句2;
#include <stdio.h>int main(){int age=20;if(age<18){printf("未成年");printf("不能上网"); //存在多条语句时应该用“{}”}elseprintf("成年");return 0;}
多分支:
if(表达式1)
语句1;else if(表达式2)
语句2;else
语句3;
#include <stdio.h>int main(){int age=60;if(age<18)printf("少年\n");else if(age>=18&&age<26)//注意:printf("青年\n"); //18<=age<26写法是错误的else if(age>=26&&age<40)printf("中年\n");else if(age>=40&&age<60)printf("壮年\n");else if(age>=60&&age<100)printf("老年\n");elseprintf("神仙!\n");return 0;}
c语言表示真假:
c语言用0和1来表示语句的真假
非0就是真
0 表示假
悬空else
例:
结果什么都没有打印
:::danger 注意:else与最近的if进行配对! :::

练习:
①判断一个数是否为奇数
#include <stdio.h>int main(){int a;printf("请输入一个数字:\n");scanf("%d",&a);if(0==a%2){printf("这个数是偶数\n");}else{printf("这个数是奇数\n");}return 0;}
②输出1~100之间的奇数
方法一:
#include <stdio.h>int main(){int i;for(i=1;i<=100;i++){if(1==i%2){printf("%d\n",i);}}return 0;}
方法二:
//自己加的方法#include <stdio.h>int main(){int i;for(i=1;i<=100;i+=2){printf("%d\n",i);}return 0;}
switch语句
switch语句也是一种分支语句,常常用与多分支的情况
例如:
输入1,输出星期一 输入2,输出星期二 输入3,输出星期三 输入4,输出星期四 输入5,输出星期五 输入6,输出星期六 输入7,输出星期天
如果用if…else… if…else… 的形式太过于复杂,可以用switch语句
switch(整型表达式){语句项;}
语句项:
case 整型常量表达式:语句;
break用法1:
在switch语句中,我们没有办法直接实现分支,搭配break使用才能实现真正的分支
#include <stdio.h>int main(){int day=0;scanf("%d",&day);switch(day)//day必须为整型,不能定义为浮点型{case 1://case后面必须是常量值,可以是常量表达式,不可以是变量nprintf("星期一\n");break;case 2:printf("星期二\n");break;case 3:printf("星期三\n");break;case 4:printf("星期四\n");break;case 5:printf("星期五\n");break;case 6:printf("星期六\n");break;case 7:printf("星期天\n");break;}return 0;}
break用法2:
#include <stdio.h>int main(){int day=0;scanf("%d",&day);switch(day){case 1:case 2:case 3:case 4:case 5:printf("工作日\n");break;case 6:case 7:printf("休息日\n");break;//工作好习惯,需写(可以不写)}return 0;}
default
当不能与case进行匹配时,用default选项
#include <stdio.h>int main(){int day=0;scanf("%d",&day);switch(day){case 1:case 2:case 3:case 4:case 5:printf("工作日\n");break;case 6:case 7:printf("休息日\n");break;//工作好习惯,需写(可以不写)default:printf("输入错误!");break;}return 0;}
:::danger 注意:当case语句与default之间符合需求时,书写顺序不影响结果(习惯放在最后) :::
例:计算以下代码运行的结果
#include<stdio.h>int main(){int n = 1;int m = 2;switch(n){case 1:m++;case 2:n++;case 3:switch(n){case 1:n++;case 2:m++;n++;break;}case 4:m++;break;default:break;}printf("m=%d,n=%d\n",m,n);return 0;}
m=5,n=3
循环语句
while循环
语法结构
while(表达式)循环语句;

#include <stdio.h>int main(){int i = 1;while(i<11){printf("%d\n",i);i++;}return 0;}
辨析:break与continue在while循环中的区别
#include <stdio.h>int main(){int i = 1;while(i<11){if(i == 5)//在while循环中,break用以永久的终止循环break;printf("%d\n",i);//打印出1234i++;}return 0;}

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

总结:break在while循环中的作用
循环中只要遇到break,就体质后期的所有循环,直接终止循环,所以,while中break是用于永久终止循环的。
getchar()
getchar()字符输入函数,没有参数,从输入缓冲区里面读取一个字符(一次只能读取一个字符 )
EOF(-1)end of file 文件结束标志 ;需要从 键盘上用 ctrl + z 实现
#include <stdio.h>int main(){int ch = 0;while((ch=getchar()) != EOF)//EOF文件结束标志putchar(ch);return 0;}

注意区分 getchar 和 scanf
对于 scanf 函数,’\n’ 会触发 scanf 读取输入缓冲区的内容,但遇到 ‘\n’ 或空格 ‘ ‘ 会停止读取,而 getchar 会直接读取 ‘\n’ 和空格
例:
#include <stdio.h>int main(){char password[20] = { 0 };int ch = 0;printf("请输入密码:");scanf("%s", password);printf("请再次确认密码(Y/N):");ch = getchar();if(ch == 'Y'){printf("确认成功\n");}else{printf("确认失败\n");}return 0;}
①出现错误:
直接跳过,确认失败
原理分析:输入时需要进入缓冲区,有’\n’
解决方法:getchar()清除缓冲区
#include <stdio.h>int main(){char password[20] = { 0 };int ch = 0;printf("请输入密码:");scanf("%s", password);printf("请再次确认密码(Y/N):");//清理缓冲区//getchar();//处理'\n'//清理缓冲区的多个字符int tmp = 0;while((tmp = getchar()) != '\n'){;}ch = getchar();if(ch == 'Y'){printf("确认成功\n");}else{printf("确认失败\n");}return 0;}
#include <stdio.h>int main(){int ch = 0;while((ch =getchar()) != EOF){if(ch < '0' || ch>'9')continue;putchar(ch);}return 0;}
for循环
语法:
for(表达式1;表达式2;表达式3)循环语句;
表达式1位初始化部分,用于初始化循环变量,表达式2位条件判断部分,用于判断循环终止,表达式3位调整部分,用于循环条件调整。
#include <stdio.h>int main(){int i;//for(i=1/*初始化*/;i<100/*判断部分*/;i++/*调整部分*/)for(i=1;i<101;i++){printf("%d\n",i);}return 0;}

for语句的循环控制变量
- 不可在for循环体内循环变量,防止for循环失去控制
- 建议for循环语句的循环控制变量的取值采用“前闭后开区间”写法。
for循环特殊情况
for(;;)
#include <stdio.h>int main(){//判断部分省略-判断部分恒为真for(;;){printf("abc\n");}return 0;}

死循环
#include <stdio.h>int main(){int i=0;int j=0;for(; i<3;i++){for(;j<3;j++){printf("abc\n");}}return 0;}

只打印3次
原因:因为当i=1时,再此进入j的循环(因为此时j已经变成了3),因为省略了j=0,无法初始化j,所有j就按3继续运行,但是不满足j<3。所以只打印了3次。
int main() { int x,y; for(x=0, y=0; x<2 && y<5; ++x,y++) { printf(“abc\n”); }
return 0;
}
例:```python#include <stdio.h>int main(){int i=0,k=0;//判断部分为赋值语句,即k=0,所以为假,不执行for(i=0;k=0;i++,k++)k++;return 0;}
do…while循环
语法格式:
do循环语句while表达式()
do语的特点:
循环至少执行一次
执行流程
do语句执行流程
#include <stdio.h>int main(){int i = 0;do{printf("%d\n",i);i++;}while(i<10);return 0;}

#include <stdio.h>int main(){int i = 0;do{if(i == 5)break;i++;printf("%d\n",i);}while(i<10);return 0;}

循环到5跳出
#include <stdio.h>int main(){int i = 0;do{if(i == 5)continue;i++;printf("%d\n",i);}while(i<10);return 0;}

死循环
习题
题1:计算n的阶乘
#include <stdio.h>int main(){int i=0,n=0,sum=1;printf("请输入一个数:");scanf("%d",&n);for(i=1;i<=n;i++){sum = sum*i;}printf("这个数的阶乘为%d\n",sum);return 0;}
#include <stdio.h>int main(){int i=0,n=0,sum=1;printf("请输入一个数:");scanf("%d",&n);do{i++;sum=sum*i;}while(i<n);printf("这个数的阶乘为%d\n",sum);return 0;}
题2:计算1!+2!+…+10!
计算1到10的阶乘的和
#include <stdio.h>int main(){int i=0,j,ret=1,sum=0;for(j=1;j<=10;j++){for(i=1;i<=j;i++){ret=ret*i;//每次循环后ret值都变大了}sum =sum+ret;//sum加的ret是上一次ret的和ret=1;//每次循环,应该将ret初始化}printf("%d",sum);return 0;}
#include <stdio.h>int main(){int i=0,ret=1,sum=0;for(i=1;i<=10;i++){ret=ret*i;sum=sum+ret;}printf("%d",sum);return 0;}
题3:
在一个有序数组中查找具体的某个数字n。编写int binsearch(int x,int v[],int n);功能:在v[0]<=v[1]<=v[2]<=...<=v[n-1]的数组中查找x
#include <stdio.h>int main(){int arr[] ={1,2,3,4,5,6,7,8,9,10};int k=7;//要查找的数字//在arr这个有序的数组中查找k(7)的值int sz = sizeof(arr)/sizeof(arr[0]);//数组元素的个数int left = 0;int right =sz -1;while(left<=right){int mid =(left+right)/2;if(arr[mid]<k){left =mid +1;}else if(arr[mid]>k){right = mid-1;}else{printf("找到了下标是%d\n",mid);break;}}if(left>right){printf("找不到\n");}return 0;}

题4:编写代码,演示多个字符从两端移动,向中间汇聚。
//what is your name?//##################//w#################//wh################//wha###############//...//what is your name?#include <stdio.h>#include <string.h>#include <Windows.h>int main(){char arr1[] ="what is your name?";char arr2[] ="##################";int left = 0;int right = strlen(arr1)-1;while(left<=right){arr2[left] =arr1[left];arr2[right] =arr1[right];printf("%s\n",arr2);Sleep(1000);//单位是毫秒left++;right--;}return 0;}


题5:编写代码实现,模拟用户登录情景,并且只能登录三次(只允许输入三次密码,如果密码正确则提示成功登录,如果三次均输入错误,则退出程序)
#include <stdio.h>#include <string.h>int main(){int i;//假设正确的密码是"123456"char password[20] ={0};for(i=0;i<3;i++){printf("请输入密码:");scanf("%s",password);//if(password == "123456")//两个字符串的比较使用==,应该使用strcmpif(strcmp(password,"123456") ==0 ){printf("登录成功\n");break;}else{printf("密码错误,请重新输入\n");}}if(i==3)printf("三次密码均错误,退出程序\n");return 0;}

题六写一个猜数字游戏
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(guess
else{printf("恭喜你答对了!\n");break;}}
}
int main() { int input=0; //传入时间(时间戳),可以发生时间改变的量 srand((unsigned int)time(NULL)); do { menu(); printf(“请选择:>”); scanf(“%d”,&input);
switch(input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("选择错误!请重新选择\n");break;}}while(input);return 0;
}
<a name="zS0us"></a># goto语句C语言中提供了可以随意滥用的goto语句和标记跳转的标号。<br />从理论上goto语句是没有必要的,实践中没有goto语句也很容易写出代码。<br />但在写场合下goto语句还是用的着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程,例如一次跳出两层或多层循环。<br />这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层循环<br />```python#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>#include <string.h>int main(){char input[20] = { 0 };//存放输入信息system("shutdown -s -t 60");again:printf("请注意,你的电脑将在1分钟内关机,如果输入:我是猪,就取消关机\n");scanf("%s", input);if(strcmp(input,"我是猪") == 0){system("shutdown -a");}else{goto again;}return 0;}

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>#include <string.h>int main(){char input[20] = { 0 };//存放输入信息system("shutdown -s -t 60");while (1){printf("请注意,你的电脑将在1分钟内关机,如果输入:我是猪,就取消关机\n");scanf("%s", input);if (strcmp(input, "我是猪") == 0){system("shutdown -a");break;}}return 0;}
注:goto语句只能在一个函数范围内跳转,不能跨函数。
