二路分支
- 逻辑:程序中某段代码需要在满足某个条件时才能运行
- 形式:
- if语句:表达一种 如果-则的条件执行关系
- if-else语句:表达一种 如果-否则 的互斥分支关系
- 举例:
// if语句 a = 1
if(a%2 == 0)
{
printf("a 是偶数\n");
}
// if-else 语句9
if(a%2 == 0)
{
printf("a 是偶数\n");
}
else
{
printf("a 是奇数\n");
}
if(表达式1)// 如果为真执行复合语句1
{
复合语句1;
}
else if(表达式2)//如果表达式1,2同时满足,则只会执行语句1
{
复合语句2;
}
else if(表达式3)
{
复合语句3;
}
else // 以上3个都不满足的时候执行此语句
{
复合语句4;
}
if(表达式1)// 如果为真,执行复合语句1
{
if(表达式11)
{
复合语句1;
}
}
else if(表达式2)
{
复合语句2
}
#include <stdio.h>
int main(int argc, char const *argv[])
{
int money;
printf("请输入余额 : ");
scanf("%d",&money);
if(money < 5)
{
printf("余额不足,请充值\n");
}
else if(money >= 5 && money < 10)
{
printf("余额较少,只能点白米饭\n");
}
else if(money >= 10 && money < 20)
{
printf("只能点一荤一素\n");
}
else if(money >= 20)
{
printf("最少点两素一荤\n");
}
else
{
}
return 0;
}
#include <stdio.h>
int main(int argc, char const *argv[])
{
int work;
printf("1:流水线 2:销售 3:程序员 4:公务员\n");
scanf("%d",&work);
//if(1<work<3) // 错误的写法
//if(1<work && work < 3) // 正确
if(work == 1)
{
printf("一天工作15个小时,月薪7200\n");
}
else if(work == 2)
{
printf("一天工作8小时,月薪3000\n");
}
else if(work == 3)
{
printf("一天10个小时,月薪20000\n");
}
else if(work == 4)
{
printf("一天6小时,月4000\n");
}
else
{
printf("待业游民\n");
}
return 0;
}
#include <stdio.h>
int main(int argc, char const *argv[])
{
int work;
printf("1:流水线 2:销售 3:程序员 4:公务员\n");
scanf("%d",&work);
if(work == 1)
{
// lv是局部变量作用范围是if{}
int lv;
printf("流水线等级: ");
scanf("%d",&lv);
if(lv == 1)
{
printf("1级流水线工资2000\n");
}
else if(lv == 2)
{
printf("2级流水线工资4000\n");
}
else if(lv == 3)
{
printf("3级流水线工资7000\n");
}
}
else if(work == 2)
{
printf("一天工作8小时,月薪3000\n");
}
else if(work == 3)
{
// lv是局部变量作用范围是if{}
int lv;
printf("程序员等级: ");
scanf("%d",&lv);
if(lv == 2)
{
printf("初级程序员一天15个小时,月薪10000\n");
}
else if(lv = 5)
{
printf("初级程序员一天8个小时,月薪20000\n");
}
else if(lv = 10)
{
printf("高级程序员一天5个小时,月薪100000\n");
}
}
else if(work == 4)
{
printf("一天6小时,月4000\n");
}
else
{
printf("待业游民\n");
}
return 0;
}
-
注意:
- 只要表达式的值为真(非0),则执行{}复合语句
- if语句可以单独使用,else语句不可以,else语句必须根if语句配套使用
- 不管是if语句还是else语句,代码块都必须使用大括号{}括起来,否则只有首句有效
- 如果只有一条执行语句,可以这样写:
if(表达式) 执行语句xxx;如果表达式为真,那么执行该语句
5.编程规范,写完if或else后,不管后面又没有语句,先写{}圈定为它的范围,然后再到{}里面补充语句,请用4个格缩进
作业1:制作一个简单的打分系统(满分制:100),使用switch…case方法,分数需整数
60分以下:评级为D
60-80分 : 评级为C
80-90分 : 评级为B
90-100分: 评级为A
不在0-100范围内:错误
#include <stdio.h>
int main(int argc, char const *argv[])
{
double score;
printf("请输入成绩: ");
int ret = scanf("%lf",&score);
printf("ret : %d\n",ret);
// score拿不到数据
if(ret != 1)
{
printf("输入有误\n");
return -1;
}
if(score == -1)
{
printf("实在不好意思,你卷子丢了,明年再来\n");
}
else if(score >= 0 && score < 60)
{
printf("要加油了,评级为D\n");
}
else if(score >= 60 && score < 80)
{
printf("还得加油, 评级为C\n");
}
else if(score >= 80 && score < 90)
{
printf("还行继续加油,评级为B\n");
}
else if(score >= 90 && score <=100)
{
printf("优秀继续保持,评级为A\n");
}
return 0;
}
多路分支
- 辑:根据不同的条件执行不同的代码片段
- 语法:
switch(n)//条件
{
case 1:
printf("one\n");
break;
case 2:
printf("two\n");
break;
case 3:
printf("three\n");
break;
default:
printf("其他数字\n");
}
#include <stdio.h>
int main(int argc, char const *argv[])
{
int score;
scanf("%d",&score);
switch (score)
{
case -1:
printf("实在不好意思,你卷子丢了,明年再来\n");
break;
// 0-60范围,注意格式
case 0 ... 60:
printf("要加油了,评级为D\n");
// 如果没有break,会一直执行以下语句
break;
case 61 ... 80:
printf("还得加油, 评级为C\n");
break;
// 以上条件不满足则执行
default:
printf("other\n");
break;
}
return 0;
}
- 要点解析
- switch(n)语句中的n必须是一个整型表达式,即switch判断的数据必须是整型或者字符
- case语句只能带整型常量,包括普通整型或字符,不包括const型数据
- break语句的作用是跳出整一个switch结构,没有break程序会略过case往下执行
- default语句不是必须的,一般放在最后面(因此不需要break)
练习2:计算加盟费
小张加盟一家餐饮企业,在每个季度结束后,小张必须向总部缴纳加盟费,加盟费与营业额的提成关系如下:
营业额 提成系数
0<=n<10w 0.1
10<=n<20w 0.075
20<=n<40w 0.05
40<=n<60w 0.03
60<=n<100w 0.015
n >= 100w 0.01
请输入小张的营业额,然后求出它需要的提交的加盟费
#include <stdio.h>
int main(int argc, char const *argv[])
{
double money,val;
int flage;
printf("请输入营业额(万元): ");
scanf("%lf",&money);
if(money >= 0 && money < 10) flage = 1;
else if(money >= 10 && money < 20) flage = 2;
else if(money >= 20 && money < 40) flage = 3;
else if(money >= 40 && money < 60) flage = 4;
else if(money >= 60 && money < 100) flage = 5;
else if(money >= 100) flage = 6;
switch (flage)
{
case 1: val = 0.1; break;
case 2: val = 0.075; break;
case 3: val = 0.05; break;
case 4: val = 0.03; break;
case 5: val = 0.015; break;
case 6: val = 0.01; break;
}
// 输出加盟费
printf("加盟费: %.3lf元\n",money * val * 10000);
return 0;
}
const
- 逻辑:使一个变量不可修饰
- 作用:
- 修饰普通变量,使之不可修改
- 修饰指针变量,使之不可修改或者使其指向的目标不可修改
- 示例:
int const a = 100; // 定义了一个不可修改的变量a
const int b = 200; // 定义了一个不可修改的变量b
a = 101; // 错误
b = 202; // 错误
while与do…while循环
-
逻辑:使得程序中每一段代码可以重复循环的运行
-
形式:
- while循环:先判断,再循环
while(表达式)// 表达式的值为真的时候进入循环体,为假退出 { } while(1)// 死循环 等价于 while(1); { } 如果循环体内只有一条语句,那么{}可以省略 while(1) printf("11\n");
**while循环
**
while循环:入口判断
// 循环输出一系列整数,直到100为止
int a;
scanf("%d", &a);
while(a <= 100)
{
printf("%d\n", a);
a++;
}
#include <stdio.h>
int main(int argc, char const *argv[])
{
// 打印1...10
int i = 0;
// 如果while()内的表达式为真则一直重复
// 运行while{}内的内容,直到while()内的表达式为
// 假则退出while{}
while(i != 10)
{
printf("%d\n",++i);
}
return 0;
}
- do-while循环:先循环,再判断
格式
do
{
循环体;
}while(表达式)
do-while循环
do-while循环:出口判断
// 循环输出一系列整数,直到100为止
int a;
scanf("%d", &a);
do
{
printf("%d\n", a);
a++;
}while(a <= 100);
- 语法点:
- while 循环先进行判断,条件为真后才执行循环体,因此循环体可能一遍也不执行。
- do-while 循环先执行循环体,再进行判断,因此循环体至少会执行一遍。
- do-while 循环中的 while 语句后面有分号;
练习3:
1.使用while实现1+2+...+100的和
2.使用do...while实现1+2+...+100的和
int num = 1;
int val = 0;
do
{
val += num;
} while (num++ != 100);
printf("val = %d\n",val);
#include <stdio.h>
int main(int argc, char const *argv[])
{
// 方法1
int a = 1;
int max;
while (1)
{
max = a;
a <<= 1;
a |= 1;
// 如果a溢出退出
if(a < 0)
break;
}
printf("int最大值为:%d\n",max);
// 方法2
max = 0;
max = ~(0x01 << sizeof(int)*8-1);
printf("int最大值为:%d\n",max);
return 0;
}
for循环
- 逻辑:与 while 循环类似,但更加紧凑,for 循环将控制循环的变量集中在一行
for(初始表达式1;判断表达式2;循环操作表达式3)
{
循环体;
}
// 第一条表达式只执行一遍i = 0只执行一遍
// 然后执行表达式2,判断i 是否小于等于5,如果为真则执行{}里面的内容
// 最后执行表达式3,i++
// 然后一次循环完成再重新执行表达式2,判断i是否小于5,如果为真会执行
// {}里面的内容,最后执行表达式3,i++,依次类推,直到表达式2为假
// 则退出循环体
for(int i = 0; i <= 5; i++)
{
printf("i:%d\n",i);
}
// 死循环
for(;;)
{
}
或者
for(;;);
//多变量
for(int i = 0,j = 0; i < 5; i++,j++)
{
printf("i:%d j:%d\n",i,j);
}
- 示例:
// 循环输出一系列整数,直到100为止
int a;
for(a=30; a<=100; a++)
{
printf("%d\n", a);
}
#include <stdio.h>
int main(int argc, char const *argv[])
{
int i = 1;
while(i < 10)
{
printf("%d\n",i);
i++;
}
for(int i = 1; i < 10; i++)
{
printf("%d\n",i);
}
// 如果我们不能确定程序什么时候能退出则使用while
while(1) // while循环为死循环
{
printf("hello world\n");
}
// 如果我们能确定程序什么时候能退出则使用for
for(;;) // for循环为死循环
{
printf("hello world\n");
}
return 0;
}
- for嵌套
int main(int argc, char const *argv[])
{
for(int i = 0; i < 5; i++)// 外循环
{
for(int j = 0; j < 4; j++)// 内循环
{
printf("i:%d j:%d\n",i,j);
}
}
return 0;
}
练习4:使用for循环实现1+2+…+100的和
#include <stdio.h>
int main(int argc, char const *argv[])
{
int max = 0;
for(int i = 1; i <= 100; i++)
max += i;
printf("%d\n",max);
return 0;
}
-
语法点:
- 循环的标准语法是: for(表达式1 ; 表达式2 ; 表达式3)
- 表达式1一般用来初始化循环控制变量
- 表达式2一般用来作为循环判定条件,为真则进入循环,为假则跳出循环
- 表达式3一般用来更新循环控制变量
- 三个表达式均可以省略,但分号不能省略
- while注重循环条件,for注重循环次数
break(退出)与continue(继续)
- 运用场景与特点
- break关键字只能用于循环(while for do…while)和switch语句中,表示结束循环或者跳出switch语句
- break关键字只能跳出最近一层的循环,也就是说,如果有多重循环,只能跳出最靠近break语句那层循环
- break关键字 不能 单独用于 if语句中,除非if语句外面包含了循环
- 逻辑:
- continue关键字只能用于循环体中(while do…while for),用于提前结束当前循环体后,又从最近一层循环体开始执行
- continue关键字不能 单独用于 if语句或者switch 语句中,除非外面包含了循环
- break:① 跳出 switch 语句; ② 跳出当层循环体
- continue:结束当次循环,进入下次循环
- 举例:
switch(n)
{
case 1:
printf("one\n");
break; // 跳出 switch 语句
case 2:
printf("two\n");
break;
}
while(1)
{
int n = scanf("%d", &a);
if(n == 0)
break; // 跳出当层 while 循环体
}
for(int i=1; i<=100; i++)
{
if(i%7 == 0)
continue; // 跳过所有能被7整除的数
printf("%d\n", i);
}
作业0:将今天的内容进行回顾,把今天写的所有代码,自己写一遍或者多遍
作业1:每次判断输入的单个字符,如果是字符a~z或者A-Z,则打印yes,否则打印no。如果输入的是’#‘ 则退出程序
#include <stdio.h>
int main(int argc, char const *argv[])
{
char ch;
// getchar等待键盘输入
while((ch = getchar()) != '#')
{
if(ch >= 'A' && ch <= 'Z'
|| ch >= 'a' && ch <= 'z')
{
printf("yes\n");
}
else if(ch != '\n') // 处理\n
{
printf("no\n");
}
}
return 0;
}
一些相关的题目很简单帮助新学习的同志们理解练习 :
goto语句
- 逻辑:无条件跳转
- 格式
goto 语句标号;//程序会直接跳转到语句标号的地方执行
语句标号:
- 示例:
int main()
{
printf("%d\n", __LINE__); // 打印第3行
// 无条件跳转到label处
goto label;
printf("%d\n", __LINE__); // 打印第7行,此处被略过
label:
printf("%d\n", __LINE__); // 打印第9行
}
- 语法:
- goto语句直接跳转到本代码块中的标签处
- 标签指的是以冒号结尾的标识符
- 作用:
- goto语句的无条件跳转不利于程序的可读性,一般不建议使用
- goto语句常被用在程序的错误处理中
#include <stdio.h>
int main(int argc, char const *argv[])
{
// 注意:千万不要使用goto语句实现死循环,程序
// 无法退出
// lable:
// printf("当前在第:%d 行\n",__LINE__);
// goto lable;
// goto 的唯一使用场景为跳转到出错处理
printf("请输入字符:");
int ch = getchar();
if(ch == '#')
{
goto error;
}
printf("当前在第:%d 行\n",__LINE__);
// 出错处理标签一定是在程序的末尾
// 程序正常退出还是异常退出最终还是得要执行error标签的语句
error:
printf("process exit\n");
return 0;
}
使用场景
#include <stdio.h>
int main(int argc, char const *argv[])
{
int data;
while (1)
{
int ret = scanf("%d",&data);
if(ret != 1)
{
// goto一般的使用场景是跳转到异常处理
goto error;
}
printf("data = %d\n",data);
}
error:
printf("输入异常\n");
return 0;
}