徐敏-C语言启蒙

徐敏-C语言启蒙

ID:82888989

大小:300.42 KB

页数:62页

时间:2023-09-24

上传者:灯火阑珊2019
徐敏-C语言启蒙_第1页
徐敏-C语言启蒙_第2页
徐敏-C语言启蒙_第3页
徐敏-C语言启蒙_第4页
徐敏-C语言启蒙_第5页
徐敏-C语言启蒙_第6页
徐敏-C语言启蒙_第7页
徐敏-C语言启蒙_第8页
徐敏-C语言启蒙_第9页
徐敏-C语言启蒙_第10页
资源描述:

《徐敏-C语言启蒙》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

(0分00秒)C语言启蒙主讲人:徐敏

1(1分32秒)目录(入门)第1章数据类型3第2章第3章第4章第5章第6章第7章第8章第9章第10章第11章第12章第13章输入输出语句4选择结构5流程图7循环结构(一)8循环结构(二)9函数10数组12字符12字符串14结构与联合14二进制15硬件知识17(进阶)第15章第14章输出语句输入语句2019第16章第17章第18章第19章第20章第21章第22章第23章第24章第25章第26章数据类型与表达式更多的运算符21选择的嵌套23多路分支24循环的嵌套25函数的嵌套27多维数组29结构的嵌套31枚举32指针基础32位运算3420(髙级)第27章指针与一维数组36第28章文件37第29章预处理39第30章自定义类型40第31章指针与二维数组41第32章指针与字符串42第33章指针与函数43第34章指针与结构45第35章双重指针与数组46第36章链表理论48第37章链表实践49第38章变量生存期50第39章常用算法51第40章难题讲解52附录:ASCII码表59

2/・程序入口点・//・起点・//・叫计算机执行的指令・//・终点・/(3分53秒)入门……(入门)第1章数据类型C语言的用途计算机“语言”的责任是让人与计算机可以通话,下指令。C语言是目前世界上流行最广的可以给计算机“下指令”的语言之一。目前我们学的几乎所有软件,如:Word,Excel,QQ,Photoshop,Windows,千千静听,电影播放器,VB,VFP……。游戏有:魔兽世界,魔兽争霸,劲舞团,征途,跑跑卡丁车都由C语言的身影。(6分32秒)软件公司开发软件首选C,主要是因为C语言设计的软件速度快,代码精简,占电脑资源少。但是它有个明显缺点:难学。造成C程序员资源稀少,工资高,直接导致软件成本上升。(7分32秒)两种人适合学习C语言,ー种是将来要通过软件设计赚钱的人,像上面所说的软件和游戏的开发,或者是单片机开发等:另ー种是对计算机本身非常有兴趣,将来要往黑客,人工智能,汇编语言等分支发展的人。软件与参考书(8分50秒)建议安装:ー、操作系统:WindowsXP二、开发工具:VisualStdio6.0英文版,简称VS6.0,安装时包含有VB6、VC6、VFP6等软件,可以选择安装。三、补丁:VS6sp6四、随机帮助:MSDN(MicrosoftDeveloperNetwork微软开发者网络)五、助手:VisualAssist(VC助手),可以加快编写程序的效率,减少出错概率参考书籍:潭浩强的《C程序设计》,清华大学出版社ー个简单的程序(12分26秒)include/・使用别人的程序・/main(){inta=l+2;)标识符(17分16秒)标识符就像给刚出生的小孩取名字ー样,给刚定义的变量或函数取名字。※合法的标识符:由字母、数字和下划线组成,并且第一个字符必须为字母或下划线。※大写字母和小写字母被认为是两个不同的字符,因此TEACHER、teacher和Teacher是三个不同的变量名。(18分40秒)题目讲解:以下选项中哪个是正确的标识符:A、voidB、_asb3C、abc.cD、2c关键字(20分13秒)关键字属标识符的子集,有些标识符已经被系统使用,称之为“关键字”。因此,程序员在写程序时就不能取与关键字相同的名字。如:void,while,#define〇常量(21分09秒)定义:其值不能被改变的量。如:50-22.382T“hello”都是常量。还有一种特殊常量:#defineMAX5这种常量的用法,将在“宏定义”一章中讲解。变量(22分07秒)定义:其值可以被改变的量。如aa3max给变量取名时要符合标识符的规定。整数:整型常量(22分48秒)整数分十进制,ハ进制,十六进制,它的明显标志是:没有小数点。ハ进制和十六进制将在“二进制”ー课中讲解。(23分30秒)计算机中各整数类型的取值范围:short:短整型(-32768-32767)int:整型(-2147483648〜2147483647)long:长整型(-2147483648〜2147483647)unsignedint(short>long):无符号整型(〇〜上面的范围乘以2再加1)(26分。0秒)题目讲解:以下选项中正确的整型常量是(口是空格):A、12.B,-20C、1,000D、40506

3实数(浮点数):实型常量(27分28秒)浮点数,顾名思议,就是有个小数点可以左右浮动的数,在数学上又叫“实数”。浮点数分小数和指数部分,它的明显标志是:有小数点。合法的小数部分:0.329.3293.-.2+.2(28分32秒)指数部分:在早期的计算机中,想把指数部分写在数字的右上角相当的困难,因此编程语言一般都用e和E表示指数部分。如:0.329*102在计算机中表示为.329e+2,0.8*10-8表示为0.8e-8。(30分11秒)计算机中各浮点类型的取值范围:浮点型:float(-3.4e-38~3.4e38)双精度浮点型:double(-1.7e-308~1.7e308)长浮点型:longdouble(-1.7e-3O8~1.7e3O8)(31分45秒)题目讲解:以下选项中正确的实型常量是:A、0B、3.C1415C、0.329*102D、.871其它复杂类型(32分31秒)枚举型enum结构struct联合union自定义类型typedef另外还有字符与字符串类型将在后面的课程中讲解。运算符(33分10秒)+-*1%(取余)都叫运算符,C语言中运算符有几十种,并且有不同的优先级与结合性。在本课只需要认识这些类似数学上的运算符和优先级,结合性的概念将在后面讲解。表达式(34分36秒)表达式由变量、常量、运算符组成。如:S=3.14*(r*r)它符合数学上的运算次序,先括号,再乘除,再加减。作业1、以下选项中哪个是正确的标识符:Aヽ_voidB、asb*3C、f.nD、2c2、以下选项中正确的整型常量是:A、12.B、.2C、1ロ2ロ3D、03、以下选项中正确的实型常量是:A、0B、2.C71828C、.329E+2D、-871第2章输入输出语句使用VC6(5分32秒)建立程序流程:(1)在菜单中选择:File/New…会弹出ー个窗口。在窗口中选择Projects标签,选择Win32ConsoleApplication选项。点击Location文本框右边的按钮,选择你要在哪个文件夹中创建文件,再在ProjectName文本框填入你的项目名,单击OK。(2)再一次在菜单中选择:File/New…会弹出同样的窗ロ,在窗口中选择Files标签,选择C++SourceFile选项。点击Location文本框右边的按钮,选择你要在哪个文件夹中创建文件,再在File文本框填入你的文件名(文件名后面一定要加.c)。再单击OKo运行程序:点击感叹号,或按Ctrl+F5键,再按OK按钮,程序就会运行。输出(14分50秒)printf的作用是按格式在显示器上显7K字符。(18分53秒)程序1printf的使用printf函数双引号中包括三种字符:(1)以%开头的格式控制字符(2)以、开头的转义字符(3)普通字符输入(28分18秒)scanf的作用是按格式从键盘接收字符。(28分44秒)程序2scanf的使用(31分37秒)※使用scanf时,变量前的&号非常第4页

4重要,这是它与printf的ー个明显区别。(33分32秒)※执行到scanf时,程序会停在那里不动等待键盘输入,待用户按下回车后,程序オ会继续往下执行,而printf不会。(35分25秒)程序3计算两数之和(38分05秒)※在程序3中,scanf在不修改代码的前提下,就可以实现许多数学运算。(38分34秒)程序4分别输入两个整数给两个整型变量a,b,交换a与b的值,再输出(45分30秒)※等号的作用是将右边的数值装进左边的变量。Xa=b执行以后,b的值并不会消失,它们是复制的关系。(49分48秒)继续程序4排查错误小经验(52分10秒)总结%d和

5作业由用户输入ー个梯型中上底,下底,高的数值,由电脑算出它的面积,输出在屏幕上。(注意:数学计算一般使用浮点型数据)第3章选择结构关系运算符(00分15秒)小于<大于〉等于==小于等于<=大于等于>=不等于!=逻辑运算符(02分03秒)非:!与:&&或:II(04分01秒)题目讲解:假设x=l,y=2,xl=3,yl=4,那么x>y||xly)&&xlf低(16分20秒)算术运算:・、/高于+、ー关系运算:>、>=、<、<=高于==、!=逻辑运算:!高于&&高于II(17分17秒)一首记忆诗:1、括号成员第一2、全体单目第二3、乘除余三,加减四4、移位五,关系六5、等于(与)不等排第七6、位与异或和位或7、"三分天下"八九于8、逻辑或跟与9、于二和H-一10、条件高于赋值11、逗号运算级最低(17分58秒)解释:1、括号运算符口()成员运算符.->2、所有的单目运算符比如++、ー、+(正)、ー(负)、~(位反)、指针运算・、&、!3、这个"余"是指取余运算即%4、移位运算符:«»,关系:><>=<=等

