学习笔记
一、运算符
算数运算符
1. + --- 加
2. — --- 减
3. * --- 乘
4. / --- 除
5. % --- 取余数
关系运算符
1. > 大于
2. >= 大于等于
3. < 小于
4. <= 小于等于
5. != 不等于
6. == 等于
逻辑运算符
1. !非
2. && 并且
3. || 或
赋值运算符
1. =
2. +=
3. *=
4. / =
5. -=
一些琐碎的运算符知识
1.自增[或者自减]
前自增--++i
后自增--i++
前自增和后自增的异同:
相同:最终都使i的值加1不同
不同:前自增整体表达式的值是i加1之后的值
后自增整体表达式的值是i加1之前的值
为什么会出现自增
代码更精练
自增的速度更快
学习自增要明白的几个问题
1.我们编程时应该尽量屏蔽掉前自增和后自增的差别
2.自增表达式最好不要作为一个更大的表达式的一部分来使用
或者说
i++和++i单独成一个语句,不要把它作为一个完整复合语句的一部分来使用
例:
nt m= i++ + ++i + i +i++;(这样写不但是错的而且还没有意义)
printf("%d %d %d",i++,++i,i); (同上)
2.三目运算符
格式:
A ? B : c
等价于
if (A)
B;
else
C;
3.逗号表达式
格式: A,B,C,D
功能:从左到右执行
优先级别
算术 >关系>逻辑>赋值
二、除法与取余运算符
三、逻辑运算符
!真 是 假
!假 是 真
真&&真 是 真
真&&假 是 假
假&&假 是 假
真||真 是 真
真||假 是 真
假||假 是 假
C语言对真假的处理
非零是真
零是假
真是1表示
假是0表示
##### 当左边的表达式是假&&时右边不执行
##### 只有当左边的表达式是假||时右边执行
四、流程控制
1.什么是流程控制
程序代码执行的顺序
2.流程控制的顺序
顺序执行、选择执行(某些代码可能执行,也可能不执行,有选择的执行某些代码)、循环执行
3.选择执行: if
-
if的简单用法
-
格式: if (表达式)
-
如果表达式为真,执行语句;不成立,不执行。
-
实操:
-
-
if的范围问题
-
if默认只能控制一个语句的执行
-
实操:
A语句成立时:
A语句不成立时:
(B语句一定会执行)
-
-
if控制多个语句:
格式:if { 语句A; 语句B; } -
if else的用法
- 默认控制一个语句
- 实操:
-
if ... else if ... else语句
-
格式:
if (1) A; else if (2) B; else if (3) C; else D; -
实操:
-
- C语言对真假的处理 非零是真
零就是假
真用1表示
假用0表示
-
举例一:求分数的等级 代码:
#include <stdio.h> int main (void) { float score ;
printf("请输入您的成绩:"); scanf("%f", &score); if ( score > 100) printf("做梦!\n"); else if (score >= 90 && score <= 100) printf("优秀!\n"); else if (score >= 80 && score <90) printf("良好!\n"); else if (score >= 60 && score < 80) printf("及格!\n"); else printf("不及格\n"); return 0; }- 结果:
-
举例二:互换两个数字 代码:
include <stdio.h>
int main (void) { int i = 3; int j = 5; int t;
t = i; i = j; j = t; printf("i = %d, j = %d\n", i, j); return 0; }
结果:
-
举例三:对任意三个数字进行排序 代码:
# include <stdio.h> int main(void> int a, b, c; int t; printf ("请输入三个整数;"); scanf("%d %d %d", &a, &b, &c); if (a < b) { t = a; a = b; b = t; } if (a < c) { t = a; a = c; c = t; } if (b < c) { t = b; b = c; c = t; } printf("%d %d %d\n",a ,b ,c); return 0; }- 结果:
-
if的常见问题解析
if (表达式1) A; else if (表达式2) B; else if (表达式3) C; else D;-
空语句问题:if()后面不加分号
-
即使if...else有多个语句成立,也只会执行表达式1
-
else后面不能加表达式,除非加if后再加表达式
-
else (表达式);等价于无意义的语句
-
4.循环执行
-
循环的定义
某些代码会循环执行
-
分类:for、while、do...while
-
for的简单用法
- 实操:
-
for和if的嵌套使用 代码:
include <stdio.h>
int main (void) { int i ; int sum = 0;
for (i=3; i<=100; ++i) { if (i%3 == 0) sum = sum + i; } printf("sum = %d\n", sum);
return 0; }
- 实操:
-
强制类型转换和求和公式
-
强制类型转换
1.格式:(数据类型)(表达式)
2.功能:包表达式的值强制转换为前面所执行的数据类型
3.例子:
(int)(4.5+2.2)---6 (float)(5)---5.000000
代码:
# include <stdio.h> int main (void) { int i ; float sum = 0; for (i=3; i<=100; ++i) { sum = sum + 1 / (float)(i); } printf("sum = %f\n", sum); return 0; }- 实操:
-
-
浮点数的存储所带来的问题
-
float和double都不能保证可以精确的存储一个小数
-
为什么循环中更新的变量不能定义为浮点型
- 因为浮点型是一种非准确性存储
-
for和if的嵌套使用的四个习题
1.100以内的奇数和
代码:
# include <stdio.h>
int main (void)
{
int i ;
int sum = 0;
for (i=3; i<=100; ++i)
{
if (i%2 == 1)
sum = sum + i;
}
printf("sum = %d\n", sum);
return 0;
}
实操:
2.100以内的奇数个数
代码:
# include <stdio.h>
int main (void)
{
int i ;
int sum = 0;
for (i=1; i<=100; ++i)
{
if (i%2 == 1)
sum = sum + 1;
}
printf("sum = %d\n", sum);
return 0;
}
实操:
3.100以内的奇数的平均值
代码:
# include <stdio.h>
int main (void)
{
int i ;
int sum = 0;
int cnt = 0;
float avg;
for (i=1; i<=100; ++i)
{
if (i%2 == 1)
{
sum = sum += i;
++cnt;
}
}
avg = sum / cnt;
printf("avg = %f\n", avg);
return 0;
}
实操:
4.100以内的奇数和,再求偶数和
代码:
# include <stdio.h>
int main (void)
{
int i ;
int sum1 = 0;
int sum2 = 0;
for (i=1; i<=100; ++i)
if (i%2 == 1)
{
sum1 = sum1 += i;
}
else
{
sum2 = sum2 += i;
}
printf("奇数和 = %d\n", sum1);
printf("偶数和 = %d\n", sum2);
return 0;
}
实操:
多个for循环的使用
for(1;2;3;)
for(4;5;6;)
A;
B;
整体是两个语句:
1;2;3;是第一个
4;5;6;是第二个
for(1;2;3;)
for(4;5;6;)
{
A;
B;
}
整体上是一个语句
for(7;8;9;)
for(1;2;3;)
{
A;
B;
for(4;5;6;)
C;
}
总体上是一个语句
实操:
# include <stdio.h>
int main (void)
{
int i ;
int j;
for (i=1; i<=3; ++i)
{
printf ("111\n");
for(j = 0; j < 3; ++j )
{
printf("222\n");
printf("333\n");
}
printf("444\n");
}
return 0;
}
结果:
while语句
1.执行顺序
格式
while(表达式)
A;
2.与for相比较
for和while可以相互转换,但for的逻辑性更强,不容易出错。
3.举例:判断回文数
代码:
int main (void)
{
int val ;
int sum;
int m;
printf("请输入您要判断的数字: ");
scanf("%d", &val);
m = val;
while (m)
{
sum = sum * 10 + m%10;
m /= 10;
}
if (sum == val)
printf("Yes\n");
else
printf("No\n");
return 0;
}
实操:
4.do...while语句
格式:
do
{
A;
} while (表达式);
主要用于人机交互
并不等价于for和while
举例:一元二次方程
# include <stdio.h>
# include <math.h>
int main (void)
{
double a, b, c;
double delta;
double x1, x2;
do
{
printf ("请输入一元二次方程的三个系数: ");
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 = x2 = (-b) / (2*a);
printf("有唯一解,x1 = x2 = %lf\n", x1, x2);
}
else
{
printf("无解\n");
}
} while(1);
return 0;
}
swith语言
break和continue语句
-
break如果用于循环是用于终止循环;
break如果用于switch,则是用于终止switch;
break不能直接用于if,除非if属于循环内部的一个语句;
再多层循环中,break只能终止最近的循环;
再多层switch中,break只能终止最近的switch。
-
continue用于跳过本次循环余下的语句,转去执行其他的语句
五、如何看懂一个程序
分三步: 1.流程 2.每个语句的功能 3.试数
对一些小算法的程序
尝试自己编程解决它,大部分人都自己无法解决如果解沃不了,就看答案 。
关键是把答案看懂,这个要花很大的精力,也是我们学习的重点。
看懂之后尝试首己去修改程序,并且知道修改之后程序的不同输出结果的含义照着答案去敲。
不看答案,自己独立把答案敲出来。
如果程序实在无法彻底理解,就把它背会。
举例:斐波拉契数列
代码:
# include <stdio.h>
int main (void)
{
int n;
int f1, f2, f3;
int i;
f1 = 1;
f2 = 2;
f1 = 1;
f2 = 2;
printf("请输入数字: ");
scanf("%d", &n);
if (1 == n)
{
f3 = 1;
}
else if (2 == n)
{
f3 = 2;
}
else
{
for (i=3; i<=n; ++i )
{
f3 = f1 + f2;
f1 = f2;
f2 = f3;
}
}
printf("%d\n", f3);
return 0;
}
实操:
六、进制
1.什么叫n进制逢n进一
2.把r进制转成十进制
3.十进制转成r进制
4.不同进制所代表的数值之间的关系
十进制的3981转化化成十六进制是F8D
十进制的3981和十六进制的F8D所代表的本质上都是同一个数
课后作业
5.10第七题
第十三题
--x
m = n%k
p = (q / p) - a
x = (a + b) / (c*d)
5.11第三题
代码:
# include <stdio.h>
int main (void)
{
int i;
int j;
int k;
printf("请输入天数: ");
scanf("%d", &i);
j = i / 7;
k = i % 7;
printf("%d days are %d weeks, %d days.\n", i, j ,k);
return 0;
}
第八题
代码:
# include <stdio.h>
int main (void)
{
int a, b, x;
printf("请输入第一个数:");
scanf("%d", &a);
printf("请输入第二个数:");
scanf("%d", &b);
if (a > 0 && b > 0)
{
x = b % a;
printf("%d", x);
}
else
printf("程序结束");
return 0;
}
6.16
第五题:
实在看不懂题目的意思,但按答案运行了一遍。
第十二题
代码:
#include<stdio.h>
int main()
{
double t;
double i;
printf("请输入项数:");
while ((scanf ("%lf", &t) == 1) && (t > 0))
{
int a = 1;
double sum1 = 0, sum2 = 0;
for (a = 1.0; a <= t; ++a, i = 0-i)
{
sum1 += 1.0 / a;
sum2 += a*1.0 / a;
}
printf("sum1 = %lf, sum2 = %lf", sum1, sum2);
}
printf("结束程序");
return 0;
}
结果:第二个收敛
第十八题
代码:
#include<stdio.h>
int main()
{
int f;
int a = 1;
for (f = 5; f < 150; ++a)
{
f = 2 * (f - a);
printf("第 %d 周有 %d 个朋友\n", a, f);
}
return 0;
}
结果:
7.11
第二题
a. number >= 90 && number <100;
b. ch!='q' && ch!='k';
c. number >= 1 && number <= 9 && number != 5;
d. number < 1 || number >9
第10题
代码:
#include<stdio.h>
int main()
{
char ch;
while ((ch = getchar()) != '#')
{
if (ch != '\n')
{
printf("step 1\n");
if (ch == 'b')
break;
else if (ch != 'c')
{
if (ch != 'h')
printf("step 2\n");
printf("step 3\n");
}
}
}
printf("Done\n");
return 0;
}
结果: