资源描述
Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,C,语言程序设计,第一讲,程序设计与,C,语言(,2,学时),计算机学院,主要内容,1.1,程序设计课程目标,1.2,程序设计概述,1.3 C,语言概述,2,1.1,程序设计课程目标,课程要求,课程目标,3,课程要求,学会从计算机角度思考问题,培养学生,逻辑思维,能力和,面向过程,的程序设计方法,能够针对非数值计算的具体问题选择合理的,存储结构,及构造较有效率的,算法,运用,C,语言编制,结构清晰,、,可读性,好的程序,会设计测试用例,完成程序的测试,能撰写该程序的技术报告,具备,面向过程,程序的独立设计及实现能力,4,5,用计算机解决问题示例,某地刑侦大队对涉及,6,个嫌疑人的一桩疑案进行分析得到以下结论,试编一程序,将作案人找出来。,A,、,B,至少有,1,人作案;,A,、,E,、,F 3,人中至少有,2,人参与作案;,A D,不可能是同案犯;,B,、,C,或同时作案,或都与本案无关:,C,、,D,中有且仅有,1,人作案;,如果,D,没有参与作案,则,E,也不可能参与作案。,课程目标,6,1.,培养逻辑思维和程序设计思想,重点培养,分析问题,和使用,C,语言进行程序设计以,解决实际问题,的能力。,2.,熟练掌握,C,语言基础知识、,C,语言程序结构、语法及函数库、简单算法和数据结构的设计方法,。,3.,了解并初步掌握当前软件行业公认的,程序设计风格和规范,,,增强程序可读性和易扩展性,;,能够熟练使用,一种常用的编程工具和集成开发环境,进行程序设计、编译、测试及调试。,1.2,程序设计概述,程序设计语言发展,语言实现及开发环境,7,8,程序无处不在,计算机,移动设备,外设,智能设备,9,什么是程序,一系列遵循一定规则并能正确完成特定功能的代码或指令序列,通常包括,数据结构,与,算法,两部分,#include,int main(),int a=3,b=2,c=5;,int d=a*b+c;,printf(ab+c=%dn,d);,return 0;,源程序,a.c,可执行程序,编译,链接,011001,111001,10,程序设计语言及其发展,程序设计语言,一套规范的集合,主要包括该语言使用的,字符集,,直接和间接支持的,数据类型集合,、,运算符集合、关键字集合、指令集合、语法规则,、以及对,特定构造,的支持。,11,程序设计语言及其发展,1834,第一台机械式计算机(最早的程序员,Ada,),1896,最早的程序载体穿孔卡片,1937,“,图灵机,”,数学模型,1952,MIT,创建了汇编语言,1953,IBM,研制,Fortran,语言,1965,BASIC,语言出现,1972,贝尔实验室发明,C,语言,20,世纪,80,年代贝尔实验室发明,C+,语言,1983,Borland,公司研制,Turbo Pascal,1991-Python,1995,Java,语言诞生,2002,Microsoft,发布,.NET,12,程序设计语言及其发展,机器语言,汇编语言,高级语言(,C,,,Java,C+,,,C#,),13,高级语言,编译,问题:计算,d=a,b+c,00000001000000001000,将单元,1000,的数据,(a),装入寄存器,0,00000001000100001010,将单元,1010,的数据,(b),装入寄存器,1,00000101000000000001,将寄存器,1,的数据乘到寄存器,0,上,(axb),00000001000100001100,将单元,1100,的数据,(c),装入寄存器,1,00000100000000000001,将寄存器,1,的数据累加到寄存器,0,上,(axb+c),00000010000000001110,将寄存器,0,的数据写入内存单元,1110,(d=axb+c),机器语言,load 0 a,将单元,1000,的数据,(a),装入寄存器,0,load 1 b,将单元,1010,的数据,(b),装入寄存器,1,mult 0 1,将寄存器,1,的数据乘到寄存器,0,上,(axb),load 1 c,将单元,1100,的数据,(c),装入寄存器,1,add 0 1,将寄存器,1,的数据累加到寄存器,0,上,(axb+c),save 0 d,将寄存器,0,的数据写入内存单元,1110,(d=axb+c),汇编语言,d=a*b+c,高级语言,程序设计语言热度,(TIOBE Index,),程序设计语言热度,(TIOBE Index,),16,语言实现,具体地实现一种语言的各种特征并支持特定的编程模式的技术和工具。,表现形式:,编译器(,Compiler,),和,连接器(,Linker,),。,语言是标准的但语言实现是因厂家而异的,常见,C,语言实现,:Borland C,、,Microsoft C,、,GCC,17,开发环境,泛指支持软件开发的一切工具,操作系统,代码编辑器,编译器,链接器,调试器,18,开发环境,集成开发环境(,IDE,),将编辑器、编译器、连接器和调试器集成在一起的开发工具,C/C+,集成开发环境:,Dev C+,Code Blocks,Visual C+,Eclipse,19,命令行下需要记住编译命令,不方便调试,集成开发环境下操作方便,但后台仍然是以命令行方式运作,V.S.,1.3 C,语言概述,C,语言简介(特点,发展等),C,程序框架(主函数,语句,注释等),20,21,C,语言能做什么,纯粹的,C,语言只能做计算和文字处理,扩充了函数库的,C,语言几乎可以完成任何和程序控制有关的任务,C,语言和第三方函数库,可以完成应用程序设计,嵌入式程序设计,驱动程序设计,游戏,,.,22,C,语言简介,C,语言简史,演变:,ALGOL 60CPL BCPL B C,1973,Dennis Ritchie&Brian Kernighan(Bell Labs.),为开发,UNIX,而设计,C,语言的标准化,ANSI C,标准化委员会:1983,C89,和,C90,C99,C11,23,C,语言特点,中级语言:介于高级语言与低级语言之间,高级语言的,结构化,与,模块化(高级语言基本特性),低级语言的,控制性,与,灵活性(指针,位操作),结构化,顺序结构、分支结构、循环结构,模块化,函数、函数库,可移植性,虽然可在多种系统下使用,但可移植性不是非常好,24,第一个,C,程序,/*,hello.c:The first program,author:wanbo,date:2017/10/9,*/,#include,int,main,(),/single line comment,printf(,*Hello,world*n,);,return,0;,25,C,源程序构成,头文件包含,条件编译语句,宏定义,说明,部分,全局变量,函数声明,其它函数,主函数,(main),执,行,部,分,常量,/*,hello.c:The first program,author:wanbo,date:2010/10/9,*/,#include,int,main,(),/single line comment,printf(*hello,world*n,);,return,0;,预处理,部分,26,一个最简单的,C,程序框架,#include,int,main,(),return,0;,在这里可以添加完成特定任务的代码,这个头文件是绝大多数,C,程序必须包含的,程序结束,27,main,函数,main,函数的两种常见形式,int,main(),return 0;,int,main(,int argc,char*argv,),return 0;,命令行参数,28,main,函数,C,程序中可以有多个函数但,必须有,且,只能有一个,main,函数,所有,C,程序都从,main,函数开始执行,main,函数的名字不能改变,(,包括大小写,),main,函数由系统调用,Main,和,main,是不同的,29,语句和注释,语句包含一个或多个表达式,数值运算、函数调用等,语句以,英文分号,(,;,)结束,一条语句可以分成多行书写,C,语言使用自由格式的语法,自由格式与代码风格,注释,多行注释用,/*/,来分界,单行注释用,/,开头,/*,多行注释,hello.c:The first program,author:wanbo,date:2017/10/9,*/,#include,int,main,(),/,单行注释,printf(*hello,world*n,);,return,0;,30,自由格式与代码风格,#include,int main(),printf(hello world);,return 0;,#include,int main()printf(hello worldn);return 0;,#include,int main(),printf(hello world);,return 0;,良好的代码风格,适当的,注释,适当的,换行,适当的,缩进,适当的,空行,V.S.,31,建立一个可执行程序,编辑,(Edit),编译,(Compile),链接,(Link),f1.h,f2.h,f3.h,s1.c,s2.c,prog.exe,链接,s1.obj,s2.obj,编译,编辑,32,命令行程序和,GUI,程序,Windows,下的文件复制,命令行程序和,GUI,程序,命令行下的文件复制,33,命令行程序和,GUI,程序,一个,C,语言完成的文件复制程序,(,fcopy.c,),34,命令行才是本质逻辑,,GUI,只是建立在本质逻辑上的用户接口。,#include,#include,#define BUF_SIZE 1024,int main(int argc,char*argv),FILE*fp1,*fp2;,unsigned char bufBUF_SIZE;,int n;,fp1=fopen(argv1,rb);,fp2=fopen(argv2,wb);,do,n=fread(buf,1,BUF_SIZE,fp1);,fwrite(buf,1,n,fp2);,while(n=BUF_SIZE);,fclose(fp1);,fclose(fp2);,return 0;,35,小结,重点,1,:了解程序设计相关概念,重点,2,:熟悉,C,语言源程序框架,重点,3,:熟悉集成开发环境的使用,重点,4,:熟悉计算机基本操作及命令行,重点,5,:熟悉机试系统使用,36,作业,完成平台上的学习,在你的开发环境中编译、运行本节中的两个程序,试着修改第一个程序,(hello.c),让它输出别的内容,熟悉,C,语言源程序结构,熟悉命令行用法,C,语言程序设计,第二讲,数据对象与计算(,4,学时),计算机学院,一个温度转换的问题,已知华氏温度,(,用,f,表示)到摄氏温度(用,c,表示)的转换公式为:,c=5/9 (f-32),写一个程序将输入的华氏温度转换为摄氏温度,输出结果保留两位小数,38,1.,已知,(,输入,),:华氏温度,f,2.,计算过程:,c=5/9,(f-32),3.,结果(输出):输出摄氏温度,c,问题转换为程序,需要解决的问题,1.c,和,f,在程序中用什么,名字,表示(标识符问题)?,2.c,和,f,在程序中用什么,数据类型,表示?,3.c,和,f,的值如何给定?(,输入,和,赋值,问题),4.,数学表达式,c=5/9 (f-32),在,C,程序中,如何表示及计算(,C,语言,表达式、运算符,、,优先级,)?,5.,如何,输出,c,的值?(,输出、精度控制,),39,目标,用,C,语言程序解决简单计算问题,掌握数据对象的表示方法,掌握,C,语言表达式的写法,掌握,C,语言输入,/,输出方法,40,主要内容,数据对象表示,2.1,基本字符、标识符、关键字,2.2,数据、类型、变量,计算过程,2.3,运算符、表达式与计算,用户交互,2.4,结果输出与数据输入,小结,41,2.1,基本字符、标识符、关键字,解决数据对象命名问题,在,C,语言中可以使用哪些字符?,在,C,语言中给对象命名要遵循哪些规则?,是否符合命名规则的名字都可以使用?,42,基本字符,数字字符:,0,9,大小写拉丁字母:,a,z,,,A,Z,;,其他一些可打印(可以显示)的字符,包括:,!%,.?/|,特殊字符,如空格符、换行符、制表符等,43,1.,在注释中可以使用,2.,在双引号内可以使用,中文字符能否使用?,对象命名规则,程序中一个,程序对象,的名字称为,标识符,,该名字必须满足以下规则,由,字母、数字和下划线(,_,),构成的一个,连续,序列,不能有空白字符(键盘上的空格键、,TAB,键),第一个字符必须是字母或下划线,_,(,注意下划线,_,与横线,-,的区别,),区别大小写:,NAME,和,name,是不同的标识符,44,标识符示例,45,标识符,合法性,abcd,A_great_machine,Beijing,key map,3set,_f2048,:ab4,C_Programming,合法,合法,合法,合法,合法,不合法,不合法,不合法,标识符命名惯例,尽量使用有意义的单词,第一个字符尽量不使用下划线,标识符由多个单词构成时可以每个单词首字母大写,标识符不宜太长,可以适当使用简写,保持命名风格的一致性,46,几种常见命名规则,驼峰命名法(,Camel,),混合使用大小写字母来构成变量和函数的,名字,例如:,MyData,匈牙利命名法,(Hungarian),在变量名前面加上相应的小写字母的符号标识作为前缀,标识出变量的作用域,类型等,例如:,iMyData,帕斯卡(,Pascal,)命名法:,与骆驼命名法类似只不过骆驼命名法是首字母,大,写,而帕斯卡命名法是首字母小写,例如:,myData,47,关键字,C,语言合法标识符中的一个特殊的小集合,作为关键字的标识符在程序里具有语言预先定义好的特殊意义,不能用于其他目的,不能作为普通的名字(标识符)使用,48,C,语言的,32,个关键字,49,auto,break,case,char,const,continue,default,do,double else,enum extern,float for,goto,if,int long,register,return,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile,while,问题转换为程序,需要解决的问题,1.,摄氏温度,c,和华氏温度,f,在程序中用什么,名字,表示(,标识符问题,)?,50,可以就用,c,表示摄氏度,,f,表示华氏度,问题转换为程序(版本,0,),下面的程序正确吗?,51,int main(),f=20;,c=5/9*(f-32);,return 0;,如何才能让,C,语言,编译器识别,c,和,f,?,Error f undeclared,Error c undeclared,2.2,数据、类型、变量,解决数据对象的存储和表示问题,计算机对不同的数据类型有不同的存储和表示方法,计算机能够表示的数值范围总是有限的,52,5.0,和,5,在数学上是相同的,但在计算机内部表示上是不同的,2356.4359,是一个有限小数,但在计算机上表示时可能不够准确,数据与类型,C,语言的基本数据类型包括,整数类型,实数类型,字符类型,程序中的每一个数据都必定属于某一种类型(,基本类型或自定义类型,),每一种数据类型都有,表示方式,(编码)和,表示范围,数据类型确定了,数据对象支持的运算,53,整数类型和整数的表示,long,int,short,字节数,4,4,2,表示范围,-2,31,2,31,-1,-2,31,2,31,-1,-2,15,2,15,-1,54,三种整数类型,长整数,l,ong int,可以简写为,long,普通整数,int,短整数,short int,可以简写为,short,三种整数类型表示范围,long,int,short,,,具体范围取决于不同的实现,整数类型和整数的表示,unsigned long,unsigned int,unsigned short,字节数,4,4,2,表示范围,02,32,-1,02,32,-1,02,16,-1,55,三种无符号整数类型,长整数,unsigned,l,ong int,可以简写为,unsigned long,普通整数,unsigned,int,短整数,unsigned short int,可以简写为,unsigned short,三种整数类型表示范围,unsigned long,unsigned,int,unsigned short,整数常数的书写形式(,int.c,),十进制形式,例如:,123456,,,123,,,100,八进制形式,以,0,开头,例如:,0123456,,,0123,,,0100,十六进制形式,以,0 x,开头,例如:,0 x123456,,,0 x123,,,0 x100,56,整数常数的书写形式示例,八进制形式,十进制值,0123456,42798,0123,83,0100,64,57,十六进制形式,十进制值,0 x123456,1193046,0 x123,291,0 x100,256,实数类型和实数表示,三种实数类型,单精度浮点数:,float,双精度浮点数:,double,长双精度浮点数:,long double,三种实数类型的表示范围,(,IEEE,标准,),58,字节数,指数位数,尾数位数,表示范围,float,4,8,23,-3.410,38,3.410,38,double,8,11,52,-1.710,308,3.410,308,long double,16,15,112,-1.2 10,4932,3.4 10,4932,浮点数表示方法,任意二进制浮点数公式:,N=M2,E,其中,,M,为尾数(纯小数部分),整数,E,为指数,,M,与,E,都带符号。,二进制浮点数特征:,尾数的位数决定数的精度;,指数的位数决定数的范围。,59,指数,符,号,指数,E,尾,数符号,尾数,M,(定点整数),(定点小数),实数常数的书写形式,小数形式,例如:,12000000.00.00001,指数形式,例如:,1.2E7 1E-5,注意:,以上形式表示的实数均被当做,double,类型存储,,如果希望以,float,类型存储需要在后面加上,F,或,f,例如:,12000000.0f,,,0.00001F,,,1.2E7F,,,1E-5F,60,Tips,:,在写程序时都使用,double,类型,字符类型和字符的表示,字符数据主要用于输入输出和文字处理,字符类型:,char,字符类型在计算机中用,一个字节的整数,存储,unsigned char,:0255,char,:-128127,每一个字符都有唯一一个对应的整数,该整数称为这个字符的,ASCII,码,61,ASCII,码,在计算机中每一个拉丁文字字母用一个,0,127,的数字表示,这个数字称为该字母的,ASCII,码,ASCII,字符集:所有大小写英文字母、数字、各种标点符号字符,还有一些控制字符,一共,128,个,62,字符的书写形式,1.,用单引号括起的单个字符,例如:,A,a,1,2.,以字符对应的,ASCII,码,表示,64,/a,b,都表示字符,A,char a,b;,a=A;,b=65;,字符的书写形式,3.,用,转义字符,表示特殊字符,反斜线(,)开头的转义字符用来表示,ASCII,字符集中的特殊字符,65,注意:对未定义的转义字符直接输出反斜线后的字符,转义字符,实际输出的字符,n,换行符号,单引号,反斜线,双引号,字符串,字符串不是,C,语言的一种数据类型,用双引号括起的一系列字符:,CHINA Beijing University Welcomen,其本质是,字符数组,主要用于输入输出,printf(,Hello C Program!n,);,字符串中间不能换行,66,Hello C Program,Hello C,Program,变量声明,变量,:用于存储程序的输入数据或计算结果的,存储单元,变量值在程序运行时可以改变,变量声明,:给存储单元定义一个,名称,及,类型,,便于程序中引用,变量名必须是,合法标识符,变量必须有,确定数据类型,可以在一条语句中定义,多个同类型,变量,可以在变量声明时赋值,67,示例程序中的变量声明,68,#include,int main(),double f=50.0;,/,声明存储华氏温度的变量并赋值,double c;,/,声明存储摄氏温度的变量,.,#include,int main(),double f=50.0,c;,/,一条语句中声明多个变量,.,变量基本操作,赋值操作,修改变量当前的值,方法:使用赋值表达式(,由操作符,“,=,”,构成的表达式,),a=,3.5,b=,5+3,取值操作,获得变量现在的值,方法:直接引用变量名称,s=,a,+,b,printf(s=%dn,s,);,69,问题转换为程序(版本,1,),70,#include,int main(),double f=20,c;,return 0;,数学运算,c=59 (f-32),如何转换成,C,语言表达式?,C,语言表达式如何计算?,2.3,运算符、表达式与计算,解决数学运算到程序的转换问题,数学运算符在程序中如何表示?,数学运算的规则在程序中如何实现?,71,算术运算符,72,运算符,使用形式,数学意义,适用数据类型,+,一元或二元运算符,一元表示正号,二元表示加法,所有基本数据类型,-,一元或二元运算符,一元表示负号,二元表示减法,所有基本数据类型,*,二元运算符,乘法运算,所有基本数据类型,/,二元运算符,除法运算,所有基本数据类型,%,二元运算符,模运算(求余数),整数类型,算术运算符示例(,operator.c,),73,double a=3.0,b=2.0;int c=4,d=2;,表达式,结果,-a,-3.0,a+b,5.0,a-b,1.0,a*b,6.0,a/b,1.5,c/d,2,c%d,0,算术表达式,由计算对象,(,例如数值的文字量、变量、函数调用等,),、算术运算符及圆括号构成,基本形式与数学上的算术表达式类似,-(28+32)+(16*7-4),25*(3-6)+234,a*b+c/2,a*,sin,(c*3.1416/180),74,算术表达式,数学公式,C,语言,表达式,b,2,-,4ac,a,+,b,-,c,ax,-(,b,+,c,),75,b*b 4*a*c,a+b-c,(a+b)/(c+d),1/(1+x*x),a*x-(b+c),表达式求值,给定了表达式中所有变量的值以后表达式的值如何计算?,表达式的计算过程,优先级,不同运算符哪个先算,哪个后算?,结合性,相同优先级的运算符哪个先算,哪个后算?,76,表达式求值,优先级规则,1.,一元运算符优先级最高,2.,先乘除后加减,3.,括号中的表达式先计算,77,运算符,优先级,一元,+,和,-,高,*,/%,中,二元,+,和,-,低,当不确定运算符优先级时,用括号来指定运算顺序是避免错误的最好方法,14,-4,表达式,值,10/5+4*6/2,-(2+6)*4)/(3+5),表达式求值,结合性,确定具有相同优先级的运算符相邻出现时表达式的计算顺序。,C,语言规定,一元,算术运算符,自右向左,结合;,二元,算术运算符,自左向右,结合,优先级相同时左边的运算符先计算。,78,4*7/2,-+-8,(4*7),/2,(-,(,+,(,-8,),),),14,8,问题转换为程序,(,版本,2,),下面的程序结果正确吗?,79,int main(),double f=50;,double c;,c=5/9*(f-32);,return 0;,c,的计算结果是多少,c=10?,计算和类型,以上计算涉及的问题,类型对计算的限制,混合类型计算和自动(隐式)类型转换,强制(显式)类型转换,80,13,0,1,1.0,5/4+4*6/2=?,1/3*3=?,1*3/3=?,1/3.0*3=?,计算和类型,类型对计算的限制,1.,两个相同类型数据使用二元运算符计算得到的结果类型相同。,例如,两个整数运算结果仍然是整数,81,1,+24/2,1,+12,1/3*3,5/4+4*6/2,0,*3,13,0,计算和类型,类型对计算的限制,2.,计算结果超出类型表示范围会导致,溢出,(,overflow.c,),82,#include,int main(),short a=32765,b=5;,short c=a+b;,/c=?,printf(c=%dn,c);,return 0;,计算和类型,混合类型计算和自动(隐式)类型转换,两个不同类型数据使用二元运算符形成混合类型计算,C,语言里混合类型计算的方法是,将混合类型计算中的某个运算对算转换为另一个运算对象的类型再计算,转换原则是,将表示范围小的类型转换为表示范围大的类型以避免丢失精度,83,表示范围,小 大,类型,short,int,long,float,double,long double,计算和类型,混合类型计算和自动(隐式)类型转换,2 +3 *4.5 =15.5,84,2,3,4.5,3.0,*,13.5,2.0,+,15.5,自动类型转换,计算和类型,强制(显式)类型转换,任何类型均可相互转换,,但转换可能丢失精度,转换方式:,(,类型名,),表达式,强制类型转换是一元运算符,其优先级和其他一元运算符相同,(,高于二元运算符,),(int)3.3*2.2,+4=,(int)(3.3*2.2),+4=,类型转换不改变原来的值,float a=3.3;,int b=(int)a;/,不改变,a,的值,85,3,*,2.2+4=10.6,(int)(7.26)+4=7+4=11,计算和类型,整数转浮点数不存在精度问题,浮点数类型转换为整数时直接去掉小数部分,86,(int)(3.3*2.2)+4=11,2.2,3.3,4,7,*,11,+,7.26,强制类型转换,问题转换为程序(版本,3,),87,#include,int main(),double f=50.0;,/,存储华氏温度的变量,double c;,/,存储摄氏温度的变量,c=5.0/9.0*(f-32);,/,计算摄氏温度,return 0;,2.4,结果输出与数据输入,解决程序与用户交互的问题,如何将计算结果展现给用户?,如何让用户输入需要的数据?,88,输出计算结果,格式化输出函数,printf,C,语言标准库函数,调用形式:,printf(,格式字符串,其他参数,);,89,控制输出格式,输出类型,输出精度,对齐方式,准备输出的值,0,个或多个,所有基本类型变量或常量,表达式或其他函数调用结果,输出计算结果,printf,函数的格式字符串,双引号括起来的字符串,其中包括:,格式字符,:,用,%,引导格式字符,控制输出格式,转义字符,:,按转义后的含义输出,其他字符,:,直接输出,90,格式字符串,输出结果,first program,first program,first,n,program,first,program,输出计算结果,用于输出整数的格式字符,%d,-,以十进制输出,带符号整数,%o,-,以八进制输出,无符号整数,%x,-,以十六进制输出,无符号整数,int a=256,b=-180;,格式字符串,输出结果,a=,%d,b=,%d,a=,256,b=,-180,a=,%x,a=,100,a=,%o,a=,400,91,输出计算结果,用于输出浮点数的格式字符,%f,-,以小数形式输出,float/double,型浮点数,%e,-,以指数形式输出,float/double,型浮点数,以上两种形式默认小数点后输出,6,位有效数字,double c=1234.567;float d=2356.4359f;,格式字符串,输出结果,c=%f,d=%f,c=1234.567000,d=2356.435791,c=%e,d=%e,c=1.234567e+003,d=2.356436e+003,92,输出计算结果,输出浮点数的精度(小数位数)控制,%.,n,f n,为整数,表示保留几位小数,位数不足时,末尾补零,位数超出时,四舍五入进位,double c=1234.567;float d=2356.4359f;,格式字符串,输出结果,c,=%.4f,c=1234.5670,d=,%.3f,d=2356.436,93,输出计算结果,用于输出字符和字符串的格式字符,%c,-,输出一个字符,%s,-,输出一个字符串,char*s=c programming;char ch1=A,ch2=a;,格式字符串,输出结果,ch1=%c,ch2=%c,ch1=A,ch2=a,ch1=%d,ch2=%d,ch1=65,ch2=97,I love%s!,I love c programming!,94,输出计算结果,使用,printf,需要注意的问题,1.,格式字符串中没有,%,引导的格式控制字符时,不需要其他参数,直接输出字符串内容,转义字符按转以后实际意义输出,95,格式字符串,输出结果,first program,first program,first,n,program,first,program,输出计算结果,使用,printf,需要注意的几个问题,2.,格式字符串中有,%,引导的格式控制字符时,其他参数的,数量,以及,类型,必须和格式控制字符一致。,96,#include,int main(),int a=123;,double b=35.8;,printf(“a=%d,b=%dn,a,b);,printf(a=%d,b=%fn,a);,printf(“a=%dn”,a,b);,return 0;,输出计算结果,示例(,printf_error.c,),97,类型不一致时,不会进行类型转换,,而会将实际传入的值当作需要的类型来理解,因此可能出现非预期结果,!,#include,int main(),int a=123;,double b=35.8;,printf(“a=%d,b=%dn,a,b);/?,return 0;,输出计算结果,示例(,printf_error.c,),98,数量不一致时,:,1.,如果缺少参数,会出现,不可预知数据,取决于不同的编译器,2.,如果有多余参数,则被忽略,#include,int main(),int a=123;,double b=35.8;,printf(a=%d,b=%fn,a);/?,printf(a=%dn,a,b);/?,return 0;,C99 7.19.6.1,对以上问题的解释,99,The fprintf function writes output to the stream pointed to by stream,under control of the string pointed to by format that specifies how subsequent arguments are converted for output.,If there are insufficient arguments for the format,the behavior is undefined.,If the format is exhausted while arguments remain,the excess arguments are evaluated(as always)but are otherwise ignored.,The fprintf function returns when the end of the format string is encountered,通过编译选项来给出警告,100,问题转换为程序(版本,4,),101,#include,int main(),double f=50.0;,/,存储华氏温度的变量,double c;,/,存储摄氏温度的变量,c=5.0/9.0*(f-32);,/,计算摄氏温度,printf(c=%.2fn,c);,/,输出摄氏温度,return 0;,如何得到用户输入,温度转换程序存在的问题,f,是固定值,如果修改,f,的值需要重新编译,102,能否让用户输入,f,的值再计算?,#include,int main(),double f=50.0;,/,存储华氏温度的变量,double c;,/,存储摄氏温度的变量,c=5.0/9.0*(f-32);,/,计算摄氏温度,printf(c=%.2fn,c);,/,输出摄氏温度,return 0;,从键盘输入数据,格式化输入函数,scanf,C,语言标准库函数,调用形式:,scanf(,格式字符串,其他参数,);,103,控制输入数据格式(类型,精度等)的字符串,以,%,引导,接受输入值的,变量地址,(在普通变量前加取地址运算符,&,可得到变量地址),scanf,函数的格式字符串,104,格式控制字符,接受输入值的变量类型,要求的实际输入,%d,int,十进制数,%ld,long,十进制数,%f,float,十进制数,可以有小数点或指数,%lf,double,十进制数,可以有小数点或指数,%c,char,一个字符,scanf,示例,1,105,int x;,float y;,double z;,char c;,scanf(%d%f%lf%
展开阅读全文