65、即==和!=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>bif语句(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的行,第6页

7问题二再双击它,代码栏就会出现ー个蓝色箭头指向错误行,再在错误行的附近查找语法错误并修正它。作业上机改错题:输入两个数,求出它们之中最小的数输出#include"stdio.h"main(){inta,b;/**************found***************/scanf("%d%d”,&a,&b);if(a>b)|/**************found***************/printf(最小的数为%d,a);)else(printf("最小的数为%d”,b);))第4章流程图解题思路(算法)(01分20秒)问题ー:将变量a与b中的值互换解题思路:1、设ー个临时变量c2、将a的值赋给c3、将b的值赋给a4、将c的值赋给b(02分57秒)问题ニ:计算1+2+3+4+5的和。解题思路:1、计算1+2的和等于32、计算3+3的和等于63、计算6+4的和等于!04、计算10+5的和等于!5顺序结构流程图(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整除作业

8画流程图并写程序:输入一个学生的成绩,判断该成绩在60分以上就显示“及格”,否则显示“不及格”。第5章循环结构(一)需求:用计算机计算从1加到10的和前面先讲了程序1(12分57秒)一种笨方法:解题思路:1、定义2个变量:计数器,总和,并初始化为〇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放在循环体内和外的差别

9dowhile语句(52分35秒)格式:do(若干语句}while(条件表达式);(53分39秒)程序4打印出〇到2010年之间所有的闰年注意:(69分10秒)※所有的循环语句都是条件满足オ执行循环体(70分19秒)Xdowhile语句至少会执行一次循环体,while则有可能一次都不执行。作业1、写出计算1+2+3+…+99+100的dowhile解法。2、求!0!第6章循环结构(二)死循环(00分55秒)插入//和/*…*/两种注释符的区别。(29分40秒)这里用了倒序讲解,所以在29分钟ォ开始讲死循环的内容※软死机:CPU占用100%,双核占50%,机器明显变慢。出现软死机其实就是死循环。如while(l);就是个死循环语句,请不要用在歪门邪道处。※硬死机:鼠标、键盘、显示器无响应。※大部分的死循环是忘记改变循环变量的值造成的。进化(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语句可直接跳出本层循环。

10(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三个变量输入nj置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女=1女=1K2、画出素数判定的流程图。第7章函数库函数(02分40秒)我们平时使用的printf和scanf都是库函数,除此之外还有常用的求平方根函数sqrt,做游戏用的rand等等也是库函数。使用库函数时要使用#include宏命令来包含有库函数的文件。(04分17秒)程序1求2的平方根(09分20秒)“随机”表示没有规律,随机函数就第10页

11doublefun(doublem,doublen)r4A若干语句returnm;main。/ザ复制@ubleq:dl;d2;d=fun(dl,d2)/・将实参复制到形参・/表示一种没有规律的函数,这种函数可以模拟很多现实的事务,比如洗扑克牌,摸奖,很多MP3播放器的随机播放模式等等。要在C语言中使用随机函数,需要调用srand和rand这两个函数。srand是随机种子,rand表示在。~32767之间产生一个随机整数。程序2(10分42秒)先讲解随机函数程序rand(23分26秒)讲解正式程序猜硬币函数的作用(32分32秒)1、减少重复代码的编写。2、将一个大项目按功能分解成函数,让多个程序员分别设计。也就是分工合作,增加效率。自定义函数(35分14秒)程序3简单的自定义函数带自定义函数时需使用F11调试(44分34秒)自定义函数的格式:返回值的类型函数名(类型名形式参数1.类型名形式参数2,…){若干语句return表达式;)(52分28秒)程序4100600350エ〃+Z〃+エ〃求“=500"=300的和注意:(62分43秒)※函数形参的定义与普通变量定义不同的是:同时定义2个普通变量可以用inta,b;而函数形参只能用inta,intb(63分41秒)※父函数在调用子函数后,会在调用点等待子函数返回,子函数永远不返回,父函数就永远不会往下执行。(65分28秒)※不能调用main函数函数声明(66分20秒)※如果子函数在父函数之后定义,就要对子函数先进行“声明”,否则父函数会认不到子函数。※函数声明的格式就是自定义函数的首部加上分号。(70分04秒)※如果函数返回值为整型,不需要声明也可编译通过,但是不提倡使用这种方式。数据传递(71分28秒)※父函数调用子函数时,通过“实际参数”将数据传给子函数的“形式参数”。※父函数将数据传给子函数加工时,子函数不会改变父函数中的数据,它加工的只是实际参数的副本。(72分57秒)※子函数通过return将加工好的数据传回父函数,这时子函数中所有的数据寿终正寝。(75分25秒)※父子函数中如果有变量重名,这两个变量之间不会互相影响fun函数m的内存区h的内存区・(クf.I.II;复制;;复制main函数:

12均符合void函数的条件。这时的return功能有点类似break语句。(86分43秒)※无返回值函数也称“功能函数”,主函数不需要它返回什么结果,只需要它做完某件事。(86分52秒)程序6无返回值的函数总结(91分04秒)函数的定义、声明、调用、形式参数、实际参数。作业不要看例题,独立完成程序4的代码。第8章数组ー维数组(03分05秒)数组的作用:如果你有一组类似的数据,ー个个起名字麻烦也没意义,用个数组保存它们,用起来省事又方便。(04分27秒)定义:类型名数组名[常量表达式];如:inta[8];它定义了一个有8个元素的数组,下标从0-7(07分38秒)初始化:inta[8]={0,l,2,3,4,5,6,7};8个元素分别初始化成。,1,2,345,6,7也可以:inta[8]={3};它只把a⑼初始化成3,后面的a[l倒a[7]系统默认初始化为〇(10分56秒)程序1求任意5个数中的最大数(27分42秒)一般在数组前面有类型说明符的,如doublea[5]就是“定义”数组。反之,前面没有类型说明符的,如n=a[5]、a[5]=n就是使用数组。定义数组时,方括号里只允许使用常量,不允许出现变量。如:intn=5;inta[n];这是非法的数组定义。(31分52秒)数组在使用时就不允许使用a[8]={0}这样的方式来给数组赋值,只有使用循环来给数组元素一个ー个地赋值。(34分09秒)定义数组时,方括号中可以是空的,如:inta[]={1,2,3);这时电脑会自动计算出a数组有3个元素,会把这行代码翻译成int凯3]={1,2,3};再执行。这种数组一定要用花括号初始化,比如inta[];这是非法的定义。(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章字符字符常量(。。分。。秒)”‘和9都是字符常量注意:’ダ和9有很大区别※单引号的空格‘口’也是ー个字符常量,但不能写成连续两个单引号'’字符变量(。2分。5秒)chare;/・定义ー个字符变量・/(03分!1秒)※字符变量在内存中占ー个字节,它只能存放ASCII(美国信息交换标准代码)码。※标准的ASCH码只有127个字符(见附录1),电子设备统ー了标准,各种电报机,打印机,电脑就可参照标准大规模生产,还可以通过ASCII码交换数据。(11分44秒)※我们在用键盘输入数据时,电脑会从ASCI!对照表中读取相应的ASCI!码装入内存,而不是真实的字符。同理,想要显示信息在屏幕上时,也要使用参照表将ASCII码转换成字符,再显示在屏幕上。(66分20秒)※大家看到,在ASCII码表中,每个字符都有序号,要记住我们常用的字符对应的序号也不难,方法如下:‘〇’〜’9’对应的整数为48-57伏〜‘Z’对应的整数为65-90匕'-'z'对应的整数为97-122※大写字母与小写字母的差值为32,于是得出小写字母减32的值刚好是对应的大写字母。字符类型的输入输出

13(18分04秒)printf和scanf格式控制符为%c如:charc;scanf(tt%c,,,&c);printf("%c”,c);(21分22秒)putchar和getchar如:charc;c=getchar();putchar(c);※无论是字符还是字符串常量,引号在屏幕上输入输出都不会显示。在编程时一定要加上,以区分其它类型的常量。字符运算(25分08秒)※じ语言规定,所有的字符运算都是转成ASCH码的整数运算。如:'B'-'A'相当于66-65=1*a'+!相当于97+l=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",&cI,&c2);如果输入abcde(回车)c1为a,c2为d(52分37秒)※空格和回车都作为字符scanf("%c%c%c",&a,&b,&c);如果输入xQyDz系统会自动使a='x',b='ロ',c='y',最右边的两个字符被丢弃如果输入x(回车)yza、c与前面相同,但是b会赋于ー个回车。也就是ASCII码的10o(55分48秒)题目讲解:有以下程序#includemain(){charcl,c2,c3,c4,c5,c6;scanf(n%c%c%c%c",&c1,&c2,&c3,&c4);c5=getchar();c6=getchar();putchar(cl);putchar(c2);printf(H%c%c

14H,c5,c6);)程序运行后,若从键盘输入(从第1列开始)123(回车)45678(回车)则输出结果是A、!267B、1256C、1278D、1245参考答案:D作业用电脑实践“用scanf输入字符”这ー小节的程序。第10章字符串字符串(00分00秒)在C语言中,没有字符串型数据,只能用字符数组和字符指针来处理字符串。如:charca[10]={0’,'e',T,T,'o','、〇’};或

15charca[l0]={"hello"};或charca[10]=,,helloM;(04分36秒)都表示ca这个字符串中有10个字符(包括、〇)。后面多出的元素自动补、〇。但是运算中出现ca="string!”;这样的赋值语句是不合法的,后期赋值只能使用循环轮循数组元素,ー个ー个写入。或者用字符串处理函数进行赋值。字符串的输入输出(10分20秒)printf和scanf格式控制符为%s/*s为string的意思・/与字符型数据处理不同的是,用%s后面的变量ー定是数组名。如:charca[l0]={"hello"};primf("%s

16”,ca);(12分31秒)printf中可以在s前面加数字和正负号:printf(M%8s",ca);系统会自动在左边补空格,输出结果为:□□□hello加负号printf(“%-8s”,ca);系统会自动在右边补空格,输出结果为:helloDDn(16分05秒)scanf在s前面加数字,意义完全不同,也不能加正负号:scanf(u%3s",ca);输入:abcde(回车)电脑会自动截取前面3个字符对ca赋值,ca的值为“abc”。(17分00秒)puts和gets格式:puts(字符数组名);gets(字符数组名);如:charca[10];gets(ca);puts(ca);注意:gets可以接收空格和TAB键,scanf不可以。字符串处理函数(18分21秒)strcpy(sl,s2):复制(目标串,源串)strcat(sl,s2):连接(目标串,源串)intstrlen(s):求长度(字符串),返回长度intstrcmp(sl,s2):比较(串1,串2),返回值>0,表示sl>s2;=0,表示sl=s2:<0表示sl

17(16分10秒)※那么什么时候才能给里面的成员赋值呢?那就是定义此结构类型的变量。※结构在定义时,后面的分号不可少。结构变量(20分30秒)定义格式:struct结构名变量名;如:structstudentstu;此处的Stu就是ー个student类型的变量。和数组ー样,它也可以在定义的时候初始化,但是格式有些不同:structstudentstu={“张三",'‘男'',23};(24分05秒)注意:结构变量初始化,必须根据成员变量的类型逐个赋初值,而数组中所有的元素都是赋同样类型的值。使用结构变量(25分43秒)结构变量不能直接引用,必须使用号对结构中的成员变量进行操作,如:stu.age=18;/・赋值・/printf("%d”,stu.age);/・打印・/※成员变量像普通变量ー样可进行数学运算。(28分40秒)程序1学生结构联合(35分50秒)在“我的电脑ー>文件夹选项”中有两种按钮,圆形的是单选按钮,方形的是多选按钮。结构就类似于多选按钮,你可以同时使用其中多个成员变量。联合就相当于单选按钮,无论何时,你只能使用其中一个成员变量,并且只有最后一次设置的成员变量有效。(38分37秒)联合的定义格式与结构差不多,只是前面的struct改成union。除此之外,联合还有以下特点:※只能对联合的第一个成员进行初始化。如:unionun(inti;doubled;)unl={10};(41分27秒)※联合变量的地址和它的各成员都是同一地址,因为它是“联合”。※联合与结构之间可以嵌套定义(45分29秒)程序2网友在互通QQ的时候,通常不是给号码就是给昵称,如何用联合来表达?作业有3个学生结构变量,从中找出年龄最大的那个学生,并打印出这个学生的姓名、性别、年龄。第12章二进制位(bit)(01分12秒)在计算机内部,开关导通时,表示1:断开表示。。这样,电压不稳时计算机还能照样工作。ー个通断开关叫做ー个“位’’。字节(byte)(05分00秒)计算机内部经常把8个位作为ー组,用来表示许多我们平时生活中用到的东西。如:00000000表示事物为假,11111111表示为真(非〇即为真)00000000表示数字0,00000011表示38个位可以表示不同的组合情况,比如音乐音符,颜色,这样就实现了多媒体。全世界统一把8个位叫做ー个“字节”,我们平时所说的硬盘容量、内存大小、U盘大小,都是以字节为单位。网络却经常使用位为单位,所以我们平时的上网速度要除以8(加上衰耗,实际上要除以10),才是下载速度。二进制与整数(12分42秒)人类平时使用的数字都是逢十进ー,叫十进制。在计算机中是逢二进ー,叫二进制。(14分10秒)二进制表示成八进制和十六进制更加方便。ハ进制是逢ハ进ー,用0到7表示。十六进制是逢十六进ー,大于9的数字用字母A到F表示。用八进制和十六进制表示二进制的原因是:3个位刚好是八进制的一位数,4个位刚好是十六进制的一位数。黑客和病毒工作者就经常工作在十六进制数上。(20分35秒)十、二、ハ、十六进制的前20个数字转换对照表十进制二进制八进制十六进制0000111121022

1831133410044510155611066711177810001089100111910101012A11101113B12110014C13110115D14111016E15111117F16100002010171000121111810010221219100112313注:标黑体字的为关键数,关键数后面的数字,可从此关键数开始推导(29分44秒)※1个ハ进制位刚好是3个二进制位(32分23秒)※1个十六进制位刚好是4个二进制位。(33分34秒)XI个字节刚好是2个十六进制位如:11111111刚好是FF(36分00秒)娱乐:用二进制表示颜色C语言中的八进制和十六进制(41分04秒)程序1输入和输出十、ハ、十六进制从程序中可以看出:※整数前加个0,表示8进制常量,如:063※整数前加个Ox,表示16进制常量,如:Ox3F(47分06秒)注意:C语言中没有二进制的输入输出,用库函数itoa也只能将十进制转换成二进制,二进制转十进制没有对应的库函数。(48分17秒)※ハ进制和十六进制整数没有负数。各类型所占内存(48分31秒)类型字节类型字节char1float4short2double8int4longdouble8long4指针4※整型前加unsigned,所占字节数保持不变※用sizeof可以计算出所有类型所占的字节数,在后面的章节中演示※同学们可以自己计算出各整型数据的数据表示范围浮点数据类型因为在后面调出几位用来做指数部分,计算方法较复杂,本书作为入门丛书,不对此内容深入讲解。进制转换(54分10秒)书写格式:(数字)进制如:(111)2(10)8(FF)16(55分17秒)※十进制转二进制:用“除2取余法”(20)10=(7)2被除数除数(商)余数读取顺序220|0▲210|025|122|021I10~注意:要除到商为〇为止答案:(20)10=(10100)2规律:以此类推,十进制转ハ进制可用“除8取余法”;转十六进制可用“除16取余法”(58分30秒)※二进制转十进制:用降幕法(10100)2=(?)101*24+0*23+1*22+0*21+0*20=20注意:任何数的〇次幕等于1(10100)2=(20)10规律:ハ或十六进制转十进制只要将底数改为8或16即可(61分10秒)※二进制转ハ进制:将二进制由低位到高位,3个分为1组,每组查表所得的八进制组合,就是最终结果。(10,100)2=(24)8

19(62分14秒)※二进制转十六进制:将二进制由低位到髙位,4个分为1组,每组查表所得的十六进制组合,就是最终结果。(1,0100)2=(14)16(63分41秒)※ハ和十六进制互转:可以通过二进制作为中间进制,再转成另ー个进制(63分54秒)※进制转换可以用Windows自带的计算器设置成科学型后再进行验算。单位关系(64分57秒)数学中的单位关系:太(T)、吉(G)、兆(M)、千(K)、字节(byte)、位(bit)1T=1OOOGlG=1000M1M=1OOOK1K=1OOObytelbyte=8bit(66分25秒)计算机中的单位关系:计算机中的单位关系都是1024,因为210=1024,便于计算机的计算,所以以上的单位关系应改为:1T=1O24G1G=1O24M1M=1O24KlK=1024bytelbyte=8bit作业1、进制转换(1011011)2=()10(2008)10=()2(11101)2=()8(3F4)16=()2(3F4)16=()10(3F4)16=()82,通过计算器辅助计算各整型数据类型表达的数据范围第13章硬件知识计算机常用部件(01分55秒)CPU、主板、内存、硬盘、显卡、声卡、机箱、电源、显示器、键盘、鼠标、音箱、摄像头、打印机。下面简单说明一下带下划线的设备:(14分44秒)CPU:控制主板上各部件之间的エ作,做加减乘除运算,存储运算结果。(16分27秒)主板:各部件通过它来交换数据内存:临时存储数据,速度快,断电数据丢失,容量小,WindowsXP时代约4G,C语言变量操作专用。(20分02秒)硬盘:永久存储数据,速度慢,断电数据不丢失,容量大,WindowsXP时代达到1T,C语言文件操作专用。显卡:掌管显示屏上显示的文字、图形、颜色、分辨率等等。程序执行流程(24分22秒)inta,b,c;scanf("%d%d”,&a,&b);c=a+b;printf("%d

20”,c);(26分22秒)inta,b,c;CPU控制在内存中分配a、b、c这3个变量空间scanf("%d%d”,&a,&b);CPU控制从键盘读入数据到内存c=a+b;CPU从内存a、b取出数据,在CPU内部将a、b相加后放回内存cprintf("%d

21”,c);CPU控制内存c中数据送至显卡,显卡控制显示器如何显示。地址(32分07秒)电脑管理内存的方式是给每个存储单元编号(地址),在32位系统中可以编232=4G个号,所以32位系统最大只能装4G内存。如果是64位系统,理论上可安装264^0.18*1020内存,相当于无限。内存计算

22(38分12秒)※前面我们学习了一个int型变量占4字节内存,那ー个整型数组呢?同理,5个元素的double类型数组呢?(39分26秒)程序1数组与内存关系(44分41秒)※下面这个是我们熟悉的ー个结构。你认为它会占用多少内存?structstudent(charname[20];/・姓名・/charsex[3];/・性别・/intage;/*年龄・/};(46分12秒)程序2结构与内存关系注意:结构的内存计算与#pragmapack(l)这句话息息相关。(50分05秒)※将上面的结构换成联合,你觉得占用内存还会ー样吗?(50分32秒)程序3联合与内存关系作业计算:1ヽsizeof(short),sizeof(unsignedint)、sizeof(longduoble)2,structstudent(doubled[3];shorts[3];inti[2];);上面的结构所占内存是多少?手工算出以上各题的答案,再上机验证自己计算的到底对不对。进阶……(进阶)第14章输出语句格式控制字符(03分42秒)前面我们学过:printf中的字符包括以下三种:(1)以%开头的格式控制字符(2)以、开头的转义字符(3)普通字符(04分31秒)程序1printf的细节(06分20秒)整数的输出(10分10秒)控制输出(14分14秒)浮点输出(26分08秒)字符串输出(28分28秒)综合输出(32分10秒)※双引号中出现ー个%,后面一定要跟随一个输出常量,变量或表达式。※两个连续的%表示输出ー个%(33分01秒)※ー旦出现格式控制字符和转义字符,它们立即会寻找后面紧跟着的字符进行组合。但是它们前面的算普通字符。如:printf("a,%c

23”,t);%c只能算ー个字符,它会输出t中的字符。

24又算ー个字符,它会输出回车。而前面的a,(逗号)只能算普通字符,会原样输出。(34分17秒)※在格式控制串中,格式说明与输出项从左到右在类型上必须ーー对应匹配。如果不匹配,数据不能正确输出,这时系统并不报错。如:printf("%d,%d”,i)因为只有一个参数,第二个%d会输出ー个乱码。(35分06秒)※%m.nf指定输出的数据共占m歹リ,其中有n位小数。如果数值长度小于m,则左端补空格,超过m列,原样输出。X%-m.nf与%m.nf基本相同,只是使输出的数值向左端靠,右端补空格。※用f或If格式打印浮点数时,系统会自动四舍五入。※格式控制字符除了X,E,Gタト,其它字符必须用小写字母,如%d不能写成%D。(36分40秒)题目讲解:以下程序的输出结果是:main(){inta=2,b=5;printf("a二%%d,b二%%d

25”,a,b);)A、a=%2,b=%5B,a=2,b=5C、a=%%d,b=%%dD、a=%d,b=%d

26参考答案:D转义字符(39分17秒)原本字符常量只能是ー个字符,但是因为有些字符看不见或是不好表达,所以特殊的字符常量可以是多个字符,它们以、开头后面跟着其它字符,这也叫“转义字符”。下面是C语言中所有的转义字符:

27回车换行\t横向跳格(代表Tab键)\v竖向跳格(打印机专用)\r回车\f换页(打印机专用)\b退格(代表Backspace键)W反斜杠字符、ヽ,单引号ヽ“双引号\ddd以ハ进制形式代表的ASCII字符\xhh以十六进制形式代表的ASCII字符\0空值下面这行代码:printf(“%c”,'\x41');会输出字符A(46分!3秒)注意:※格式控制字符“%”只能在printf和scanf中使用,而转义字符“ヽ”可以用在所有字符和字符串处理函数中。※转义字符“ヽ”会取后面所有符合条件的字符,并且只取一次,就失去作用,后面的都按普通字符输出。如:ヽx4In就会输出An(47分30秒)程序2转义字符输出(56分36秒)制表符输出演示作业将“程序1”和“程序2”中所有格式输出自己在VC中抄写一遍第15章输入语句scanf的使用(04分07秒)程序1scanf的细节(13分19秒)注意:※有些同学在书写时,经常将scanf函数书写成:scanf("%d%d

28”,&a,&b);后面多加了个

29,电脑会多要求用户输入一个回车,否则程序不会往下执行。(15分20秒)※可以指定输入数据所占列数,系统自动按要求截取所需数据。如:scanf("%3d%3d",&a,&b);若输入:5201314(回车)系统自动将52。赋给a,131赋给b。(13分52秒)※与printf不同的是,输入数据时不能规定精度,如:scanf(“%7.2「,&n);/*n为浮点型・/若输入:123456(回车)n的值并不是1234.56,而是乱码。(18分40秒)※如果在“格式控制”字符串中除了格式说明以外还有其他字符,则在输入数据时在对应位置应输入与这些字符相同的字符。如:scanf("%d,%d”,&a,&b);输入时应用如下形式:3,4如果用:3(回车)4变量b将得不到数据。如果是:scanf("%dロロロ%d”,&a,&b);输入时应用如下形式:3ロロロ4(20分54秒)程序2scanf格式输入(25分45秒)※在输入数据时,遇以下情况时该数据认为结束:(1)遇空格,或按“回车”或“跳格”(TAB)键(2)按指定的宽度结束,如%3d,只取3歹リ。(3)遇非法输入。(4)%c只取1列。

30如:scanf("%2d%d%f',&a,&b,&c);若输入12345.26783个变量的结果:a为12,b为345,c为0.26(31分40秒)※在输入long型数据时,格式字符必须是%Id;输入double时,格式字符必须是%If。否则得不到正确的数据(32分12秒)题目讲解:(1)现有格式化输入语句:scanf("x=%dロ,sumロy=%d,lineロz=%d”,&x,&y,&z);已知在输入数据后,x,y,z的值分别是12,34,45,则下列选项中是正确的输入格式的是:A、!2,34,45B、x=12,y=34,z=45C、X=12C,sumy=34,z=45D、x=12ロ,sumロy=34,lineロz=45参考答案:D(38分07秒)附加程序:scanf的用户哲学作业若变量已正确定义为int类型,要给a、b、c输入数据,以下正确的输入语句是:A、read(a,b,c);B、scanf("%d%d%d'',a,b,c);C、scanf("%D%D%D”,&a,&b,&c);D、scanf(''%d%d%d”,&a,&b,&c);第16章数据类型与表达式无符号整数的范围(。。分00秒)回到《数据类型》中“整数类型的取值范围”,可以得出unsignedshort的取值范围为〇〜65535。(02分29秒)原因是:unsignedshort占有2个字节,也就是16位,在计算机内部用(0000000000000000)2表示〇,用(1111111111111111)2表示最大数。

31(1)2表示),(11)2表示31(111)2表示?(1111111111111111)2表示65535,刚好是21-1、22-1、23-1……216-1,得出无符号整型的计算公式为〇〜2n-l(n为整型位数)。可以用此方法推算出unsignedint(long)类型的取值范围。补码(05分22秒)补码中第一位表示正负数:0表示正数,1表示负数。(08分14秒)补码原理(见PPT演示)(14分26秒)要求一个负数的补码,将它的绝对值二进制按位取反再加1,正数的补码是自己。(15分18秒)如求4位二进制数-3的补码:把(3)10=(0011)2按位取反得(1100)2,再加1得(1101)2,short型只是把4位扩展为16位(0000000000000011)2,按位取反得(1111111111111100)2,加1得(1111111111111101)2。(19分01秒)16位二进制数-32768的补码:将32768转成二进制得(1000000000000000)2,取反得(0111111111111111)2,加1得(1000000000000000)2(21分06秒)补码的特点是可以把减法运算转换成加法,比如一个4位二进制减法(0011)2-(0001)2在CPU中会先取得(0001)2的补码(1111)2,将此变成加法运算(0011)2+(1111)2得到(10010)2,因为运算器只有4个位,前面的1舍去,得到正确结果(0010)2,这样CPU中就可以省去ー个做减法运算的元件。(27分38秒)补码在数学和计算机硬件的书籍中有更深入的讲解,对些有兴趣的的同学可以去网上搜寻相应的文章书籍进ー步学习。不同类型的混合运算(28分46秒)※赋值语句中,等号两边类型不同时,以左边类型为准。(30分42秒)程序示例如:inta=300;charb;b=a;/・不可预期的错误,但系统不会报错・/(35分00秒)※除法运算时,2/3的结果为0,2.0/3或者2/3.0结果都为0.66666……〇这说明如果除号两边都是整数,结果只能是整数,除号两边有任意ー个浮点数,结果就是精确的浮点数。混合运算时也遵循上述规律:doubled=l.0+2/3;会先算2/3,这时答案已经是〇,再加1.0,得到错误的结果1.0,改成doubled=1.0+2/3.0;结果为!.666666,正确。(36分32秒)Xchar参与任何运算都会转换成ASCI!码※外(取余)不能用在浮点数上,它不会自动将浮点数转换成整数。强制转换(37分18秒)格式:(类型名)表达式如:doubled=(double)2/3+1.0;相当于doubled=2.0/3+1.0;与doubled=2/3.0+1.0;运算结果相同作业写出下列8位二进制数的补码,并转换成十六进制。(1)(221)10=((2)(-128)10=((3)(-32)10=()2=()2=()2=()16)16)16第17章更多的运算符复合运算符(03分04秒)算术运算符后面加=号,便成为复合运算符如:i+=5;相当于i=i+5;那么i-=a+b;等价于什么?注意:i*=a+b;并不等价于i=i*a+b,而是等价于i=i*(a+b)(06分23秒)+-*/%5个算术运算符都可以和=号组合成复合运算符,除此之外还有位运算符也可与=号组合成复合运算符。逗号运算符(08分15秒)逗号运算符的运算顺序为从左到右,计算结束后取最右边的表达式作为运算结果。如:inta;a=(3+5,4+6);a的结果为!0o

32(11分00秒)在循环中经常见到:for(i=0;i<=100;s+=i,i++);用这种方式计算1加到100的和,循环体可以省掉。(17分20秒)※逗号运算符的优先级是C语言中最低的,比=号还低。假设a=3,下面的逗号表达式:b=(a=2+5,a*2)会先算a=2+5,再算7*2,b的最终值是I4,而不是3*2得6。(21分00秒)※逗号表达式出现在函数调用当中,很容易混淆,如:func(rec1,rec2+rec3,(rec4,rec5));该函数调用语句中实际上只有3个函数实参,(rec4,rec5)是个逗号表达式,取变量rec5的值作为实参,差别就在于这个括号。(23分48秒)※逗号是表达式,分号表示一条语句结束。赋值表达式(25分39秒)inta=l,b=2,c,d;if((c=a)<(d=b)){…}(27分13秒)if语句中,c=a表达式得到的结果为1,d=b得到的结果为2,相当于比较1<2,条件成立,会执行花括号中的语句。※表达式inta=b=c=l+2;的真实运算顺序如下:inta=(b=(c=(l+2)));(30分45秒)※赋值表达式也可出现在函数中,如:printf("%d

33”,(n=5));运算符结合性(31分29秒)单目运算符(++,-,!取反,&取址,・取值,正负号)、条件运算符(在后面讲解)和=号(包括复合运算)结合性都是从右向左,其它运算符都是从左向右结合,如:a=-i++相当于a=-(i++);(34分00秒)上节的inta=b=c分+2+3;先算1+2是因为=号的优先级比+号低,先算后面的c=l+2是因为=号的运算符结合性是从右向左。++^和ー-(36分34秒)i++等价于i=i+li--等价于i=i-l++i表示i先自加1,再参与运算如:inti=2;printf("%d

34”,++i);输出3,i的值为3,这条printf语句可以分解为:i=i+l;printf("%d

35”,i);(40分26秒)※注意i++和i+1的区别。i++表示i先参与运算,再自加1printf("%d

36”,i++);输出2,但是i的值为3,它可以分解为:printf("%d

37”,i);i=i+l;(42分53秒)X++和ー只能作用于变量,不能作用于常量或表达式,如3++或(a+b)一都视为非法操作。因为++和一都会产生新值,常量或表达式都无法存放这个新值。(45分00秒)※如果遇见a+++b,编译器会尽可能地从左到右组合运算符,把它变成(a++)+b,这和运算符结合性没并有什么关系。如果你忘记了这条法则,可以自己使用括号控制运算顺序。(46分23秒)题目讲解:设变量已正确定义为整型,则表达式n=i=2,++i,i++的值为ー参考答案:3(48分25秒)程序1++运算符演示作业用C语言的方式写出ー元二次方程的ー个实根:—b+yb~—4tzcx-2a

38第18章选择的嵌套逻辑表达式(01分40秒)※じ语言中没有其它语言的“真”和“假’’值,英文叫TRUE和FALSE值,也叫逻辑型变量。所有的表达式,只要非〇(包括负数)即为真,0即为假。真和假就是我们平时所说的“条件成立”与“不成立”。(04分08秒)※关系和逻辑运算符也可以和算术运算符一起参加混合运算,与算术运算不同的是,关系和逻辑运算的结果只有0和1。假如inta=3,b=4,c=0;a&&b的结果为!,b||c的结果为1,a&&c的结果为O。!a+c>b||a-b的结果呢?(07分47秒)Xa&&b&&c中,如果a为假,就不必再判断b和c,对于(i=0)&&(j=20)这样的式子,j=20这条赋值语句永远也不会执行。(09分35秒)※同理,a||b||c,如果a为真,就不必再判断b和c,对于(i=5)||(j=20)这样的式子,后面的j=20也不会执行。条件运算符(13分17秒)格式:条件表达式1?表达式2:表达式3它相当于普通的if分支语句,条件表达式1成立(非0值),执行表达式2,不成立(0值),执行表达式3。如果将它作为表达式,将执行过的值作为整个表达式的最终值。(15分14秒)条件表达式应用的ー个典型例子就是取两数中的最大值:intmax,a=3,b=5;max=a>b?a:b;它相当于if(a>b)max=a;elsemax=b;(17分39秒)题目讲解:设inta=5,b=6,表达式(++a==b--)?++a:--b的值是参考答案:7嵌套的if(26分25秒)定义:if中还有一层if,或者else中还有if帐号检查(28分42秒)讲解流程图(30分40秒)讲解程序(38分54秒)附加程序:“配对”写程序技巧,以减少错误帐号a<-3166(40分00秒)※嵌套的层数过多,if语句的配对容易出问题,这种问题主要出现在if和else数目不ー样的情况下,如:if(a<5)if(b<5)printffW);elseif(c<5)printf("c

39”);elseprintf("d

40");程序作者想通过格式的改变将第一个else和第一个if语句配对,实际上编译器有自己的配对方式:它会将else与离自己最近的if语句配对,上面的语句实际上被编译器配对成:if(a<5)if(b<5)printf("b

41");

42开始NoNoNo输出‘’不及格”,输出“优秀'‘,输入成绩grade输出''格''casecase常量表达式1:常量表达式2:语句1语句2elseif(表达式)(若干语句case常量表达式n:语句ndefault:语句n+1;)elseif(c<5)prinlf("c

43”);elseprintf("d

44");(43分00秒)如果想强制配对,请多使用花括号:if(a<5)(if(b<5)printfCW*);}else|if(c<5)printfCtc

45M);elseprimf("d

46”);)作业1、有以下程序:#includemain(){inta=2,b=-l,c=2;if(a

