P73- 逻辑运算符的简要介绍。
1.比较运算符和比较表达式。
1.1 比较表达式: 1个比较表达式描述的是1个条件。那么可以根据这个比较表达式的结果来判断这个条件是否成立。
缺点: 1个表达式只能描述1个条件。
3 > 2 ;
2. 判断多个条件并且指定多个条件之间的关系。
3.逻辑运算符。
3.1 作用:判断多个条件。使用逻辑运算符来指定多个条件之间的关系。
3.2 逻辑运算符:
&& 逻辑与 并且
|| 逻辑或 或者
! 非 取反
4.逻辑表达式:由逻辑运算符链接起来的式子,就叫逻辑表达式。
一般情况下:逻辑运算符链接起来两个条件(比较表达式)
逻辑表达式的结果。
因为逻辑表达式描述的是多个条件,也是条件,所以结果要么成立(结果为真),要么不成立(结果为假)。
所以逻辑表达式的结果仍然是真,假。所以我们用int类型的变量来表示结果。
0 表示假
非0 表示真
逻辑表达式和比较表达式的区别:
1.比较表达式只能描述1个条件
2.逻辑表达式可以描述多个条件。并且使用逻辑运算符来指定多个条件之间的关系。
P74 - 76 逻辑运算符
详解逻辑表达式
1.&& 逻辑与 并且。
由&&连接起来的逻辑表达式,只有当两边的条件都成立的时候,整个逻辑表达式才能成立。
只要有一边的条件不成立,整个逻辑表达式都不成立。
1 && 1 1
0 && 1 0
1 && 0 0
0 && 0 0
断路问题:
逻辑表达式,在执行的时候,是先计算左边的条件的结果,再计算右边的结果。
当是&&逻辑表达式的时候。
那么左边的表达式不成立,那么这个时候可以确定整个逻辑表达式的结果不成立。
那么这个时候,右边的条件根本不会去判断,就不会去执行了。
int i = 1;
int res = i++ >10 && ++i <0;
// i++ i=2 (如果执行的话 ++i后 i=3)
printf("i = %d\n",i); //i = 2
printf("res = %d\n",res); //res =0
2. || 逻辑或 或者。
由||连接起来的逻辑表达式,
只要有一边的条件成立,整个逻辑表达式就成立。,整个逻辑表达式就能力。
只有两边都不成立的时候,整个逻辑表达式才不成立
1 || 1 1
0 || 1 1
1 || 0 1
0 || 0 0
断路问题:
逻辑表达式,在执行的时候,是先计算左边的条件的结果,再计算右边的结果。
当是||逻辑表达式的时候。
如果左边的条件成立。那么这个时候就可以确定整个表达式的结果为 成立。
那么这个时候,右边的条件根本就不会去判断了。所以这个时候右边的那个条件根本就不会去执行了。
int i = 1;
int res = i++ >0 || ++i <10;
// 左边条件成立,不再判断右边的条件,所以为 ++i 不执行。
printf("i = %d\n",i); //i = 2
printf("res = %d\n",res); //res =1
3. ! 非 取反
作用:将真变为假,将假变为真。
int res = 10 > 0;
int res1 = !res;
!的作用:将后面的值取反 如果后面的结果为真,结果就为假 如果后面的结果为假,那么结果就为真。
4.取反运算符的优先级要比比较运算符的优先级高。
5.逻辑运算符之间的优先级
not and or
! && ||
! > && > ||
取反优先级最高,其次是逻辑与,最小的优先级是逻辑或。
当你不确定优先级的时候,可以使用小括号来改变优先级。
6.课堂练习:
6.1请用户输入小明的语文成绩和数学成绩,输出以下判断的结果
a.两门成绩都大于90分.输出 1 或 0。
b.任意1门成绩大于90分,输出 1 或 0。
int shuXue = 0 ;
int yuWen = 0 ;
int res = 0 ;
printf("输入数学语文成绩(空格分隔):");
rewind(stdin);
scanf("%d %d",&shuXue,&yuWen);
res = shuXue > 90 && yuWen > 90;
printf("数学语文都高于90分: %d\n", res);
res = shuXue > 90 || yuWen >90 ;
printf("数学或语文高于90分:%d\n", res);
6.2.定义1个变量year int 保存年份。
写1个表达式 判断这个年份是不是闰年,
满足如下两个条件之一 那么年份就是闰年,
a.年份可以被400整除.
b.年份可以被4整除 但是 不能被100整除.
int year = 0 , res = 0 ;
printf("输入年份:");
rewind(stdin);
scanf("%d",&year);
// res = !(year % 400) || (!(year % 4) && year % 100);
res = year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
printf("年份是否是闰年:%d\n", res);
P79 - 运算符的优先级和结合性。
1.到目前为止,学习过哪些运算符:
= 赋值运算符
+ - * / % 算术运算符
+= -= *= /= %= 复合赋值运算符
++ -- 自增自减运算符
, 逗号运算符
> >= < <= == != 比较运算符,关系运算符
&& || ! 逻辑运算符
& 取地址运算符
2. C语言将所有的运算符分为了15个等级。
1级的优先级最高,15级的优先级最低。
当表达式中有多种运算,先算优先级高的,再算优先级低的。
3.运算符的结合性。
当1个表达式中的运算符的优先级是一样的时候,是从左到右计算 还是从右到左来计算是根据运算符的结合方向来的。
P80 - IF 结构的使用。
1.比较表达式和逻辑表达式。统称为条件表达式。
条件表达式,描述的是1个或者多个条件。
2.IF语法结构。
2.1 作用: 可以实现,1段代码在只有满足指定条件的时候才执行,否则不执行。
2.2 语法:
if (条件表达式)
{
执行代码;
}
条件表达式:比较表达式或者逻辑表达式。
2.3 执行步骤:
a.先判断if后面条件表达式的真假
a.1 如果为真,条件成立,就会执行if块中的代码。执行完毕之后再继续往下执行。
a.2 如果为假,条件不成立,就略过if块中的代码继续往下执行。
3.使用IF结构要注意:
3.1 关于分号。
在1条语句的后面,我们都要写一个分号,这个分号代表这条指令的结束。
CPU在识别指令的时候,如何判断指令结束并执行,以分号为基准。
而绝大多数的情况下,每一条语句就代表1条指令。所以每条语句的后面要跟一个分号。
IF结构是一个语法快,他的范围从左大括号开始到右大括号结束。
所以一般情况下,IF结构不需要加分号。因为}就代表了结束。
3.2 IF后面的小括号内可以写任意的表达式。
反正在执行的时候,计算IF后面的小括号中的表达式的结果。
0 表示假
非0 表示真
3.3 关于永真和永假的
if(1) 代表条件永远成立.
if(0) 代表永远不成立.
3.4 IF 代码块中可以有任意行代码。只要符合你的逻辑。
3.5 请保持正确的代码缩进。
属于1个大括号的代码,就应该保持一个Tab的缩进。
选中要对齐的代码: CTRL(control)+I 就会自动对齐,前提是代码没有语法错误。
P83 - 变量的作用域。
1. 声明1个变量就是在内存申请一块空间来存储数据。
2. 声明在1个大括号内的变量,当这个大括号被CPU执行完毕之后,定义在这个大括号内的变量申请的内存空间就会被回收。
定义在1个大括号中的变量只能在大括号内访问。
变量的作用域:指的就是变量可以在哪段范围内访问。离变量最近的大括号
3.我们可以自定义一个作用域来提前释放1个变量。
{
int i=1;
printf("i=%d",i);
} //这个时候,i就会在这里呗释放。
4.在不同的作用域(大括号)中,或者是不同层级的作用域中,是可以定义名称相同的变量的。
这个时候,内层作用域中的同名变量就会将外层作用域中的同名变量屏蔽。在内层作用域当中访问的就是内层的变量。
虽然在不同层级的作用域中可以定义名称相同的变量,但是这样的代码比较混乱,不便于阅读,所以一般情况下我们不会在不同层级的作用域中定义相同的变量。
P84 - IF-ELSE结构。
1.IF结构的缺点。
只能在条件满足的时候执行1段指定的代码。条件不满足的时候就无法执行另外的代码了。
2.IF-ELSE 结构。
2.1 作用 :在条件满足的时候执行1段代码,在条件不满足的时候执行另外1段代码。
2.2 语法 :
if (条件表达式)
{
执行代码
}
else
{
执行代码
}
2.3 执行步骤:
a.先计算if后面的条件表达式的真假。
a.1 如果为真,就执行if块中的代码,执行完毕之后,结束if-else结构,往下执行,不会执行else中的代码.
a.2 如果为假,就会执行else中的代码。不会执行if中的代码。执行完了之后继续往下执行。
2.4 什么时候使用if-else 结构呢?
如果你有2段代码,1段在条件成立的时候执行,另外一块在条件不成立的时候执行,这个时候就可以使用if-else结构。
用法:
if(条件)
{
条件满足的时候执行的代码;
}
else
{
条件不满足的时候执行的代码;
}
P86 使用IF-else结构注意
1.保持正确的代码缩进,
2.IF后的表达式任意 结果为0就是假,非0就是真。
3.分号不要乱写。
4.IF与ELSE是1个整体。不能在中间写代码。
5.IF和ELSE中间的代码绝对不会同时执行。
因为if后的表达式的结果只有两个,不会有第三个,成立就执行if,不成立就执行else,没有第三个。
6.块中代码可以任意写。
P88 IF-ELSE IF 结构
1.IF-ELSE 的缺点:只能判断1个条件。
新需求 :
需要按照顺序判断多个条件,只要一个成立,就要执行对应的事情,后面的就不需要再判断了。
只有前面条件不成立的时候才判断后面的条件。
2.IF-ELSE IF - ELSE IF - ELSE 结构。
2.1 作用
依次的按照顺序判断多个条件,只要1个成立,就会执行对应的代码。
只有前面的不成立,才继续判断下个。
2.2 语法
if (条件表达式1)
{
执行代码;
}
else if (条件表达式2)
{
执行代码;
}
else if (条件表达式3)
{
执行代码;
}
else
{
执行代码;
}
3.执行步骤
从上到下的依次判断每一个条件表达式的结果。
只要有1个条件表达式成立,就执行对应的快代码。
只有当前面的条件表达式不成立的时候才会继续向下判断。
如果所有的条件表达式都不成立,那么久会执行else中的代码。
4.使用注意
4.1.只要前面的条件成立,就会执行相应的代码。
执行完毕之后 立即结束这个结构。
哪怕后面的条件是成立的 也不会执行。
4.2.如果判断了后面的条件
那么就说明前面的条件是不成立的。
所以后面的条件中不需要特别的写前面的条件不成立。
4.3.判断的的顺序最好不要乱。
如果你要写乱,那么条件就要完整一些。
但是一般情况下,我们从上到下的,条件范围是逐步缩小的。
4.4.else可以省略
如果省略,那么就没有默认执行代码了。
4.5.else if的格数可以任意。
P90 - 三元表达式。
1.根据参与的操作数的格数将运算符分如下几类。
双目运算符/双元运算符: 指的是参与这个运算的操作数有2个。
+
-
*
/
%
>
<
……
单目运算符/一元运算符:只有1个数据参与运算
自增自减
++
--
三目运算符/三元运算符:指的是三个数据参与运算的运算符。
? :
2.三元表达式
2.1 语法:
条件表达式 ? 值1 : 值2 ;
三元表达式的结果是?
如果三元表达式成立,那么三元表达式的结果就是值1, 否则就是值2
int i = 1;
printf("%d\n",i > 0 ? 100 : 200);
输出结果为100。
同理,三元表达式可以用if语句来表示。
int i = 1;
if (i>0)
{
printf("100");
}
else
{
printf("200");
}
int i = 1;
i > 0 ? printf(">\n") : printf("<\n");
3.三元表达式可以部分代替if-else.
要得到1个数据,这个数据的大小是根据某个条件来的。
可以使用if-else,也可以使用三元表达式。
但是三元表达式更间接一些。
4.注意:
4.1.条件表达式可以是任意的表达式,只关注表达式结果,0为假,非0为真。
4.2.值1和值2可以是1个表达式,反正是各自的结果。
P91 - 如何产生1个随机数。
1.先引入1个系统头文件。
#include <stdlib.h> //(std 标准 lib 库)
2. 调用 arc4random_uniform 函数。
在其中传入一个整数n,就会返回一个0->(n-1)的随机数。
int num = arc4random_uniform(10);
就会产生0-9的随机数,并赋值给num.
3.如何产生1个指定范围的随机数。
int num =arc4random_uniform(最大数-最小数+1)+最小数;
产生1-33的随机数:
int num1 = arc4random_uniform(33)+1 ;
P94 - 题目讲解
5.自己写一个四舍五入的算法:
double 小数 = 0.0;
printf("输入一个小数:");
scanf("%f",&小数);
int 十倍小数 = 小数 * 10 ; //将用户数据扩大10呗。取出小数点后第一位
int 整数部分 = 十倍小数 / 10; //取出整数部分
int 小数点后第一位 = 十倍小数 % 10; //取出小数点后第一位
printf("四舍五入结果:%d\n", 小数点后第一位 > 4 ? 整数部分 + 1 : 整数部分);
double num = 0.0;
printf("输入一个小数:");
scanf("%lf",&num);
int i = num ; //整数部分
double xiaoShu = num - i; //小数部分
if(xiaoShu >= 0.5)
{
i++ ;
}
printf("四舍五入后的数为:%d\n",i);
P97- switch-case 结构
1.语法:
switch(表达式)
{
case 值1:
执行代码;
break;
case 值2:
执行代码;
break;
case 值3:
执行代码;
break;
case 值4:
执行代码;
break;
default:
执行代码;
break;
}
2.switch 后的表达式没有说必须是1个条件表达式。
3.执行步骤:
a. 先计算switch后面的表达式的结果:
b. 从上到下的将这个结果和每一个case块后面的值进行相等比较判断。
c. 只要有1个相等的,那么就执行其中的代码,执行完毕后,就结束整个switch结构。
d. 如果不相等 再判断下一个case的值。
e. 如果所有的case后面的值和表达式的值都不相等,就执行default中的代码.
4.例题:请用户输入一个星期数,输出相对应的英文。 1-7 其他的输出火星来的。
int weekDay = 0 ;
printf("输入一个星期数:");
scanf("%d",&weekDay);
switch (weekDay) {
case 1:
printf("Today is Monday\n");
break;
case 2:
printf("Today is Tuesday\n");
break;
case 3:
printf("Today is Wednesday\n");
break;
case 4:
printf("Today is Thursday\n");
break;
case 5:
printf("Today is Friday\n");
break;
case 6:
printf("Today is Saturday\n");
break;
case 7:
printf("Today is Sunday\n");
break;
default:
printf("你是火星人吗?\n");
break;
}
5.使用注意
5.1 switch 后面的小括号中可以写表达式、变量、常量。
5.2 case穿透
每一个case块后面的break在语法上是可以不写的。
break 的意思是 立即结束整个switch结构。
如果case块中没有break,那么就会直接穿透到下一个case中执行代码。
知道遇到break才会结束switch结构,或者执行完。
所以,一般情况下,我们不希望穿透下一个case中执行代码,每一个case后面都会加一个break;
如果多个case块的处理逻辑是一样的,那么我们可以利用穿透来简写代码:
5.2.1 穿透案例:根据月份打印季节:
int month = 0 ;
printf("请输入月份");
scanf("%d",&month);
switch (month) {
case 1:
case 2:
case 3:
printf("春天来了,万物复苏...\n");
break;
case 4:
case 5:
case 6:
printf("夏天夏天悄悄过去留下小秘密...\n");
break;
case 7:
case 8:
case 9:
printf("秋风扫落叶...\n");
break;
case 10:
case 11:
case 12:
printf("冬天来了,春天还会远吗?\n");
break;
default:
printf("火星来的吗?\n");
break;
}
5.3 switch 后面的表达式任意类型都是可以的,除了实型(小数)。
5.4 case块可以加大括号,没有任何影响,但是一般情况下不加。
5.5 case块下面可以写任意行代码,只要复合你的逻辑。
如果要声明变量,就必须要使用大括号。
5.6 case块可以有任意个,根据你的逻辑来。
default可以省略,如果省略就没有默认执行代码了。
5.7 练习:
用户输入一个年份,一个月份,显示这一年这一月有多少天。
int year = 0 ;
int month = 0 ;
printf("请输入年份 月份(空格分隔)");
scanf("%d %d",&year,&month);
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 9:
case 11:
printf("%d年%d月有31天\n",year,month);
break;
case 4:
case 6:
case 8:
case 10:
case 12:
printf("%d年%d月有30天\n",year,month);
break;
case 2:
if(year % 400 == 0 ||( year % 4 == 0 && year % 100 != 0))
{
printf("%d年2月有29天\n",year);
}
else
{
printf("%d年2月有28天\n",year);
}
break;
default:
printf("火星来的吗?\n");
}
P102:switch-case 与 if 结构
6.switch-case 与 if 结构:
6.1 能够使用switch-case结构写出来的代码一定可以用if结构写出来。
if结构写出来的代码用switch-case代码不一定能够写出来
6.2 switch结构只能做等值判断,不能直接做范围判断。并且case后面的数据不能有变量。
if结构可以做等值判断,也可以做范围判断
6.3 如果做等值判断, 建议使用 switch
如果做范围判断 才用 if.
P103: 程序的调试:
在代码行号区域单击 就是在所属行下了断点。 拖动断点标志到代码区丢掉,就可以取消断点。
1. 跟踪CPU的执行顺序。检查代码的执行逻辑。(step over 按钮)
2. 使用调试来监视变量的值在运行的过程中的变化。(找BUG源头)
调试的时候把鼠标放到代码里的变量上,或者在调试区可以直接查看变量的值。
3. 退出调试模式:(continue program execution 按钮)