分支循环语句
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;
}
一个逻辑问题:  如果条件成立,要执行多条语句,应该怎样使用代码块。
#include <stdio.h>
int main()
{
if(表达式)
{
语句列表1;
}
else
{
语句列表2;
}
return 0;
}
这里的一对{}就是一个代码块。
悬空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;
}
 注:else与离得最近的if匹配 代码风格的重要性:《高质量c/c++编程》林锐
解决方法:
#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;
}
if书写形式的对比 代码1:
if (condition){
return x;
}
return y;
代码2:
if(condition)
{
return x;
}
else
{
return y;
}
代码3:
int main()
{
int num = 3;
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,输出星期一 输入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;
}
调试结果如下:  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 <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if (i == 5)
break;
printf("%d ", i);
i = i+1;
}
return 0; }
在while循环中,break用于永久的终止循环
#include <stdio.h>
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 <stdio.h>
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
putchar(ch);
return 0; }
代码2:
#include <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
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;
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 <windows.h>
#include <string.h>
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);
system("cls");
left++;
rignt--;
}
printf("%s\n",arr2);
return 0;
}
 
#include <string.h>
int main()
{
int i = 0;
char password[20] = { 0 };
for (i = 0; i < 3; i++)
{
printf("请输入密码:>");
scanf("%s", password);
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 <stdio.h>
#include <time.h>
void menu()
{
prinntf("******************************\n");
prinntf("********* 1. play ********\n");
prinntf("********* 0.exit **********\n");
prinntf("******************************\n");
}
void game()
{
int ret = rand()%100+1;
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;
}

|