47M,c);)程序的输出结果是A)0B)1C)2D)32、编写程序:输入a、b、c三个数,打印出最大者。第19章多路分支if多路分支(00分42秒)格式:if(表达式)(若干语句)elseif(表达式){若干语句)else(若干语句(02分12秒)程序1学校将考试成绩分为3档,0-59分为不及格,60-89分为及格,90-100分为优秀。现在请编ー程序,由老师输入ー个学生成绩,计算机判断这个成绩在哪ー档,并在屏幕上显示。(03分02秒)讲解流程图(05分28秒)讲解程序IF结束switch语句和break语句(14分58秒)格式:switch(表达式)(18分15秒)程序2写ー个程序供老师查询A、B、C三档分数各在什么范围

48(19分02秒)讲解流程图(20分59秒)讲解程序(25分16秒)Xswitch语句出现嵌套时,break只会跳出本层switch※加fault相当于if中的elseXbreak不对if语句起作用。(26分52秒)Xcase如果后面没有break,程序会继续向下执行,而不会跳出switch,如:inta=l;switch(a){casel:printf("l

49”);case2:printf("2

50’');}这时1和2都会打印在屏幕上。(28分18秒)Xcase后面只能是常量表达式,不能是变量,如:case1+2:case'a':case1<2:都是合法的,而switch(a){casea:casea<5:)因为a是变量,两条语句都不合法(36分19秒)程序3投票统计(52分20秒)演示break不对if语句起作用(54分36秒)题目讲解:以下程序的运行结果是〇#includemain(){intx=1,y=0,a=0,b=0;switch(x)(case1:switch(y){case0:a++;break;case1:b++;break;)case2:a++;b++;break;case3:a++;b++;)printf("a=%d,b=%d

51”,a,b);)参考答案:a=2,b=l;作业若a值小于100,请将以下选择结构改写成由switch语句构成的选择结构。if(a<30)m=l;elseif(a<40)m=2;elseif(a<50)m=3;elseif(a<60)m=4;elsem=5;提示:既然a的值小于100,switch后ー对括号内的表达式可写成a/10,这样可精简代码。第20章循环的嵌套六种排错方法(03分55秒)1、断点2、单步执行:跟踪(07分21秒)3、缩小循环变量4、注释代码段排错:整片整片地“删除”代码,如果在注释掉某片代码,程序突然不出错了,说明问题出在那片区域

52(09分42秒)5、printf6、输出到文件:用printf输出的结果在ー屏幕显示不下的时候,就将它输出到文件(10分23秒)注意:调试时只能按F5,不能按Ctrl+F5循环嵌套和break语句(1I分50秒)while、dowhile和for语句都可以形成嵌套,在这里我们着重分析for语句的嵌套。(12分20秒)程序1简单的for语句嵌套(22分05秒)第二段小程序(27分15秒)讲解流程图inti,j,k=O接跳出本层循环(47分04秒)程序3小游戏:打飞碟数学类问题解题技巧(77分55秒)一、找到计数器(步长)的数学规律,确定步长二、确定初值和终值三、找出“总和”或“总积”的数学规律(78分42秒)找规律:()1力ロ至リ100:1+2+3+4+...+99+100た,111—+——+...(二)计算P1值:4357,直到某ー项的绝对值小于10-6为止(三)求某数列的前40个数:1,1,2,3,5,8,13,21...i=0j=0i=i+ll结束ノ(31分10秒)程序2打印九九乘法表尝试用F10跟踪此程序的执行流程注意:break语句不是跳出if中的花括号,而是直(四)1!2!3!4!加,计算前50项(五)求10〇〜200间的全部素数(84分36秒)题目讲解:1、以下程序的输出结果是#includemain(){inta,i;a=0;for(i=l;i<5;i++){switch(i){case0:case3:a+=2;case1:case2:a+=3;default:a+=5;}}printf(H%d

53H,a);}参考答案:31(88分08秒)2、以下程序的输出结果是:A、!2B、15C、20D、25inti,j,m=0;for(i=l;i<=15;i=i+4)for(j=3;j<=19;j=j+4)m=m+l;

