1.分支语句
(1)if语句
三种方式:
1if
if(表达式)
语句;
2if /else
if(表达式)
语句1;
else
语句2;
3if /else if /else
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
#include <stdio.h>
int main()
{
int age=100;
if(age<18)
printf("未成年\n");
else if(age>=18&&age<28)
printf("青年\n");
else if(age>=28&&age<50)
printf("壮年\n");
else if(age>=50&&age<90)
printf("老年\n");
else
printf("老不死\n")
return 0;
}
表达式为真 执行后面的语句
当有多条语句时 要加大括号
真为非0 假为0
=赋值
==判断相等
看看这个代码if和哪个else匹配
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
{
if(b == 2)
{
printf("hehe\n");
}
}
else
{
printf("haha\n");
}
return 0;
}
打印haha
else的匹配:else是和它离的最近的未与else匹配的if匹配。
练习
1.判断一个数是否为奇数
2.输出1-100之间的奇数
#include <stdio.h>
int main()
{
int n=0;
scanf("%d",&n);
if(n%2==1)//模2余1为奇数
{
printf("odd\n");
}
return 0;
}
#include <stdio.h>
int main()
{
int i=1;
while(i<=100)//循环
{
printf("%d ",i);//百分号d后面要有空格 不然打印出来的数会连起来
i+=2;
}
}
(2)switch语句
switch(整型表达式)
{
语句项;
}
语句项
case 整形常量表达式:
语句;
break语句
#include <stdio.h>
int main()
{
int day = 0;
switch(day)
{
case 1:
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 直接跳出switch语句
若无break
当输入数字时 不会只执行所对应case语句后的打印
而是会从上到下依次执行
像这样
#include <stdio.h>
int main()
{
int day = 0;
switch(day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday\n");
break;
case 6:
case 7:
printf("weekend\n");
break;
}
return 0;
}
输入1-5 都会打印weekday
输入6-7 都会打印weekend
default语句
如果上述例子中输入的数字不是1-7
可以提醒输入错误
在case7后可以j加
default:
printf("输入错误");
break;
类似于else
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;
}
因为n=1 所以从case1开始走 直到走到break跳出switch语句
m=5 n=3
2.循环语句
(1)while循环
while(表达式)
循环语句;
打印1-10的数字
#include
int main()
{
int i = 1;
while(i<=10)
{
printf("%d ", i);
i = i+1;
}
return 0;
}
break
在上述代码中
while循环中加入
if(i==4)
{
break;
}
该代码块在打印前
打印结果为?
当i=4时 会跳出循环
因此最后打印结果为1 2 3
其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。
continue
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
continue;
printf("%d ", i);
i = i+1;
}
return 0;
}
最后打印1 2 3 4
i==5时 重新开始循环 i==5无法改变 进入死循环
程序没有结束
改
把i=i+1;放到if语句前
最后打印1 2 3 4 6 7 8 9 10
当i==5时 重新开始循环
也就是不会打印5
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,
而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。
(2)for循环
for(表达式1; 表达式2; 表达式3)
循环语句;
表达式1
表达式1为初始化部分,用于初始化循环变量的。
表达式2
表达式2为条件判断部分,用于判断循环时候终止。
表达式3
表达式3为调整部分,用于循环条件的调整。
用for循环打印1-10
#include <stdio.h>
int main()
{
int i = 0;
//for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
for(i=1; i<=10; i++)
{
printf("%d ", i);
}
return 0;
}
break
#include <stdio.h>
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
if(i == 5)
break;
printf("%d ",i);
}
return 0;
}
当i==5时跳出循环
打印1 2 3 4
continue
#include <stdio.h>
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
if(i == 5)
continue;
printf("%d ",i);
}
return 0;
}
当i==5时 会重新开始循环
但不同于while循环
continue后i会加1
不会进入死循环
最后打印1 2 3 4 6 7 8 9 10
另类for循环
for循环三个条件都可以省略
但容易出现问题 尽量不要省略
#include <stdio.h>
int main()
{
int i=0;
for(i=0;i<10;i++)
{
int j=0;
for(j=0:j<10:j++)
{
printf("hehe\n");
}
}
return 0;
}
循环嵌套
最后打印i*j个hehe
也就是100个hehe
#include <stdio.h>
int main()
{
int i=0;
int j=0;
for(;i<10;i++)
{
for(:j<10:j++)
{
printf("hehe\n");
}
}
return 0;
}
只打印10个hehe
当i=0时
会打印10个hehe
j变成10
没有初始化
所以当i=2-9时
j一直为10
不打印
所以最后只打印10个hehe
#include <stdio.h>
int main()
{
int x,y;
for(x=0,y=0;x<2&&y<5;++x,y++)
{
printf("hehe\n");
}
return 0;
}
可以x y两个变量初始化 判断 还有调整
最后打印2个hehe
循环多少次?
#include <stdio.h>
int main()
{
int i = 0;
int k = 0;
for(i =0,k=0; k=0; i++,k++)
k++;
return 0;
}
0次
注意判断条件说k=0
也就是0赋值给k
整个表达式为假
所以不进入循环
(3)do while循环
循环至少执行一次
#include <stdio.h>
int main()
{
int i = 10;
do
{
printf("%d\n", i);
}while(i<10);
return 0;
}
打印一次10
先进入循环
走完循环后判断
不成立
跳出
break和continue与while语句用法一致
(4)练习
1. 计算 n的阶乘。
2. 计算 1!+2!+3!+……+10!
3. 在一个有序数组中查找具体的某个数字n。(二分查找)
4. 编写代码,演示多个字符从两端移动,向中间汇聚。
5. 编写代码实现,模拟用户登录情景,并且只能登录三次。
只允许输入三次密码,如果密码正确则 提示登录成,如果三次均输入错误,则退出程序。
n的阶乘
#include<stdio.h>
int main()
{
int i=0;
int n=0;
int ret=1;
scanf("%d",&n);//n无法定义的时候可scanf打印
for(i=1;i<=n;i++)
{
ret=ret*i;//每回赋值打印可实现连乘
}
printf("ret=%d\n",ret);
return 0;
}
n的阶乘的和
#include<stdio.h>
int main()
{
int i=0;
int n=0;
int ret=1;
int sum=0;
for(n=1;n<=10;n++)
{
ret=ret*n;//直接*n n会自加 相当于阶乘
sum=sum+ret;
}
printf("sum=%d\n",sum);
return 0;
}
二分查找
#include<stdio.h>
int main()
{
int arr[]={1,2,3,4,5,6,7,8,9,10};
int k=7;
int sz=sizeof(arr)/sizeof(arr[0]);//计算元素个数
int left=0;//左下标
int right=sz-1;//右下标
while(left<=right)//查找次数大约为log以2为底的n次
{
int mid=(left+right)/2;//mid必须在循环里面 不然进入循环后系统默认无mid值
if(arr[mid]>k)//找到的中间值与最终所找值进行比较 调整左右下标 再查找
{
right=mid-1;
}
else if(arr[mid]<k)
{
left=mid+1;
}
else
{
printf("找到了,下标是:%d\n",mid);
break;
}
}
if(left>right)
{
printf("找不到\n");
}
return 0;
}
画图理解
所查找元素在中间元素左边 右下标变为中间元素下标-1
所查找元素在中间元素右边 左下标变为中间元素下标+1
二分查找函数
int bin_search(int arr[], int left, int right, int key)
{
int mid = 0;
while(left<=right)
{
mid = (left+right)/2;
if(arr[mid]>key)
{
right = mid-1;
}
else if(arr[mid] < key)
{
left = mid+1;
}
else
return mid;//找到了,返回下标
}
return -1;//找不到
}
演示多个字符从两端移动,向中间汇聚
#include <stdio.h>
int main()
{
char arr1[] = "welcome to bit...";
char arr2[] = "#################";
int left = 0;
int right = strlen(arr1)-1;
printf("%s\n", arr2);
//while循环实现
while(left<=right)
{
Sleep(1000);
arr2[left] = arr1[left];
arr2[right] = arr1[right];
left++;
right--;
printf("%s\n", arr2);
}
//for循环实现
for (left=0, right=strlen(src)-1; left <= right; left++, right--)
{
Sleep(1000);
arr2[left] = arr1[left];
arr2[right] = arr1[right];
printf( "%s\n", target);
}
return 0;
}
利用数组元素下标的对应进行赋值
将其覆盖
strlen为求长度的函数 即为数组元素个数
int main()
{
char psw[10] = "" ;
int i = 0;
int j = 0;
for (i = 0; i < 3 ; ++i)
{
printf( "please input:");
scanf("%s", psw);
if (strcmp(psw, "password" ) == 0)
break;
}
if (i == 3)
printf("exit\n");
else
printf( "log in\n");
}
strcmp判断字符串相等 字符串相等则为0
(5)goto语句
一次跳出两层或多层循环
关机程序
#include <stdio.h>
int main()
{
char input[10] = {0};
system("shutdown -s -t 60");
again:
printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
scanf("%s", input);
if(0 == strcmp(input, "我是猪"))
{
system("shutdown -a");
}
else
{
goto again;
}
return 0;
}
没有输入对的话
接着跳到again:
走后面的程序
(6)猜数字游戏
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//猜数字游戏
//1电脑会生成一个随机数
//2猜数字
void menu()
{
printf("******************************\n");
printf("*** 1.play 0.exit ***\n");
printf("******************************\n");
}
void game()
{
//1生成一个随机数
//2猜数字
int ret=0;//拿时间戳来设置随机数的生成起点 time函数 放主函数里面 设置一次起点即可
int guess=0;//时间戳 当前计算机的时间减去计算机的起始时间1970 1.1 00.00.00=(xxxx)秒
ret=rand()%100+1;//生成随机数 0=32767之间 最好生成1-100随机数
while(1)
{
printf("请猜数字(0-100):>");
scanf("%d",&guess);
if(guess>ret)
{
printf("猜大啦嘿嘿嘿\n");
}
else if(guess<ret)
{
printf("猜小啦嘿嘿嘿\n");
}
else
{
printf("你真好看,恭喜你,猜对啦\n");
break;
}
}
}
int main()
{
int input=0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择(1开始 0结束)>:");
scanf("%d",&input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}
}while(input);
return 0;
}
#2分支和循环语句#完