第1章 c程序设计基础.ppt
第第1 1章章 c c程序设计程序设计基础基础1.1计算机内的数据表示1.2算法及其表示1.3程序设计语言1.4结构化程序设计1.1计算机内的数据表示n数制及其转换n常用计数方法n十进制计数法进制计数法是“逢十进一”的例如:(1234.56)10110321023101410051016102各位的权值分别为:103、102、101、100、101、102。n二进制计数法二进制计数法是“逢二进一”的。例如:(1001101.11)2=126025024123122021120121122各位的权值分别为:26、25、24、23、22、21、20、21、22、23。1.1计算机内的数据表示n八进制数与十六进制数八进制计数法是“逢八进一”的,数码为:0、1、2、3、4、5、6、7。例如:(621)8=682281680各位的权值分别为:82、81、80。十六进制计数法是“逢十六进一”的,数码为0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。例如:(8A1F)16=816310162116115160各位的权值分别为:163、162、161、160。1.1计算机内的数据表示n数制转换n任意进制转换为十进制由r制数转换为十进制数可按照如下公式进行多项式展开求和即可:KnKn1K1K0.K1K2KmKnrnKn1rn1K1r1K0r0K1r1K2r2Kmrmn十进制转换为任意进制n可以采用除基取余法将十进制整数转换为r进制整数:将十进制整数除以r,得到商和余数,余数对应为r进制数低位的值;继续让商再除以r,得到商和余数,重复此操作,直至商为0,如此得到的一系列的余数就是相应r进制数的各位数字,先得到的是低位,后得到的是高位。1.1计算机内的数据表示例如,将(29)10转换为二进制整数:因此,(29)10(11101)2 2 29 2 14 1 低位 2 7 0 2 3 1 2 1 1 0 1 高位 1.1计算机内的数据表示n可采用乘基取整法将十进制小数转换为r进制小数:将十进制小数乘以r,去掉乘积的整数部分,再将余下的纯小数乘以r,重复此操作,直至乘积等于0或达到所需的精度为止,如此得到的一系列整数就是r进制小数的各位数字,先得到的是高位,后得到的是低位。例如,将(0.625)10转换为二进制小数:0.6252=1.251高位0.252=0.500.52=11低位因此,(0.625)10(0.101)2n由于整数和小数的转换方法截然不同,将十进制数转换为r进制数时,整数部分和小数部分要分开来进行转换。r进制小数能精确的转换为十进制小数,但十进制小数通常不能精确的转换为r进制小数。1.1计算机内的数据表示n二进制与八进制、十六进制之间的转换n对于一个二进制数,只要依次(整数部分由低位到高位,小数部分由高位到低位)将其每3位或4位分成一组,就可以直接转换为八进制数或十六进制数。例如,(1000101111010011.01101)2(105423.53)8(1000101111010011.01101)2(8B13.B8)16n将八进制数中的每一位用3位二进制数表示,将十六进制数中的每一位用4位二进制数表示,就能转换为对应的二进制数。1.1计算机内的数据表示n 原码,反码及补码在计算机中,在计算机中,“位位”是数据的最小单位。计算是数据的最小单位。计算机中的存储量是以字节来计算的,一个字节是机中的存储量是以字节来计算的,一个字节是8位位二进制位。二进制位。在计算机内,一般规定:用在计算机内,一般规定:用0表示正号表示正号“”,用,用1表示负号表示负号“”;符号位放在数值位之前。;符号位放在数值位之前。一个数连同其符号在机器中的二进制表示形式称一个数连同其符号在机器中的二进制表示形式称为机器数,它所代表的数值称为机器数的真值。为机器数,它所代表的数值称为机器数的真值。机器数的一般格式为:机器数的一般格式为:符号位符号位 数值位数值位1.1计算机内的数据表示n原码n原码表示法是符号位用0表示正数,用1表示负数,数值位表示数值本身。例如:27原=0001101127原=10011011n在原码表示法中,0的表示方法不唯一:0原=000000000原=10000000。n反码n反码表示法中正数与负数的表示方法不同,正数的反码与原码同形,如:27反=00011011n负数的反码为:符号位仍为1,数值位是对原码取反,如:27反=11100100n在反码表示法中,0的表示也不唯一:0反=000000000反=11111111。1.1计算机内的数据表示n补码n正数的补码与原码、反码同形,如:18原18反18补00010010n负数的补码为:符号位为1,数值位等于原码的数值位取反,再加1,或者说:x补x反1;如:18原1001001018反1110110118补11101110n补码形式的数据进行运算时,符号位和数值位一样的参与运算。例如,计算3658,36补1101110058补001110101101110000111010溢出100010110n在补码表示法中,0的表示是唯一的,假设用一个字节存放数据0补000000001.2算法及其表示n算法n为解决一个问题而采取得方法和步骤,称为算法。n算法就是被精确定义的一组规则,规定先做什么,再做什么,以及判断某种情况下做哪种操作。例如,下面是用自然语言表示的对三个数进行从小到大排序的算法。输入三个数x、y、z;将x与y比较,若xy,交换x与y的值;将x与z比较,若xz,交换x与z的值;将y与z比较,若yz,交换y与z的值;输出此时的三个数x、y、z1.1计算机内的数据表示n算法的特性和目标n算法必须具有以下五个特性:n确定性算法中的每一步都必须有确切的含义,不允许存在二义性;对于相同的输入数据,必须有相同的输出结果。n可行性算法中的每一步操作都能通过可以实现的基本运算,执行有限次来完成,并最终得到确定的结果。n有穷性一个算法必须总是在执行有限个操作步骤和可以接受的时间内完成其执行过程。也即是说,对于一个算法,要求其在时间和空间上均是有穷的。1.2算法及其表示n输入一个算法有零个或多个输入数据。有些算法需要提供输入数据,有些算法则不需要。n输出一个算法应该有1个或多个输出数据。n算法应达到的目标n正确性n可读性n健壮性n高效率与低存储空间需求 1.2算法及其表示n算法的表示n自然语言n传统流程图 传统流程图是用规定的一组图形符号、流程线和文字说明来表示各种操作的算法表示方法。1.2算法及其表示1.2算法及其表示流程图只包括三种基本程序结构 n顺序结构n选择结构真处理A处理B假条 件 选择结构处理A处理B 顺序结构1.2算法及其表示n循环结构真 处理A假条 件 直到型循环结构假真 处理 A条 件 当型循环结构 开始 输入x,y,z 结 束 输出x、y、z对三个数进行排序 交换x、y假真 xy?交换x、z假真 xz?交换y、z假真 yz?1.2算法及其表示nN-S流程图 n顺序结构n选择结构 顺序结构 处理A 处理B 分支结构 条 件 处理A 处理B成立不成立1.2算法及其表示n循环结构 当条件成立时继续 处理 A 当型循环结构 处理 A 直到条件成立时结束 直到型循环结构1.2算法及其表示 输入x,y,zxy?Y N 交换x、yxz?Y N 交换x、zyz?Y N 交换y、z 输出x、y、z三个数进行从小到大排序1.2算法及其表示n伪码伪码是用一种介于自然语言和计算机语言之间的文字和符号来描述算法。例如,用伪码描述上述算法:inputx,y,zxmaxifymaxthenymaxifzmaxthenzmaxoutputmax1.3程序设计语言 n程序与程序设计语言 n程序 计算机程序是指为让计算机完成特定的任务而设计的指令序列。n程序设计语言 n机器语言n汇编语言n高级语言n面向对象的语言 nC语言简介 nC语言的历史 1.3程序设计语言nC程序的结构 nC程序是一种函数结构,一般由一个或若干个函数组成;n其中必有一个名为main()的主函数,程序的执行就是从这里开始的。【例1.1】编写程序判断一个整数是否是3的倍数,如果是输出“YES”,否则输出NO”。main()/*main函数的首部*/*main函数体的开始*/int m;/*定义整型变量m*/printf(nPlease input a integer:);/*输出提示信息*/scanf(%d,&m);/*读入变量的值*/if(m%3=0)printf(YES);else printf(NO);/*如果flag值为0,输出“YES”,否则输出“N0”*/1.3程序设计语言运行情况如下:Please input a integer:20 NO【例1.2】编写程序求任意三个整数中的最小值。main()/*main函数的首部*/*main函数体的开始*/int n1,n2,n3;/*定义三个整型变量*/int minnum;/*定义变量minnum,用于存放最小值*/printf(nEnter three integers:);/*输出提示信息*/scanf(%d,%d,%d,&n1,&n2,&n3);/*读入变量的值*/minnum=min(n1,n2,n3);/*调用自定义函数min,将所求的最小值赋给变量minnum*/printf(nMaximum is:%d,minnum);/*输出minnum值*/1.3程序设计语言int min(int x,int y,int z)/*num函数的首部*/*num函数体的开始*/int m;m=x;/*默认第一个数最小*/if(ym)m=y;/*如果第二个数更小,则修改m*/if(zm)m=z;/*如果第三个数更小,则修改m*/return m;/*将m的值作为函数值返回*/*max函数体的结束*/运行情况如下:Enter three integers:18,25,12Maximum is:12 1.3程序设计语言nC程序的结构特点n C程序是由函数构成的。n函数由函数首部和函数体两部分组成。一般函数的格式如下:类型名类型名 函数名(函数参数表)函数名(函数参数表)声明部分声明部分 执行部分执行部分 函数体中也可以没有任何内容,即构成一个空函数。n一个源程序有一个且只能有一个main函数(又称主函数)。C程序的执行总是从main函数开始的,在调用其它函数后,最后回到main函数中结束整个程序的执行。1.3程序设计语言nC程序书写格式自由。既允许在一行内写多个语句,也允许将一个语句分写在多行上,但每个语句必须以分号结束。n“/*/”表示对函数或语句的功能作注释。在“/”和“*”之间不能有空格,且“/*”和“*/”必须配对使用。注释是供人阅读的,并不参与编译和运行。注释可以出现在程序的任何地方,添加必要的注释可以提高程序的可读性。n源程序中可以使用预处理命令(如include命令、define命令),预处理命令以“#”开头,一般预处理命令应放在源文件或源程序的最前面。1.3程序设计语言C程序的一般形式如下:预编译处理命令预编译处理命令 全局变量定义全局变量定义 main()main()声明部分声明部分 执行部分执行部分 sub 1()/*sub 1()/*自定义函数自定义函数*/*/sub n()/*sub n()/*自定义函数自定义函数*/*/1.3 程序设计语言nC程序的特点 n简洁、紧凑n模块化、结构化n功能强大n可移植性好nC语言的不足n运算符多,难以掌握nC程序中常常为了类型转换上的方便不要求类型检查,这就导致有些情况下即使要求类型一致,但实际类型不一致也不出错,而产生莫名其妙的运算结果。nC语言中对数组进行处理时对数组元素的下标不做越界检查,若程序中引用数组元素时越界,容易造成数据的混乱,甚至更严重的错误。1.4 结构化程序设计 n结构化程序设计方法n结构化程序设计方法是一种用来编写清晰、可读性好、易修改性强的程序的严格的设计方法。n结构化程序设计方法要求程序仅由三种基本结构:顺序结构、选择结构和循环结构经组合、嵌套而成。而且,要求每个程序模块是单入口单出口的;程序中没有永远执行不到的语句,没有死循环(无终止的循环)。n结构化程序设计方法要求采用“模块化”的设计方法。n程序的设计过程采用“自顶向下,逐步求精”的策略。1.4 结构化程序设计n程序设计的步骤n分析问题,确定数据结构。n确定算法。n编写程序。n调试运行程序。n建立文档资料。n程序设计的风格