目录
一:基础部分
1.计算机基础知识
1. 进制转换:
二进制、八进制、十进制、十六进制
二进制:逢二进一
0、1
八进制:逢八进一
0、1、2、3、4、5、6、7
十进制:逢十进一
0、1、2、3、4、5、6、7、8、9
十六进制:逢十六进一
0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f
二进制、八进制、十六进制 -> 十进制:
对应位 * 对应位的权值再求和
十进制 -> 二进制、八进制、十六进制:
十进制数除以进制数得到的余数逆序排列
十进制 <-> 二进制
二进制 <-> 八进制、十六进制
八进制的1位 == 二进制的3位
十六进制1位 == 二进制的4位
2. 负数在内存中的存储
100 1100100
-100
负数在内存中存储:
1.先获得原码(去掉符号位,数字对应的二进制形式)
2.获得反码 (原码取反)
3.获得补码(反码+1)
4.获得内存中的值(符号位+补码)
3. 程序在计算机内部如何运行:
存储器:
1.内存
读写速度快
价格昂贵
掉电数据丢失
2.外存
读写速度慢
价格便宜
掉电数据不丢失
外存存储文件
a.out是存放在外存中的一个文件
./a.out时将该文件加载到内存中运行,内存负责与CPU交互执行代码内的运算处理
4.计算机内存的存储单位:
1 bit
1 byte == 8 bit
1 kb == 1024 byte
1 mb == 1024 kb
1 gb == 1024 mb
1 tb == 1024 gb
2.C语言基础部分
1.基本数据类型
1.整数类型:
2.字符类型:
3.浮点数类型:
float 单精度浮点数类型 4个字节 1位符号位 + 8位指数位 + 23位尾数位
double 双精度浮点数类型 8个字节 1位符号位 + 11位指数位 + 52位尾数位
1.浮点数类型均为有符号
2.float 6-8位有效数字、double 12-14位有效数字
2.常量和变量:
1.常量
1.整形常量(默认为int类型)
123
123l 长整型
123ul 无符号长整型
123u 无符号整形
123L
123U
123UL
0100 八进制常量
0x1f 十六进制常量
2.浮点型常量(默认为double类型)
3.14
3.14f
3.14F
3.14e3
3.14e-3
3.字符常量
'!'
'\''
'\\'
'\n' 换行符
'\r' 回车符
'\t' 横向制表符
'\b' 退格符
'\v' 纵向制表符
'a'
'A'
'0' 字符0
0 零
'\0' 反斜杠零
'0' 字符零
'\0' -> 0 '\0' 与 0 等价
'0' -> 48 '0' 与 48 等价(字符0)
'\141' 八进制141对应的字符
'\x32' 十六进制32对应的字符
4.字符串常量
5.标识常量
2.变量
1.变量名的要求:
1.不能与C语言关键字重名
2.最好不要与系统的库函数重名
3.变量名可以以字母、数字、下划线组成,但是不能以数字开头
4.变量名不允许重名
5.变量名最好做到见名知意
6.变量必须先定义再使用
2.变量的定义:
数据类型 变量名;
short d;
long e;
int a;
char f;
float b;
double c;
3.变量的初始化:
变量定义时未经初始化值为随机值
初始化:变量定义时为变量赋初值
不要使用未经初始化的变量
int a = -3, b = -4, c = -5;
unsigned int a = 10;
float f = 3.14;
double d = 5.12;
4.变量的打印:
short
int
long
%d打印
float
double
%f打印
char
%c打印
3.表达式:
由常量和变量所组成的式子
1.表达式一定有值
2.表达式一定有类型
int a = 100;
int b = 20;
1 + 2
a + 5
a / b
(1 > 2) + 3
5.0 / 2.0
'a' + 3
'B' + 32
5.0 / 2
1.混合类型运算时表达式的类型
类型转换:
1.显示类型转换(强制类型转换)
(int)变量名
(double)变量名
2.隐式类型转换
主要出现在混合类型计算时
低精度转换成高精度
1.同种类型所占空间越大精度范围越高
long > int > short > char
2.整数类型中无符号类型精度大于有符号类型精度
unsigned > signed
3.浮点数类型精度高于整数类型精度
double > float > 整数类型
注意:
1.short char int进行数据运算和数据处理时会默认转换为long类型
2.float double进行数据运算和数据处理时会默认转换为double类型
float f1 = 3.0;
float f2 = 5.0;
f1 + f2;
double f = 5 / 2;
printf("f = %f\n", f);
4.运算符
1.算术运算符:
+
-
*
/
练习:
定义两个变量a和b,并对a b赋初值,打印出a b四则运算的结果
% 唯一不能对浮点数操作的算数运算符
练习:定义一个整形变量,并给定一个三位数,请打印出各个位上的数字的和值
int a = 123;
++ 自增运算符
-- 自减运算符
i++ 后置++ 先用再+
++i 前置++ 先+再用
2.赋值运算符:
=
+=
-=
*=
/=
%=
左值:能够放在等号左边的值,可以是变量,不能是常量或表达式
右值:能够放在等号右边的值,可以为常量、变量、表达式
char ch = 0;
int num = 1568;
ch = num;
printf("%d\n", ch);
1.整形赋值给浮点数类型扩展精度
2.浮点数类型赋值给整形舍弃精度
3.左右两边空间大小一致直接完成内存数据拷贝
4.小数据放入大空间时需要补位,有符号数补符号位,无符号数补0
5.大数据放入小空间时需要截断,截取数据低位
char ch = 480;
printf("ch = %d\n", ch);
3.逗号运算符:
val = (a, b, a+b, b+c, a+3, b-3)
从左到右依次运行,最后一个逗号表达式的结果为整体表达式的结果
5.语言中常用的输入输出函数
1.putchar:
1.功能:给定一个数字,并将其对应的ASCII码显示在屏幕上
2.使用形式:
putchar('a');
练习:
1.利用putchar实现将hello world打印在终端屏幕上
2.getchar:
1.功能:从键盘读取一个字符,并将其对应的ASCII码返回
2.使用形式:
char ch = 0;
ch = getchar();
练习:
从终端接收一个小写字符,将其对应的大写形式显示出来
所有能够在终端显示的和输入的均为字符
3.printf
格式化输出函数,将双引号中的内容以字符串形式显示在终端
1.printf打印非输出控制符
printf("hello world");
\n 换行符
\t 制表符
\b 退格符
\v 纵向制表符
\r 回车符
\\ \字符
\" "字符
2.printf打印输出控制符
int Num = 100;
printf("Num = %d\n", Num1);
%d 按照有符号十进制打印
%o 按照无符号八进制打印
%x 按照无符号十六进制打印
%X 按照十六进制打印
%# 打印八进制前的0和十六进制前的0x
%s 按照字符串打印
%p 按照指针打印
%% 打印%字符
%u 按照无符号十进制打印
%e 按照浮点数类型打印
%f 按照浮点数类型打印
%c 按照字符(ASCII码表)打印
3.printf打印多个输出控制符
int Num1 = 100;
int Num2 = 200;
char ch = 'a';
printf("Num1 = %d, Num2 = %d\n", Num1, Num2);
printf("ch = %c, ch = %d\n", ch, ch);
4.格式化打印
printf("%5d", Num);
%nd n:不足域宽高位用空格补齐
%-nd -:左对齐
%0nd 0:不足域宽高位用0补齐
%.mf m:显示小数点后m位有效数字
作业:
1.定义两个变量,并初始化为两个两位数,根据这两个数构建一个新数,规则为:
第一个数的十位作为新数的个位
第一个数的个位作为新数的十位
第二个数的十位作为新数的百位
第二个数的个位作为新数的千位
打印该数:
12 34
4321
4.scanf
格式化输入函数
1.接收非输入控制符
scanf("m");
scanf中出现非输入控制符,需要原封不动的从终端输入该字符
2.接收输入控制符
%d 按照int类型接收
%f 按照float类型接收
%lf 按照double类型接收
%c 按照char类型接收(会接收' '和'\n'字符)
_%c 接收一个非' '和'\n'的字符
%s 按照字符串类型接收
3.多个输入控制符的接收
int Num1 = 0;
int Num2 = 0;
scanf("%d %d", &Num1, &Num2);
注意:
1.scanf中内容写的越短越好
2.scanf中不要加入\n字符
3.scanf只有%s可以不加&,其余均需要加上&
4.scanf中' '和'\n'字符表示数据末尾
5.scanf中只有%c可以接收' '和'\n'字符,其余均认为是数据结束的标志
练习:从终端接收两个数,打印出这两个四则运算的结果
int Num = 0;
scanf("%d", &Num);
float f = 0;
scanf("%f", &f);
double d = 0;
scanf("%lf", &d);
char ch = 0;
scanf("%c", &ch);
int Num1 = 0;
int Num2 = 0;
scanf("%d%d", &Num1, &Num2);
float f1 = 0;
float f2 = 0;
scanf("%f%f", &f1, &f2);
double d1 = 0;
double d2 = 0;
scanf("%lf%lf", &d1, &d2);
5.puts
打印一行字符串
字符数组
char ch[32] = {"Hello World"};
puts(ch);
注意:
1.puts会多打印一个\n
2.printf不会多打印\n
6.gets
从终端接收一行字符串
注意:
1.gets会去掉从终端接收的\n字符
2.gets能够接收带' '的字符串
3.scanf不能接收带' '的字符串
6.流程控制
1.运算符:
1.三目运算符:
? :
逻辑表达式?表达式1:表达式2;
练习:定义三个变量,从终端获得三个变量的值,
请打印出三个变量中的最大值
a > b ? a : (b > c ? b : c)
注意:
三种特殊运算符,结合方向自右至左
1.单目运算符
2.赋值运算符
3.三目运算符
2.关系运算符:
> 大于
< 小于
>= 大于等于
<= 小于等于
== 等于
!= 不等于
3.逻辑运算符:
&& 逻辑与 既..又..
|| 逻辑或 要么..要么..
! 逻辑非 真取非得假 假取非得真
逻辑与:一假为假,全真为真
逻辑或:一真为真,全假为假
逻辑非:真取非得假,假取非得真
截断特性:
逻辑与左边为假时,右边不再计算
逻辑或左边为真时,右边不再计算
2.顺序结构:
从main函数第一句开始执行,执行到main函数结束
3.分支结构:
1. if分支
1.判断逻辑时使用分支语句
2.同一类数据执行不同操作
1.简单分支:
if (逻辑表达式)
{
语句块1;
}
else
{
语句块2;
}
注意:
1.if后面必须加条件, else后面不能加条件
2.if可以脱离else单独使用,但是else不能脱离if单独使用
3.if和else如果不加{},默认只能控制一句代码
ch >= 'a' && ch <= 'z'
ch >= 'A' && ch <= 'Z'
ch是字母:
(ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')
ch不是字母:
!(ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')
练习:
从终端接收两个分别给Num1和Num2
如果第一个数比第二个数大则直接打印第一个数
如果第一个数没有第二个数大则两个数交换后打印第一个数
int Num1 = 10;
int Num2 = 20;
Num1 = Num2;
Num2 = Num1;
if简单分支可以与三目运算符等价转换
1.作业:
1.从终端接收三角形三边的长,计算三角形的周长和面积?
海伦公式
#include <math.h>
sqrt();
gcc filename.c -lm
2.从终端接收一个年份,判断该年是闰年还是平年?
1900 平年
2000 闰年
普通闰年:4的倍数却不是100的倍数
世纪闰年:400的倍数
2.阶梯分支:
if (逻辑表达式1)
{
语句块1;
}
else if (逻辑表达式2)
{
语句块2;
}
else if (逻辑表达式3)
{
语句块3;
}
else
{
语句块4;
}
练习:
1. 从键盘输入一个字符,输出该字符的按字典排列顺序的下一个字符,
例如,输入a,则输出b。如果输入的字符不在26个英语字母中,
则显示输入数据有误,如果输入的字符是z或Z,则输出a或A。
char ch = 0;
ch >= 'a' && ch <= 'z'
ch >= 'A' && ch <= 'Z'
3.嵌套分支:
if (逻辑表达式1)
{
if (逻辑表达式2)
{
语句块1;
}
else
{
语句块2;
}
}
else
{
}
注意:嵌套太深会导致可读性变差,最多嵌套3 - 5层
2.switch分支
1.基本形式
switch (整形表达式)
{
case 常量1:语句块1;break;
case 常量2:语句块2;break;
case 常量3:语句块3;break;
default:
语句块4;
}
注意:
1.switch后面的表示式类型必须为整形,不能为浮点数类型
2.case后面必须为常量,不允许是变量或表达式
3.switch只与case后面的值比一次,然后顺序向下执行直到break或者switch结束
练习:
1.从终端输入一个成绩,打印成绩的级别 (使用switch实现)
90 - 100打印 优秀
80 - 89打印 良好
70 - 79打印 中等
60 - 69打印 及格
0 - 59打印 不及格
2.switch嵌套形式
switch (整形表达式1)
{
case 常量1:switch (整形表达式2)
{
case 常量2:语句块2;break;
case 常量3:语句块3;break;
default:
语句块4;
};break;
default:
语句块5;
}
注意:
1.双层switch中,里层switch结束,如果没有break,外层switch会继续向下执行
4.循环结构:
1.重复执行一段代码时使用循环结构
2.有规律的代码使用循环结构
未知循环次数使用while
已知循环次数使用for
1. while 循环
while (逻辑表达式)
{
语句块;
}
练习:编写代码实现0 - 100的求和,并将和值打印在终端
while (1)
{
}
死循环
2. do..while 循环
do {
} while (逻辑表达式);
人机交互、界面控制
3. for循环
1.基本形式:
for (A; B; C)
{
D;
}
A:for循环前执行一次
B:循环判断条件
D:满足条件执行的循环体内部代码
C:每轮循环执行结束后会执行的代码
穷举法:将所有的情况都使用循环试一遍
练习:鸡兔同笼,共50只,140只脚,打印出鸡兔的个数
x:0 - 50
2*x + 4*(50-x)
2.双层for循环使用:
for (A; B; C)
{
for (D; E; F)
{
G;
}
}
外层执行一次,里层执行一遍
练习:利用双层for循环打印 99乘法表
4. goto循环
代码中尽量不要使用goto,因为破坏程序的逻辑性、可读性
出错处理使用goto
作业:
1.使用穷举法打印出所有的水仙花数:
1.是一个3位数
2.各位数字的立方和等于该数本身
例:153 == 1*1*1 + 5*5*5 + 3*3*3
5.辅助控制语句:
1.break:
只能在循环或者switch中使用
跳出当前循环
2.continue:
只能在循环中使用
结束本次循环
3.return:
. 在函数中使用,让当前函数结束