什么是语句
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("不能上网"); //存在多条语句时应该用“{}”
}
else
printf("成年");
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");
else
printf("神仙!\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后面必须是常量值,可以是常量表达式,不可以是变量n
printf("星期一\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);
//打印出1234
i++;
}
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;
}
![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)
例:
```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")//两个字符串的比较使用==,应该使用strcmp
if(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;
}
![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)
<a name="zS0us"></a>
# goto语句
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)
```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语句只能在一个函数范围内跳转,不能跨函数。