分支和循环语句
- 分支语句:if、switch
- 循环语句:do while、while、for
- 转向语句:break、continue、goto、return
一、分支语句(选择结构)
1.1 if语句
- 当结果为真(0为假,非0为真)的时候执行语句块【多个语句时用括号{}括住】
- else 和离其最近的if去匹配
int main()
{
int i = 0;
scanf("%d",&i);
if (i)
{
printf("haha\n");
}
else
{
printf("aaaaaa\n");
}
return 0;
}
int i = 5;
if(5 == i) //当两个整型变量比较时,常量放在左边
{
printf("hahha\n");
}
1.2 switch 语句 ——常常用于多分支的情况
- 结构:
switch(整型表达式)
{
case 整形常量表达式:
语句;
}
- break 实现分支—— 将语句列表列表划分成不同的分支部分
int main()
{
int day = 0;
printf("请输入一个数:>");
scanf("%d",&day);
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;
}
- default——所有的语句都被跳过
上个程序如果输入的数不是1-7则会被自动忽略
int main()
{
int day = 0;
printf("请输入一个数:>");
scanf("%d",&day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday\n");
break;
case 6:
case 7:
printf("weekend\n");
break;
default:
printf("您输入的数不正确,即将跳出程序。");
break;
}
return 0;
}
二、循环语句
while
for
do while
2.1 while语句
- while和 if 的区别在于while可以多次循环执行,而if 只执行一次
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d\n",i);
i++;
}
return 0;
}
- while语句中的break和continue
while语句中的break用于跳出整个循环
while语句中的continue用于跳出后面的所有语句
int main()
{
int i = 1;
while (i <= 10)
{
if (5 == i)
{
break; //输出1 2 3 4
//continue; //输出1 2 3 4 死循环
}
printf("%d ",i);
i++;
}
return 0;
}
- 另附:= 和 ==
int main()
{
int i = 1;
while (i <= 10)
{
if(i == 5) //只会输出5;若写成=,则会输出死循环。因为==表示判断两边是否相等
printf("%d ",i);
i++;
}
return 0;
}
2.2 for 循环语句——使用频率比while高
for 循环三个条件:初始化、进行条件判断、调整
while 循环中也有这三个条件,但是由于代码风格三个条件偏离较远,不利于集中修改和查找
- 用for 循环输出1-10
int main()
{
int i = 0;
for (i = 1;i <= 10;i++)
{
printf("%d ",i);
}
return 0;
}
- for 中的break和continue
与while 中的作用一样:break用于跳出整个循环,而continue 用于跳出循环后面的语句
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (5 == i)
{
//continue; // 1 2 3 4 6 7 8 9 10
break; //1 2 3 4
}
printf("%d ", i);
}
return 0;
}
- for 语句中的循环控制变量
for(i=0; i<10; i++) //建议前闭后开
{}
- 一些for 循环里的变种
- 直接省略循环中的初始化、条件判断、调整等部分:
int main()
{
int i = 0;
for (; ; )
{
printf("haha\n"); //循环中的初始化、条件判断部分、调整部分可以进行省略,但是不建议,会形成死循环
}
return 0;
}
- 嵌套循环
int main()
{
int i = 0;
int j = 0;
int count = 0;
for (i = 1; i < 10; i++)
{
for (j = 1; j < 10; j++)
{
count++;
printf("count = %d,haha\n",count); //9*9=81 个haha循环
}
}
return 0;
}
- 嵌套循环不进行初始化
int main()
{
int i = 0;
int j = 0;
int count = 0;
for (; i < 10; i++)
{
for (; j < 10; j++)
{
count++;
printf("count = %d,haha\n", count); //会输出10个haha循环
}
}
return 0;
}
2.3 do while循环
循环至少执行一次,所以使用场景有限
- 结构
do
{
循环语句体;
}while(表达式)
- do while 循环语句中的break和continue
do while 里的break用于跳出整个循环
continue 用于跳过循环后面的所有语句
int main()
{
int i = 0;
do
{
if (5 == i)
continue;
printf("haha\n"); //输出5个haha.若为continue,则输出5个haha后死循环
i++;
} while (i < 10);
return 0;
}
三、小练习
3. 1 计算阶乘
int main()
{
int i = 0;
int n = 0;
printf("请输入你想计算的阶乘:>");
scanf("%d",&n);
int ret = 1;
for (i = 1;i <= n;i++)
{
ret *= i;
}
printf("%d ",ret);
return 0;
}
3.2 计算 1!+2!+3!+……+10!
int main()
{
int i = 0;
int ret = 1;
int sum = 0;
int j = 0;
for (i = 1;i < 11;i++)
{
ret = 1; //计算下一个阶乘时一定得将result初始化,不然每一次都会从上一个阶乘的值开始进行相加,结果就会越加越大
for (j = 1; j <= i; j++)
{
ret *= j;
}
sum += ret;
}
printf("1!+2!+3!+……+10!:%d", sum);
return 0;
}
计算下一个阶乘时一定得将result初始化,不然每次都会从上一个阶乘的值开始相加
3.3 在一个有序数组中查找具体的某个数字n——二分查找/折半查找
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int key = 0; //想要查找的数字为5
printf("请输入你想要查找的值:>");
scanf("%d",&key);
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] > key)
{
right = mid - 1;
}
else if (arr[mid] < key)
{
left = mid + 1;
}
else
{
printf("%d的下标找到了,下标为%d\n", key, mid);
break; //用于找到下标后跳出循环
}
}
if (left > right)
{
printf("%d下标没找到。\n",key);
}
return 0;
}
3.4 编写代码,演示多个字符从两端移动,向中间汇聚
#include <windows.h>
int main()
{
char arr1[] = "hello bjbit";
char arr2[] = "############";
int sz = sizeof(arr1) / sizeof(arr1[0]);
int left = 0;
int right = sz - 1;
while (left <= right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
left++;
right--;
Sleep(500); //0.5s 输出一次
system("cls"); //引入windows.h头文件
printf("%s\n",arr2);
}
return 0;
}
3.5 编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成,如果三次均输入错误,则退出程序。
int main()
{
int i = 0;
char password[10] = { 0 };
for (i = 0;i < 3;i++)
{
printf("请输入登录密码:>");
scanf("%s",password);
if (strcmp(password,"123456") == 0)
{
printf("密码输入正确,登录成功!\n");
break;
}
}
if (i == 3)
{
printf("已输入三次密码,现在退出程序!!");
}
return 0;
}
3.6 猜数字小游戏的实现
写一个猜数字游戏:
- 自动产生一个1-100之间的随机数
- 猜数字
a. 猜对了,就恭喜你,游戏结束
b. 你猜错了,会告诉猜大了,还是猜小了,继续猜,直到猜对- 游戏一直玩,除非退出游戏
void menu()
{
printf("**************************\n");
printf("****** 1.play *********\n");
printf("****** 2.exit ********\n");
printf("**************************\n");
}
void game()
{
/*生成一个随机数:srand函数设置起点,rand函数生成随机数
* rand() 函数返回了一个0-32767 之间的数字
* */
int ret = rand() % 100 + 1; //%100 为0-99再+1,即1-100
//猜数字
int guess = 0;
while (1)
{
printf("请猜数字:>");
scanf("%d",&guess);
if (guess > ret)
{
printf("猜大了\n");
}
else if (guess < ret)
{
printf("猜小了\n");
}
else
{
printf("猜对了,退出游戏!\n");
}
}
}
int main()
{
int input = 0;
/*随机数起点的设置:srand 里传入时间,用函数time(NULL)不用其参数 time得引<time.h>
* srand 函数返回的是unsigned int 的值,所以进行类型转化
*/
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;
}
3.7 将3个整数从大到小输出
int main()
{
int a = 0;
int b = 0;
int c = 0;
scanf("%d%d%d", &a, &b, &c);
if (a < b)
{
int tmp = a;
a = b;
b = tmp;
}
if (a < c)
{
int tmp = a;
a = c;
c = tmp;
}
if (b < c)
{
int tmp = b;
b = c;
c = tmp;
}
printf("%d %d %d",a,b,c);
return 0;
}
3.8 输出1-100中所有的3的倍数
int main()
{
int i = 0;
/*for (i = 1; i < 101; i++)
{
if (i % 3 == 0)
printf("%d ",i);
}*/
for (i = 3; i < 101; i += 3)
printf("%d ",i);
return 0;
}
3.9 找到两数的最大公约数
两数相等时,任意一个都是最大公约数
不相等时,大数-小数,得到的差和之前的小数再次相减,直到两数相等,这两数中,任意一个都是最大公约数
int main()
{
int a = 0;
int b = 0;
printf("请任意输入两个数:");
scanf("%d%d", &a, &b);
while ((a - b) != 0)
{
if (a > b)
a = a - b;
else
b = b - a;
}
printf("最大公约数为:%d\n", b);
return 0;
}
3.10 写出1000-2000年之间所有的闰年
int main()
{
int year = 0;
int count = 0;
for (year = 1000; year <= 2000; year++)
{
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
{
printf("%d是闰年\n",year);
count++;
}
}
printf("count = %d\n",count);
return 0;
}