54华科电脑学校二级C语言专用教材printf("%d

55”,m);参考答案:C注意:这里的循环省掉了大括号作业1、编程题:求e的值。(1)用for循环,计算前50项(2)用while循环,要求直至最后ー项的值小于10-42、(单重循环思考题):给ー个不多于5位的正整数,要求:(1)求出它是几位数;(2)分别打印出每一位数字;(3)按逆序打印出各位数字,例如原数为487,应输出784。第21章函数的嵌套模块化与函数嵌套(00分00秒)计算机的最终走向是模拟人工智能和社会,人类在完成复杂任务都采用分工合作的方式,在计算机内部也可以通过函数来划分各程序的功能来完成一个复杂任务。main函数就相当于程序里的皇帝,必须要有,并且只有一个。它指挥所有的大臣(子函数)协调工作,大臣又可以调用更底层的子函数,相当于指挥小兵再进行更具体的工作,这就叫函数嵌套:(04分14秒)程序1函数的嵌套调用(11分32秒)程序2打印100-200间所有的素数(两种解法)(23分56秒)方法2程序演示再论数据传递(30分20秒)intfun(intn)(intm;m=n+2;returnm;)main()(inti=3J;j=fun(2)*fun(i)+6;)第一次调用:定义:fun(intn);/・形参*/调用:fun(2);/・实参*/这个实参到形参的传递过程可以分解为intn=2;第二次调用定义:fun(intn);/・形参*/调用:fun(i);/・实参・/这个实参到形参的传递过程可以分解为intn=i;返回值没有形参和实参的说法,返回细节也比参数传递复杂,在这里不作详解。如果在表达式中出现函数调用,直接用它的返回值代替函数即可,如:j=fun(2)*fun(i)+6;两次返回值传递后得:j=4*5+6;(36分12秒)程序3求3个数中的最大数(45分25秒)如果实参与形参类型不匹配,会发生什么样的事情?(46分42秒)按数据类型的精度来排序,顺序如下(不考虑unsigned):char、short、int>long>float、double,longdouble,如果形式参数比实际参数精度高,系统会自动转换成正确的类型,比如整数5会被转换成浮点的5.0。反过来如果形式参数精度比实际参数低,系统也不会报错,但是所得到的数值无法预料。比如:voidfun(inta){...}下面的代码:shorts;fun(s);没有问题,但是:doubled;fun(d);编译可以通过,程序在执行却会有无法预料的后果。(52分18秒)下半节课开始(52分58秒)题目讲解:

56填空题:回,否则它会无限递归下去,直至程序崩溃。请补充函数fun,它的功能是:计算并输出n(包括n)以内所有能被3或7整除的自然数的倒数之和。(75分30秒)题目讲解:例如,在主函数中从键盘给n输入30后,输出为:※以下程序的输出结果是[1]。(见PPT演示)s=1.226323〇#includevoidfun(intx)注意:部分源程序给出如下。{if(x/2>0)fun(x/2);请勿改动main函数和其他函数中的任何内容,仅printf("%d”,x);在函数fun的横线上填入所编写的若干表达式或语)句。main(){fun(3);printf("

57");}试题程序:参考答案:13#includedoublefun(intn)函数的设计原则((86分10秒)函数在设计时应该遵循两种原则:intI;ー种是自顶向下,也就是在主函数中先设计功能,doublesum=0.0;再设计子函数,如ー个煮饭程序:for(I=l;[11;I++)main()if(I%3==0[2]I%7==0)(sum+=[3]/I;洗米();returnsum;)下锅();打开电饭煲();)main()将中文翻译成英文后,再在main函数顶部分别再{设计各子函数的细节:intn;void洗米〇doubles;(printfC€

58!nputn:M);scanf(<4%d,,,&n);s=fun(n);)printfC<

59

60s=%f

61M,s);)(87分44秒)另一种是由下而上:许多通用函数设计出来时根本就不知道哪个父函数谁会调用它,比如我们看到的sqrt、printf和各种库函数,程序员参考答案:将它设计好后把函数的接口(声明部分)交给调用(l)I<=n者,调用者不需要知道里面的程序细节,只需按照(2)11它的接口调用即可达到目的。(3)1.0有些函数设计出来,有可能永远都不会被调用。这就好像if语句的分支ー样,有些分支因为数据值没递归函数有满足条件,就永远都不会执行那个模块。这也是(64分10秒)函数还可以自己调用自己,这样的对程序设计资源的ー种浪废。函数称作“递归函数”。目前无论是汽车、手机、电脑都是按照这个理念组装出来的。(65分50秒)程序4用递归函数求10!(见PPT演示)作业(1)上机填空题:请补充函数fun,该函数的功能是:(75分03秒)※注意:递归函数必须要设条件返计算并输出下列多项式的值。

62C,111S=IH1+…H1+21+2+31+2+3+---+50例如,若主函数从键盘给n输入50后,则输出为S=1.960784.注意:部分源程序给出如下。请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填若干表达式或语句。试题程序:#include[I]fun(intn)(inti,j;doublesum=0.0,t;for(i=l;i<=n;i++)(t=0.0;for(j=l;j<=i;j++)t+=[2];sum+=[3];)returnsum;)voidmain(){intn;doubles;printf("

63lnputn:");scanf(H%dM,&n);s=fun(n);printf(,'

64

65s=%f

66

67';s);)(2)上机改错题:下列给定程序中,函数fun的功能是:根据整型形参m,计算如下公式的值。,1111y=1++++•••+2x23x34x4mxm例如,若m的值为5,则应输出:1.463611。请改正程序中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序:#include#includedoublefun(intm){doubley=1.0;inti;/*************nd**************Ifor(i=2;i

68Theresultis%lf

69",fun(n));)第22章多维数组二维数组(00分00秒)定义:类型名数组名[常量表达式][常量表达式];如:inta[3][3];它定义了一个有9个元素的二维数组(3*3),两个维数的下标都是0-2初始化:inta[3][3]={{0,1,2},{3,4,5),(6,7,8});或inta[3][3]={{0,l],{5},{6,7,8});它相当于inta[3][3]={{O,l,O},{5,0,0},{6,7,8}};(03分46秒)提问:inta[2][4]={{0,l},{0}};数组a的下标各是从多少到多少?各数组元素的值是多少?多维数组的规律(05分20秒)※数组其实也是ー种嵌套结构,二维数组也叫数组的数组,那么三维数组呢?n维呢?※像Photoshop这样的平面图像处理软件中,经常用到ニ维数组,处理二维数组通常要用到双重循环。※像3DMax这样的三维图像处理软件中,经常用到三维数组,处理三维数组通常会用到三重循环。(07分42秒)※类似Windows资源管理器中的“树状菜单”,经常会用到多维数组。(09分48秒)程序1

70将一张矩阵笑脸上下翻转成哭脸(16分42秒)讲解程序,前面先讲解题思路000000001001011001101001.0000a-翻转成b=o000解题思路:0,00,10,20,31,01,11,21,32,02,12,22,3矩阵坐标为:3,03,13,23,3翻转规律为放置第一排b(3,0)=a(0,0)b(3,l)=a(0,l)b(3,2)=a(0,2)b(3,3)=a(O,3)放置第二排b(2,0)=a(l,0)b(2,l)=a(l,l)b(2,2)=a(l,2)b(2,3)=a(l,3)放置第三排b(l,0)=a(2,0)b(l,l)=a(2,l)b(l,2)=a(2,2)b(l,3)=a(2,3)放置第四排b(0,0)=a(3,0)b(0,l)=a(3,l)b(0,2)=a(3,2)b(0,3)=a(3,3)也就是说把矩阵a中第0行的数据放到矩阵b中的第3行,第1行放到第2行,第2行放到第1行,第3行放到第。行。经过4次重置,任务完成。下标在交换过程中有几个规律可寻:第一个规律:在4次放置中,b的第一位下标刚好是递减的,a的第一位下标刚好是递增的。无论在哪ー排,b的第一位下标数字刚好是3减去a的第一位下标数字。(请同学们思考这个3的意义是什么?)第二个规律:两个矩阵的第二个下标数字相同。排序(30分42秒)程序2将任意5个数按由大到小的顺序排序(见PS演示)(37分12秒)讲解程序,前面先讲解题思路(32分04秒)解题思路:(1)将第1个数与后面所有数比较,如果有比它大的,就与它交换(2)将第2个数与后面所有数比较,如果有比它大的,就与它交换(3)以此类推,将第n(n=l~5)个数组元素与n+1到n+5个数比较,较大的数字会被选择到第n个元素中(4)全部比较完成后,数组已经按从大到小的顺序排好,用循环输出数组用5个数来描述以上过程:1)57428:5和7比较得:2)75428:7和42比,还是原来顺序,与8比较得:3)85427:第一轮比较完毕,老大已经出现在第1位。第二轮开始:5跟42比较,还是原来顺序,与7比较得:4)87425:第二轮比较完毕,老2已经出现在第2位。第三轮开始:4跟2比较,还是原来顺序,与5比较得:5)87524:第三轮比较完毕,老3已经出现在第3位。第四轮开始:2跟4比较得:6)87542:第四轮比较完毕,老4已出现在第4位。最后一位不用比,排序结果已经出来。这就是世界著名的“选择排序法”排序方法有多种‘还有‘‘冒泡排序法、快速排序法”,因为时间问题,在这里无法ーー列举。数组与函数(50分34秒)数组元素可直接做函数实参传递,下面的代码是ー维数组和二维数组元素传递给普通函数:inta[10]={5,10},b[10][10]={{2,3},{5,6}};intc;c=max(a[l],b[O][O]);有时候要将整个数组传进函数,这时函数的形式参数要改变。(52分56秒)程序3求5个学生的总分(57分17秒)※函数的形参可以省略元素个数,如:doublesum(doublearray[])也合法(58分47秒)程序4将两个矩阵相加(66分21秒)※数组元素做函数参数时,如果子

