字节
字节是存储数据的单位
是硬件所能访问的最小单位
1个字节 == 8 位
1K = 1024字节
1M = 1024K
1G = 1024M
1.5G可以存放的数据:
1.5x1024x1024x1024x8
内存条的控制只能精确到位
一个字节 由 8个位 组成。
一个 int 占 4个字节
一个long占 8个字节
一个char占 1个字节
不同类型数据之间相互赋值的问题
int i = 45;
long j = 102345;
i = j;
printf("%d %d\n", i, j);
float x = 6.6;
double y = 8.8;
printf("%f %lf", x, y);
暂不考虑
什么是SCII
#include <stdio.h>
int main(void) {
// insert code here...
char ch = 'A';
// char ch = 'AB'; // AB是字符串。所以error,类型不一致
return 0;
}
字符 和 字符串的区别
#include <stdio.h>
int main(void) {
char ch = 'A';
// char ch = 'AB'; // error: AB是字符串。所以error,类型不一致
// char ch2 = "A"; // error: 所有字符串末尾都默认有\0 作为结尾,这里应该是两个字符 A 和 \0,char只能存放一个字符
// char ch3 = 'AB'; //error 'AB'是错误的
// char ch = 'B'; //error: 以为ch变量已经在12行定义了,这样会导致重复定义
return 0;
}
以下代码不会报错
因为任何字符 都是以数字,二进制存储的
#include <stdio.h>
int main(void) {
char ch = 'A';
printf("%d\n",ch); // 65
return 0;
}
什么是ASCII
ASCII不是一个值,而是一种规定,
ASCII规定了不同的字符是使用哪个装数值去表示
它规定了
‘A‘ -- 65
‘B‘ -- 66
‘a’ -- 97
'b' -- 98
'0' -- 48
还有其他不同的码
GB2312
utf-8
等
不同的码 规定 字符使用不同的数字去表示。
处理遗留垃圾值的情况
#include <stdio.h>
int main(void) {
int i;
scanf("%d", &i);
printf("i = %d\n", i);
char ch;
// 清楚用户上面遗留的非法输入
while ((ch = getchar()) != '\n') {
continue;
}
int j;
scanf("%d", &j);
printf("j = %d \n", j);
return 0;
}
运算符
算术运算符
+ - * / % 加 减 乘 除 取余数
除法/的运算结果和运算对象的数据类型有关,两个数都是int 则商就是int,若商有小数,则截取小数部分;被除数和除数中只要有一个或两个都是浮点型数据,则商也是浮点型,不截取小数部分。
取余%的运算对象必须是整数,结果是整除后的余数,其余数的符号与被除数相同
关系运算符
> >= < <= != ==
逻辑运算符
! 非 && 并且 || 或
c语言对真假的处理
非零是真
零是假
真是1表示假是0表示
#include <stdio.h>
int main(void) {
int i = 10;
int k = 20;
int m;
m = (3 > 2) && (k = 8); // m要么0 要么1. 左边 真 右边 真
printf("m = %d, k = %d\n", m ,k);
return 0;
}
m = 1, k = 8
#include <stdio.h>
int main(void) {
int i = 10;
int k = 20;
int m;
m = (1 > 2) && (k = 8);
printf("m = %d, k = %d\n", m ,k);
return 0;
}
m = 0, k = 20
为什么k为20?
&& 左边的表达式为假右边的表达式肯定不会执行。
因为 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;
}
m = 1, k = 20
赋值运算符
= += *= /= -=
优先级
算术 > 关系 > 逻辑 > 赋值
scanf 用法
#include <stdio.h>
int main(void) {
int i;
scanf("%d", &i);
printf("i = %d\n", i);
int ch;
scanf("%c", &ch);
printf("ch = %c\n", ch);
return 0;
}
9km
i = 9
ch = k
流程控制
什么是流程控制
程序代码执行的顺序
流程控制的分类
顺序
选择
什么是选择
某些代码,可能执行,也可能不执行,选择性执行某些代码。
分类
if
switch
if
- if最简单的用法
- if的范围问题
- if… else. … 的用法
- if. . else if…e1se…的用法
- C语言对真假的处理
- if举例–求分数的等级
- if的常见问题解析
- if最简单的用法
#include <stdio.h>
int main(void) {
if (3>2) {
printf("AAAA\n");
}
return 0;
}
#include <stdio.h>
int main(void) {
if (3) {
printf("AAAA\n");
}
if (0) {
printf("BBBB\n");
}
if (0 == 0) {
printf("CCCC\n");
}
return 0;
}
AAAA
CCCC
- if的范围问题
if 只能控制离它最近的一个语句,如果不用 brackets 括号。
或者这么说:
if默认的只能控制一个语句的执行或不执行。
#include <stdio.h>
int main(void) {
if (1 > 2)
printf("AAAA\n");
printf("BBBB\n");
return 0;
}
BBBB
3. if… else. … 的用法
#include <stdio.h>
int main(void) {
int i, j;
scanf("%d %d", &i, &j);
if (i > j) {
printf("i 大于 j\n");
} else{
printf("i 小于 j\n");
}
return 0;
}
4.if. . else if…else…的用法
#include <stdio.h>
int main(void) {
double delta = 3;
if (delta > 0) {
printf("有两个解!\n");
} else if (delta == 0){
printf("有一个唯一解!\n");
} else{
printf("无解!\n");
}
return 0;
}
例子:
成绩判断
//
// main.c
// helloworld
//
//
#include <stdio.h>
int main(void) {
float score; // socre分数
printf("请输入您的考试成绩:");
scanf("%f", & score);
if (score >= 100) {
printf("这是梦!\n");
} else if (score >= 90){
printf("优秀A\n");
} else if (score >= 80){
printf("良好B\n");
} else if (score >= 60){
printf("及格C!\n");
} else if (score >= 0){
printf("不及格D!\n");
} else{
printf("输入分数过低!");
}
return 0;
}
求三个数字的最大值
#include <stdio.h>
int main(void) {
int a, b, c;
printf("请输入三个数字: ");
scanf("%d %d %d", &a, &b, &c);
int t;
// 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的常见问题解析
#include <stdio.h>
int main(void) {
if (1 > 2);
printf("AAAA\n");
printf("BBBB\n");
return 0;
}
下面代码报错
#include <stdio.h>
int main(void) {
if (3 > 2);
printf("哈哈\n");
else
printf("嘿嘿\n");
return 0;
}
#include <stdio.h>
int main(void) {
if (3 > 2)
printf("AAAA\n");
else if (3 > 1)
printf("BBBB\n");
else
printf("CCCC\n");
return 0;
}
AAAA
#include <stdio.h>
int main(void) {
if (3 > 2)
printf("AAAA\n");
else if (3 > 1)
printf("BBBB\n");
else (5 > 10);
printf("CCCC\n");
return 0;
}
AAAA
CCCC
switch
循环
什么是循环
某些代码被重复执行
分类
for
简单例子
1+2+3+。。。。+99+100
求和
#include <stdio.h>
int main(void) {
int i = 0;
int sum = 0;
for (i = 1; i <= 100; i++)
sum = sum + i;
printf("sum = %d\n", sum);
return 0;
}
sum = 5050
先执行1,判断2是否成立,成立执行4,执行3 标志循环1次结束
判断2,成立执行4,执行3
判断2,成立执行4,执行3
判断2,成立执行4,执行3
判断2,不成立,退出循环。
1只有刚开始会执行1次,然后就再也不执行了。
3完了,表示循环1次结束。
3玩了,一定会执行2。
2不成立,退出循环。
A3B4 例子
#include <stdio.h>
int main(void) {
int i = 0;
for (i = 1; i < 4; ++i)
printf("AAAA\n");
printf("BBBB\n");
return 0;
}
AAAA
AAAA
AAAA
BBBB
#include <stdio.h>
int main(void) {
int i = 0;
int sum;
for (i = 3; i < 12; ++i){
if (i % 3 == 0) {
sum = sum + i;
}
}
printf("sum = %d\n", sum);
return 0;
}
3 6 9 = 18
sum = 18
求 1+ 1/2 + 1/3 + … + 1/ 99 + 1/100的和的结果
int main(void) {
int i = 0;
float sum;
for (i = 1; i <= 100; ++i){
// sum = 1/(i * 1.0) + sum;
sum = (float)1/i + sum;
}
printf("sum = %f\n", sum); // float 必须用%f输出
return 0;
}
sum = 5.187378
浮点数存储问题
float 和 double 都不可以保证 精确存储一个小数
例子
求1到100之间的奇数之和
求1到100之间的奇数的个数
1到100之间的奇数的平均值
多个for循环的嵌套使用
1 2 4 5 A 6
5 A 6
5 A 6
5 A 6
5 A 6
5不符合 退出
3 2
4 5 A 6
5 A 6
5 A 6
5 A 6
5 A 6
5不符合 退出
3 2
4 5 A 6
5 A 6
5 A 6
5 A 6
5 A 6
5不符合 退出
3
2 不符合 退出
B
执行完毕
while
1.执行顺序
格式:
while(表达式)
语句;
2.和for的相互比较
3.举例子
从键盘输入一个数字,如果该数字是回文数, 则返回yes,否则返回no 回文数:
正着写和倒着写都一样
比如:121 12321 都是回文数
#include <stdio.h>
int main(void) {
int val;
int m;
int sum;
printf("请输入您需要判断的数字: ");
scanf("%d", &val);
m = val;
sum = 0;
while (m) {
sum = sum * 10 + m % 10;
m /= 10;
}
if (sum == val) {
printf("Yes!\n");
} else {
printf("No!\n");
}
return 0;
}
试数
/**
1. m = 1234 成立
sum = 0 * 10 + 1234 % 10 = 4
m = m/10 = 123
2. m = 123 成立
sum = 4 * 10 + 123%10 = 43
m = 123/10 = 12
3. m = 12 成立
sum = 43 * 10 + 12%10 = 432
m = 12/10 = 1
4. m = 1 成立
sum = 432 * 10 + 1%10 = 4321
m = 1/10 = 0
5. m = 0 不成立
最终sum = 4321
*/
斐波拉契数列
/**
斐波拉契数列
1 2 3 5 8 13 21 34
*/
#include <stdio.h>
int main(void) {
int n;
int f1,f2,f3;
f1 = 1;
f2 = 2;
printf("请输入您需要的序列:");
scanf("%d",&n);
if (1 == n) {
f3 = 1;
} else if (2 == n){
f3 = 2;
} else{
for (int i = 3; i <= n; ++i) {
f3 = f1 + f2;
f1 = f2;
f2 = f3;
}
}
printf("%d\n", f3);
试数
/**
n = 5
i = 3
f3 = 1 + 2 = 3
f1 = 2
f2 = 3
f1 = 1 f2 = 2
n 5
i 3 4 5 6
f3 3 5 8 13
f1 2 3 5 8
f2 3 5 8
*/
4.什么时候用while,什么时候用for
自己体会
do while
主要是用于 人机交互
do while 先执行后执行
while 先判断后执行
while内部很可能1次都不执行
do while 内部一定会执行1次
例子
#include <stdio.h>
#include <math.h>
int main(void) {
double a, b, c;
double delta;
double x1, x2;
char ch;
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", &x1, &x2);
} else if (delta == 0){
printf("有唯一解, x1 = x2 = %lf", &x1);
} else{
printf("无解!");
}
printf("您想继续吗? (Y/N): ");
scanf(" %c", &ch); // %c前面必须加一个空格
} while('y' == ch || 'Y' == ch);
return 0;
}
break 和 continue
case1
case2
case3
case4
case5
等这些都是程序的入口,判断从哪里进入。
当一旦找到入口之后,就开始从这里 往下全部执行。
#include <stdio.h>
int main(void) {
int val;
printf("请输入您想进入的楼层: ");
scanf("%d", &val);
switch (val){
case 1:
printf("1层开\n");
break;
case 2:
printf("2层开!\n");
break;
case 3:
printf("3层开!\n");
break;
case 4:
printf("4层开!\n");
break;
case 5:
printf("5层开!\n");
break;
default:
printf("没有盖到这一次层!\n");
break;
}
return 0;
}
break 和 for 连用
用来终止 for 循环
在多层循环中,break只能终止距离它最近的那个循环
#include <stdio.h>
int main(void) {
int i , j;
for (i = 0; i < 3; i++) {
for (j = 1; j < 4; j++) {
break;
printf("同志们好!\n");
}
printf("为人民服务!\n");
}
return 0;
}
为人民服务!
为人民服务!
为人民服务!
continue
用于跳过本次循环环余下的语句, 转去判断是否需要执行下次循环
getchar() 表示 从键盘上获取 字符
如何看懂一个程序
分为三步:
- 流程 即 执行顺序
- 每个语句的功能
- 试数
如何掌握程序
进制
什么叫n进制
逢n进一
把r进制转为10进制
把10进制转为r进制
除r取余,直至商0,余数倒序排列。
不同进制代表数值之间的关系
十进制 3981 转化为 16进制 F8D
十进制 3981 和 16进制 F8D 本质上所代表的都是同一个数字
自增 自减
分类
前自增 ++i
后自增 i++
前自增 整体表达式的值是 i 加1之后的值
后自增 整体表达式的值是 i 加1之前的值
#include <stdio.h>
int main(void) {
int i;
int j;
int k;
int m;
i = j = 3; // 等价于 i = 3; j = 3;
k = i++;
m = ++j;
printf("i = %d, j = %d, k = %d, m = %d\n", i,j,k,m);
return 0;
}
i = 4, j = 4, k = 3, m = 4
为什么会出现 自增
使代码 更精练
自增的速度 更快
自增在寄存器
寄存器 比存储即更快
三目运算符
A ? B : C
等价于
if(A)
B;
else:
C;
例子;
#include <stdio.h>
int main(void) {
int i;
i = (0 > 2 ? 5 : 1);
printf("%d\n", i);
return 0;
}
1
逗号表达式
(A, B, C, D)
功能:
从左到右执行
最终表达式的值是 最后一项的值
#include <stdio.h>
int main(void) {
int i;
i = (1, 2, 3, 4, 5, 6);
printf("%d\n", i);
return 0;
}
6