第1章 数据类
第3章 选择结构 5
第4章 流程图 7
第5章 循环结构(一) 8
第6章 循环结构(二) 9
第7章 函数 10
第8章 数组 12
第9章 字符 12
第10章 字符串 14
第11章 结构与联合 14
第12章 二进制 15
第13章 硬件知识 17
(进阶)第14章 输出语句 19
第15章 输入语句 20
第16章 数据类型与表达式 21
第17章 更多的运算符 21
第18章 选择的嵌套 23
第19章 多路分支 24
第20章 循环的嵌套 26
第21章 函数的嵌套 27
第22章 多维数组 29
第23章 结构的嵌套 31
第24章 枚举 32
第25章 指针基础 32
第26章 位运算 34
(高级)第27章 指针与一维数组 36
第28章 文件 37
第29章 预处理 39
第30章 自定义类型 40
第31章 指针与二维数组 41
第32章 指针与字符串 43
第33章 指针与函数 44
第34章 指针与结构 45
第35章 双重指针与数组 46
第36章 链表理论 48
第37章 链表实践 49
第38章 变量生存期 50
第39章 常用算法 51
第40章 难题讲解 53
附录:ASCII码表 59
(入门)第1章 数据类型
C语言的用途
计算机“语言”的责任是让人与计算机可以通话,下指令。
C语言是目前世界上流行最广的可以给计算机“下指令”的语言之一。目前我们学的几乎所有软件,如:Word,Excel,QQ,Photoshop,Windows,千千静听,电影播放器,VB,VFP……。游戏有:魔兽世界,魔兽争霸,劲舞团,征途,跑跑卡丁车都由C语言的身影。
(6分32秒)软件公司开发软件首选C,主要是因为C语言设计的软件速度快,代码精简,占电脑资源少。但是它有个明显缺点:难学。造成C程序员资源稀少,工资高,直接导致软件成本上升。
(7分32秒)两种人适合学习C语言,一种是将来要通过软件设计赚钱的人,像上面所说的软件和游戏的开发,或者是单片机开发等;另一种是对计算机本身非常有兴趣,将来要往黑客,人工智能,汇编语言等分支发展的人。
软件与参考书
(8分50秒)建议安装:
一、操作系统:Windows XP
二、开发工具:Visual Stdio 6.0英文版,简称VS6.0,安装时包含有VB6、 VC6、VFP6等软件,可以选择安装。
三、补丁:VS6SP6
四、随机帮助:MSDN(MicroSoft Developer Network微软开发者网络)
五、助手:Visual Assist(VC助手),可以加快编写程序的效率,减少出错概率
参考书籍:潭浩强的《C程序设计》,清华大学出版社
一个简单的程序
(12分26秒)#include <stdio.h> /使用别人的程序/
main() /程序入口点/
{ /起点/
int a=1+2; /叫计算机执行的指令/
} /终点/
标识符
(17分16秒)标识符就像给刚出生的小孩取名字一样,给刚定义的变量或函数取名字。
※合法的标识符:由字母、数字和下划线组成,并且第一个字符必须为字母或下划线。
※大写字母和小写字母被认为是两个不同的字符,因此TEACHER、teacher和Teacher是三个不同的变量名。
(18分40秒)题目讲解:
以下选项中哪个是正确的标识符:
A、void B、_asb3 C、abc.c D、2c
关键字
(20分13秒)关键字属标识符的子集,有些标识符已经被系统使用,称之为“关键字”。因此,程序员在写程序时就不能取与关键字相同的名字。如:void,while,#define。
常量
(21分09秒)定义:其值不能被改变的量。如:5 0 -2 2.382 ‘t’ “hello”都是常量。
还有一种特殊常量:
#define MAX 5
这种常量的用法,将在“宏定义”一章中讲解。
变量
(22分07秒)定义:其值可以被改变的量。如a a3 max
给变量取名时要符合标识符的规定。
整数:整型常量
(22分48秒)整数分十进制,八进制,十六进制,它的明显标志是:没有小数点。
八进制和十六进制将在“二进制”一课中讲解。
(23分30秒)计算机中各整数类型的取值范围:
short:短整型(-32768~32767)
int:整型(-2147483648~ 2147483647)
long:长整型(-2147483648~ 2147483647)
unsigned int(short、long):无符号整型(0~上面的范围乘以2再加1)
(26分00秒)题目讲解:
以下选项中正确的整型常量是(□是空格):
A、12. B、-20 C、1,000 D、4□5□6
实数(浮点数):实型常量
(27分28秒)浮点数,顾名思议,就是有个小数点可以左右浮动的数,在数学上又叫“实数”。
浮点数分小数和指数部分,它的明显标志是:有小数点。
合法的小数部分:0.329 .329 3. -.2 +.2
(28分32秒)指数部分:在早期的计算机中,想把指数部分写在数字的右上角相当的困难,因此编程语言一般都用e和E表示指数部分。如:0.329102在计算机中表示为.329e+2,0.810-8表示为0.8e-8。
(30分11秒)计算机中各浮点类型的取值范围:
浮点型:float(-3.4e-38~3.4e38)
双精度浮点型:double(-1.7e-308~1.7e308)
长浮点型:long double (-1.7e-308~1.7e308)
(31分45秒)题目讲解:
以下选项中正确的实型常量是:
A、0 B、3.□1415 C、0.329*102 D、.871
其它复杂类型
(32分31秒)枚举型enum
结构struct
联合union
自定义类型typedef
另外还有字符与字符串类型将在后面的课程中讲解。
运算符
(33分10秒)+ - * / %(取余)都叫运算符,C语言中运算符有几十种,并且有不同的优先级与结合性。在本课只需要认识这些类似数学上的运算符和优先级,结合性的概念将在后面讲解。
表达式
(34分36秒)表达式由变量、常量、运算符组成。如:
S=3.14*(r*r)
它符合数学上的运算次序,先括号,再乘除,再加减。
作业
1、以下选项中哪个是正确的标识符:
A、_void B、asb*3 C、f.n D、2c
2、以下选项中正确的整型常量是:
A、12. B、.2 C、1□2□3 D、0
3、以下选项中正确的实型常量是:
A、0 B、2.□71828 C、.329E+2 D、-871
第2章 输入输出语句
使用VC6
(5分32秒)建立程序流程:
(1)在菜单中选择:File/New…会弹出一个窗口。在窗口中选择Projects标签,选择Win32 Console Application选项。点击Location文本框右边的按钮,选择你要在哪个文件夹中创建文件,再在Project Name文本框填入你的项目名,单击OK。
(2)再一次在菜单中选择:File/New…会弹出同样的窗口,在窗口中选择Files标签,选择C++ Source File选项。点击Location文本框右边的按钮,选择你要在哪个文件夹中创建文件,再在File文本框填入你的文件名(文件名后面一定要加.c)。再单击OK。
运行程序:点击感叹号,或按Ctrl+F5键,再按OK按钮,程序就会运行。
输出
(14分50秒)printf的作用是按格式在显示器上显示字符。
(18分53秒)程序1
printf的使用
printf函数双引号中包括三种字符:
(1)以%开头的格式控制字符
(2)以 \ 开头的转义字符
(3)普通字符
输入
(28分18秒)scanf的作用是按格式从键盘接收字符。
(28分44秒)程序2
scanf的使用
(31分37秒)※使用scanf时,变量前的&号非常重要,这是它与printf的一个明显区别。
(33分32秒)※执行到scanf时,程序会停在那里不动等待键盘输入,待用户按下回车后,程序才会继续往下执行,而printf不会。
(35分25秒)程序3
计算两数之和
(38分05秒)※在程序3中,scanf在不修改代码的前提下,就可以实现许多数学运算。
(38分34秒)程序4
分别输入两个整数给两个整型变量a,b,交换a与b的值,再输出
(45分30秒)※等号的作用是将右边的数值装进左边的变量。
※a=b执行以后,b的值并不会消失,它们是复制的关系。
(49分48秒)继续程序4排查错误小经验
(52分10秒)总结%d和\n
作业
由用户输入一个梯型中上底,下底,高的数值,由电脑算出它的面积,输出在屏幕上。(注意:数学计算一般使用浮点型数据)
第3章 选择结构
关系运算符
(00分15秒)小于<
大于>
等于= =
小于等于<=
大于等于>=
不等于!=
逻辑运算符
(02分03秒)非:!
与:&&
或:||
(04分01秒)题目讲解:
假设x=1,y=2,x1=3,y1=4,那么x>y||x1<y1的结果是真还是假?!(x>y)&&x1<y1呢?
参考答案:真、真
简单运算符
(10分10秒)=号是最常用的运算符,在数学表达式中a=a+1是错误的,而在计算机中,这表示将a的值加上1再赋给a,如果a原来是5,经过这种运算后,a会变成6。也是就是说=号在计算机中表示“赋值”,它会将右边的“计算结果”装进左边的“变量”。
(12分41秒)a=a+1也是经常用的运算符,C语言为了方便,便使用a++这种运算符来计算a=a+1,a–来计算a=a-1。也就是说,++代表变量自身加1,–代表变量自身减1。
(13分46秒)C语言中的运算符一旦参加复合运算后,会变的异常复杂,在后面的课程中,我们会更深入地研究这两个运算符。
运算符优先级
(14分31秒)
括号
!(非)
算术运算符
关系运算符
&&和||
赋值运算符(=) 高
低
(16分20秒)算术运算:*、/ 高于 +、-
关系运算:>、>=、<、<= 高于 = =、!=
逻辑运算:!高于&&高于||
(17分17秒)一首记忆诗:
1、括号成员第一
2、全体单目第二
3、乘除余三,加减四
4、移位五,关系六
5、等于(与)不等排第七
6、位与异或和位或
7、"三分天下"八九十
8、逻辑或跟与
9、十二和十一
10、条件高于赋值
11、逗号运算级最低
(17分58秒)解释:
1、括号运算符 成员运算符. ->
2、所有的单目运算符比如++、 --、 +(正)、 -(负) 、~(位反)、指针运算*、&、!
3、这个"余"是指取余运算即%
4、移位运算符:<< >> ,关系:> < >= <= 等
5、即= = 和!=
6、这几个都是位运算: 位与&异或^位或|
7、接上一句
8、逻辑运算符:|| 和 &&
9、注意顺序:优先级(||) 底于 优先级(&&)
10、三目运算符(:?)优先级排到13 位只比赋值运算符和","高
11、逗号运算符优先级最低
(23分46秒)诗歌只有11句,实际上C语言运算符的优先级分15级,在学习时不要奢求在一两天全部掌握,以后随着经验的积累会慢慢增加熟练度,自然会消化掉这些运算符。
(24分43秒)脱括号:
(a>b) && (x>y) 可化简为a>b && x>y
(a= =b) || (x= =y) 可化简为a= =b || x= =y
(!a) || (a>b) 可化简为 !a || a>b
if语句
(26分35秒)格式:
if(表达式)
{
若干语句
…
}
(27分07秒)程序1
用户输入2个数,按从大到小的顺序将它输出
(35分08秒)变化一:
格式:
if(表达式)一条语句;
注意:
if(a>b)a++;b++;
相当于
if(a>b)
{
a++;
}
b++;
而不是
if(a>b)
{
a++;
b++;
}
(37分56秒)变化二(二选一):
格式:
if(表达式)
{
若干语句
…
}
else
{
若干语句
…
}
(38分48秒)变化三:
格式:
if(表达式)一条语句; else 一条语句;
(39分08秒)程序2
用户输入2个数,按从大到小的顺序将它输出的第二种解法
单目运算符和双目运算符
(44分15秒)目前学过的运算符中,++、–、!都为单目运算符。其实减号运算符也可作单目运算符,它加在表达式(表达式可包括常量、变量)左边,表示取它的相反数。
双目运算符的两边必须都要有表达式
(45分11秒)程序3
输入一个整数,打印出它是奇数还是偶数(学习%的使用)
程序调试技巧
(51分25秒)程序调试:
F9:设置断点
F5:运行至断点
F10:单步执行
F11:单步执行至函数内部
(60分25秒)在VC中书写程序时如果不小心拼错了某个关键字或漏了什么标点标号等等,这叫语法错误。这时按感叹号时在编辑器的下面会报错,查找错误的方式就是在报错栏中找到带error的行,再双击它,代码栏就会出现一个蓝色箭头指向错误行,再在错误行的附近查找语法错误并修正它。
作业
上机改错题:输入两个数,求出它们之中最小的数输出
#include “stdio.h”
main()
{
int a,b;
/found*/
scanf(“%d%d”,&a,&b);
if(a>b)
{
/found*/
printf(最小的数为%d,a);
}
else
{
printf(“最小的数为%d”,b);
}
}
第4章 流程图
解题思路(算法)
(01分20秒)问题一:将变量a与b中的值互换
解题思路:
1、设一个临时变量c
2、将a的值赋给c
3、将b的值赋给a
4、将c的值赋给b
(02分57秒)问题二:计算1+2+3+4+5的和。
解题思路:
1、计算1+2的和等于3
2、计算3+3的和等于6
3、计算6+4的和等于10
4、计算10+5的和等于15
顺序结构流程图
(04分45秒)讲解流程图
※学习流程图得先学会看,再尝试跟书上画的一模一样,最后自己画。
(08分22秒)程序1内附带debug窗口无意关闭如何处理
程序1
计算1+2+3+4+5的和
选择结构流程图
(15分19秒)问题:判断一个数能否同时被3和5整除
(18分38秒)※不一定一个图框要对应一行代码,也可以直接写文字思路。
※画图时尽量不要交叉
※流程图为了美观,有时图框可以画成并排的,而程序不可能并排执行,在流程图转化为程序时要注意这点。(见PPT演示)
(21分32秒)(PPT演示)流程图上下排列
(23分41秒)(PPT演示)画流程图的顺序
(25分50秒)程序2
判断一个数能否同时被3和5整除
作业
画流程图并写程序:输入一个学生的成绩,判断该成绩在60分以上就显示“及格”, 否则显示“不及格”。
第5章 循环结构(一)
需求:用计算机计算从1加到10的和
前面先讲了程序1(12分57秒)一种笨方法:
解题思路:
1、定义2个变量:计数器,总和,并初始化为0
2、计数器加1(1)
3、总和=总和+计数器
4、计数器加1(2)
5、总和=总和+计数器
6、……
7、计数器加1(10)
8、总和=总和+计数器
9、输出总和55
(01分53秒)程序1
计算1+2+3+…+9+10
(14分21秒)※累加器一般初始化为0,请同学们想想累乘器可否初始化为0?
goto语句
(15分26秒)格式:
goto 标号;
标号格式:
标识符:语句;
规律:goto语句通常配合if语句使用,否则容易构成死循环
(15分55秒)程序2
计算1+2+3+…+9+10的goto解法
(29分05秒)讲解流程图
while语句
(34分55秒)格式:
while(条件表达式)
{
若干语句
…
}
(35分20秒)程序3
计算1+2+3+…+99+10的while解法
(44分16秒)讲解流程图
(47分35秒)错误讲解:printf放在循环体内和外的差别
do while语句
(52分35秒)格式:
do
{
若干语句
…
} while(条件表达式);
(53分39秒)程序4
打印出0到2010年之间所有的闰年
注意:
(69分10秒)※所有的循环语句都是条件满足才执行循环体
(70分19秒)※do while语句至少会执行一次循环体,while则有可能一次都不执行。
作业
1、写出计算1+2+3+…+99+100的do while解法。
2、求10!
第6章 循环结构(二)
死循环
(00分55秒)插入//和/…/两种注释符的区别。
(29分40秒)这里用了倒序讲解,所以在29分钟才开始讲死循环的内容※软死机:CPU占用100%,双核占50%,机器明显变慢。出现软死机其实就是死循环。如while(1);就是个死循环语句,请不要用在歪门邪道处。
※硬死机:鼠标、键盘、显示器无响应。
※大部分的死循环是忘记改变循环变量的值造成的。
进化
(03分00秒)程序1
将1到10显示在屏幕上
(03分01秒)(1)使用goto语句
(09分15秒)(2)使用while语句
(14分48秒)(3)使用for语句
(20分35秒)规律:for循环一般用在循环次数确定的循环中,而while一般用在循环次数不确定的循环中。
for语句
(22分35秒)规律:将while的初始化、递增都组装成一条语句,就成了for
格式:
for(循环变量赋初值;条件表达式;循环变量增值)
{
若干语句
…
}
for循环执行流程
(22分53秒)for(①n=0; ②⑤n<100; ④⑦n++)
{
③⑥循环体
}
相当于
n=0;
while(n<100)
{
循环体
n++;
}
continue和break语句
(37分46秒)continue可结束本次循环,但不跳出循环,break语句可直接跳出本层循环。
(38分12秒)程序2
用continue求1到100的偶数之和
(50分20秒)讲解流程图
(50分10秒)题目讲解:
判断一个数n是否为素数
(56分50秒)先讲标记法程序
(63分37秒)才正式讲解素数判定程序
解题思路:(脑中所想)
(55分28秒)假设这个数是n,要判断n是否素数,必须用n除以2到n-1,有任意一个除断即不是素数,全部除不断就是素数。
(62分23秒)2到n-1可以用一个for循环解决,在for循环中如果n除以任意一个数除断,就要立刻跳出循环。
(62分47秒)在循环中要使用一个变量作为标志,如果是用break跳出循环的,就将这个标志置0,如果是自然退出循环的,标志就置1。当循环结束后,查看标志为0就输出“不是素数”,为1就输出“是素数”。
(72分50秒)写在纸上的草稿:
定义i,n,j三个变量
输入n
j置1(默认是素数)
循环i=2到n-1
如果n÷i可以除断
把标志位j置0
跳出循环
判断j的值
如果是0就输出“不是素数”
如果是1就输出“是素数”。
(63分37秒)程序3
素数判定
(74分12秒)规律:
一般循环中的break或continue语句都使用if语句判断后执行。
for循环的变化
(74分35秒)for语句中两个分号之间可以没有表达式,比如:
for(;i<100;i++){…}
是一种常用写法。
如果写成for(;😉; 就成了死循环。
这表示,for循环中的所有表达式,它可以根据实际需要进行增减,有些人就喜欢放在循环体中判断循环条件,再用break来跳出循环。
作业
1、求
2、画出素数判定的流程图。
第7章 函数
库函数
(02分40秒)我们平时使用的printf和scanf都是库函数,除此之外还有常用的求平方根函数sqrt,做游戏用的rand等等也是库函数。使用库函数时要使用#include宏命令来包含有库函数的文件。
(04分17秒)程序1
求2的平方根
(09分20秒)“随机”表示没有规律,随机函数就表示一种没有规律的函数,这种函数可以模拟很多现实的事务,比如洗扑克牌,摸奖,很多MP3播放器的随机播放模式等等。
要在C语言中使用随机函数,需要调用srand和rand这两个函数。srand是随机种子,rand表示在0~32767之间产生一个随机整数。
程序2
(10分42秒)先讲解随机函数程序rand
(23分26秒)讲解正式程序猜硬币
函数的作用
(32分32秒)1、减少重复代码的编写。
2、将一个大项目按功能分解成函数,让多个程序员分别设计。也就是分工合作,增加效率。
自定义函数
(35分14秒)程序3
简单的自定义函数
带自定义函数时需使用F11调试
(44分34秒)自定义函数的格式:
返回值的类型 函数名(类型名 形式参数1,类型名 形式参数2,…)
{
若干语句
…
return 表达式;
}
(52分28秒)程序4
求的和
注意:
(62分43秒)※函数形参的定义与普通变量定义不同的是:同时定义2个普通变量可以用int a,b; 而函数形参只能用int a,int b
(63分41秒)※父函数在调用子函数后,会在调用点等待子函数返回,子函数永远不返回,父函数就永远不会往下执行。
(65分28秒)※不能调用main函数
函数声明
(66分20秒)※如果子函数在父函数之后定义,就要对子函数先进行“声明”,否则父函数会认不到子函数。
※函数声明的格式就是自定义函数的首部加上分号。
(70分04秒)※如果函数返回值为整型,不需要声明也可编译通过,但是不提倡使用这种方式。
数据传递
(71分28秒)※父函数调用子函数时,通过“实际参数”将数据传给子函数的“形式参数”。
※父函数将数据传给子函数加工时,子函数不会改变父函数中的数据,它加工的只是实际参数的副本。
(72分57秒)※子函数通过return将加工好的数据传回父函数,这时子函数中所有的数据寿终正寝。
(75分25秒)※父子函数中如果有变量重名,这两个变量之间不会互相影响
(75分42秒)程序5
父子函数变量重名示例
函数返回值
(80分07秒)格式:
return 表达式; 或 return (表达式);
※表达式最后的运算结果要与函数定义时的类型相同。如上面的代码,fun定义为double类型,return m中的m也必须是double类型。
※每个函数只能通过return返回一个值。
(82分15秒)※如果函数头部没有返回类型标识,默认返回类型为int
※函数中无论有多少个return,只有一个return会执行,return一旦执行,函数马上就会跳出,后面的代码不再执行。
(84分30秒)无返回值的函数:
※无返回值的函数,类型定义为void。函数体中若没有return语句,或是有单独一个return;后面不带表达式,均符合void函数的条件。这时的return功能有点类似break语句。
(86分43秒)※无返回值函数也称“功能函数”,主函数不需要它返回什么结果,只需要它做完某件事。
(86分52秒)程序6
无返回值的函数
总结
(91分04秒)函数的定义、声明、调用、形式参数、实际参数。
作业
不要看例题,独立完成程序4的代码。
第8章 数组
一维数组
(03分05秒)数组的作用:
如果你有一组类似的数据,一个个起名字麻烦也没意义,用个数组保存它们,用起来省事又方便。
(04分27秒)定义:
类型名 数组名[常量表达式];
如:
int a[8];
它定义了一个有8个元素的数组,下标从0-7
(07分38秒)初始化:int a[8]={0,1,2,3,4,5,6,7};
8个元素分别初始化成0,1,2,3,4,5,6,7
也可以:int a[8]={3};
它只把a[0]初始化成3,后面的a[1]到a[7]系统默认初始化为0
(10分56秒)程序1
求任意5个数中的最大数
(27分42秒)一般在数组前面有类型说明符的,如double a[5]就是“定义”数组。反之,前面没有类型说明符的,如n=a[5]、a[5]=n就是使用数组。
定义数组时,方括号里只允许使用常量,不允许出现变量。如:
int n=5;
int a[n];
这是非法的数组定义。
(31分52秒)数组在使用时就不允许使用a[8]={0}这样的方式来给数组赋值,只有使用循环来给数组元素一个一个地赋值。
(34分09秒)定义数组时,方括号中可以是空的,如:
int a[]={1,2,3};
这时电脑会自动计算出a数组有3个元素,会把这行代码翻译成int a[3]={1,2,3};再执行。
这种数组一定要用花括号初始化,比如
int a[];
这是非法的定义。
(35分38秒)程序2
将数组中的值按逆序重新存放。例如,原来顺序为5、8、9、4、6,调整以后为6、4、9、8、5。
(50分25秒)数据调换不了的奇怪错误
作业
技巧:一旦有循环的题目,一定要在纸上打草稿
1、求某数列的前40个数:1,1,2,3,5,8,13,21…
第9章 字符
字符常量
(00分00秒) ‘a’和’9’都是字符常量
注意:’9’和9有很大区别
※单引号的空格’□’也是一个字符常量,但不能写成连续两个单引号’’
字符变量
(02分05秒)char c; /定义一个字符变量/
(03分11秒)※字符变量在内存中占一个字节,它只能存放ASCII(美国信息交换标准代码)码。
※标准的ASCII码只有127个字符(见附录1),电子设备统一了标准,各种电报机,打印机,电脑就可参照标准大规模生产,还可以通过ASCII码交换数据。
(11分44秒)※我们在用键盘输入数据时,电脑会从ASCII对照表中读取相应的ASCII码装入内存,而不是真实的字符。同理,想要显示信息在屏幕上时,也要使用参照表将ASCII码转换成字符,再显示在屏幕上。
(66分20秒)※大家看到,在 ASCII码表中,每个字符都有序号,要记住我们常用的字符对应的序号也不难,方法如下:
‘0’’9’对应的整数为4857
‘A’’Z’对应的整数为6590
‘a’~’z’ 对应的整数为97~122
※大写字母与小写字母的差值为32,于是得出小写字母减32的值刚好是对应的大写字母。
字符类型的输入输出
(18分04秒)printf和scanf
格式控制符为%c
如:
char c;
scanf(“%c”,&c);
printf(“%c”,c);
(21分22秒)putchar和getchar
如:
char c;
c=getchar();
putchar©;
※无论是字符还是字符串常量,引号在屏幕上输入输出都不会显示。在编程时一定要加上,以区分其它类型的常量。
字符运算
(25分08秒)※C语言规定,所有的字符运算都是转成ASCII码的整数运算。
如:
‘B’-‘A’ 相当于66-65=1
‘a’+1相当于97+1=98=’b’
‘9’+’9’ 相当于57+57=114=’r’
(30分50秒)※既然字符型数据和整型数据可这么方便的转换,那么字符型数据也经常使用%d输出,用来得到字符的ASCII码序号。
(32分36秒)※不可以对字符串进行类似的运算,如”b”-“a”是错误的,字符串运算必须通过函数,将在后面介绍
(33分25秒)程序1
字符运算
用scanf输入字符
(49分35秒)※每个%c只接收一个字符
scanf(“%c%c%c”,&a,&b,&c);
如果输入
uvwxyz(回车)
系统会自动一个一个地截取,使a=’u’,b=’v’,c=’w’
(50分56秒)※在字符型变量上使用列宽控制时,第一个变量只会读取第一个字符,第二个变量会跳跃列宽后再读取一个字符
scanf(“%3c%3c”,&c1,&c2);
如果输入
abcde(回车)
c1为a,c2为d
(52分37秒)※空格和回车都作为字符
scanf(“%c%c%c”,&a,&b,&c);
如果输入
x□y□z
系统会自动使a=’x’,b=’□’,c=’y’,最右边的两个字符被丢弃
如果输入
x(回车)
yz
a、c与前面相同,但是b会赋于一个回车。也就是ASCII码的10。
(55分48秒)题目讲解:
有以下程序
#include <stdio.h>
main()
{char c1,c2,c3,c4,c5,c6;
scanf(“%c%c%c%c”,&c1,&c2,&c3,&c4);
c5=getchar();c6=getchar();
putchar(c1);putchar(c2);
printf(“%c%c\n”,c5,c6);
}
程序运行后,若从键盘输入(从第1列开始)
123(回车)
45678(回车)
则输出结果是
A、1267 B、1256 C、1278 D、1245
参考答案:D
作业
用电脑实践“用scanf输入字符”这一小节的程序。
第10章 字符串
字符串
(00分00秒)在C语言中,没有字符串型数据,只能用字符数组和字符指针来处理字符串。
如:
char ca[10]={‘h’,’e’,’l’,’l’,’o’,’\0’};
或
char ca[10]={“hello”};
或
char ca[10]=”hello”;
(04分36秒)都表示ca这个字符串中有10个字符(包括\0)。后面多出的元素自动补\0。但是运算中出现ca=”string!”;这样的赋值语句是不合法的,后期赋值只能使用循环轮循数组元素,一个一个写入。或者用字符串处理函数进行赋值。
字符串的输入输出
(10分20秒)printf和scanf
格式控制符为%s /s为string的意思/
与字符型数据处理不同的是,用%s后面的变量一定是数组名。
如:
char ca[10]={“hello”};
printf(“%s\n”,ca);
(12分31秒)printf中可以在s前面加数字和正负号:
printf(“%8s”,ca);
系统会自动在左边补空格,输出结果为:
□□□hello
加负号
printf(“%-8s”,ca);
系统会自动在右边补空格,输出结果为:
hello□□□
(16分05秒)scanf在s前面加数字,意义完全不同,也不能加正负号:
scanf(“%3s”,ca);
输入:
abcde(回车)
电脑会自动截取前面3个字符对ca赋值,ca的值为”abc”。
(17分00秒)puts和gets
格式:
puts(字符数组名);
gets(字符数组名);
如:
char ca[10];
gets(ca);
puts(ca);
注意:gets可以接收空格和TAB键,scanf不可以。
字符串处理函数
(18分21秒)strcpy(s1,s2):复制(目标串,源串)
strcat(s1,s2):连接(目标串,源串)
int strlen(s):求长度(字符串),返回长度
int strcmp(s1,s2):比较(串1,串2),返回值>0,表示s1>s2;=0,表示s1=s2;<0表示s1<s2
(24分54秒)程序1
使用字符串处理函数
提示:字符串的比较实际上是比较它们的ASCII码
作业
用户输入若干个大写字母,将这些大写字母转换成小写字母输出。
第11章 结构与联合
结构的作用
(02分48秒)※处理大量的数据,除了使用数组外,还有一个方法,就是使用结构。
※以前我们只学过int,double,char等几种类型,学了结构以后,程序员就可以定义自己的类型。
(04分10秒)※从二维表格理解结构(见Excel演示)
结构类型的定义
(06分50秒)定义格式:
struct 结构名
{
成员表列
}变量名表列;
(14分51秒)这里用了倒序讲解。技巧:
“结构名”和“变量名表列”可省略,初学者在使用结构时,一般可省略后面的变量名表列,以便于理解。
(07分15秒)如:
struct student
{
char name[20]; /姓名/
char sex[3]; /性别/
int age; /年龄/
};
※上面定义了一个结构student,中间是此结构的3个成员变量。记住,它们不可以赋初值,目前只是个躯壳。
(16分10秒)※那么什么时候才能给里面的成员赋值呢?那就是定义此结构类型的变量。
※结构在定义时,后面的分号不可少。
结构变量
(20分30秒)定义格式:
struct 结构名 变量名;
如:
struct student stu;
此处的stu就是一个student类型的变量。和数组一样,它也可以在定义的时候初始化,但是格式有些不同:
struct student stu={“张三”,”男”,23};
(24分05秒)注意:结构变量初始化,必须根据成员变量的类型逐个赋初值,而数组中所有的元素都是赋同样类型的值。
使用结构变量
(25分43秒)结构变量不能直接引用,必须使用·号对结构中的成员变量进行操作,如:
stu.age=18; /赋值/
printf(“%d”,stu.age); /打印/
※成员变量像普通变量一样可进行数学运算。
(28分40秒)程序1
学生结构
联合
(35分50秒)在“我的电脑->文件夹选项”中有两种按钮,圆形的是单选按钮,方形的是多选按钮。结构就类似于多选按钮,你可以同时使用其中多个成员变量。联合就相当于单选按钮,无论何时,你只能使用其中一个成员变量,并且只有最后一次设置的成员变量有效。
(38分37秒)联合的定义格式与结构差不多,只是前面的struct改成union。除此之外,联合还有以下特点:
※只能对联合的第一个成员进行初始化。
如:
union un
{
int i;
double d;
}un1={10};
(41分27秒)※联合变量的地址和它的各成员都是同一地址,因为它是“联合”。
※联合与结构之间可以嵌套定义
(45分29秒)程序2
网友在互通QQ的时候,通常不是给号码就是给昵称,如何用联合来表达?
作业
有3个学生结构变量,从中找出年龄最大的那个学生,并打印出这个学生的姓名、性别、年龄。
第12章 二进制
位(bit)
(01分12秒)在计算机内部,开关导通时,表示1;断开表示0。这样,电压不稳时计算机还能照样工作。
一个通断开关叫做一个“位”。
字节(byte)
(05分00秒)计算机内部经常把8个位作为一组,用来表示许多我们平时生活中用到的东西。如:
00000000表示事物为假,11111111表示为真(非0即为真)
00000000表示数字0,00000011表示3
8个位可以表示不同的组合情况,比如音乐音符,颜色,这样就实现了多媒体。
全世界统一把8个位叫做一个“字节”,我们平时所说的硬盘容量、内存大小、U盘大小,都是以字节为单位。网络却经常使用位为单位,所以我们平时的上网速度要除以8(加上衰耗,实际上要除以10),才是下载速度。
二进制与整数
(12分42秒)人类平时使用的数字都是逢十进一,叫十进制。在计算机中是逢二进一,叫二进制。
(14分10秒)二进制表示成八进制和十六进制更加方便。八进制是逢八进一,用0到7表示。十六进制是逢十六进一,大于9的数字用字母A到F表示。用八进制和十六进制表示二进制的原因是:3个位刚好是八进制的一位数,4个位刚好是十六进制的一位数。黑客和病毒工作者就经常工作在十六进制数上。
(20分35秒)十、二、八、十六进制的前20个数字转换对照表
十进制 二进制 八进制 十六进制
0 0 0 0
1 1 1 1
2 10 2 2
3 11 3 3
4 100 4 4
5 101 5 5
6 110 6 6
7 111 7 7
8 1000 10 8
9 1001 11 9
10 1010 12 A
11 1011 13 B
12 1100 14 C
13 1101 15 D
14 1110 16 E
15 1111 17 F
16 10000 20 10
17 10001 21 11
18 10010 22 12
19 10011 23 13
注:标黑体字的为关键数,关键数后面的数字,可从此关键数开始推导
(29分44秒)※1个八进制位刚好是3个二进制位
(32分23秒)※1个十六进制位刚好是4个二进制位。
(33分34秒)※1个字节刚好是2个十六进制位
如:11111111刚好是FF
(36分00秒)娱乐:用二进制表示颜色
C语言中的八进制和十六进制
(41分04秒)程序1
输入和输出十、八、十六进制
从程序中可以看出:
※整数前加个0,表示8进制常量,如:063
※整数前加个0x,表示16进制常量,如:0x3F
(47分06秒)注意:C语言中没有二进制的输入输出,用库函数itoa也只能将十进制转换成二进制,二进制转十进制没有对应的库函数。
(48分17秒)※八进制和十六进制整数没有负数。
各类型所占内存
(48分31秒)
类型 字节 类型 字节
char 1 float 4
short 2 double 8
int 4 long double 8
long 4 指针 4
※整型前加unsigned,所占字节数保持不变
※用sizeof可以计算出所有类型所占的字节数,在后面的章节中演示
※同学们可以自己计算出各整型数据的数据表示范围
浮点数据类型因为在后面调出几位用来做指数部分,计算方法较复杂,本书作为入门丛书,不对此内容深入讲解。
进制转换
(54分10秒)书写格式:
(数字)进制
如:
(111)2 (10)8 (FF)16
(55分17秒)※十进制转二进制:用“除2取余法”
(20)10=(?)2
被除数 除数(商) 余数 读取顺序
2 20 0
2 10 0
2 5 1
2 2 0
2 1 1
0
注意:要除到商为0为止
答案:(20)10=(10100)2
规律:以此类推,十进制转八进制可用“除8取余法”;转十六进制可用“除16取余法”
(58分30秒)※二进制转十进制:用降幂法
(10100)2= (?)10
124+023+122+021+0*20=20
注意:任何数的0次幂等于1
(10100)2= (20)10
规律:八或十六进制转十进制只要将底数改为8或16即可
(61分10秒)※二进制转八进制:
将二进制由低位到高位,3个分为1组,每组查表所得的八进制组合,就是最终结果。
(10,100)2= (24)8
(62分14秒)※二进制转十六进制:
将二进制由低位到高位,4个分为1组,每组查表所得的十六进制组合,就是最终结果。
(1,0100)2= (14)16
(63分41秒)※八和十六进制互转:
可以通过二进制作为中间进制,再转成另一个进制
(63分54秒)※进制转换可以用Windows自带的计算器设置成科学型后再进行验算。
单位关系
(64分57秒)数学中的单位关系:
太(T)、吉(G)、兆(M)、千(K)、字节(byte)、位(bit)
1T=1000G
1G=1000M
1M=1000K
1K=1000byte
1byte=8bit
(66分25秒)计算机中的单位关系:
计算机中的单位关系都是1024,因为210=1024,便于计算机的计算,所以以上的单位关系应改为:
1T=1024G
1G=1024M
1M=1024K
1K=1024byte
1byte=8bit
作业
1、进制转换
(1011011)2= ( )10
(2008)10= ( )2
(11101)2= ( )8
(3F4)16= ( )2
(3F4)16= ( )10
(3F4)16= ( )8
2、通过计算器辅助计算各整型数据类型表达的数据范围
第13章 硬件知识
计算机常用部件
(01分55秒)CPU、主板、内存、硬盘、显卡、声卡、机箱、电源、显示器、键盘、鼠标、音箱、摄像头、打印机。
下面简单说明一下带下划线的设备:
(14分44秒)CPU:控制主板上各部件之间的工作,做加减乘除运算,存储运算结果。
(16分27秒)主板:各部件通过它来交换数据
内存:临时存储数据,速度快,断电数据丢失,容量小,Windows XP时代约4G,C语言变量操作专用。
(20分02秒)硬盘:永久存储数据,速度慢,断电数据不丢失,容量大,Windows XP时代达到1T,C语言文件操作专用。
显卡:掌管显示屏上显示的文字、图形、颜色、分辨率等等。
程序执行流程
(24分22秒)int a,b,c;
scanf(“%d%d”,&a,&b);
c=a+b;
printf(“%d\n”,c);
(26分22秒)int a,b,c;
CPU控制在内存中分配a、b、c这3个变量空间
scanf(“%d%d”,&a,&b);
CPU控制从键盘读入数据到内存
c=a+b;
CPU从内存a、b取出数据,在CPU内部将a、b相加后放回内存c
printf(“%d\n”,c);
CPU控制内存c中数据送至显卡,显卡控制显示器如何显示。
地址
(32分07秒)电脑管理内存的方式是给每个存储单元编号(地址),在32位系统中可以编232=4G个号,所以32位系统最大只能装4G内存。
如果是64位系统,理论上可安装264≈0.18*1020内存,相当于无限。
内存计算
(38分12秒)※前面我们学习了一个int型变量占4字节内存,那一个整型数组呢?
同理,5个元素的double类型数组呢?
(39分26秒)程序1
数组与内存关系
(44分41秒)※下面这个是我们熟悉的一个结构。你认为它会占用多少内存?
struct student
{
char name[20]; /姓名/
char sex[3]; /性别/
int age; /年龄/
};
(46分12秒)程序2
结构与内存关系
注意:结构的内存计算与#pragma pack(1)这句话息息相关。
(50分05秒)※将上面的结构换成联合,你觉得占用内存还会一样吗?
(50分32秒)程序3
联合与内存关系
作业
计算:
1、sizeof(short)、sizeof(unsigned int)、sizeof(long duoble)
2、
struct student
{
double d[3];
short s[3];
int i[2];
};
上面的结构所占内存是多少?
手工算出以上各题的答案,再上机验证自己计算的到底对不对。
进阶……
(进阶)第14章 输出语句
格式控制字符
(03分42秒)前面我们学过:printf中的字符包括以下三种:
(1)以%开头的格式控制字符
(2)以 \ 开头的转义字符
(3)普通字符
(04分31秒)程序1
printf的细节
(06分20秒)整数的输出
(10分10秒)控制输出
(14分14秒)浮点输出
(26分08秒)字符串输出
(28分28秒)综合输出
(32分10秒)※双引号中出现一个%,后面一定要跟随一个输出常量,变量或表达式。
※两个连续的%表示输出一个%
(33分01秒)※一旦出现格式控制字符和转义字符,它们立即会寻找后面紧跟着的字符进行组合。但是它们前面的算普通字符。如:
printf(“a,%c\n”,t);
%c只能算一个字符,它会输出t中的字符。\n又算一个字符,它会输出回车。而前面的a,(逗号)只能算普通字符,会原样输出。
(34分17秒)※在格式控制串中,格式说明与输出项从左到右在类型上必须一一对应匹配。如果不匹配,数据不能正确输出,这时系统并不报错。如:
printf(“%d,%d”,i)
因为只有一个参数,第二个%d会输出一个乱码。
(35分06秒)※%m.nf指定输出的数据共占m列,其中有n位小数。如果数值长度小于m,则左端补空格,超过m列,原样输出。
※%-m.nf与%m.nf基本相同,只是使输出的数值向左端靠,右端补空格。
※用f或lf格式打印浮点数时,系统会自动四舍五入。
※格式控制字符除了X,E,G外,其它字符必须用小写字母,如%d不能写成%D。
(36分40秒)题目讲解:
以下程序的输出结果是:
main()
{
int a=2,b=5;
printf(“a=%%d,b=%%d\n”,a,b);
}
A、a=%2,b=%5 B、a=2,b=5
C、a=%%d,b=%%d D、a=%d,b=%d
参考答案:D
转义字符
(39分17秒)原本字符常量只能是一个字符,但是因为有些字符看不见或是不好表达,所以特殊的字符常量可以是多个字符,它们以 \ 开头后面跟着其它字符,这也叫“转义字符”。
下面是C语言中所有的转义字符:
\n 回车换行
\t 横向跳格(代表Tab键)
\v 竖向跳格(打印机专用)
\r 回车
\f 换页(打印机专用)
\b 退格(代表Backspace键)
\ 反斜杠字符
\’ 单引号
\” 双引号
\ddd 以八进制形式代表的ASCII字符
\xhh 以十六进制形式代表的ASCII字符
\0 空值
下面这行代码:
printf(“%c”,’\x41’);
会输出字符A
(46分13秒)注意:
※格式控制字符“%”只能在printf和scanf中使用,而转义字符“\”可以用在所有字符和字符串处理函数中。
※转义字符“\”会取后面所有符合条件的字符,并且只取一次,就失去作用,后面的都按普通字符输出。如:\x41n就会输出An
(47分30秒)程序2
转义字符输出
(56分36秒)制表符输出演示
作业
将“程序1”和“程序2”中所有格式输出自己在VC中抄写一遍