分支循环语句
文章目录
- 分支循环语句
-
- 一.分支语句(选择结构)
-
- 1.if语句
- 2.switch语句
-
- a.switch语句也是一种分支语句。常常用于多分支的情况。
- b.default语句
- 二.循环语句
-
- 1.while
- 2.for
- 3.do while
C语言是结构化的程序设计语言!什么是语句?
1.顺序结构
2.选择结构
3.循环结构
C语言中由一个分号; 隔开的就是一条语句。比如:
printf("hehe");
1+2;
一.分支语句(选择结构) 如果你好好学习,校招时拿一个好offer,走上人生巅峰。
如果你不好好学习,毕业等于失业,回家卖折耳根。
这就是选择!
1.if语句
C语言是如何表示真和假的呢?那if语句的语法结构是怎么样的呢?
非0就是真 -1
0就是假
语法结构:
if(表达式)
语句;
if(表达式)
语句1;
else
语句2;
多分支:
if(表达式1)
语句1:
else if(表达式2)
语句2;
else
语句3;
演示代码:
int main()
{
int age = 10;
if(age>=18)
printf("成年\n");
else
{
printf("未成年\n");
printf("不能谈恋爱\n");
}
return 0;
}
if,else默认只控制一条语句,控制多条语句要带上{}(一个代码块,一个逻辑)。
int main()
{
int age = 70;
if (age < 18)
printf("少年\n");
else if (age>=18 && age<26)
printf("青年\n");
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;
}
一个逻辑问题:
文章图片
如果条件成立,要执行多条语句,应该怎样使用代码块。
#include
int main()
{
if(表达式)
{
语句列表1;
}
else
{
语句列表2;
}
return 0;
}
这里的一对{}就是一个代码块。
悬空else
当你写了这个代码:
#include
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
文章图片
注:else与离得最近的if匹配
代码风格的重要性:《高质量c/c++编程》林锐
解决方法:
#include
int main()
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
{
printf("hehe\n");
}
}
else
{
printf("haha\n");
}
return 0;
}
if书写形式的对比
代码1:
if (condition){
return x;
}
return y;
代码2:
if(condition)
{
return x;
}
else
{
return y;
}
代码3:
int main()
{
int num = 3;
//if (num = 5)
//if(5 = num)
if(5 == num)
printf("hehe\n");
return 0;
}
文章图片
练习
- 判断一个数是否为奇数
2.输出1-100之间的奇数
int main()
{
int num = 15;
if (num % 2 == 1)
printf("奇数\n");
return 0;
}
int main()
{
int i = 0;
for (i = 1;
i <= 100;
i++)
{
if (i % 2 ==1)
printf("%d ", i);
}
return 0;
}
小细节:
文章图片
其他写法:
int main()
{
for (int i = 1;
i <= 100;
i+=2)
{
printf("%d ", i);
}
return 0;
}
2.switch语句
a.switch语句也是一种分支语句。常常用于多分支的情况。 比如:
输入1,输出星期一那我没写成if…else if…else if的形式太复杂,那我们就得有不一样的语法形式。这就是switch语句。
输入2,输出星期二
输入3,输出星期三
输入4,输出星期四
输入5,输出星期五
输入6,输出星期六
输入7,输出星期天
switch(整型表达式)
{
语句项
}
而语句项是什么呢?
是一些case语句;
如下:
case整型常量表达式
语句;
int main()
{
int day = 0;
scanf("%d", &day):
switch (day)
{
case 1:
printf("星期1\n");
case 2:
printf("星期2\n");
case 3:
printf("星期3\n");
case 4:
printf("星期4\n");
case 5:
printf("星期5\n");
case 6:
printf("星期6\n");
case 7:
printf("星期天\n");
}
return 0;
}
调试结果如下:
文章图片
case决定入口,而不决定出口。
如何解决出口?
int main()
{
int day = 0;
scanf("%d", &day):
switch (day)
{
case 1:
printf("星期1\n");
break;
case 2:
printf("星期2\n");
break;
case 3:
printf("星期3\n");
break;
case 4:
printf("星期4\n");
break;
case 5:
printf("星期5\n");
break;
case 6:
printf("星期6\n");
break;
case 7:
printf("星期天\n");
break;
}
return 0;
}
要求:
1-5 工作日
6-7 休息日
实现:
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;
}
编程的好习惯
在最后一个case语句的后面加上一条break语句。(之所以怎么写是可以避免出现在以前的最后一个case语句后面忘了添加break语句)。b.default语句
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(“输入错误\n");
break;
}
return 0;
}
练习:
文章图片
文章图片
二.循环语句
文章图片
1.while
我们已经掌握了if语句:
if(条件)
语句;
当条件满足的情况下,if语句后的语句执行,否则不执行。但是这个语句只会执行一次。
但是我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。
那我们怎么做呢?C语言中给我们引入了:while语句,可以实现循环。
文章图片
文章图片
while语法结构
while(表达式)
循环语句;
while语句执行的流程:
文章图片
比如我们实现:
在屏幕是打印1-10的数字。
#include
int main()
{
int i = 1;
while(i<=10)
{
if (i == 5)
break;
printf("%d ", i);
i = i+1;
}
return 0;
}
在while循环中,break用于永久的终止循环
#include
int main()
{
int i = 1;
while(i<=10)
{
if (i == 5)
continue;
printf("%d ", i);
i = i+1;
}
return 0;
}
文章图片
在while循环,continue的作用是跳过本次循环continue后面的代码,直接去判断部分,看是否进行下一次循环
再看几个代码:
代码什么意思?
代码1:
#include
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
putchar(ch);
return 0;
}
代码2:
#include
int main()
{
while ((ch = getchar()) != EOF)
{
if (ch < ‘0’ || ch > ‘9’)
continue;
putchar(ch);
}
return 0;
}
文章图片
getchar读取的是字符,而字符本质上是以ASCII码值存储,ASCII码值是整型。
getchar返回的不一定是ASCII码值,有可能返回EOF(本质上是-1)
stdin-标准输入-键盘
文章图片
文章图片
EOF - end of file - 文件结束标志
文章图片
文章图片
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
{
putchar(ch);
}
return 0;
}
ctrl+z - getchar 就读取结束
#include
int main()
{
char password[20] = { 0 };
printf("请输入密码:>");
scanf("%s", password);
printf("请确认密码(Y/N):>");
int ch = getchar();
if (ch == 'Y')
{
printf("确认成功\n");
}
else
{
printf("确认失败\n");
}
return 0;
}
一种情况:
文章图片
解决方法:
清理缓冲区
#include
int main()
{
char password[20] = { 0 };
printf("请输入密码:>");
scanf("%s", password);
printf("请确认密码(Y/N):>");
getchar();
//处理'\'
if (ch == 'Y')
{
printf("确认成功\n");
}
else
{
printf("确认失败\n");
}
return 0;
}
另一种情况:
文章图片
解决方法:
清理缓存区的多个字符
#include
int main()
{
char password[20] = { 0 };
printf("请输入密码:>");
scanf("%s", password);
printf("请确认密码(Y/N):>");
int tmp = 0;
while ((tmp = getchar()) != '\n')
{
;
}
int ch = getchar();
if (ch == 'Y')
{
printf("确认成功\n");
}
else
{
printf("确认失败\n");
}
return 0;
}
#include
int main()
{
while ((ch = getchar()) != EOF)
{
if (ch < ‘0’ || ch > ‘9’)
continue;
putchar(ch);
}
return 0;
}
2.for
我们已经知道了while循环,但是我们为什么还要一个for循环呢?首先来看看for循环的语法:
语法
for(表达式1: 表达式2: 表达式3)
循环语句:
表达式1为初始化部分,用于初始化循环变量的。表达式2为条件判断部分,用于判断循环时候终止。表达式3为调整部分,用于循环条件的调整。
文章图片
int main()
{
int i = 0;
for (i = 1;
i <= 10;
i++
{
printf("%d ",i);
}
return 0;
}
文章图片
文章图片
break和continue在for循环中
int main()
{
int i = 0;
for (i = 1;
i <= 10;
i++
{
if (i ==5)
break;
printf("%d ",i);
}
return 0;
}
结果为1-4.
int main()
{
int i = 0;
for (i = 1;
i <= 10;
i++
{
if (i ==5)
continue;
printf("%d ",i);
}
return 0;
}
结果为1-10.
for语句的循环控制变量
一些建议:
1.不可在for循环体内修改循环变量,防止for循环失去控制。循环体内改变循环变量的例子:
1.
int main()
{
int i = 0;
for (i = 1;
i <= 10;
i++)
{
printf("%d ", i);
i = 5;
}
return 0;
}
2.
文章图片
2.建议for语句的循环控制变量的取值采用“前闭后开区间”的写法。
文章图片
文章图片
文章图片
为什么一直死循环打印?
判断部分省略 - 判断部分恒为真
把握不住不要随便省略
如下:
文章图片
外面执行一次,里面执行三次,打印9次
文章图片
打印3次,j = 3被保留
一道笔试题:
请问循环几次?
#include
int main()
{
int i = 0;
int k = 0;
for(i = 0, k = 0;
i++, k++)
k++;
return 0;
}
循环0次,k=0为假
3.do while
do语句的循环:
do
循环语句;
while(表达式);
int main()
{
int i = 1;
do
{
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
执行流程
文章图片
do语句的特点
文章图片
do while循环中的break和continue
文章图片
文章图片
练习
文章图片
1.
int main()
{
int i = 0;
int n = 0;
int ret = 1;
scanf("%d", &n);
for (i = 1;
i <= n;
i++)
{
ret *= i;
}
printf("%d\n", ret);
return 0;
}
int main()
{
int i = 0;
int n = 0;
int ret = 1;
int sum = 0;
for (n = 1;
n <= 3;
n++)
{
for (i = 1;
i <= n;
i++)
{
ret *= i;
}
sum += ret;
}
printf("%d\n", sum);
return 0;
}
文章图片
…为什么呢?
文章图片
更高效的方法:
文章图片
3.
二分查找(折半查找):
文章图片
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 ()
{
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;
}
文章图片
文章图片
#include
#include
int main()
{
char arr1[] = "welcome to bit!!!!!!";
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);
//睡眠1秒
system("cls");
//清空屏幕
left++;
rignt--;
}
printf("%s\n",arr2);
return 0;
}
文章图片
文章图片
#include
int main()
{
int i = 0;
//假设正确的密码是字符串“123456”
char password[20] = { 0 };
for (i = 0;
i < 3;
i++)
{
printf("请输入密码:>");
scanf("%s", password);
//if (password == "123456")//err - 两个字符串比较,不能使用==,应使用strcmp
if(strcmp(password, "123456") == 0)
{
printf("登录成功\n");
break;
}
else
{
printf("密码错误,重新输入!\n");
}
}
if (i == 3)
printf("删除密码均错误,退出程序\n");
return 0;
}
写一个猜数字游戏
1.自动产生一个1-100之间的随机数
2.猜数字
a.猜对了,就恭喜你,游戏结束
b.猜错了,会告诉猜大了,还是猜小了,继续猜,直到猜对
3.游戏可以一直玩,除非退出
#include
#include
void menu()
{
prinntf("******************************\n");
prinntf("*********1. play********\n");
prinntf("*********0.exit**********\n");
prinntf("******************************\n");
}
void game()
{
//猜数字游戏的实现
//1.生成随机数
//rand函数返回了一个0-32767之间的数字
//时间-时间戳
int ret = rand()%100+1;
//%100的余数是0-99,然后+1,范围就是1-100
//printf("%d\n",ret);
//2.猜数字
while (1)
{
printf("请猜数字:>");
scanf("%d", &guess);
if(guess < ret)
{
printf("猜小了\n");
}
else sf (guess > ret)
{
printf("猜大了\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
}
}
int mian()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
//打印菜单
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("猜数字\n");
break;
case 0:
printf("退出游戏\n");
break;
default;
printf("选择错误,重新选择\n");
break;
}
} while (input);
return 0;
}
【初阶C语言|C语言初阶(分支循环语句)】
文章图片
推荐阅读
- 进阶C语言|动态内存管理
- 进阶C语言|自定义类型(结构体,枚举,联合)
- 进阶C语言|程序环境和预处理
- 进阶C语言|C语言文件操作
- 初识C语言|初识C语言(指针)
- 进阶C语言|详解C语言指针
- 笔记|c笔记
- 数据结构|数据结构——链表一网打尽
- C语言|C程序设计练习