初阶C语言|C语言初阶(分支循环语句)

分支循环语句
文章目录

  • 分支循环语句
    • 一.分支语句(选择结构)
      • 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语言是如何表示真和假的呢?
非0就是真 -1
0就是假
那if语句的语法结构是怎么样的呢?
语法结构:
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; }

一个逻辑问题:
初阶C语言|C语言初阶(分支循环语句)
文章图片

如果条件成立,要执行多条语句,应该怎样使用代码块。
#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; }

初阶C语言|C语言初阶(分支循环语句)
文章图片

注: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; }

初阶C语言|C语言初阶(分支循环语句)
文章图片

练习
  1. 判断一个数是否为奇数
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; }

小细节:
初阶C语言|C语言初阶(分支循环语句)
文章图片

其他写法:
int main() { for (int i = 1; i <= 100; i+=2) { printf("%d ", i); } return 0; }

2.switch语句
a.switch语句也是一种分支语句。常常用于多分支的情况。 比如:
输入1,输出星期一
输入2,输出星期二
输入3,输出星期三
输入4,输出星期四
输入5,输出星期五
输入6,输出星期六
输入7,输出星期天
那我没写成if…else if…else if的形式太复杂,那我们就得有不一样的语法形式。这就是switch语句。
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; }

调试结果如下:
初阶C语言|C语言初阶(分支循环语句)
文章图片

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; }

练习:
初阶C语言|C语言初阶(分支循环语句)
文章图片

初阶C语言|C语言初阶(分支循环语句)
文章图片

二.循环语句 初阶C语言|C语言初阶(分支循环语句)
文章图片

1.while
我们已经掌握了if语句:
if(条件) 语句;

当条件满足的情况下,if语句后的语句执行,否则不执行。但是这个语句只会执行一次。
但是我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。
那我们怎么做呢?C语言中给我们引入了:while语句,可以实现循环。
初阶C语言|C语言初阶(分支循环语句)
文章图片

初阶C语言|C语言初阶(分支循环语句)
文章图片

while语法结构
while(表达式) 循环语句;

while语句执行的流程:
初阶C语言|C语言初阶(分支循环语句)
文章图片

比如我们实现:
在屏幕是打印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; }

初阶C语言|C语言初阶(分支循环语句)
文章图片

在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; }

初阶C语言|C语言初阶(分支循环语句)
文章图片

getchar读取的是字符,而字符本质上是以ASCII码值存储,ASCII码值是整型。
getchar返回的不一定是ASCII码值,有可能返回EOF(本质上是-1)

stdin-标准输入-键盘
初阶C语言|C语言初阶(分支循环语句)
文章图片

初阶C语言|C语言初阶(分支循环语句)
文章图片

EOF - end of file - 文件结束标志
初阶C语言|C语言初阶(分支循环语句)
文章图片

初阶C语言|C语言初阶(分支循环语句)
文章图片

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; }

一种情况:
初阶C语言|C语言初阶(分支循环语句)
文章图片

解决方法:
清理缓冲区
#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; }

另一种情况:
初阶C语言|C语言初阶(分支循环语句)
文章图片

解决方法:
清理缓存区的多个字符
#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为调整部分,用于循环条件的调整。
初阶C语言|C语言初阶(分支循环语句)
文章图片

int main() { int i = 0; for (i = 1; i <= 10; i++ { printf("%d ",i); } return 0; }

初阶C语言|C语言初阶(分支循环语句)
文章图片

初阶C语言|C语言初阶(分支循环语句)
文章图片
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.
初阶C语言|C语言初阶(分支循环语句)
文章图片

2.建议for语句的循环控制变量的取值采用“前闭后开区间”的写法。
初阶C语言|C语言初阶(分支循环语句)
文章图片

初阶C语言|C语言初阶(分支循环语句)
文章图片

初阶C语言|C语言初阶(分支循环语句)
文章图片

为什么一直死循环打印?
判断部分省略 - 判断部分恒为真
把握不住不要随便省略
如下:
初阶C语言|C语言初阶(分支循环语句)
文章图片

外面执行一次,里面执行三次,打印9次
初阶C语言|C语言初阶(分支循环语句)
文章图片

打印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; }

执行流程
初阶C语言|C语言初阶(分支循环语句)
文章图片

do语句的特点
初阶C语言|C语言初阶(分支循环语句)
文章图片
do while循环中的break和continue
初阶C语言|C语言初阶(分支循环语句)
文章图片

初阶C语言|C语言初阶(分支循环语句)
文章图片

练习
初阶C语言|C语言初阶(分支循环语句)
文章图片

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; }

初阶C语言|C语言初阶(分支循环语句)
文章图片

…为什么呢?
初阶C语言|C语言初阶(分支循环语句)
文章图片

更高效的方法:
初阶C语言|C语言初阶(分支循环语句)
文章图片

3.
二分查找(折半查找):
初阶C语言|C语言初阶(分支循环语句)
文章图片

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; }

初阶C语言|C语言初阶(分支循环语句)
文章图片

初阶C语言|C语言初阶(分支循环语句)
文章图片

#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; }

初阶C语言|C语言初阶(分支循环语句)
文章图片
初阶C语言|C语言初阶(分支循环语句)
文章图片

#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语言初阶(分支循环语句)
文章图片

    推荐阅读