C语言程序设计课程第一次直播.ppt
C+语言程序设计语言程序设计第一次直播课堂第一次直播课堂主讲主讲 首都经贸大学首都经贸大学 李宁李宁 副教授副教授 2 2一、明确学习目标一、明确学习目标 通过学习通过学习C+C+语言中的数据类型、语句结语言中的数据类型、语句结构以及程序设计的基本方法,掌握程序构以及程序设计的基本方法,掌握程序设计的最基本的概念、方法和理论,了设计的最基本的概念、方法和理论,了解面向对象程序设计的基本概念和方法,解面向对象程序设计的基本概念和方法,获得运用获得运用C+C+语言解决一般问题的使用技语言解决一般问题的使用技能。能。3 3注意:注意:应以本教材为主,其他参考资料不应以本教材为主,其他参考资料不必过多;必过多;教材中的所有程序都是控制台应用教材中的所有程序都是控制台应用程序(程序(Console ApplicationsConsole Applications),),即即 DOS DOS 下的应用程序。下的应用程序。WINDOWS WINDOWS 下应用程序的设计不是本课程要解下应用程序的设计不是本课程要解决的问题。决的问题。4 4Visual C+或或C+Builder都是功能都是功能十分强大的集成化开发环境。但对十分强大的集成化开发环境。但对于本课程的学习,只需使用其中很于本课程的学习,只需使用其中很少的几个功能;全面掌握这两种软少的几个功能;全面掌握这两种软件的使用不是本课程的目标。件的使用不是本课程的目标。5 5二、落实三个环节二、落实三个环节通过授课或自学,理解教材内容;通过授课或自学,理解教材内容;完成自测题和习题,检验、巩固学完成自测题和习题,检验、巩固学习效果;习效果;尽量多地上机实践:尽量多地上机实践:6 6实验教材中的练习必须上机完成;实验教材中的练习必须上机完成;习题中的程序设计题要求上机完成;习题中的程序设计题要求上机完成;对于自测题和其他习题,应先给出答对于自测题和其他习题,应先给出答案,然后尽可能地上机加以验证;案,然后尽可能地上机加以验证;对教材内容中有疑问之处,可设法通对教材内容中有疑问之处,可设法通过上机化解疑点。过上机化解疑点。7 7三、理清知识点之间的联系三、理清知识点之间的联系 第一条线:第一条线:C+数据数据基本数据类型与表达式(第二章)基本数据类型与表达式(第二章)数组(第四章)数组(第四章)动态数据(第六章)动态数据(第六章)结构、联合(第七章)结构、联合(第七章)类与对象(第八章)类与对象(第八章)8 8第二条线:第二条线:数据的操作:数据的操作:C+C+语句与函数语句与函数表达式语句(第二章)表达式语句(第二章)流程控制语句与程序结构(第三章)流程控制语句与程序结构(第三章)数组及字符串操作(第四章)数组及字符串操作(第四章)函数的定义与调用(第五章)函数的定义与调用(第五章)指针、指针、引用及动态空间引用及动态空间操作(第六章)操作(第六章)操作符重载(第七、第八章)操作符重载(第七、第八章)类的成员函数和友员函数(第八章)类的成员函数和友员函数(第八章)数据的输入输出(第九章)数据的输入输出(第九章)9 9四、熟练掌握常见处理四、熟练掌握常见处理利用表达式计算并保存计算结果(赋值)利用表达式计算并保存计算结果(赋值)交换两变量的值交换两变量的值按正向或反向顺序扫描一维数组按正向或反向顺序扫描一维数组按先行后列或先列后行的顺序扫描二维按先行后列或先列后行的顺序扫描二维数组数组累加累加1010累乘累乘复合条件的表示复合条件的表示从从2个(个(n个)数之中找出最大(或最个)数之中找出最大(或最小)者小)者挑选排序、插入排序挑选排序、插入排序.1111五、掌握程序设计的三个环节五、掌握程序设计的三个环节分析分析设计设计编码编码1212分析:分析:分析要解决问题分析要解决问题首先要明确要解决的问题是不是普通首先要明确要解决的问题是不是普通配置的计算机系统能够解决的问题。配置的计算机系统能够解决的问题。必须明确:要使问题获得解决必须获必须明确:要使问题获得解决必须获得哪些数据信息,如何获得这样的信得哪些数据信息,如何获得这样的信息。息。必须将问题的解决归结为生成某种数必须将问题的解决归结为生成某种数据信息。据信息。13131.对于有缺陷的问题表述,考察是否有对于有缺陷的问题表述,考察是否有可能补救。例如,可能补救。例如,依据输入的工资、薪金所得,计算依据输入的工资、薪金所得,计算应纳个人所得税并显示计算结果。应纳个人所得税并显示计算结果。就是一个错误的问题表述,它缺少解就是一个错误的问题表述,它缺少解决问题所必需的一些信息,包括:决问题所必需的一些信息,包括:1.分段计税的税率表分段计税的税率表2.工资、薪金所得中应纳税所得额的工资、薪金所得中应纳税所得额的计算方法计算方法1414问题的表述可增加以下内容:问题的表述可增加以下内容:假假定定工工资资、薪薪金金所所得得扣扣除除10001000元元后后剩剩余余部分为应纳税所得额,税率如下:部分为应纳税所得额,税率如下:级数级数 全月应纳税所得额全月应纳税所得额 税率税率()1 1 不超过不超过500500元的部分元的部分 5 5 2 2 超过超过500500元至元至20002000元的部分元的部分 10 10 3 3 超过超过20002000元至元至50005000元的部分元的部分 15 15 4 4 超过超过50005000元至元至2000020000元的部分元的部分 20 20 5 5 超过超过2000020000元至元至4000040000元的部分元的部分 25 25 1515设计:设计:设计算法,即找出依据获得的信息设计算法,即找出依据获得的信息产生结果信息的方法产生结果信息的方法编码:编码:用计算机语言表达所设计的算法。用计算机语言表达所设计的算法。1616对第二章学习的基本要求对第二章学习的基本要求1.1.熟记各种类型的类型修饰符,如:熟记各种类型的类型修饰符,如:短整型:短整型:short short 字符:字符:char char 整型:整型:int int 枚举:枚举:enumenum 长整型:长整型:long long 逻辑:逻辑:boolbool单精度:单精度:floatfloat双精度:双精度:double double 长双精度:长双精度:long doublelong double1717掌握单字节和双字节整型类数据的的掌握单字节和双字节整型类数据的的值域范围以及实型类的有效位数:值域范围以及实型类的有效位数:字符字符:-128127 或或 0255短整型短整型:-3276832767 或或 065535实型实型:有效位:有效位:单精度单精度7位,双精度位,双精度15位位1818掌握掌握常量常量的表示方法的表示方法掌握掌握变量变量的定义和初始化方法的定义和初始化方法能熟练运用算术、赋值、复合赋值、能熟练运用算术、赋值、复合赋值、增增1减减1和关系和关系操作符操作符构造表达式构造表达式会利用逻辑操作符会利用逻辑操作符|和和&表达表达复合复合条件条件1919了解常用操作符的优先级、结合了解常用操作符的优先级、结合 性:性:()()(括弧)(括弧)+、-等一元操作符等一元操作符(从右到左)(从右到左)*、/、%(乘除)(乘除)+、-(加减)(加减)、=等关系操作符等关系操作符&(逻辑与)(逻辑与)|(逻辑或)(逻辑或)=和和+=+=等复合赋值操作符等复合赋值操作符(从右到左)(从右到左)了解操作符及表达式的副作用了解操作符及表达式的副作用2020关于多分支结构关于多分支结构1.1.各个不同条件必需互斥,不得出现各个不同条件必需互斥,不得出现既满足这个条件,又满足那个条件既满足这个条件,又满足那个条件的情况的情况2.2.合理安排条件判别的顺序,简化条合理安排条件判别的顺序,简化条件的表达件的表达2121输入一个输入一个0100分范围的一个成绩,显分范围的一个成绩,显示相应的等级:示相应的等级:90100 优优8089 良良 7079 中中6069 及格及格60分以下分以下不及格不及格2222void main()/void main()/合理的判别顺序合理的判别顺序合理的判别顺序合理的判别顺序 float score;float score;cout coutscore;cinscore;if(score100)if(score100)coutcout成绩必须在成绩必须在成绩必须在成绩必须在01000100分之间!分之间!分之间!分之间!;else if(score60)cout else if(score60)cout不及格不及格不及格不及格endl;endl;else if(score70)cout else if(score70)cout及格及格及格及格endl;endl;else if(score80)cout else if(score80)cout中中中中endl;endl;else if(score90)cout else if(score90)cout良良良良endl;endl;else cout else cout优优优优endl;endl;2323void main()/void main()/合理的判别顺序合理的判别顺序合理的判别顺序合理的判别顺序 float score;float score;cout coutscore;cinscore;if(score100)if(score100)coutcout=90)cout=90)cout优优优优endl;=80)cout=80)cout良良良良endl;=70)cout=70)cout中中中中endl;=60)cout=60)cout及格及格及格及格endl;endl;else cout else cout不及格不及格不及格不及格endl;endl;2424void main()/void main()/不合理的判别顺序不合理的判别顺序不合理的判别顺序不合理的判别顺序 float score;float score;cout coutscore;cinscore;if(score100)if(score100)coutcout成绩必须在成绩必须在成绩必须在成绩必须在01000100分之间!分之间!分之间!分之间!;else if(score=60)else if(score=60)cout cout及格及格及格及格endl;endl;else if(score60)cout else if(score60)cout不及格不及格不及格不及格endl;endl;else if(score=80)else if(score=80)cout cout良良良良endl;endl;else if(score80)cout else if(score80)cout中中中中endl;endl;else cout else cout优优优优endl;endl;2525如果条件可用一系列的整数(或字如果条件可用一系列的整数(或字符、枚举)来表示,可以采用符、枚举)来表示,可以采用switchswitch多分支结构(常与多分支结构(常与break break 语语句配合使用)句配合使用)2626void main()void main()float score;float score;cout coutscore;cinscore;switch(int(score)/10)switch(int(score)/10)case 0:case 0:case 5:cout case 5:cout不及格不及格不及格不及格endl;break;endl;break;case 6:cout case 6:cout及格及格及格及格endl;break;endl;break;case 7:cout case 7:cout中中中中endl;break;endl;break;case 8:cout case 8:cout良良良良endl;break;endl;break;case 9:case 10:cout case 9:case 10:cout优优优优endl;break;endl;break;default:cout default:cout成绩必须在成绩必须在成绩必须在成绩必须在01000100分之间!分之间!分之间!分之间!;2727关于循环结构关于循环结构1.1.什么样的问题需要借助于循环结构?什么样的问题需要借助于循环结构?如果问题可以分为若干步来解决,而如果问题可以分为若干步来解决,而每一步的工作都十分相似,则一般需每一步的工作都十分相似,则一般需要利用循环结构。要利用循环结构。2828问题:问题:求一维数组求一维数组a a的的1010个元素之和个元素之和可分可分1010步解决,每一步步解决,每一步累加一个元素累加一个元素:int s=0;int s=0;int s=0;int s=0;for(int i=0;i10;i+)s+=ai;for(int i=0;i10;i+)s+=ai;for(int i=0;i10;i+)s+=ai;for(int i=0;i10;i+)s+=ai;问题:问题:显示输出如下的直角三角形:显示输出如下的直角三角形:*2929 可分可分 5 步解决,每一步步解决,每一步输出一行输出一行;若行号若行号 k 分别为分别为 0,1,2,3,4,则则每一行的输出可分每一行的输出可分 k*2+1步解决,步解决,每一步每一步输出一个输出一个*for(k=0,k5,k+)for(k=0,k5,k+)coutendl;coutendl;for(j=0;jk*2+1;j+)cout*;for(j=0;jk*2+1;j+)cout1 时)时)3131 int n=1,d=2;double s=0.0,s0;while(s0=double(n)/d)=0.000001)s+=s0;n+=2;d+=d;3232什么情况下用什么情况下用 for for 循环,什么情循环,什么情况下用况下用 while while 循环?循环?下列情况下适合用下列情况下适合用 for for 循环:循环:能够明显地确定循环次数能够明显地确定循环次数循环体每次处理的数据与一个循环体每次处理的数据与一个等差数列相关等差数列相关 其他情况下适合用其他情况下适合用 while while 循环。循环。for for 循环结构和循环结构和 while while 循环结构循环结构可以相互转换。可以相互转换。3333如果条件可用一系列的整数(或字如果条件可用一系列的整数(或字符、枚举)来表示,可以采用符、枚举)来表示,可以采用switch多分支结构,并常与多分支结构,并常与break 语句配合使用语句配合使用3434 float score;float score;cout coutscore;cinscore;switch(int(score)/10)switch(int(score)/10)case 0:case 0:case 1:case 1:case 5:cout case 5:cout不及格不及格不及格不及格endl;break;endl;break;case 6:cout case 6:cout及格及格及格及格endl;break;endl;break;case 7:cout case 7:cout中中中中endl;break;endl;break;case 8:cout case 8:cout良良良良endl;break;endl;break;case 9:case 9:case 10:cout case 10:cout优优优优endl;break;endl;break;default:cout default:cout成绩必须在成绩必须在成绩必须在成绩必须在01000100分之间!分之间!分之间!分之间!;3535数组与指针的关系数组与指针的关系重点掌握:重点掌握:数组元素的指针访问方式数组元素的指针访问方式指向数组的指针指向数组的指针3636数组元素的指针访问方式数组元素的指针访问方式数组的下标操作就是一种特殊形式数组的下标操作就是一种特殊形式的指针操作:的指针操作:Ai 是是*(A+i)的的另一种表示形式。另一种表示形式。对于一维数组:对于一维数组:Ai *(A+i)Ai *(A+i)A0 *(A+0)*A A0 *(A+0)*A 3737对于二维数组:对于二维数组:Bij *(Bi+j)Aj *(A+j)因此因此:Bij *(Bi+j)*(*(B+i)+j)3838数组的指针访问方式数组的指针访问方式.当当i i、j j之一为之一为0 0或均为或均为0 0时:时:Bi0 *(Bi+0)*Bi *(B+i)B0j (*(B+0)j (*B)j *(*B+j)B00 *(B0+0)*B0 *(B+0)*B3939指向数组的指针指向数组的指针数组名就是一个指向该数组本身的指针数组名就是一个指向该数组本身的指针(但不是指针变量),如:(但不是指针变量),如:int b=1,2,3,4,5;coutb3;cout*(b+3);显示两个显示两个4任何与任何与数组名等价的指针都是指向该数数组名等价的指针都是指向该数组的指针组的指针4040ps1(&s)ps2(s 或或&s0)一维数组的例子:一维数组的例子:int s5;int(*ps1)5=&s;int*ps2=s;/或或=&s0;4141二维数组的例子:二维数组的例子:int w34;int(*p1)34=&w;int(*p2)4=w;/或或=&w0;int*p3=w0;/或或=&w00;4242p1(&w)p2 (w 或或&w0)p3(w0 或或&w00)4343关于关于“指向数组的指针指向数组的指针”.三维数组的例子:三维数组的例子:int x334;int(*px1)334=&x;int(*px2)34=x;/或或=&x0;int(*px3)4=x0;/或或=&x00;int*px4=x00;/或或=&x000;4444关于关于“指向数组的指针指向数组的指针”.(&x)px1px2 (x 或或&x0)px3(x 0 或或&x00)px4(x 0 0 或或&x000)