C语言程序的三种结构:
1.顺序结构:程序从上往下依次执行就叫顺序结构
2.分支结构:程序有选择的执行某段代码或者不执行某段代码
3.循环结构:程序重复的执行某段代码
重点是分支结构和循环结构
1.分支结构有两大类语句:一种是if 一种是switch
if语句
1.第一种形式:
语法:if(表达式){
语句块;
}
语义:如果表达式的结果为真,则执行语句块,否则不执行语句块
第二种形式:
语法:
if(表达式){
语句块1;
}else{
语句块2;
}
语义:如果表达式的结果为真,则执行语句块1,否则执行语句块2
语句块1或者语句块2,至少会有一个被执行
第三种形式:
if语句的嵌套
简单来说:就是if语句里面还可以有任意的if语句
第四种形式:
语法:
if(表达式1){
语句块1
}else if(表达式2){
语句块2
}else if(表达式3){
语句块3
}
……………………
else if(表达式n){
语句块n
}else{
语句块n+1;
}
语义:先判断表达式1,如果成立则执行语句块1,后面的都不执行了,否则继续判断表达式2,如果成立,则执行语句块2,后面的都不执行了,如果不成立则判断语句块3,如果成立则执行语句块3,否则继续往下判断,直到else上面的条件都不满足,就执行语句块n+1;
而且我们的这种语法格式是一个整体,上面判断过的内容如果不成立,那么下面判断时已经做了过滤
例子:请土豪输入他儿子的成绩:
用户输入 奖励
90及以上 法拉利跑车
80-89 奔驰汽车
70-79 大众汽车
60-69 拖拉机
60以下 吊打
#include <stdio.h>
int main(int argc, const char * argv[]) {
printf("亲爱的尊敬的土豪同志,请输入你后代的成绩\n");
int score;
scanf("%d",&**score);
/*第一种方法
if(score >= 90){
printf("来,给你台法拉利,去装X去飞\n");
}
if(score>=80 && score <90){// 80 <= score <90
printf("给你台奔驰去泡吧\n");
}
if(score>=70 && score <80){
printf("来台大众随便去代步\n");
}
if(score>=60 && score <70){
printf("你不是这块料,给你台拖拉机回家耕田把!\n");
}
if(score < 60){
printf("你大爷的,吊打你一顿\n");
}
*/
//第二种方法
if(score >= 90){
printf("来,给你台法拉利,去装X去飞\n");
}else if(score >= 80){
printf("奔驰\n");
}else if(score >= 70){
printf("大众\n");
}else if(score >= 60){
printf("拖拉机\n");
}else{
printf("吊打一顿\n");
}
printf("程序结束\n");
return 0;
}
```
三目运算符:?:
语法:
表达式1 ?表达式2 : 表达式3;
语义:执行表达式1,看看表达式的结果,如果为真,则执行表达式2,否则执行表达式3
口语:问表达式1成立吗?成立就表达式2,否则表达式3
什么时候用三目?
就是判断条件后的语句比较少得时候用3目(也相当于if-esle),如果有多条语句的时候用if-else
例子:
int num1=10,num2=3;
num1 > num2 ? num1++ : num2++;
if(num1>num2){
num1++;
}else{
num2++;
}
printf("num1=%d,num2=%d\n",num1,num2);//11 3
if语句需要注意的地方:
1.if语句后面千万不要加分号,如果你非要手贱加一个分号,那么就加在大括号后面
2.if语句的大括号,其实是可以省略的!
当你省略大括号的时候,那么if语句只能管到离它最近的一句语句,但是这句语句不能是声明变量的语句
3.if语句里面可以写任意条语句(必须要有大括号)
4.非0的数就是真,0就是假,避免让你的表达式是永真或永假
5.if语句里面定义的变量只能在它语句块里面访问
6.if语句小括号里面的表达式可以写任意表达式
***** switch语句
switch语法:
switch(表达式){
case 常量表达式1:
语句块1
break;
case 常量表达式2:
语句块2
break;
case 常量表达式3:
语句块3
break;
………………
default:
语句块n
break;
}
语义:先得出表达式的结果,根据结果跳转到相应的case语句块里面去执行
表达式结果 == 常量表达式 就叫相应的case语句块
如果case 后面的常量表达式没有一个跟表达式结果对应的
那么就跳转到 default里面执行语句块n
switch语句的穿透问题:
当case块里面不加break的时候,会发生穿透
穿透意思:就是从这个case块里面执行完语句后,会继续跳到下一个case块里面继续执行
所以,我们必须加break,防止穿透
break可以跳出当前的switch语句
switch与if-else if语句的比较:
例子:
include
switch语句需要注意的地方:
1.switch语句后面的小括号只能写整数类型的表达式,否则会报错
2.case后面只能接常量表达式
3.case后面的常量表达式不能有重复的值
4.switch小括号后面不要加分号,手贱要加分号加在大括号后面
5.case后面不能立即声明变量,除非在声明前面加一条或者N条语句
6.非要在 case后面立即声明变量怎么办??那么就在case块里面加一个大括号
7.如果不加大括号声明的变量,其他case块也可以访问(知道)
8.default可以写在任意位置,不影响结果
例子:要求用户输入一个月份,判断这个月份属于哪个季节
12月1月 2月:冬季
3月4月5月:春季
6月7月8月:夏季
9月10月11月:秋季
include
总结:任何可以用if语句实现的功能,绝对也可以用switch语句来实现,同样用switch语句可以做得东西,if也完全可以
Command + ~键(数字键1旁边的那个):在同一个程序里面不同的窗口之间进行切换
如果要判断范围的话用if比较方便,用switch比较麻烦,不能直接用
如果是判断具体的某个值,并且值不是很多的时候用switch方便和简洁
循环语句:while语句
while语句的基本语法:
while(表达式){
循环体;
}
语义:
1.先判断表达式是否成立,如果成立,则跳转2,否则跳转3
2.执行循环体,执行完毕跳转到1
3.跳出循环,循环结束
例子1:
include
例子2:
遍历1-100;遍历就是给它一个一个打印出来
include
while循环需要注意的地方:
1.防止死循环。避免条件永真或永假。如果永真死循环,如果永假不循环,写起来毫无意义
2.while循环后面千万不要加分号,手贱要加分号,你们都懂的
3.记得结束循环的语句不要忘了写
4.循环跟if语句一样的地方就是:大括号可以省略。只能控制离它最近的一条语句,并且这条语句不能是声明变量的语句
习题一:计算1-100以内(包含1和100)所有偶数的和
(能被2整除的数都叫偶数)
分析:从1数到100
判断当前每个被数到的数是不是偶数
include
习题二:请用户输入个任意整数N,打印出从1到这个整数N的所有平方表
例:用户输入4,那么则顺序打印出1的平方的值为1,2的平方的值为4,3的平方的值为9,4的平方的值为16
分析:第一步:接收用户输入任意一个整数
要从1开始遍历到这个整数
打印出每个遍历的数的平方
从1遍历到4
打印出遍历到的当前数的平方
include
习题三:要求用户输入5个数字,计算出这5个数字中最小的数字、最大的数字和平均数
分析:
要判断谁最大,谁最小
平均数 = 总和 / 次数
要计算出总和
如: 10 9 20 23 14
我把我认为的最大的数赋为0不科学,因为用户可以输入负数
那么我们一定要让我们认为的最大的数是一个无限小的数,然后让用户输入的数不可能比我还小了
引入一个,int类型所能取值的最小数
INT32_MIN 就是int类型里面所能取值的最小的数了
第二种解法的精髓:
先把第一个输入的数,当做我认为的最大的数和最小的数
include
习题四:让用户输入一个数n和一个数m,计算从n到m之间的所有数之和
include
****** do-while循环语句:
do-while的语法:
do{
循环体;
}while(表达式);
注意:while的小括号后面一定要加分号
语义:
1.执行循环体,跳转到2
2.判断表达式的结果是否为真,如果为真,跳转到1,否则跳转到3
3.跳出循环,循环结束
所以证明:循环体至少会被执行1次
跟while循环的最大的区别就是:do-while是先执行循环体,再判断,while是先判断再执行
while里面的循环体很可能1次都不会被执行
do-while里面的循环体至少被执行1次
场景:就是循环体需要至少执行1次的时候用
例子:
include
最最重要的for循环来了
所以我们现在迫切的需要一种循环,它的格式能够让我不会忘记写i++
for循环
语法:
for(表达式1;表达式2;表达式3){
循环体;
}
语义:1.先执行表达式1,跳转到2
2.判断表达式2的结果是否为真,如果为真,跳转到3,否则跳转到5
3.执行循环体,执行完毕,跳转到4
4.执行表达式3,执行完毕跳转到2
5.跳出循环,循环结束
例子:用for循环来计算1加到100
#include
for循环的其他格式:
表达式1,表达式2,表达式3都可以省略
注意:表达式2没写的话代表是死循环
就算你不写表达式1,表达式2,或者表达式3,但是那两个分号无论如何都不省略
表达式1,表达式3,可以写任意条语句,用,隔开
***for循环的嵌套:可以用来打印图形
就是一个for循环里面还套了一个for循环
for循环的嵌套一般用来控制平面
精华:
外层循环控制行数
内层循环控制列数
例子:
#include <stdio.h>
int main(int argc, const char * argv[]) {
for (int i=0; i<6; i++) { //外层循环控制行数
for (int j=0; j<6; j++) { //内层循环控制列数
printf("* ");
}
printf("\n");
}
return 0;
}
结果打印为:
* * * * * *
* * * * * *
* * * * * *
* * * * * *
* * * * * *
* * * * * *
知道这种图形怎么用for循环做么?
*
* *
* * *
* * * *
* * * * *
* * * *
* * *
* *
*
#include <stdio.h>
int main(int argc, const char * argv[]) {
for (int i=1; i<=9; i++) {//控制行数
//分两段
if(i<=5){
for (int j=1; j<=i; j++) {//控制列数
printf("* ");
}
}else{
for (int j=1; j<=9-i+1; j++) {//控制列数
printf("* ");
}
}
printf("\n");
}
return 0;
}
“`