课堂笔记
算术运算符
+(加)
-(减)
*(乘)
/(除) (注意:除法的运算结果和运算对象的数据类型有关,两个数都是int,则商就是int,若商有小数,则截取小数部分;被除数和除数中只要有一个或者两个都是浮点类型数据,则商也是浮点型,不截取小数部分 )
%(取余数) (注:取余的运算对象必须是整数,结果是整数后的余数,其余数的符号与被除数相同)
测试取模运算字符的例子
#include<stdio.h>
int main(void)
{
printf("%d %d %d %d %d %d %d",3%3,13%-3,-13%3,-13%-3,-13%23,3%5);
return 0;
}
运行结果为下图
逻辑运算符
c语言的真假处理
- 非零为真
- 零是假
- 真是用1表示,假是用0表示
!(非)
- !真 即假
- !假 即真
&&(并且)
- 真&&真 即真
- 真&&假 即假
- 假&&真 即假
- 假&&假 即假 &&左边的表达为假,右边的表达肯定不会执行
如上图1,左边的表达(3>2)为真,所以能执行右边的表达(k=8)
代码为
# include<stdio.h>
int main(void)
{
int i = 10;
int k = 20;
int m;
m = (3>2) && (k=8);// 不含有分号的是表达式 含有分号的是语句
printf("m = %d, k = %d\n",m ,k);
return 0;
}
如上图2,左边的表达(1>2)为假,所以不能执行右边的表达
其代码为
# include<stdio.h>
int main(void)
{
int i = 10;
int k = 20;
int m;
m = (1>2) && (k=5);// 不含有分号的是表达式 含有分号的是语句
printf("m = %d, k = %d\n",m ,k);
return 0;
}
||(或者)
- 真||假 即假
- 假||真 即真
- 真||真 即真
- 假||假 即假 ||左边的表达式为真,右边的的表达式肯定不会执行
优先级别
算术>关系>逻辑>赋值
赋值运算符
1.=
2.+=
3.*=
4./=
5.-=
eg:a+=3等价于a=a+3
流程控制(重点)
什么是流程控制?
- 流程控制就是流程代码执行的顺序
流程控制的分类
1.顺序
2.选择
- 定义:某些代码可能执行,也有可能不执行,有选择的执行某些代码
分类
If
- 1.if最简单的用法
格式:
if(表达式)
语句
功能:如果表达式为真,执行语句;如果表达式为假,语句不执行
- if的范围问题
if(表达式)
语句A;
语句B;
解释:if默认只能控制语句A的执行或不执行,if无法控制语句B的执行或不执行。换句话讲就是B语句一定会执行
if(表达式)
{
语句A;
语句B;
}
注意:此时if可以控制A的和B
故如果想控制多个语句的执行或者不执行就必须把这些语句用{}括起来
-
if····else····的用法
-
if···else if····else···的用法
-
f举例——分数的等级
//逻辑表达式最终值的测试,if秋分数的等级
# include<stdio.h>
int main(void)
{
float score;
printf("输入你的成绩\n");
scanf("%f",&score);
if (score>100)
printf("不可能\n");
else if (score>=90 && score<=100)//不能写成90<=score<=100,因为无论90<=score为真或为假输出的值只会是1或0,而1或0始终小于100
printf("优秀");
else if (score>=80 &&score<=90)
printf("良好");
else if (score>=60 &&score<=90)
printf("及格");
else if (score<=60 && score>=0)
printf ("不及格");
return 0;
}
- if的常见问题 1>. 空语句的问题
if(3>2); 等价于
if(3 > 2)
; //这是一一个空语句
2>.
if (表达式1)
else
B;(是正确的)
3>.
if (表达式1);
A;
else
B;(是错误的)
if (表达式1)
A;
else if (表达式2)
B;
else if (表达式3)
else
(即便表达式1和2都成立,也只会执行A语句)
4>.
if (表达式1)
A;
else if (表达式2)
B;
else if (表达式3)
C;
(这样写语法不会出错,但逻辑上有漏洞)
5>.
if(表达式1)
A;
else if(表达式2)
B ;
else if(表达式3)
C;
else(表达式4)
D;
(这样写是错误的,正确的写法是
要么去掉(表达式4)保留else
要么else后面加上if且保留(表达式4))
6>.
if(表达式1)
A;
else if(表达式2)
B ;
else if(表达式3)
C;
else(表达式4);
D;
(这样写语法上不会错,但逻辑上是错误的,相当于else执行的是(表达式4))
else(表达式4);
D;
等价于
else
(表达式4);
D;
switch
需要看懂电梯程序
int main(void)
{
int a;
printf("请输入楼层: ");
scanf("%d",&a);
switch (a)
{
case 1:
printf("1层");
break;
case 2:
printf("2层");
break;
case 3:
printf("3层");
break;
default:
printf("还没那么高");
break;
}
return 0;
}
3.循环
定义:某些代码会被重复执行
分类
for
- 格式
for(1;2;3)
语句A;
注意:第一次循环执行顺序先执行1再执行2再执行A最后执行3,之后每一次循环不执行1先执行2再执行A最后执行3
//for循环例子
int main(void)
{
int i;
int sum = 0;
for ( i = 1; i < 10; i+=2)
sum = sum + i;//++1就是1+i
printf("i = %d",i);//此时i的值为11,并不为9,因为每次循环都要执行完所有步骤
printf("sum = %d",sum);
return 0;
}
- 执行的流程(重点)
1.for和if的嵌套使用
图1:
图2:
由上两图得知printf的位置不同,输出结果也不同
2.单个for循环使用
3.多个for循环的嵌套使用(重点)
for(a;b;c) // 1
for(d;e;f) // 2
A; // 3
B; // 4
整体是两个语句,1,2,3是第一个语句。4是第二个语句
执行顺序先执行a->b->d->e->A->f->e->A······->c(一直执行到e不成立后执行c)->
b->d->e->A->f->e->A·····一直循环执行直到b不成立后最后执行B
int main (void)
{
int i,j;
for (i=0;i<3;++i)
{
printf("111\n");
for ( j = 2; j< 5; ++j)
{
printf("222\n");
printf("333\n");
}
printf("444\n");
}
return 0;
}
运行结果如图
- for的范围问题
for(表达式)
语句A;
语句B;
解释:if默认只能控制语句A的执行或不执行,if无法控制语句B的执行或不执行。换句话讲就是B语句一定会执行
for(表达式)
{
语句A;
语句B;
}
注意:此时for可以控制A的和B
故如果想控制多个语句的执行或者不执行就必须把这些语句用{}括起来
- for的例题
1+1/2+1/3····+1/100
# include<stdio.h>
int main(void)
{
int i;
float sum = 0;
for (i=1;i<=100;++i)
{
sum = sum+ 1/(float)(i);//sum = sum + (float)(1/i),这样写是不对的
//上式也可以写成:sum = sum + 1.0/i;
}
printf("sum=%f\n",sum);
return 0;
}
输出结果
while
- 1.执行顺序
格式:
while (表达式)
语句;
while的简单用法
# include<stdio.h>
int main(void)
{
int i;
int sum = 0;
i =1;
while (i<101)
{
sum = sum +i;
++i;
}
printf("sum=%d\n",sum);
return 0;
}
输出结果如下图
-
2.与for的相互比较
for(1;2;3)
A;
等价于
1;
while(2)
{
A;
3;
}
注:while和for可以互相转化,但for的逻辑性更强,推荐多使用for -
3.举例
从键盘输入一个数字,如果该数字是回文数,则返回yes,否则返回no
回文数:正着写和倒着写都一样 eg:121
do ····while
格式:
do
{
·····
}
while (表达式);
注:主要用于人机交互
do···while并不等价于for,也不等价于while
例子:一元二次方程
# include <math.h>
int main(void)
{
double a, b, c;
double delta;
double x1,x2;
do
{
printf("请输入系数\n");
printf("a= ");
scanf("%lf",&a);
printf("b= ");
scanf("%lf",&b);
printf("c= ");
scanf("%lf",&c);
delta = b*b - 4*a*c;
if (delta > 0)
{
x1 = (-b + sqrt(delta)) / (2*a);
x2 = (-b - sqrt(delta)) / (2*a);
printf("该一元二次方程有两个解, x1 = %lf, x2 = %lf\n", x1, x2);
}
else if (delta == 0)
{
x1 = (-b) / (2*a);
x2 = x1;
printf("该一元二次方程有一个唯一解, x1 = x2 = %lf\n", x1, x2);
}
else
{
printf("无解\n");
}
} while (1);
return 0;
}
运行结果如下图
break和continue
1.break
break如果用于循环是用来终止循环
break如果用于switch,则是用于终止switch
break不能直接用于if,除非if属于循环内部的一一个子句
例子:
for (i=0; 1<3; ++i )
{
if (3>2)
break; (break虽然是if内部的语句,但break終止的确是外部的for循环)
printf("aasss\n"); (此表达式永远不会输出)
}
-
在多层循环中,break只能终止最里面包裹它的那个函数 例子: .
for (i=0; i<3; ++i)
{ for (j=1; j<4; ++j)//break能终止距离它最近的循环
printf("同志们好!\n"); } -
在多层switch嵌套中,break只能终止距离它最近的switch 例子:
2.continue
用于跳过本次循环余下的语句,
转去判断是否需要执行下次循环
例子1:
for (1; 2; 3)
{
A;
B;
continue; //如果执行该语句,则执行完该语句后,会执行语句3, C和D都会被跳过去,C和D不会被执行
C;
D;
}
例子2:
while (表达式)
{
A;
B;
continue;
//如果执行该语句,则执行完该语句后,会执行表达式,C和D都会被跳过去,C和不会被执行
C;
D;
其他课堂笔记
如何看懂一个程序
1.流程
2.每个语句的功能
3.试数
强制类型转化
格式:(数据类型)(表达式)
功能: 把表达式的值强制转化为前面所执行的数据类型
eg:(int)(4.5+2.2)最终值为6
(float)(5)最终值为5.000000
课后作业
5.10第七题
int main(void)
{
char c1,c2;
int diff;
float num;
c1='s';
c2='0';
diff = c1-c2;
num = diff;
printf("%c%c%c:%d %3.2f\n",c1,c2,c1,diff,num);
return 0;
}
输出结果如下
5.10第13题
5.11第3题
int main()
{
int a,b,c;
printf("请输入总天数:");
scanf("%d",&a);
b=a/7;//算有多少周
c=a%7;//算还剩多少天
printf("%d days are %d weeks %ddays\n",a,b,c);
return 0;
}
5.11第8题(参考了答案自己对着敲了一遍
)
int main(void)
{
int second_operand = 0;
int first_operand = 0;
printf("This program computers moduli.\n");
printf("Enter an integer to serve as the second operand: \n");
scanf("%d",&second_operand);
printf("Now enter the first operand: \n");
scanf("%d",&first_operand);
printf("%d %% %d is %d\n",first_operand,second_operand,first_operand%second_operand);
printf("Enter next number for first operand (<= 0 to quit): \n");
scanf("%d",&first_operand);
while (first_operand > 0)
{
printf("%d %% %d is %d\n",first_operand,second_operand,first_operand%second_operand);
printf("Enter next number for first operand (<= 0 to quit): \n");
scanf("%d",&first_operand);
}
printf("Done\n");
}
6.16第五题(参考了答案后自己背着打出来的)
int main(void)
{
int i,j,k;
char letter;
printf("Please enter a capital letter.\n");
scanf("%c",&letter);
k = letter - 'A' + 1;
for (i = 0; i < k;i++) //确定行数
{
for (j = 0; j <=k-i; j++) //除输出的那个字符外,其余用空格填充
printf(" ");
for (j = 0;j <= i;j++) //升序输出
printf("%c",'A' + j);
for (j = i - 1;j >= 0;j--) //降序输出
printf("%c",'A' + j);
printf("\n");//该表达式作用为让每次输出都要换行
}
return 0;
}
6.16第12题(实在做不出来看的答案,但是大概能看懂答案)
#include<math.h>
int main(void)
{
int limit;
int i;
float sum1,sum2;
printf("Please enter the limit.\n");
while(scanf("%d",&limit) == 1 && limit>0 )
{
for (i = 0;i < limit;i++)
{
sum1 += 1.0/(1.0 + i);
sum2 += 1.0/(1.0 + i)*pow(-1,i);
}
printf("The firse result is %f\n",sum1);
printf("The second result is %f\n",sum2);
}
return 0;
}
711第2题
a .90<=number&&number<100
b .ch!==q||k
c .1<=number&&number<=9&&number!=5
d .number!<=9&&number!>=1
7.11第10题
int main(void)
{
char ch;
while ((ch == getchar()) !='#')
{
if(ch !=='\n');//让下个表达式独立于if函数
printf("step 1\n");
if (ch 1!=='c')
else if (ch == 'b')
else if (ch == 'h')
printf("step 2\n");
printf("step 3\n");
}
printf("done\n");
return 0;
}