71函数改变了数组元素的值,父函数里的数组元素不会变。但是用数组名做函数参数时,父函数里的的数组也会随之改变。(67分45秒)※函数定义时,二维和多维数组的第一维元素可以省略。作业1、将程序1的矩阵左右翻转。2、已有一个按从小到大排好序的数组,今输入一个数,要求按原来排序的规律将它插入数组中。比如数组a元素为2,5,7,12,20,0(多出个0是为了方便插入数据用),用户输入10后,数组变成了2,5,7,10,12,2003、熟悉程序2的排序程序,争取不看书能独立将其写出。(提醒:写如此复杂的程序加上打草稿时间,至少要1小时以上)第23章结构的嵌套(00分00秒)技巧:要养成写注释的习惯(03分45秒)技巧:Alt+F8自动排版结构数组(08分58秒)既然结构是ー个自定义“类型”,那么我们可以像int那样,定义ー个结构数组:structstudentArrayStu[10];上面的代码一次定义了10个学生。如果同时给这个数组的前2个元素初始化,就写为:structstudentん0^5■10]={{"张三’',"男",18},{“李四,,,,,女”,22}};(12分58秒)结构数组元素使用时和普通变量ー样要加上下标:ArrayStu[l].age=18;它把李四的年龄改成了18岁在实际应用中,初学者有时会将上面的代码误写为:ArrayStu.age[l]=18;下标写在后面,其实跟写在前面有完全不同的意义,后面会详细解释这种写在后面的意义。结构嵌套(14分43秒)structStudent/*学生・/charname[10];/・姓名・/charsex[3];/・性别・/intage;/*年龄・/);structRoom/・寝室・/(intnumber;/・号码・/structStudentstu;/・学生・/);main()(structRoomroom;strcpy(room.stu.name,"张三”);/・如何输出张三请同学们自己思考・/)(20分08秒)※这里举的是结构嵌套结构变量的例子,结构也可以嵌套结构。考虑到这种方式较少使用,在这里不做详解。结构成员为数组(22分49秒)我们将学生结构定义修改一下:structstudent/・学生・/(charname[10];/・姓名・/floatscore[8];/*本学期8门课成绩・/floataver;/*平均分・/);(23分58秒)此结构表示每个学生将本学期8门课的考试成绩放在score数组中,最后通过程序算出平均分存进aver。(见Excel演示)(28分47秒)程序1计算学生平均分(39分28秒)题外话:结构与函数的哲学(41分55秒)题目讲解:根据以下定义,能输出字母M的语句是A、printf("%c

72",class[3].name);B、printf(t*%c

73,,,class[3].name[1]);C、printf(',%c

74,,,class[2].name[1]);D、printf("%c

75",class[2].name[〇]);structperson{charname[9];intage;};structpersonclass[10]={“John”』7,“Pauド』9,“Mary”,18,“Adam”/6,};

76参考答案:D作业有5个学生,每个学生的数据包括学号、姓名、成绩,从键盘输入5个学生数据,要求将最高分学生的学号、姓名、成绩全部打印出来。第24章枚举(00分00秒)解析浮点型数据枚举的作用(02分!5秒)有一种变量类型,它的值只有固定的几种选择之一,比如性别(男、女)、硬币的两面(正、反)、星期(周一到周日)、居住省份(36个省市自治区名称)等等,这样的变量适合用enum枚举类型。使用枚举(03分43秒)说明:※自定义的类型一般都放在main函数前面,枚举也遵循这个规律:enumsex{boy,girl};main(){...}(05分47秒)※枚举类型在定义时,系统会自动用整数为枚举的可用值从〇开始用整数进行编号,如上面的boy的值为0,gir!为!,也可以用printf("%d”,gril)这样的语句输出。枚举值也可以叫做“符号常量”,有时候用英文单词组成的符号常量来代替简单的数字,会使程序的可读性大大提高。比如我们看到boy第一反应这就是男孩,而你看到数字0,并不知道这表示什么意思。(09分00秒)可以通过赋值来改变枚举常量的值:enumcolor{red=4,green=l,blue,black);这条语句中从blue开始会自动往后递增,blue的值为2,black为3。(09分50秒)※不能给枚举常量赋值,比如boy=2,这是错误的写法。※枚举常量相当于ー个关键字,程序中不得出现与枚举常量相同的标识符。※枚举支持所有的逻辑运算,也可以递增递减,比如上面的枚举类型color值为green,color++就得至リblue,color+=2就得到black。有了这个规律,我们就用循环来处理枚举变量就非常方便。(13分28秒)程序1箱子里有3种不同颜色(红绿蓝)的乒乓球若干个,请任意摸3个,如果摸到2个相同颜色的为二等奖,奖金一千元,摸到3个相同颜色的为一等奖,奖金ー万元。(27分53秒)※仔细观察程序1会发现,枚举常量不支持直接的输入输出,因此,枚举变量经常会跟swith联用而达到直观的文字输出效果。作业我国规定周六和周日双休日,请输入一个星期几,由程序判断并输出这一天是否是休息日。第25章指针基础指针的作用(00分46秒)※处理大量数据:编写大型软件时,函数与函数之间经常会传送大批量的数据。比如ー个班有50个学生,有一个子函数的作用就是将这50个学生的成绩进行排序,再返回给父函数。如果用之前学过的“参数复制”方式,我们就要定义一个有50个参数的子函数,并且子函数只能有一个返回值,不能实现这个功能。这时候父函数可以将第一个同学的座位号(指针)传给子函数,ー个参数就能搞定。(02分58秒)※改变父函数中变量的值。※高手用来提高程序运行速度。内存和地址(04分16秒)※许多馆子店在管理房间时,会给每个房间编号,同时会给房间取个名字,比如“水云阁”,“碧玉居”等等。那么名字就是我们平时所说的“变量名”,编号就是我们所说的“指针”,俗称“内存地址”。(05分50秒)※指针也是变量,它也要占用内存,它不存储“整数,,,“实数”这种普通数据,它存的是其它变量的“地址”,占用4字节内存。指针的定义和使用(07分37秒)普通变量定义时,前面加个・就是指针的定义。一般来说,我们都会在指针类型的变量名前面加p,表示pointer(指针)的意思。指针也是变量,它也要占用内存,只是它不是存“整数,,,“实数,,,它存的是其它同种类型变量的“地址”。就像ー个抽屉A,里面什么也不放,只放着另ー个抽屉B的钥匙,若想拿到抽屉B中的物品,必须先从抽屉A中取钥匙。

77(08分22秒)下面我们来看一个指针的执行情况:inti=15,j=0;/・定义2个普通变量・/int*pi,*pj=0;/・这行定义2个指针,pj初始化为空指针・/pi=&i;/・用&运算符将i的地址赋给指针pi*/地址内存0x03FF0000i=0000000F*--0x03FF0004j=000000000x03FF0100p\=03FF00000x03FF0104pj=00000000(14分15秒)注意:※可以将地址〇赋给指针,如pi=0时,系统会自动将0转成空地址赋给pi«但是像pi-OxOOOOFFFF这样的表达式,被视为ー种很危险的操作。(18分34秒)这里用了倒序讲解※等号左边只允许是容器,右边只允许是数值。如果右边是容器,它会自动取出容器里的数值。(15分47秒)X・在定义时出现表示定义指针,在表达式中出现表示取值。它还有个作用就是做乘号,这时它是个双目运算符。如:inti=5,j=0,*pi;/・定义指针・/pi=&i;int*pj=pi;/・定义指针・/j=*pi;/*取值・/*pi=50;j=i*5;/*作为乘号・/(23分17秒)提问:inti;int*pi=&i;这个・是定义变量还是取值?实际上系统看见“变量定义”与“表达式”合成的语句,会自动分解。如上式会被分解为:int*pi;pi=&i;int*pl=&a,*p2=pl;会被分解为:int*pl,*p2;pl=&a;p2=pl;(28分22秒)请同学们思考一下:int*p=pl;和*p=*pl;的含义各是什么?(29分12秒)程序1用指针间接操作2个变量(见Excel演示)(34分40秒)讲解第2个函数(54分22秒)※指针就相当于存放着各变量的钥匙,得到变量的钥匙用&i,从指针中拿钥匙取值就用・pi※指针不能指向不同类型的变量。如:floatf=3.14;int*pi=&f;/・错误・/(55分16秒)※指针在定义时・号可以靠着类型,也可以靠着变量,但中间一定要有空格。通常定义函数返回值时靠着类型,定义变量时靠着变量。为什么呢?如:int*pi,pj;/・此写法容易误认为定义了2个指针,实际上pj是整型变量・/int*p,pj;/・立刻就看出第二个不是指针・/(56分46秒)因为函数不可能定义多个返回值,所以・号可以靠着类型。int*fun(){…}/・表示此函数返回一个整型指针・/int*fun(){...)/・此写法容易误认为定义了指向函数的指针・/(57分33秒)题目讲解:若有以下程序:#includemain()

78{intk=2,m=4,n=6,*pk=&k,*pm=&m,*p;*(p=&n)=*pk*(*pm);printf(44%d

79M,n);)程序的输出结果是A)4B)6C)8D)10参考答案:C(64分30秒)技巧:替换法解题,事半功倍作业若有定义:intx,*pb;则正确的赋值表达式是A)pb=&xB)pb=xC)*pb=&xD)*pb=*x第26章位运算作用(00分37秒)在小内存时代,经常把ー个字节分成好几份来用,以达到节约内存的目的。现在经常用于网络数据传输,单片机领域……。(01分59秒)注意:※在进行任何位运算前,首先应将进任何表达式的结果转换成二进制,算完以后再转回原来的进制即可得到结果。※不能对浮点数进行位运算。按位与(02分43秒)格式:二进制&二进制如:inta=3&5;相当于00000011&0000010100000001转成十进制后a的值为1(03分56秒)记忆方法:在逻辑与运算中,两边的表达式都为真,结果オ为真。因此按位与运算时,两个位都为1,结果才为1。作用:(05分10秒)※清零:要将某一位清零,可将相应的位设置为〇,其它位为1,再使用&运算。(07分28秒)※取指定位:想取某一位,可将相应的位设置为1,其它位为〇,再使用&运算。按位或(09分51秒)格式:二进制|二进制如:inta=3|5;相当于10000001110000010100000111转成十进制后a的值为7(10分32秒)记忆方法:在逻辑或运算中,两边的表达式有一个为真,结果就为真。因此按位或运算时,有一个位为1,结果就为1。作用:(10分56秒)※将某位置1:要将某一位置1,可将相应的位设置为1,再使用|运算按位异或(13分02秒)格式:二进制八二进制如:inta=3A5;相当于00000011A0000010100000110转成十进制后a的值为6(14分12秒)记忆方法:“异”就是不同的意思,异或实际上是判断两数是否“不同”,如果不同就为真。因此按位异或时,两数不同,结果为1。(15分30秒)定理:1、任何数与自己异或都为〇2、任何数与〇异或值不改变(16分06秒)作用:※翻转位:要将某一位翻转,可将相应的位置1,第34页

80第一次用~运算,可将其翻转,第二次用~运算,又可将其转回来。早期的鼠标指针用的就是ー种图形异或运算,所以速度非常快。(21分。5秒)※不用临时变量交换两个值。如a=4,b=5,可用以下语句实现互换:a=aAb;b=bAa;a=aAb;用等量代换法分析:a=aAb,那么b=bAa相当于b=bA(aAb),去括号得b=bAaAb,移项得b=bAbAa,根据定理1得b=OAa,根据定理2得b=a。这时候b的值是4,而a只是个中间值。a=aAb相当于a=(aAb)A(bAaAb),去括号得a=aAbAbAaAb,移项得a=aAaAbAbAb,根据定理1得a=OAOAb,根据定理2得a=bo这时候a的值是5,交换完毕(26分36秒)程序1矩阵异或按位取反(35分19秒)格式:~二进制如:inta=~3;得到11111100,它是个负数。左移(36分57秒)格式:二进制<<要移动的位数如:inta=3«2;相当于00000011«2得到00001100转成十进制后,a的值为12(38分02秒)作用:将二进制数左移一定的位数,最右边补。。任何一位移出左边界,自动丢弃。※不越界的左移相当于让变量值乘以2。右移(41分45秒)格式:二进制〉〉要移动的位数如:inta=12»2;相当于00001100»2得至リ00000011转成十进制后,a的值为3(42分08秒)作用:将二进制数右移一定的位数,最左边补0(或1)。任何一位移出右边界,自动丢弃。※不越界右移相当于让变量值除以2〇(43分07秒)注意:右移比左移要复杂些,如果要移的数为负数,最左边符号位为1,为了不改变此数的符号位,往右移的时候,左边会自动补1。(43分52秒)位运算的优先级:~高于〈<〉〉高于&高于A高于I作业设有定义语句:chara=3,b=6,c;则执行赋值语句c=aハbv<2;后变量c中的二进制值是A)00011011B)00010100C)00011100C)00011000高级……(高级)第27章指针与一维数组数组与指针(01分33秒)程序1指向数组元素的指针(见Excel演示)(15分23秒)注意:※指针++并不是指针指向的内容++,而是指针本身++,相当于指针向前移动ー个位置。※指针每次++,并不是移动一个字节,它移动的字节数刚好为指针类型所占的字节数。每次移动多少字节,同学们也可以用sizeof函数自己测出来。如:double*pd;pd++;/*pd一次移动了8字节・/(17分38秒)※指针一般在指向数组元素时オ使用加减法,指向二维数组时还经常用到乘法(18分45秒)※指针的比较也就是比较两个指针是否指向同一位置,在指向数组元素的指针中经常用来测试两个指针是否指向同一数组元素。内存计算(19分11秒)学了指针以后,大家都知道指针的操作实际上就是对内存的操作。定义doublearr[1000];将占用8*1OOO=8OOO=8K的内存,同学们可用sizeof(arr)自己试试。

81定义ー个指针变量,要消耗4个字节的内存。因此学完这课后,大家就知道为什么买电脑时,内存是越大越好。指针数组(20分22秒)格式:int*a[10J;定义变量时,虽然各运算符意义不同,但同样符合C语言的运算符优先级。在这里a先与[10]结合,表示a是个数组,再与int*结合,表示数组的每个元素都是int・型,也就是int型指针。(22分48秒)程序2指针数组指向数组的指针(29分58秒)格式:int(*a)[10];a先与・结合,表示a是个指针,再与[10]结合,表示它指向有10个元素的数组,再与int结合,表示这个数组是int型。(33分31秒)程序3指向数组的指针(42分36秒)切割记忆法:*a:a先与・结合,不管两旁有什么东西,表示a只是''1个"指针,指向什么,以后再说。a[10]:a先与[10]结合,表示a有“10个"元素,这10个元素是什么类型,以后再说。数组名与指针(46分33秒)程序4数组名与指针(52分20秒)※数组名实际上是个只读指针,[n]运算早就被C语言的设计者设计好,在电脑中取a[n]的值相当于・(a+n)请问・(a+n)与・a+n有什么区别(见Exce!演示)?能否进行a++这样的操作?(59分36秒)※数组名与指针的差别是:数组名是只读的,而指针可以改写。假设a是数组名,p是指针,p++就可以,a++就不行。(60分58秒)※因为a[〇]等价于・(a+0)等价于・a,所以&a[〇]与a意义相同。因此p=&a[0]和p=a效果ー样。(71分47秒)题目讲解:以下程序的输出结果是什么?int*var,ab;ab=100;var=&ab;ab=*var+10;printf("%d

82",*var);参考答案:110++的分解(73分51秒)假如p是ー个赋了值的char型指针,如果遇到如下表达式chara=*p++;可分解为:chara=*p;p=p+l;(75分53秒)第二种情况:chara二*++p;可分解为p=p+l;chara=*p;(76分54秒)第三种情况:chara=(*p)++;可分解为chara=*p;(*p)=(*p)+l;请同学们自己考虑chara=++(*p);的分解。(78分15秒)题目讲解:定义inta=5,b;则执行表达式b=++a*--a之后,变量b的值为ー参考答案:25(81分26秒)PPT演示总复习:前面学的4种指针横向比较。(重点)作业1、用指针输出ー个数组中的全部元素2、有以下程序:#includemain(){inta[]={2,4,6,8,10},y=l,x,*p;p=&a[l];for(x=0;x<3;x++)y+=*(p+x);printf("%d

83”,y);)程序的输出结果是

84A)不确定的值B)13C)19D)213、有以下程序:#includemain(){inta[]={2,4,6,8),*p=a,i;for(i=0;i<4;i++)a[i]=*p++;printf("%d

85”,a⑵);)程序的输出结果是A)6B)8C)4D)2第28章文件文件指针(03分12秒)定义:FILE・指针变量名;如:FILE*fpl,*fp2;一次定义了两个指向文件的指针文件操作方式(04分47秒)※文本方式文本方式将数据以ASCII码方式存储在文件中,我们电脑中的“文本文件”就是典型的以文本方式存储的文件。(05分57秒)※二进制方式音乐、图形这类非文本数据,就比较适合使用二进制方式存储打开文件(06分44秒)格式:FILE*fopen(文件名,文件使用方式);如:FILE*fp;fp=fopen("file_a'',''r'');(09分03秒)使用方式列表:派“r”,文本只读X“rb",二进制只读派“w”,文本只写X“wb",二进制只写X”a”,文本添加X“ab",二进制添加(II分10秒)派r+,w+,a+,rb+,wb+,ab+带加号方式打开的文件,读写都允许,其它操作与前面6项ー样。(14分08秒)打开文件经常会出现错误,比如这个文件根本就不存在。可用以下方法检查:if((fp=fopen('由Ie_a",',"))==NULL)Iprintf(44Cannotopenthisfile

86");exit(O);/*使程序退出运行・/)关闭文件(18分05秒)格式:fclose(文件指针);文本文件的读写(19分II秒)写入:

87putc(字符,文件指针);读取:chargetc(文件指针);(23分13秒)判断是否文件尾部:EOF因为ASCII字符没有负数,所以在C语言中将EOF定义为ー1。用文件读取函数时,遇见ー1或EOF即为文件结束标志。(24分28秒)程序I将字符串“Hello”写入文本文件(36分33秒)程序2读取程序1中文本文件的内容(47分55秒)除这两个函数外,还有几个可以批量读取数据的函数:fscanf(文件指针,格式控制字符串,输出表列);如:fscanf(fp”%d%d”,&a,&b);fprintf(文件指针,格式控制字符串,输出表列);如:fprintf(母,"%d%d”,a,b);(54分59秒)fgets(数组名,字符个数,文件指针);如:fgets(str,n,fp);fputs(数组名,文件指针);如:fputs(str,fp);※这几个函数有点类似我们平时操作字符串时候用到的函数,只是fgets加了个“字符个数”参数。同学们有时间可以自己尝试在程序中使用。二进制文件的读写(57分06秒)二进制文件可以存储任何类型的数据,就有可能出现负数,因此在判断文件尾部时得改用其它方法。(58分18秒)判断文件尾部函数:intfeof(文件指针);遇到文件结束,返回值为1,否则为〇。fwrite(内存首地址,内存大小,内存个数,文件指针);读取:fread(内存首地址,内存大小,内存个数,文件指针);(59分34秒)程序3读写二进制文件(67分39秒)第2段程序演示:文本文件与二进制文件的差别(76分09秒)题目讲解:1、以下程序用来统计文件中字符的个数。请填空。#includevoidmain(){FILE*fp;longnum=0;if((fp=fopen(ufname.datM,)ニニNULL){printf(HOpenerror

88M);exit(0);}while()num++;printf("num二%ld

89",num);fclose(fp);}参考答案:(1)ケ'(2)getc(fp)!=EOF(81分39秒)2、有以下程序:#includemain(){FILE*fp;intk,n,a[6]={l,2,3,4,5,6);fp二fopen("d2.danW);fprintf(fp;'%d%d%d

90u,a[O],a[1],a[2]);fprintf(fp;,%d%d%d

91';a[3],a[4],a[5]);fclose(fp);fp二fopen("d2.da「T);fscanf(fp,H%d%d';&k,&n);printf(w%d%d

92H,k,n);fclose(fp);}程序运行后的输出结果是:A)12B)14C)1234D)123456参考答案:D(88分1フ秒)3、有以下程序:

93main()(58分50秒)写入:#includeFILE*fp;inti,a[6]={l,2,3,4,5,6);fp=fopen(',d3.dat',;'w+b,');fwrite(a,sizeof(int),6,fp);/・该语句使读文件的位置指针从文件头向后移动3个int型数据・/fseek(fp,sizeof(int)*3,SEEK_SET);fread(a,sizeof(int),3,fp);fclose(fp);fbr(i=0;i<6;i++)printf("%d,",a[i]);)程序运行后的输出结果是:A)4,5,6,4,5,6B)1,2,3,4,5,6C)4,5,6,1,2,3D)6,5,4,3,2,1参考答案:A作业请调用fputs函数,把5个字符串输出到文件中(注意每个字符串用回车分开);再从此文件中读入这5个字符串放在一个字符串数组中;最后把字符串数组中的字符串输出到终端屏幕,以检验所有操作是否正确。第29章预处理宏定义(02分20秒)格式:#define标识符字符串如:(05分03秒)#deHnePI3.1415926以后程序ー看见PL就自动会用3.1415926替代。注意:※宏命令只是简单地替换字符串,但是它不做合法性检查。比如将3.1415926写成3.14T5926,只会在使用了PI的语句上报错,而不会在#define这行上报错。※宏定义后面不得加分号※宏定义后面的字符串可以省略。如:#definePl此定义的作用较少用到,在这里不作详解。(07分34秒)※可以直接用宏定义一条语句。如:#definePTprintf(4t%d

94,\a)以后就可以用PT来代替printf("%d\iT,a)这条语句。(08分54秒)※在进行宏定义时,可以引用已定义的宏名,可以层层置换#defineR3.0#definePI3.1415926#defineL2*PI*R#defineSPI*R*Rmain()(printf("L=%f

95S=%f

96”,L,S);)运行情况如下:L=18.849556S=28.274333(12分11秒)※在字符串中的如果出现与宏名相同的字符串,不进行替换,如上面双引号中的L会原样输出。※在学习宏命令时,一定要学会将它展开,再参与运算。如上面的printf函数层层展开,最后为:printf("L=%f

97S=%f

98'',2*3.1415926*3.0,3.1415926*3.0*3.0);(15分07秒)※宏定义和普通变量不同,它不分配内存空间※宏名称虽然没有规定非用大写,但是在C程序员的书写习惯当中,经常使用大写,以区分它与普通变量和函数。逻辑值(16分43秒)程序员可以自己用#define来定义TRUE和FALSE来增加程序的可读性。(17分25秒)XNULL在系统中已经被定义成#defineNULL0,EOF在系统中已经被定义成#defineEOF-1这样,在判断指针是否为空时,if(pi!=NULL)与if(pi)就没有什么分别。那么,打开文件是否出错的代码可以缩减为:if(!(fp=fopen("file_a",”r"))){......}带参数的宏定义(24分30秒)宏定义也可以加上参数,这时它的功能有点类似函数,但是它和函数有本质上的区别。格式:

99#define宏名(参数表)字符串如:#defineMUL(a,b)a*bc=MUL(3,5);展开得c=3*5;#definec=MUL(a,b)a*bヘ導:;c=MUL(3,5);c=3*5;(29分48秒)※也可在参数表中代入复杂点的字符串。如:c=MUL(2+3,l+2);展开得:c=2+3*l+2;这行代码出现了问题:・号改变了两个参数的优先级,因此,一般带参宏替换的标准定义形式为:#definec=MUL(a,b)(a)*(b)上面的代码展开得:c=(2+3)*(l+2);这样展开的结果符合程序员意图。(32分03秒)※前面说过,还有一种方法可以使用“常量”,那就是用宏替换。#defineNUM3main()(inta[NUM];)用宏替换来定义数组,也是可以的。什么叫“预处理”(34分32秒)每个程序在编译前,计算机会预先干ー些事:那就是碰到预处理指令时,将它展开,得到真正的代码。如上面的代码经过编译器预处理后,得到的可运行代码实际上是:main(){inta[3];)因此如果把#defineNUM3误写成#defineNUM3T,程序会在第3行报错。以此类推,如果在多个地方使用了NUM宏,编译器会在使用过NUM的行数上都报个错。(36分14秒)请同学们想想,如果误写成#defineNUM3;(这里加了个分号),会出现什么问题?文件包含(38分13秒)格式:#include"文件名”或#includeく文件名〉双引号一般用来包含用户文件名,尖括号一般用来包含系统自带的文件名。如stdio.h就是系统文件名,所以包含stdio.h时,就要用尖括号括起来。有了文件包含功能以后,将一个大程序划分成多个文件就成为可能。多个文件可同时让多个人编写,再用#include将其它人写好的文件包含进来即可使用,不用关心它的细节。(42分10秒)程序1用多文件模式计算任意两数之间所有整数之和(53分54秒)程序演示:如何建立头文件※用#include包含的文件后缀一般是•h※文件包含也可以嵌套作业用多文件模式计算n的阶乘第30章自定义类型typedef自定义类型(02分28秒)格式:typedef新类型名如:typedefintINTEGER;typedeffloatREAL;定义之后就可以用新的类型定义变量:INTEGERi;(04分25秒)typedef还有更复杂的用法,比如用它去定义一个数组名,再用这个数组名去定义变量:typedefintARR[100];ARRa,b,c;这个定义相当于inta[100],b[100],c[100];(06分08秒)实际上,typedef的定义不像想象中这么简单,下面就归纳下它的定义方法:(1)先按定义变量的方法写出定义体(如:inti)

100第40页

101(2)将变量名换成新类型名(如:将i换成COUNT)(3)在前面加typedef(如:typedefintCOUNT)(4)然后可以用新类型名去定义变量。再以定义上述的数组类型为例来说明:(1)先按定义数组变量形式书写:intn[100];(2)将变量名n换成自己指定的类型名:intARR[100];(3)在前面加上typedef,得到typedefintARR[100];(4)用来定义变量ARRa;(10分02秒)注意:Xtypedef只能定义各种类型,但它不能定义变量。(13分23秒)※じ语言没有字符串类型,可以用typedef自己定义ー个字符串类型:typedefcharSTRING[100];STRINGStr;Str就是个字符串,比使用charStr[100];来定义字符串要直观的多。结构与自定义类型(16分48秒)在这里,我们先进ー步学习一下结构定义的两种特殊形式:第一种:定义结构,同时定义ー个结构变量stu,当然也可以同时给它的成员进行初始化。注意这个结构定义时没有结构类型名,因此这个结构只定义了一次变量stu,就再也不起作用了。因为你不知道再用什么方式引用它。struct(}stu;(18分42秒)第二种:定义结构时顺便定义ー些变量或同类型数组。structstudent(}stu,stuarray[5];这种变量定义可分解为:structstudentstu,stuarray[5];省掉中间的花括号,就是它的定义形式。(24分29秒)同样,使用typedef可以将结构后面定义的变量提升成类型:typedefstructstudent(charname[9];intage;}STU,STUARRAY[5];参照typedef的定义逻辑,以后用STUstu就相当于structstudentstu;用STUARRAYstuarray就相当于structstudentstuarray[5]〇(29分33秒)程序1用typedef定义结构类型作业将“结构与自定义类型”小节定义的STU和STUARRAY两种类型用到实处(比如从5个学生中找出成绩最好的学生)。第31章指针与二维数组数组的特殊情况(03分28秒)※数组在定义时可以省略下标:intai[]={1,2,3);编译器会自动算出此数组在初始化时有3个元素,自动定义成intai[3]={1,2,3);这种方法经常用在字符串上:charstrロ={"string"};同学们可以自己算出str的长度。(04分53秒)※二维数组初始化时,只有第一维下标可以省略:intai[][3]={{l,2,3},{4,5,6});同学们可以自己算出第一维下标的长度。(06分20秒)※也可以用一维数组的形式初始化二维数组:intai[][3]={1,2,3,4,5,6);缺胳膊少腿也行:intai[][3]={l,2,3,4);元素ai[l][l]和ai[l]⑵会自动初始化为0(08分53秒)※无论多少维数组,它的内存都连成一片,我们可以用通过指针的移动来指向数组中的任何ー个元素。intaiロ[3]={1,2,3,4,5,6};

102int*pi=&ai[O][OJ;

103pi+=3;这时pi指向ai⑴[0];(12分27秒)注意以下写法都是错误的:※血ai[][3]={{1,2,3}{4,5,6});少了中间的逗号※血aiロ[3]={{1,2,3},{}};不能用空花括号初始化,ー维数组也ー样※血ai[O];不能定义只有0个元素的数组※血ai[3][]={{l,2,3},{4,5,6});除第一维下标外,其它维的下标都不能省略二维数组与指针(14分41秒)在学二维数组与指针之前,我们先回顾下ー维数组与指针的关系。a[3]等价于・(a+3)a[0]等价于・(a+O)等价于・a(17分02秒)二维数组可当成是“数组的数组”,假设二维数组定义如下:inta[3]⑷={{1,3,5,7},{9,11,13,15],[17,19,21,23]]a是个数组名,包含3个元素:a[0],a[l],a[2],每个元素又是ー个数组,包含4个元素a[0][0],a[O][l],a[0][2],a[0][3]。(18分28秒)从ー维数组的知识得知:a[2]相当于*(a+2),但是它只能取到下ー维数组的地址,即&a[2][0]»那么如何取到aロ][2]的内容呢?用如下方法:*(*(a+l)+2)它等价于a[l][2](25分51秒)※一般在没有&影响的情况下,n维数组中有n个・就会取到数据,小于n个・,只能取到地址。通过以上表达式,我们可以推出另外几个表达式:a[〇][1]等价于*(*(a+O)+l)等价于・(*a+l)a[l][0]等价于・(*(a+l)+O)等价于**(a+1)a[〇][〇]等价于・(*(a+0)+0)等价于**(a+O)(31分26秒)题目讲解:已知数组intx[5][4]={0};中x的地址为OxOAFDOlOO,求**(x+3)+2、・x+3、*(*(x+3)+2)的地址或值。参考答案:2OxOAFDOlOC0说明:ー、**(x+3)+2相当于*(*(x+3)+0)+2相当于x[3][0]+2=2(36分48秒)二、・x+3相当于・(x+0)+3相当于x[0]+3相当于x[0][3]的地址&x[0][3],等于0x0AFD0100+3*4等于OxOAFDOl00+C=0x0AFD010C。三、*(*(x+3)+2)相当于x[3][2]=0(45分54秒)重点程序1二维数组与指针的关系(见Excel演示)(79分03秒)讲解程序,前面通过Excel表格讲解原理多维数组(87分56秒)多维数组地址换算(见Excel演示)※内存是线性结构,数组维数再多,也要通过公式转换为线性地址将数据存储在内存中。作业已知有二维数组:inta[3][2]={2,4,6,8,10,12),a的地址为3368,请写出以下算式的地址或值。1、&a2、3、・(*a+l)+l4、5、&a[l]6、7、a+1第32章指针与字符串字符串的输入输出(00分00秒)printf和scanf格式控制符为%s/*s为string的意思・/与字符型数据处理不同的是,用%s后面的变量ー定是数组名或是字符指针。如:char*pcゴstring!”;printf(t4%s

104,\pc);字符数组与指针(02分29秒)定义格式:(见Excel演示)char*pc="string!”;chars[]—'string!**;a[2]*(*(a+l)+l)*a+l赋值:

105pcゴstring!”;/・指针可以在运算中赋值・/s="string!”;/*数组不允许・/(09分18秒)注意:※字符指针在运算过程中可以用上面的方式赋值,但是用scanf或gets这类函数从键盘获取字符串时,一定要令其先指向某个数组。如:scanf("%s”,pc),运行时会报错,(13分36秒)※可以通过移动指针指向串中某个字符,如:printf("%c”,*(pc+2));会输出r※双引号也是ー种运算符,它会求出ー串字符的首地址。上面的‘'string!”相当于用&求出・的地址赋值给pc〇※字符数组(字符串)初始化,系统会自动按顺序填充数组元素。平时运行时不能用=号给数组赋值,因为数组名是只读的。字符串数组与指针(16分09秒)所有的字符串都是ー维数组,那“字符串数组”肯定是二维数组。字符串之间的运算都要通过字符串函数,而不能用简单的〉、<、=这样的运算符,这是初学者易犯的错误。(18分10秒)程序1用前面学过的选择排序法给5个字符串从小到大排序(见Excel演示)(21分06秒)讲解程序,前面通过Exce!表格讲解原理(26分08秒)字符串比较规则:比较的时候,从字符串左边开始,依次比较每个字符,直到出现差异、或者其中一个串结束为止。比如ABC与ACDE比较,第一个字符相同,继续比较第二个字符,由于C的ASCI!码比B大,所以不再继续比较,结果就是后面一个串大。再如ABC与ABC123比较,比较三个字符后第一个串结束,所以就是后面一个串大。所以,长度不能直接决定大小,字符串的大小是由左边开始第一个差异字符决定的。(29分48秒)题目讲解:阅读下列程序,则在执行后,程序的运行结果为#include#includemain(){chara[30]=Hnicetomeetyou!”;strcpy(a+strlen(a)/2,"you");printf("%s

106",a);)A^nicetomeetyouyouB、nicetoCヽmeetyouyouDヽnicetoyou参考答案:D(34分53秒)下面会出错的程序是:A、char*pc="string";pc="string";C、char*pc="string'';printf("%s”,pc);参考答案:DB、char*pc;D、char*pc;scanf(“%s”,pc);(39分00秒)下面会出错的程序是:A、chars[]="string";s="string";C、chars[10]=^^string^^;printf(<<%s,\s);B、chars[10];D^chars[10];scanf(t<%s,,,s);参考答案:B作业I、请手工比较下列字符串大小,再上机用strcmp函数验证:1)“IA3C!”IA2”2)“CBA”与”CBA5”3)“Ab35”与”AB350”4)"XYZ"^"X2C2、尝试自己写出将5个字符串从小到大排序的程序(先要写出大概思路)第33章指针与函数传值与传址(〇〇分30秒)父函数如果将变量的钥匙复制ー份,再传给子函数,子函数就可以用钥匙开启这个变量,来进行操作。C语言中这种做法叫“传递指针”。(01分24秒)程序I传址演示:设计ー个函数,它可以交换任意两个变量的值。(见Excel演示)(07分03秒)通过Exce!讲解原理(11分10秒)间接传递指针演示(20分47秒)用替换法简化程序分析时间请同学们思考一下:

107(25分23秒)※如果不用指针能否交换这两个变量?(27分56秒)Xswap函数改成如下代码,能否交换两个变量?voidswap(int*il,int*i2){int*temp;temp=il;il=i2;i2=temp;)scanf与&(33分27秒)假设scanf函数定义如下:voidscanf(int*pl,int*p2)(*pl=从键盘读值;*p2=从健盘读值;main(){inta,b;scanf(&a,&b);printf("%d,%d",a,b);)(36分54秒)变化1:改成不用指针(37分55秒)变化2:printf为什么不用加&voidprintf(inta,intb)(屏幕显示=a;屏幕显示=b;)main()(inta,b;printf(a,b);)数组名做函数参数(39分44秒)前面我们简单学习了数组名做函数参数,现在我们进ー步研究它。(40分28秒)程序2数组名做函数参数(46分01秒)注意:※父子函数传递数组时,人们最先想到是使用这样的方式传递:fun(b[n]){...}main(){inta[10];fun(a[10]);)这是错误的理解。(47分42秒)※じ语言规定:在函数的形式参数中,一旦发现intarrH或intarr[3]这种数据类型定义,就统ー编译为int*arr因此,向子函数传递整个数组时,一定要附加一个参数来传递数组元素个数intn,定义成intarr[3]没有用,父函数照样可以传递ー个inta[100]或是inta[2]进去。(52分24秒)※用数组名做参数有2个巨大的好处:(1)再大的数组,只要传递2个参数,大大提高编程效率(2)子函数不用返回值也可以批量修改父函数中的数据,真正做到“内存共享”。子函数相当于不用return,就可以返回值给父函数,还同时返回多个值。因此,在函数间传递数组名,是经常使用的方法。函数指针和函数返回指针(56分25秒)函数指针和函数返回指针考试出现的概率很小,我只用一个程序做讲解,大家重点是是要分清楚这两种定义的区别:函数指针(也叫指向函数的指针):int(*pf)(inta);/・注意分号・/函数返回指针(也叫返回地址的函数),它的定义形式为:int*fun(inta){...}(64分30秒)程序3用函数找出ー个数组中的最大数,返回它的地址类型分解(78分27秒)※类型定义符出现在不同的标识符前,所表达的含义不同:inti出现在变量前,表示定义整型变量intfun()出现在函数前,表示函数返回intinta[10]出现在数组前,表示数组的每个元素都是整型int*p出现在指针前,表示定义的指针是整型(79分44秒)※变量之间通过指针或结构赋值或函数间传递参数时,类型必须相同,否则编译无法通过。

108像inta;这样的类型定义,较好理解,表示a为int型,若是遇到复杂的类型,我们可以先找到变量或函数在程序头部的定义,将它的名称删除,就是它的类型。(81分10秒)下面几个是容易混淆的定义:int*fun()类型为int*()int*a[10]类型为int*[10]int(*pf)()类型为int(*)()int(*b)[10I类型为int(*)[l0](83分50秒)题目讲解:下列程序是用来判断数组中特定元素的位置所在的。#include#includeintfun(inl*s,intt,int*j){inti;*j=0;for(i=0;i

109”,k,a[k]);}如果输入如下整数:876,675,896,101,301,401,980,431,451,777则输出结果为:A)7,431B)6C)980D)6,980参考答案:D作业1、请编写函数,对传送过来的三个数选出最大和最小数,并通过形参传回调用函数。2、请编写函数,其功能是对传送过来的两个浮点数求出和值与差值,并通过形参传送回调用函数。第34章指针与结构结构与函数(01分22秒)程序1结构变量与函数(11分50秒)※与普通变量一样,使用结构变量当形式参数时,只能是单相传递。它被系统分解为:structstudentstu;s=stu;试问,在这里你改变S的值,是否会改变Stu的值?(13分45秒)※函数同样可以返回结构变量,返回形式与普通变量类似。※无论是返回值还是传递参数,使用结构变量做函数参数,数据都会大量复制。比如student定义了50个成员,上面小小的s=stu这个表达式,就使系统自动进行了如下动作:strcpy(stu.name,s.name);strcpy(stu.sex,s.sex);stu.age=s.age;直到把这50个成员复制完毕。这大大耗费了CPU和内存资源,因此,在传送结构时,应多使用结构变量的指针。指向结构变量的指针(15分10秒)※指针用的最多,并且可以显著提高效率的ー个用法,就是在函数间传送结构变量。(18分01秒)※使用ー个“指向结构变量指针”的成员变量有所改变,将前面的程序代码修改ー下:structstudentstu;/・定义ー个结构变量・/structstudent*pstu;/・定义一个相同类型的结构变量指针・/※成员变量和普通变量一样可以用&号取地址。pstu=&stu;/・给指针赋值・/(*pstu).age=18;/・给结构成员变量赋值・/pstu->age=18;/*括号和・号可以直接用ー〉(减号+大于号)运行符替代・/(24分17秒)程序2使用指针传送结构变量(29分29秒)※传递结构变量的指针与直接传送结构变量各有好处。使用指针传递结构变量的好处显而易见,父函数与子函数之间只要传递ー个4字节的指针即可随意操纵父函数的结构变量。缺点就是:如果好几个函数都使用指针方式,这些函数都“共享”这个结构变量,都给它赋值的话,最后不知道这个结构变量会改成什么样子。typedef的实用价值(31分37秒)运用“自定义类型”一章学过的知识,在这里我们将typedef与结构指针联系起来:structstudent

110}stu,*pstu;这种变量定义可分解为:structstudentstu,*pstu;省掉中间的花括号,就是它的定义形式。(33分22秒)同样,使用typedef可以将结构后面定义的变量提升成类型:typedefstructstudent{charname[9];intage;}STU,*PSTU;参照typedef的定义逻辑,以后用STUstu就相当于structstudentstu;用PSTUpstu就相当于structstudent*pstu。(36分52秒)程序3用typedef定义结构指针作业有以下程序:#includestructst{intx;int*y;)*P;main()(intdt[4]={10,20,30,40};structstaa[4]={50,&dt[0],60,&dt[0],60,&dt[0],60,&dt[0]);p=aa;printf(',%d

111',,++p->x);printf("%d

112”,(++p)4x);printf(H%d

113M,++(*P->y));程序的运行结果是A)10B)50C)51D)602060607020211131第35章双重指针与数组多维数组与指针(00分00秒)回顾以前学过指向ー维数组的指针,定义格式为:int*pa;inta[5];pa=a;(04分48秒)这里用了倒序讲解指向三维数组的指针,定义格式为:int(*pa)[5][8]inta[3][5][8];pa=a;从定义格式中我们看出,指向多维数组的指针,只有将第一维变成指针,后面的格式保持不变才能进行赋值。(02分21秒)由此得出指向二维数组的指针定义格式为:int(*pa)[8];inta[3][8];pa=a;(06分54秒)※按照以上规律,如果函数之间要传送ー个多维数组,可用下面三种定义:voidfun(int(*pa)[5][8],intn){...}voidfun(inta[][5][8],intn){...}voidfun(inta[3][5][8],intn){...}再用以下方式调用:inta[3][5][8]={0};fun(a,3);这样理解可以简化成按ー维数组的传送方式进行传送。(10分35秒)题目讲解:若有定义:intc[4][5],(*cp)[5];和语句cp=c;,则能正确引用c数组元素的是A)cp+1B)*(cp+3)C)*(cp+l)+3D)*(*cp+2)参考答案:D指针的指针(15分46秒)每个变量都有地址,包括指针变量,如果要存储指针变量的地址,那只能定义ー个指针的指针,也叫双重指针,如:int**ppa,*pa;ppa=&pa;双重指针一般和指针数组配合使用。(19分02秒)程序1双重指针(29分49秒)※char为寸匕葭「朋、セハゼリ非法,而char*ca[]={"aa","bbb","cccc"}合法。因为**p只能指向一个指针,而ca口可以为字符串分配内存空

114间,它们道不同不相为谋。(30分38秒)注意:※指针的指针不能直接指向多维数组,如:int**ppa,a[3][3];ppa=a;这是不允许的因为有数组的存在,双重指针使用的机会不是很多,多重指针的使用更是罕见,所以同学们在学习双重指针概念时不必深究,只要记住“双重指针不能定义字符串,不能指向二维数组”这两句话即可。(33分50秒)题目讲解:若有定义:int**ppa,*pa,a[3],b[2][3];,以下语句正确的是A)pa=b;B)ppa=b;C)paゴabc”;D)ppa=&pa;参考答案:Dmain函数参数(35分57秒)Windows中有个“命令行模式”,源自于它的曾曾曾祖父操作系统“DOS”,在没有鼠标的情况下,它可以通过给计算机发文字指令的方式来完成操作系统的大部分工作。(41分22秒)比如copya.txtb.txt命令,会将文件a.txt复制到文件b.txt中去。(见命令行演示)(45分30秒)现在我们就来研究Windows命令是怎么做出来的。main函数还有一种格式:main(intargc,char*argv[])根据“多维数组与指针”的概念,实际上main函数接收的就是ー个字符串数组。intargc负责接收字符串的个数,char*argv[]负责接收若干字符串。(48分31秒)程序2带参数的main函数(57分23秒)正式讲解程序2,前面用程序1过度(58分32秒)程序3脑筋急转弯(64分59秒)※字符串数组下标从0开始记数,文件名本身也算1个参数,如:copya.txtb.txt中的copy也算1个参数,它的下标是〇。※中文和英文的编码格式不同,因此在编程时为减少错误的发生,尽量少用中文。作业1、假定以下程序经编译和连接后生成可执行文件PROGEXE,如果在DOS提示符下键入PROGABCDEFGH【JKL(此处く笊>代表Enter健),则输出结果为。#includemain(intargc,char*argv[]){while(—argc>0)printf(4t%s,,,argv[argc]);printf("

115”);)2、有以下程序:#includemain(){intaa[3][3]={{2),{4},{6}},i,*p=&aa[0][0];for(i=0;i<2;i++){if(i==O)aa[i][i+l]=*p+l;else++p;printf(<4%dM,*p);)printf("

116”);)程序的输出结果是A)23B)26C)33D)36第36章链表理论动态内存分配(00分00秒)程序1sizeof与结构(07分58秒)※在sizeof中使用变量和类型效果ー样,如果计算的是变量,它只会计算出变量对应类型所占的字节数。(10分04秒)普通的变量定义,在定义时分配内存,函数结束时释放内存,这一切都由系统自动完成。在C语言中,程序员也可以自由地,不受系统控制地手动分配内存。若要手动分配内存,需要用到以下知识点:(12分16秒)※使用sizeof函数计算变量或类型的大小※使用malloc函数、free函数分配内存※使用指针指向已分配的内存。

117(13分17秒)程序2无名变量(23分48秒)有程序示范,很有趣※malloc和free通常配对使用,malloc的内存如果没有用free释放,会造成“内存泄露”。链表原理(28分51秒)使用数组存储数据时,所有的数据在内存中连成一片,需要取出某个数据,只要报上它在内存中的房间编号(数组下标)即可马上取出。数组也有缺点,它必须预先分配好一些内存,如果这些内存未全部使用,其它的就浪废了。这在字符串的使用中尤为明显:charstr[100]=*,hello!M;程序员定义这个字符串最大能接受99个字符。但是在这里因为实际需求只用了前面7个字符,后面的93个字节就浪废了,浪废率达到90%。(31分55秒)于是软件工程师们就想出“链表”这种存储方法,它的内存结构如下:头指针内容1—►内容1―►内容1内容2内容2内容2指针—指针一指针NULL(33分08秒)在C语言中,一般用结构表示链表:structstudent(charname[9];/・姓名・/intage;/・年龄・/structstudent*pNext;/・下ー结点・/};(34分16秒)※老师带小朋友游玩时,老师用手拉着第一个小朋友,第一个小朋友又拉着后面的小朋友,以此类推……这里的“头指针”可以比作老师的手,后面的“指针”就像小朋友的手,最后一个小朋友后面没有拉人,所以它设置为NULL。链表这种结构,就像锁链ー样,一环扣着ー环,有ー个环坏了,后面所有的结点都会丢失,这就是链表的特点。(36分02秒)程序3手拉手的小朋友(见Excel演示)名词解释(45分30秒)结点(Node):在《数据结构》中,结点通常表示一个数据单位,比如在数组中,数组元素可称为结点。在“树”结构中,每个分支元素也称为结点。如:设系为根结点,班是系的子结点,学生是班的子结点。反推过去,系是班的父结点,班是学生的父结点,系是所有子结点的祖宗结点。链表和数组都不是用来描述父子关系的,它们通常用来描述“兄弟关系”,所以结点与结点的关系不像“树”结构这么复杂。《数据结构》也可称作数据关系学,有点类似人类的人际关系学,在本课,我们只研究如何用“链表”来表达数据之间的“兄弟关系’作业有以下程序:#includefut(int**s,intp[2][3])(**s=p[l][l];}main(){inta[2][3]={1,3,57,9,1l},*p;p=(int*)malloc(sizeof(int));fut(&p,a);printf(u%d

118,,,*p);)程序的运行结果是A)1B)7C)9D)11第37章链表实践结构变量地址与成员地址(00分00秒)下列代码:structstudent{charname[9];/・姓名・/intage;/・年龄・/structstudent*next;/*下ー结点指针ッ};main()(structstudentstu,*pstu;int*pi;pstu=&stu;

119pi=&stu.age;pi=&pstu->age;)(05分28秒)pstu只能指向同类型的结构变量地址,pi只能指向同类型的结构成员地址。创建链表并添加结点(06分54秒)链表的代码都比较长,要做到无限制地动态创建,有些难度。在这里,我们演示ー个链表,并给它简单地创建4个节点,先删除ー些需要判断的因素。(见Excel演示)(30分46秒)这里用了倒序讲解,先用后面的程序1实践,再讲解流程。链表创建流程:(1)创建一个链表需要3个指针,头指针(pHead),尾指针(pEnd),新指针(pNew)(2)刚开始链表中一个结点都没有,可用malloc申请内存,动态创建1个结点,令pNew指向它(3)输入数据后,目前这个新结点又是头结点,也是最后ー个结点,所以要令pHead和pEnd也指向它。第一个结点通常需要特殊处理,所以将它放在循环外面建立(4)剩下3个结点有相同规律,可用(5)到(7)步的循环进行处理:(5)新建结点给pNew,输入数据(6)使最后一个结点pEnd的下ー结点next指向这个新结点,形成兄弟关系(7)将新结点pNew设为最后ー个结点pEnd(8)循环结束(9)不再添加结点,要使最后ー个结点pEnd的指针指向NULL(10)返回头指针pHead(09分07秒)程序1:create函数创建链表并输入4个结点输出链表(34分18秒)相对其它操作,输出链表结点的操作比较简单,用ー个临时指针通过循环不停地指向下ー结点即可。(36分44秒)程序1:print函数输出链表所有结点删除结点(42分50秒)删除结点时通常会进行结点查找,找到符合条件的结点再进行删除操作。0>(2>—►(3>-->(4)在本程序中找到第3个结点为要删除的结点,再令第2个结点的下ー结点指针指向第4个结点,第3个结点就完成了自然脱链动作。(44分39秒)程序1:del函数删除指定姓名的结点插入结点

120(54分28秒)插入的意思是把结点插入至链表中间,插入方法有“前插”和“后插”法,前插就是找到目标结点后,在它前面插入新结点,后插就是在其后面插入。本程序中演示的是前插法。有个例外的是:如果未找到指定结点,会将新结点添加到链表最后。(57分23秒)程序1:insert函数插入一个新结点在指定姓名之前(73分40秒)考试要点作业以下程序中函数fun的功能是:构成一个如图所示的带头结点的单向链表,在结点的数据域中放入了具有两个字符的字符串。函数disp的功能是显示输出该单链表中所有结点中的字符串。请填空完成函数disp〇head—>-►ab—►ce—>ef\0#includetypedefstructnode/・链表结点结构・/{charsub[3];structnode*next;}Node;Nodefun(chars)/・建立链表・/{-}voiddisp(Node*h){Node*p;p=h->next;while(){printf("%s

121”,p->sub);p=;})main(){Node*hd;hd=fun();disp(hd);printf("

122”);)第38章变量生存期变量的生老病死(03分42秒)所有变量都占着内存,变量什么时候开始占着内存,什么时候从内存中消失,这叫做变量的生存周期。(04分28秒)按照变量的生存周期分类有:※自动变量auto※静态变量static※寄存器变量register※外部变量externauto和static变量是本课讨论的重点,其它类型稍作了解。函数也有外部函数extern和静态函数static两种,在这里不做探讨。变量作用域(05分34秒)有时候变量还未消亡,你却不能使用它,这就是变量作用域在作怪。按照变量作用域分局部变量和全局变量。它们没有什么关键字修饰,只是看你在什么部位定义变量。下面我们将从变量生存期和作用域来分析几种不同种类变量的特性。局部变量(06分33秒)定义局部变量的关键字为auto,也叫自动变量。在前面所有课程中,我们定义的变量实际上都是局部变量,因为C语言规定自动变量在定义时前面的auto可以省略。如:inta;等价于autointa;全局变量(07分34秒)在函数外面定义的变量都是全局变量,不管它用什么关键字修饰。全局变量的特点:※全局变量的生存期和作用域在从它的定义点开始,一直到本文件的程序结束前,都是有效的,程序结束后消亡,释放内存。※全局变量作用域中的所有函数将共享这个全局变量中的内存数据,各函数之间也可以通过全局变量传送数据,但在职业程序员中,这是种很不好的习惯。(10分01秒)注意:在同一作用域中,如果局部变量与全局变量重名,全局变量将暂时退居幕后,这时只能操作局部变量。(10分15秒)程序1局部变量和全局变量(见下图)(24分30秒)讲解下面图形#includeinta=l,b=2;ヽvoidfun(intc,intd)ヽ

123(inta=3,b=4;ヽt.,く外部>c,dautointe=5;!、..’么[ab被intt=o;>e,隐藏Iノノノ、>a,bintg=10,h=l1;ヽmain()(Iinti=12,j=13;]ひかfun(i,h);>i,j)JJJ静态变量(28分27秒)静态变量在程序执行点离开它的作用域时,它并不消亡,它还会死霸着那片内存不放,等着你别的函数下次来使用它。与全局变量不同的是:静态变量通常在函数内部定义,而全局变量只能在函数外部定义。它们的共同点是:在程序结束时,它们都会消亡。(31分02秒)程序2静态变量演示寄存器变量(38分27秒)寄存器变量不放在内存中,直接放在CPU寄存器中。因为CPU中的寄存器数量有限,所以寄存器变量不能设置太多。寄存器变量的特点是:比普通内存速度快上百倍。外部变量(40分40秒)如果ー个文件要使用其它文件中的全局变量,就要使用extern声明,这样它就可以和其它文件共享此变量。作业以下程序运行后的输出结果是。#includevoidfun(){staticinta;a+=2;printf("%d”,a);)main(){intcc;for(cc=1;cc<=4;cc++)fun();printf("

124”);}第39章常用算法闰年的判定(01分34秒)闰年的口诀为:四年一闰,百年不闰,四百年又闰。下面这个表达式如果返回1,表示year是闰年。year%4==0&&year%100!=0||year%400==0(10分26秒)上式可简化为:!(i%4)&&i%100||!(i%400)(14分03秒)下面这个表达式如果返回1,表示year不是闰年。year%4!=0||year%100==0&&year%400!=0素数的判定(20分00秒)求n是不是素数,只要求n除以2〜ム内的所有整数都不能除尽,即为素数。(21分57秒)程序1素数的判定(非标志法)数的各位数表示方法(28分45秒)设n=84327,要取出百位数3的算法为:(1)用84327除以100,得到843(2)用843%10得至リ3取出千位数4的算法为:(1)用84327除以1000,得到84(2)用84%10得到4总结:从个位数开始数,如果要取出整数s的第n位放入另ー个变量k中,公式为k=s/(10n-l)%10那么,84327取千位的写法为:ints=84327,k;k=s/1000%10;数值转字符串算法(33分18秒)先说明一下数字与ASCII码之间的关系:0的ASCII值是48,那么1的ASCII值是49。也就是说,”’与1的差值是48,按这个规律,我们推导出:任何小于!0的整数与它的ASCII码的差值是48:

125intn='3'-48;这时n的结果为3。(36分17秒)程序2数值转字符串(见Excel演示)(55分45秒)程序3字符串转数值(见Excel演示)字母大小写转换法(02分52秒)小写字母比大写字母的ASCII码要大32,因此:charc=,a,-32;这时c的结果为,Al四舍五入算法(63分36秒)如果要截取浮点数的第几位小数,计算机不会自动四舍五入,我们可以用下面的算法。(64分37秒)设f=38.6453,四舍五入到小数点第二位的算法为:⑴用38.6453乘以100,得到3864.53(2)加上0.5,得到3865.03(3)用(int)取整得3865(4)用3865再除以100.0得38.65四舍五入到小数点第三位的算法为:(1)用38.6453乘以1000,得至リ38645.3(2)加上0.5,得到38645.8(3)用(int)取整得38645(4)用38645再除以1000.0得38.645(67分07秒)总结:从小数点第一位开始数,如果要将浮点数f四舍五入到小数点后第n位放入另ー个变量k中,公式为k=(int)(f*10n+0.5)/(double)(10n)那么,38.6453四舍五入到小数点后第三位的写法为:floatf=38.6453,k;k=(int)(P=1000+0.5)/1000.0;冒泡排序法(68分06秒)在《数组》的学习当中,我们已经学习了选择排序法。在这节课,我们再学习一下排序的另ー种方法:冒泡排序法。(68分40秒)解题思路:(1)从第一个数开始,一直到最后一个数,将相邻两个数进行比较,如果第一个数比第二个数小,就交换这两个数(2)第一轮比较结束,最小的数会“沉”到最底,也就是数组的最右边。(3)使用(1)的方法比较第一个数到倒数第二个数,将第二小的数沉底。(4)如果有n个数,从第1个数与n-j(2-n)个数两两进行比较,比较n-l轮,即可将小数一个ー个“沉底”,相对小数,大数就好像在往上冒,这就是“冒泡排序法”。(70分29秒)用5个数来描述以上过程:(1)57428:57比较得:(2)75428:54比较,不动,42比较,不动,2和8比较得:(3)75482;第一轮比较完毕,最小数已在最后ー位。第二轮开始:75比较,不动,54比较,不动,48比较得:(4)75842;第二轮比较完毕,第二小数已在倒数第二位。第三轮开始:75比较,不动,58比较得:(5)78542;第三轮比较完毕,第三小数已在倒数第三位。第四轮开始:78比较得:(6)87542!比较完毕,排序结果已经出来。(71分45秒)程序4冒泡排序法(见PS演示)第40章难题讲解难题分类(见Excel演示)(01分27秒)链表类自己编写strcpy、strcat、strlen>strcmp函数矩阵删除指定字符删除若干・号从已排序的数组中删除重复元素平移字符串ー、链表类(03分54秒)链表程序一般分5个小部分:创建、删除、修改、搜索、打印结点。这些程序篇幅都比较长,有些题目会略去其中的某些部分来缩短程序长度:在链表程序中比较喜欢做文章的部分,ー个是循环判断条件p->next!=NULL,表示判断这个结点的下个结点是否为空,为空表示到了最后一个结点。另ー个是“前往下ー个结点”的p=p->next,表示把下ー结点的指针赋给p,令p永远指向最新的结点。想要熟练做出链表的题目,必须得花上一两天时间研究并自己写出链表的各种操作程序,否则就算题

126目做对,也会在题目的理解上花上大量时间。(07分48秒)题目:上机改错题:下列给定程序是建立一个带头结点的单向链表,并用随机函数为各结点赋值。函数fun的功能是将单向链表结点(不包括头结点)数据域为偶数的值累加起来,并且作为函数值返回。请改正函数fun中的错误,使它能得出正确的结果。注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。试题程序:#include#include#includetypedefstructaa{intdata;structaa*next;)NODE;intfun(NODE*h){intsum=0;NODE*p;p=h->next;/*************nd**************/while(p->next){if(p->data%2==0)sum+=p->data;/************,found**************/p=h->next;}returnsum;)NODE*creatlink(intn){NODE*h,*p,*s;inti;h=p=(NODE*)malloc(sizeof(NODE));for(i=l;idata=rand()%16;s->next=p->next;p->next=s;p=p->next;)p->next=NULL;returnh;}outlink(NODE*h){NODE*p;p=h->next;printf(ヽn

127TheLIST:

128

129HEAD');while(p){printf("->%d",p->data);p=p->next;}printf(,'

130,');)voidmain(){NODE*head;intsum;system("CLSH);head=creatlink(10);outlink(head);sum=fun(head);printf("

131SUM=%d",sum);)参考答案:(1)错误:while(p->next)正确:while(p!=NULL)(2)错误:p=h->next;正确:p=p->next;二、自己编写strcpy>strcat>strlen>strcmp函数(16分16秒)串复制strcpy/*s为目标串,t为源串・/voidfun(char*s,char*t){while(*t!-\0')(*s++=*t;t++;}*s='、0';)(21分13秒)简单写法voidfun(char*s,constchar*t)

132(while((*s++=*t++)!='、〇’);)(25分21秒)※串连接/*s为目标串,t为源串,请注意s的长度要大于两串之和・/voidfun(char*s,char*t)(while(*s!='\0,)s++;while(九!二NT){*s=*t;s++;t++;)s='\0';)(27分50秒)简单写法:voidfun(char*s,char*t){while(*s!='\0')s++;while((*s++=*t++)!='\0');)(28分28秒)※串比较/*s比t小,就返回-1,相同就返回。,大就返回ド/intfun(char*s,char*t){inti=0;while(*s-*t==0&&*t!-\0')++s,++l;i=*s-*t;if(i<0)i=-l;elseif(i>0)i=l;returni;}(35分36秒)※求长度/・返回值为长度・/intfun(char*s)(char*t=s;while(*t++!-\0');returnt-s-1;)三、矩阵(38分31秒)矩阵中的运算通常是两层循环加二维数组。矩阵题干的难度在于找出两个下标的规律,再用循环实现之。如:如将一个矩阵行列互换。123456矩阵a:789转换成:147258矩阵b:369编程题:编写程序,实现矩阵(3行、3列)的转置(即行列互换)。例如,若输入下面的矩阵:100200300400500600700800900则程序输出:100400700200500800300600900注意:部分源程序给出如下。请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。试题程序:#include#include#includevoidfun(intarray[3][3]){}voidmain()(FILE*wf;

133

134intij;(45分21秒)voidfun(intarray[3][3])intarray1[3][3]={{100,200,300},{400,500,600},{700,800,900}inti,j,t;);/・将右上三角和左下三角对换,实现行列互换・/system(,'CLSH);for(i=0;i<3;i++)for(i=0;i<3;i++)for(j=i+l;j<3;j++){forG=0;j<3;j++){printf(H%7d”,array[i][j]);t=array[i][j];printf(H

135ッ;array[i][j|=array[j][i];)array|j][i]=t;fun(array);}printf(HConvertedarray:

136");)for(i=0;i<3;i++){for(j=0;j<3;j++)(51分00秒)这个参考答案中其实隐藏了另外两printf(H%7d”,array[i][j]);种矩阵题型的解法:printf(”

137M);将矩阵的左下半三角的元素都乘以n:}#defineN3/******************************/fun(inta[][N],intn)wf=fopen(',out.dat,,,,,w,');{for(i=0;i〈3;i++)intij;{forU=0;j<3;j++)for(i=0;i

138M);a[i][j]=a[i][j]*n;))fclose(wf);(52分13秒)将矩阵的右上半三角的元素都乘以)n:(41分03秒)本题有个笨方法:voidfun(inta[][N],intn)(voidfun(intarray[3][3])intij;(for(i=0;i

139请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。试题程序:#include#includevoidfun(chars[],intc){)main(){staticcharstr[]=*'turbocandborlandC++";charch;FILE*out;printf("Theoriginaldatais:%s

140",str);printf("inputastring:

141");scanf("%c",&ch);fun(str,ch);printf("str[]=%s

142",str);strcpy(str,"turbocandborlandC++");fun(str,'a');out=fopen("out.dat","w");fprintf(out,"%s",str);fclose(out);)(54分12秒)参考答案:voidfun(chars[],intc)(inti=0;char*p;p=s;while(*p)/*判断是否为结束符・/Iif(*p!=c)/*判断字符串中字符是否与指定字符相同・/{s[iド・p;/・不同将重新组合字符串・/i++;}/・相同则处理下ー个字符・/P++;)s[i]='\0';)(63分00秒)总结:删除指定字符在编程题中出现的概率非常高,在这里总结下它的流程:(1)它会利用两个指针或数组元素(原指针和巡检指针)向前移动,一直到巡检指针为'0,并不停地赋值(这题为s[iド・p)(2)利用ー个指针来与要删除的字符比较(这题用・P跟c比)(3)比较到有要删除的字符,不给它赋值,并使原指针停在这个位置。(这题没有执行if中的语句)(4)记住一定要给最后ー个元素补上、。。(这题是s「ド’、。,)五、删除若干*号(65分38秒)编程题假定输入的字符串中只包含字母和・号。请编写函数fun,它的功能是:除了字符串前导和尾部的・号之外,将串中其他・号全部删除。形参h已指向字符串中第一个字母,形参p已指向字符串中最后一个字母。在编写函数时,不得使用C语言提供的字符串函数。例如,若字符串中的内容为****A*BC*DEF*G******,册。除后,字符串中的内容应当是****ABCDEFG******。注意:部分源程序给出如下。请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。试题程序:#include#include#includevoidfun(char*a,char*h,char*p)main()(chars[81],*t,*f;FILE*out;printf("Entreastring:

143");gets(s);t=f=s;while(*t)t++;t一;while(%==*)t一;whi殯・fニニ'*')f++;

144fun(s,f,t);printf("Thestingafterdeleted:

145M);puts(s);out=fopen("out.datH;'w");strcpy(s,"****A*BC*DEF*G********");fun(s,s+4,s+13);fprintf(out,"%s",s);fclose(out);(66分58秒)参考答案:voidfun(char*a,char*h,char*p)(inti=0;char*q二a;while(q#defineN80intfun(inta[],intn)voidmain(){FILE*wf;inta[N]={2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10,10},i,n=20;printf("Theoriginaldata:

146H);for(i二0;ivn;i++)printf("%3d",a[i]);n二fun(a,n);printf(H

147

148Thedataafterdeleted:

149H);for(i=0;i

150

151");wf=fopen(,,out.dat,';,w'');for(i=0;i

152)参考答案:intfun(inta[],intn)(inti,j=l;for(i=l;i#include#defineN80voidfun(char*w,intm))voidmain(){FILE*wf;chara[N]="ABCDEFGHIJK",b[N]="ABCDEFGHIJK";intm;printf("Theoriginastring:

153");puts(a);printf("

154

155Enterm:");scanf("%d",&m);fun(a,m);printf("

156Thestringaftermoving:

157");puts(a);printf("

158

159");wf=fopen("out.dat","w");fun(b,3);fprintf(wf,"%s",b);fclose(wf);参考答案:(89分31秒)讲解理论(90分47秒)讲解代码voidfun(char*w,intm)Iinti,j;chart;for(i=l;i<=m;i++)/・进行m次的循环左移・/{t=w[〇];for(j=l;w[j]!='\0,;j++)/*从第2个字符开始以后的每个字符都依次前移ー个字符・/w(j-l]=w[j];w|j-l]=t;/・将第1个字符放到最后ー个字符中・/)(95分59秒)总结:字符串平移也就是数组平移,这种题干通常要用2层循环,外层控制平移的次数,内层循环控制所有元素向前移动。可以说,有多少个元素,内层循环就要执行多少次。因此,平移字符串的内层循环可以用‘、〇’来做终值,而其它类型的数组元素个数只能用函数形参传进来。附录:ASCII码表十六进制十进制字符十六进制十进制字符000nul4064@011soh4165A022stx4266B033etx4367C044eot4468D055enq4569E066ack4670F

160077bel4771G088bs4872H099hi4973I0a10nl4a74J0b11vt4b75K0c12ff4c76L0d13er4d77MOe14so4e78NOf15si4f79O1016die5080P1117del5181Q1218dc25282R1319dc35383S142()dc45484T1521nak5585U1622syn5686V1723etb5787W1824can5888X1925em5989Yla26sub5a90Zlb27esc5b91i1c28fs5c92Id29gs5d931le30re5e94AIf31us5f95—2032sp6096r2133\6197a2234ti6298b2335#6399c十六进制卜进制字符十六进制十进制字符,436$64100d37%65101eヒ638&66102f,739ヽ67103g2840(68104hヒ941)69105i2a42*6a106j2b43+6b107k12c446c10812d45-6d109m2e466enon12f47/6f111o3048070112P3i49171113q3250272114r|3351373115s,452474116t3553575117u3654676118V3755777119w3856878120X,957979121y3a587a122z3b597b123f3c60<7c1243d61=7d125)62>7e126〜,f6377f127del

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
大家都在看
近期热门
关闭