• 825.00 KB
  • 2022-04-22 11:51:45 发布

《C语言程序设计教程》实验及习题解答.doc

  • 122页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'实验指导书内容l一、上机指南Turboc2.0l二、实验安排l三、教材习题解答(第1章—第11章)122 第一部分TurboC集成开发环境简介TurboC是一个集程序编辑、编译、连接、调试为一体的C语言程序开发环境,具有速度快、效率高、功能强、使用方便等优点。C语言程序开发人员可以在该集成开发环境下利用菜单操作进行编辑、编译、连接、调试、运行以及环境设置等工作。1、TurboC的安装TurboC的安装非常方便,只需将TurboC系统中的安装软盘(含有install.exe程序)插入A:驱动器中,然后将A:盘设定为当前盘,键入install"后,安装即开始,在安装过程中,只需按照屏幕提示信息进行操作即可。如果采用系统提供的默认方式安装,则安装完成后,用户的C盘上将会有以下主要的目录和文件:(1)C:TC(其中包括TC.EXE、TCC.EXE、MAKE.EXE、等可执行文件)(2)C:TCINCLUDE(其中包括stdio.h、math.h、string.h等头文件)(3)C:TCLIB(其中包括maths.lib、mathl.lib、graphics.lib等库函数文件)(4)C:TCBGI(其中包括多种显示适配器的驱动程序)2、启动TurboC(1)在DOS平台上启动使用下面的DOS命令可以进入TurboC的集成开发环境:C:>CDTC"(将TC目录设置为当前目录)C:TC>TC"(执行tc.exe文件)(2)在WINDOWS平台上启动进入包含tc.exe的文件夹,用鼠标双击tc.exe文件的图标,即可进入TurboC的集成开发环境。TurboC集成开发环境的屏幕显示如下:图1-13、TurboC的窗口TurboC的屏幕窗口分为如下几部分:(1)主菜单区它在屏幕窗口的上方。包含8个菜单选项:File(文件)、Edit(编辑)、Run(运行)、Compile(编译)、Project(项目)、Options(选项)、Debug(调试)、Break/Switch(断点/监视),主菜单的选择以ALT键加上菜单名的第一个字母来实现,如:ALT+F即选择File122 菜单。各个主菜单均有子菜单供用户选择来实现各种操作。(2)编辑窗口它在主菜单的下方,用于源程序的输入。在其右上角可见当前编辑的文件的名字。(3)信息窗口它在编辑窗口的下方,用于显示编译和连接时的有关信息,用户要注意其中显示的错误提示信息,以帮助调试程序。(4)功能键区它在TurboC的屏幕窗口的底部,它提示功能键的作用。具体如下:F1-Help(帮助):按下F1,屏幕上显示帮助信息。F5-Zoom(放大):将当前窗口放大或缩小。F6-Switch(转换):按下此键可选择编辑窗口或信息窗口为当前窗口,即在二者之间转换。F7-Trace(跟踪):用于跟踪程序的运行情况。F8-Step(单步执行):按一次F8键,执行一条语句。F9-Make(生成目标文件):按下此键将一次完成当前编辑窗口里源文件的编译和连接,生成.obj和.exe文件。F10-Menu(菜单):回到主菜单行并激活某一个菜单项(如File此时File反相显示),用户可以使用“←”、“→”键来激活自己想要的菜单项,回车后显示其子菜单。4、编辑、编译、运行程序(1)编辑源文件编辑源文件是将已经编写的程序输入到计算机中去并将其以某个文件名保存。注意:TurboC的源文件名的扩展名必须为.C。具体操作方法是:①编辑新文件单击F6键,将光标置于编辑窗口后即可输入文件内容。编辑完成后注意应保存该文件,具体方法是:RenameNONAMEC:TCNONAME图1-2按下ALT+F键,屏幕上显示File的子菜单,通过↑或↓键或者S键选择SAVE选项后,屏幕上显示:用户可以指定磁盘路径并将NONAME改为自己所要的文件名后回车,则当前编辑的源文件就按照该路径以及名字保存于计算机中。如:键入C:TCMYFILE。②编辑已经存在的文件LoadFileName*.C图1-3按下ALT+F键,屏幕上显示File的字菜单,通过↑或↓键或者L键选择Load选项后,屏幕上显示:用户在此可输入需要编辑的文件名或直接回车,若回车则屏幕上将显示当前目录下所有扩展名为.C的文件名,用户可用“←”“↑”“→”“↓”键选择需要编辑的文件,回车后屏幕上即显示该文件的内容供编辑。122 用户在保存文件时有两种选择,一是使用ALT+F调出File的子菜单后选择SAVE,这时,当前编辑的文件被保存到当前的文件名下,二是使用ALT+F调出File的子菜单后选择Writeto,这时,屏幕提示输入新文件名,用户可以输入新文件名后回车,此时当前编辑文件将保存到新文件名下。用户在保存文件时应特别注意屏幕上的提示信息,以免出现操作失误。③快捷键的使用在编辑过程中除了可以使用如“Backspace”、“Del”等一般编辑键外还可以使用快捷键,提高编辑效率。用户可以先将编辑窗口激活再按F1键,这时屏幕上显示出各种快捷键的使用方法。例如:使用CTRL+Y快捷键可以删除光标所在的一整行。使用CTRL+QF快捷键可以在当前编辑的源文件中查找某一字符串,方法是先按CTRL+Q,再按F键并输入所要查找的字符串即可。使用CTRL+KB和CTRL+KK可以选定“块”,用于复制、移动、删除等操作。用户应仔细阅读有关快捷键的使用说明并熟悉其使用方法,这样会大大提高自己的编辑效率。(2)编译源文件用户在编辑好源文件后,可以对其进行编译。对当前文件进行编译只需按ALT+C然后选择“CompiletoOBJ…”即可。编译正常完成时,屏幕提示信息中会显示“Success….”信息,如果有错误则显示“Errors….”,用户可以按任意键,屏幕上反相显示的行是可能有错误的行,这时应注意信息窗口里的提示信息以帮助自己快速找出错误并进行修改。在进行修改时可配合使用F5、F6键以及“↑”、“↓”键,以帮助对错误行的快速定位,提高修改速度。图4编译正常完成后,用户将获得一个名字于当前编辑文件一致,扩展名为.OBJ的目标文件。(3)连接程序当编译正常结束后,就需对.OBJ文件进行连接以得到.EXE文件供执行时使用。具体方法是使用ALT+C,然后选择“LinkEXEfile”项,即对经正常编译后的.OBJ文件进行连接,若正常结束则得到一个.EXE可执行文件,若有错误则屏幕提示“Errors…..”,用户可以按任意键,屏幕上信息窗口里显示错误信息。(4)运行程序122 运行程序有多种方式:①在DOS平台上运行由于通过编译、连接后得到一个可执行的.EXE文件,那么在DOS环境的系统提示符下,只需键入该可执行文件的路径和名字回车后即可运行该程序。如:C:TC>myfile"②在TurboC集成开发环境中运行使用CTRL+F9、F10、ALT+R键都可达到运行程序的目的。使用F10和CTRL+R时,进入“Run”菜单后选择“Run CTRL+F9”项回车后即可运行,而使用CTRL+F9则直接运行无需菜单操作。实际上用户可能会发现菜单项中的快捷键提示如:在“RunCTRL+F9”项中看到的CTRL+F9就是其快捷键。用户在使用的过程中应注意菜单项的快捷键并使用快捷键以达到简化操作的目的。需要说明的是:在TurboC集成开发环境中运行程序实际上是将编译、连接、运行这三个操作合为一体进行的。在这个过程中任意一个环节出错,系统将给出错误信息供用户参考并修改错误。③在WINDOWS平台上运行进入包含经编译、连接后得到可执行的.EXE文件的文件夹中用鼠标双击该文件图标即可执行该文件。(5)查看运行结果(用户屏幕)当程序正常运行结束后,用户可使用ALT+F5键显示用户屏幕查看运行结果。5、环境设置(1)改变用户工作目录所谓工作目录是指用户文件所在的目录。一般情况下,用户出于安全和管理上的需要愿意将自己的文件放置于自己的专用目录中,那么,如何改变用户在TurboC集成开发环境中的工作目录呢?改变工作目录后对用户操作有什么影响呢?我们知道在DOS环境下,改变工作目录是通过“CD”命令来实现的,而在TurboC集成开发环境中是使用菜单操作来实现。假定有C:TCUSER目录存在(如果不存在,用户可以使用DOS命令建立该目录),其中存放的是用户文件,在TurboC卷竟下改变用户工作目录的方法是:键入ALT+F(或F10)后使用“←”“↑”“→”“↓”或“C”键选择“Changedir”项后屏幕提示如下:NewDirctoryC:TC图1-5用户可以在该窗口中输入自己的工作目录名即可,如:NewDirctoryC:TCUSER图1-6这样改变用户工作目录后,用户在“LOAD”时,屏幕上显示的都是当前用户工作目录里的文件,从而方便操作。(2)建立TurboC的工作环境在TurboC中,要对源程序进行编译、连接、调试、运行,仅有源程序有时是不够的,122 在这个过程中还有诸如包含文件和库文件的存放位置、编译模式、连接方法等等一系列环境因素需要预先设置,才能保证程序正常执行。所谓建立工作环境,就是对这些因素进行设定,需要指出TurboC初次安装后,其工作环境的缺省设置可以保证程序的正常运行,除非有特殊要求,一般特别是初学者不要对其进行修改为好。另外,关于环境设置的内容很多,这里只介绍常用的目录设置的内容,有兴趣的读者可参见有关资料。建立工作环境的操作如下:CompileLinkerIncludedirectories:C:TCINCLUDEEnvironmentLibrarydirectories:C:TCLIBDirectoryOutputdirectories:ArgumentTurboCdirectory:C:TCSavePickfilename:RetrieveoptionCurrentpickfile:图1-7Option子菜单图1-8Directory子菜单键入ALT+O(或F10)后,再使用“←”“↑”“→”“↓”或“O”键选择“Options”项,屏幕提示如图7所示。选择“Directory”项后,屏幕提示如图8所示。建立“包含文件”的默认目录在第一行中显示的“Includedirectories”表示当前“包含文件”所在的目录,用户可以根据需要进行修改。修改的方法是:IncludeDirectoriesC:TCINCLUDE图1-9使用“↑”或“↓”键,选中该行后回车,屏幕提示如下:用户可对其中内容进行修改。例如:可以改为C:TCINCLUDE;C:TCINCLUDEUSER,表示“包含文件”存放在两个不同的目录中,注意要用“;”分隔。这样修改后系统有两条默认的“包含文件”路径。建立“库文件”的默认目录在第二行中显示的“Librarydirectories”表示当前“库文件”所在的目录,用户可以根据需要进行修改。修改的方法是:IncludeDirectoriesC:TCLIB图1-10使用“↑”或“↓”键,选中该行后回车,屏幕提示如下:修改的方法同“包含文件”的修改方法相同。建立输出文件的默认目录在第三行中显示的“Outputdirectories”表示当前用于存放输出文件(*.obj文件和*.exe文件)的目录,用户可以根据需要进行修改。修改的方法是:OutputDirectoriesC:TC图1-11使用“↑”或“↓”键,选中该行后回车,屏幕提示如下:用户可对其中内容进行修改。122 例如:可以改为C:TCINCLUDEUSER,表示在编译、连接过程中产生的所有*.obj文件和*.exe文件都存放在C:TCINCLUDEUSER目录中。注意:此处不能给出两个或多个路径,否则出错。TurboC的默认目录在第四行中显示的“TurboCdirectories”表示当前“包含文件”所在的目录,用户可以根据需要进行修改。需要指出:由于它是TurboC系统文件所在的目录,系统显示的是安装时的默认目录,一般不修改它。(1)保存配置在完成上述设置以后,应将这些信息保存起来。操作方法是:回到“Options”菜单中,选择“Saveoptions”项回车后,屏幕显示:ConfigureFileC:TCTCCONFIG.TC图1-12其中的文件名是TC的配置文件名,所有的配置信息均保存在该文件中。每次启动TC时,系统自动按照配置文件里的设置建立TC的工作环境。要将用户设置信息保存到配置文件TCCONFIG.TC中,只需在出现图12所示信息时,回车并确认即可。6、TurboC集成开发环境命令简介命令名含义Load装入一个已经存在磁盘上的文件Pick将最近编辑过的8个磁盘文件名列表显示,供用户选择New编辑新文件Save将当前编辑的文件以其现有的文件名存盘Writeto将当前编辑的文件以用户指定的文件名存盘Directory显示目录及目录中的文件供用户选择Changedir改变目录OSshell暂时退出TC,回到DOS界面,键入EXIT可返回TCQuit退出TC集成开发环境,返回操作系统界面表1-1(1)File菜单中子菜单名及含义如下:命令名含义命令名CTRL+KB设置块首PgDn向后翻页,光标移到下一屏CTRL+KK设置块尾Home光标移到所在行首CTRL+KV块移动End光标移到所在行尾CTRL+KC块复制CTRL+KY块删除CTRL+T删除光标所在位置的一个词CTRL+KR读文件(块插入)CTRL+Y删除光标所在行CTRL+KW将块写入文件PgUp向前翻页,光标移到上一屏CTRL+P块打印表1-2(2)Eidt菜单中,用户可以按F1键显示全部快捷键命令及含义,这里给出部分部分快捷键命令:命令名含义Run运行当前编辑窗口里的程序Programreset终止当前的调试,释放程序所占存储空间Gotocursor使程序运行到光标处停止Traceinto单步执行程序,可跟踪到函数内部的每一条语句Stepover单步执行程序,但不跟踪到函数内部Userscreen切换到用户屏幕以查看输出结果表1-3(3)Run菜单中子菜单名及含义如下:122 命令名含义CompiletoOBJ将当前窗口中的源程序编译成OBJ文件MakeEXEfile将当前窗口中的修改过的源程序编译并连接成EXE文件Buildall重新编译Project中的文件,并生成EXE文件PrimaryCfile设置主文件名,设置后,编译、运行均对该文件进行,当编译出现错误时,自动将该程序装入编辑窗口供修改(Option/Environment/MessageTracing为Allfile时)Getinto显示当前路径、文件名、文件大小、错误个数等信息表1-4(4)Compile菜单中子菜单名及含义如下:命令名含义Projectname建立一个项目文件Breakmakeon选择在何种类型错误停止MAKE编译或连接前停止Autodependencies当置为ON时,编译将检查.C何.OBJ文件的日期是否更新,若已更新则重新编译,为OFF时,不进行这种检查Clearproject清除项目文件名Removemessage清除Message窗口中的信息表1-5(5)Project菜单中子菜单名及含义如下:命令名含义Complier设置存储模式、硬件配置、调试技术、代码优化等参数Linker设置有关连接程序的选项Environment设置有关环境的选项Saveoption将有关编译、连接的设置信息保存到配置文件TCCONFIG.TC中Retrieveoption装入一个配置文件并按此配置文件设置TC的编译、连接等环境表1-6(6)Options菜单中子菜单名及含义如下:(7)Debug菜单中子菜单名及含义如下:命令名含义Addwatch插入一个监视表达式,使在屏幕下方的监视窗口显示其值Deletewatch从监视窗口中删除当前监视表达式Editwatch在监视窗口中编辑监视表达式Removeallwatch从监视窗口中清除所有监视表达式Togglebreakpoint对光标所在位置设置或清除断点Clearallbreakpoints清除所有断点Viewnextbreakpoint将光标移到下一断点处,移动的顺序按设置顺序进行表1-8命令名含义Evaluate在调试过程中,计算变量、表达式的值并显示其值。用于检查断点处某些变量的值Callstack在调试过程中,用于检查堆栈使用情况Findfunction显示当前程序中某一函数的定义。Refreshdislay当前编辑屏幕被重写时,可用此选项重新恢复表1-7(8)Break/watch菜单中子菜单名及含义如下:需要指出:在上述子菜单中,有很多还有子菜单,对于其中的选项这里没有进行解释,感兴趣的读者可以参看有关TurboC集成开发环境的资料。122 7、TurboC的命令行编译方式TurboC的集成开发环境为用户提供了一个非常有效的C语言程序的开发环境,但是在某些情况下我们不能使用它进行工作,例如:当采用C语言何其它高级语言或汇编语言混合编程时,不能使用集成开发环境,但可以使用TurboC的命令行方式,对程序进行编译,从而得到可执行程序。这里作一个简要介绍。TurboC的命令行编译就是指在DOS状态下,使用TurboC的编译程序TCC.EXE对源程序进行编译的方式,通过执行TCC.EXE程序将用户的源程序生成OBJ或EXE文件。TurboC的命令行方式的格式为:TCC[选项1选项2…选项n]文件名1文件名2…文件名n其中:(1)选项为编译程序或连接程序的可选项。常用的可选项见表9,使用选项时必须在每个选项前冠以“-”并注意其大小写的含义是不同的,各个选项间用空格分隔,文件名是同时进行编译、连接的源文件名、中间代码文件名或库文件名。若省略扩展名,则按默认扩展名.C处理。(2)在没有指出只编译而不连接时,TCC将自动进行连接工作。例如:tcc–ms–eMyfile–Lc:tclib–Ic:tcincludeFile1File2.objgraphics.lib命令含义是:编File1.c并与File2.obj以及graphics.h连接生成小模式存储的可执行文件Myfile.exe。其中:–ms表示使用小模式存储模式。-eMyfile表示连接后可执行文件名为Myfile.exe,注意-e 和Myfile间不空格。-Lc:tclib表示库文件的路径,注意-L 和Myfile间不空格。-Ic:tcinclude表示包含文件的路径,注意-I 和Myfile间不空格。选项含义选项含义-C只编译成.OBJ文件-Lxxx指定库文件的路径(xxx为路径)-f使用浮点仿真-Ixxx指定包含文件的路径(xxx为路径)-B编译带有行内汇编的程序-nxxx指定输出目录(xxx为路径)-S输出一个调用汇编模块的格式-exxx指定执行文件名(xxx为文件名)-ms使用小型存储模式-w显示所有警告错误-d合并重复串-wxxx显示警告信息xxx-mt使用微型存储模式-w-xxx不显示警告错误xxx-180186/80286指令集-Dxxx定义宏-G按时间优化-K缺省字符为无符号型-O优化转移指令-Uxxx取消宏定义-M产生连接映射-oxxx指定目标文件名(xxx为文件名)-r寄存器变量-PPascal调用-y产生行号信息-zxxx设置段名-v源级调试-N堆栈溢出检查-gN出现N个警告信息时,停止编译-Z寄存器优化-jN出现N个错误信息时,停止编译-f878087浮点运算-mh使用巨型模式-iN最大标识符长度N-mm使用中型模式-U外部名下划下划线-mc使用紧缩模式-ml使用大型模式-A禁止非ANSI扩展-Exxx选择汇编器名-C允许注释嵌套-a产生字对齐表1-9File1File2.objgraphics.lib表示源文件名为File1.c,需要进行编译处理得到File1.obj后,再将其与File2.obj和graphics.lib进行连接得到可执行文件。122 第2部分实验实验一TurboC集成环境的熟悉与使用一、实验目的(1)了解实验所用计算机系统以及启动TurboC的方法。(2)了解TurboC环境下编辑、编译、连接、运行程序的基本方法。(3)通过对对示例程序的修改,进一步了解C程序的特点。二、实验内容及步骤1.查找计算机系统中是否已经安装TurobC系统。名称所在文件夹大小类型修改时间tc.exec:tc284KB应用程序88-8-292:00在WINDOWS环境下,通过桌面上开始/查找进入查找窗口,在“名称”栏中输入tc.exe,在“搜索栏”中选择本地硬盘驱动器,再单击“开始查找”按钮,如果所用计算机系统中已经安装TurboC系统,则会显示已经安装的TurboC系统的路径,如下图所示:如果计算机系统中没有安装TurboC系统,则搜索栏中没有文件名和路径名显示。2.启动TurboC集成环境(1)从WINDOWS98环境中启动双击查找窗口中,已经找到的tc.exe文件名即可启动TurboC。(2)从DOS环境中启动通过桌面上开始/程序/MSDOS方式,进入DOS窗口,将tc.exe文件所在目录设定为当前工作目录(假定tc.exe所在文件夹为c:tc)。具体方法是:在提示符后键入CDC:TC↙,再键入TC↙即可启动TurboC集成环境。(3)在WINDOWS98中汉字环境下启动在WINDOWS98中,查找pdos95.bat文件,找到后,选定该文件并单击右键选择“编辑”该文件,在该文件尾部增加一条命令:c:windowscommand.com,存盘后,双击该文件名,则屏幕上显示汉字状态下的DOS窗口。将tc.exe文件所在目录设定为当前工作目录(假定tc.exe所在文件夹为c:tc)。在提示符后键入CDC:TC↙,再键入TC↙即可启动TurboC集成环境。通过这种方式进入TurboC集成环境后,可以通过CTRL+空格或CTRL+SHIFT功能键选择中/英文输入方式,以达到在程序中使用汉字的目的。3.熟悉TurboC集成环境(1)认识TurboC集成环境的各个窗口即编辑窗口(Edit)、信息窗口(Message),找出功能键区。(2)使用F5和F6功能键,观察屏幕窗口发生什么变化,单击F10键选择主菜单行并与↑、↓、←、→、回车键等配合使用,可选择子菜单,或者使用ALT+(主菜单项首字母)并配合使用↑、↓、←、→、回车键,观察菜单变化。(3)通过编辑一个文件来熟悉编辑时常用的键,具体方法是:①通过选择File菜单项建立新文件或打开已有的文件。选择File的子菜单中的New可以进入建立新文件的编辑窗口,选择File的子菜单中的Load可以打开已有的文件。②通过上述方式进入Edit122 窗口后,会发现光标在闪烁,这时就可以进行输入,试着输入下列程序:main(){printf(“Hello,C”);}在输入过程中,请有意地使用↑、↓、←、→、回车键、Del、Backspace、PageUp、PageDown等编辑键和下列组合编辑键:CTRL+Y的作用是删除光标所在的行。CTRL+QF的作用是在当前编辑文件中查找字符串,按下CTRL键不放的同时按下Q键,这时编辑窗口的左上角会出现^Q,再单击F键,编辑窗口出现Find:提示,这时输入需要查找的字符串后回车后出现Option时,再回车即可,如果找到,则光标停在该字符串上,如果没有,则显示红色提示,按ESC键,返回编辑状态,需要注意的是:字符串查找是从当前光标所在位置开始向文件尾部查找,因此,要想从文件头部开始查找,则须将光标移到文件头部后再进行查找操作。CTRL+KB(定义块首)、CTRL+KK(定义块尾)、CTRL+KC(块复制)、CTRL+KV(块移动)、CTRL+Y(块删除)这些组合编辑键在处理多行程序时来得非常方便。例如:要进行多行复制,则可以进行下列操作:定义块首:将光标移到上面程序中{的前面,按下CTRL键不放的同时按下K键后,单击B键,即完成块首的定义。定义块尾:将光标移到上面程序中}的后面,按下CTRL键不放的同时按下K键后,单击K键,即完成块首的定义,这时所定义的块呈反相显示。再将光标移到一空行上,分别按下CTRL+KC、CTRL+KV、CTRL+Y组合编辑键,观察结果。③保存文件操作是通过File菜单中的Save或Write两个子菜单来进行的。前者是将当前编辑的文件内容保存到当前编辑的文件名下,后者是将当前编辑的文件内容保存到新文件名下,操作时应注意提示信息,以免引起不必要的麻烦。(4)编译、连接、运行程序是通过以下功能键或菜单选项来实现的。编译:通过ALT+C或F10选择Compile菜单,然后选择CompiletoOBJ子菜单,回车即对当前文件进行编译,请注意编译后屏幕提示以确定当前程序中是否有错误,若有则使用F5和F6键来查找错误,通过F5将Edit窗口和Message窗口同时显示出来,这时会发现两个窗口中都有反相显示,表明程序中有错误的行和该行所存在的错误性质。使用↑、↓光标移动键,可以将错误行逐行与其错误性质对应显示,以便修改,编译连接还可通过F9功能键来一次完成。连接:通过通过ALT+C或F10选择Compile菜单,然后选择LinkEXEfile子菜单,可以对经编译后并且没有错误的OBJ文件进行连接,得到.exe文件。运行:通过ALT+R或F10选择Run子菜单来达到运行目的,也可通过CTRL+F9来完成运行程序的操作。(5)检查运行结果是通过ALT+F5功能键转换TurboC集成环境和用户屏幕的方式来实现的。若上述程序运行完毕,按下ALT+F5后在用户屏幕上可以看到屏幕上显示Hello,C。实验二数据类型、运算符和表达式一、实验目的1.掌握如何定义不同类型的变量以及变量赋初值的方法。122 2.掌握不同类型数据间赋值规律并通过小程序来进行检验。3.熟悉C语言表达式的书写方式和表达式类型的变化规律。二、实验内容即步骤1.输入下面的程序main(){printf(“Hello,c”);printf(“Ilikeyou”);}运行后检查结果。再将其中的printf(“Hello,C);改为printf(“Hello,Cn”);并加注释行/*commentline*/运行并检查结果。比较两次运行的结果有什么不同并观察第二次运行后结果中是否有注释行的内容。分析原因。2.运行下面的程序main(){charc=’a’;printf(“Hello,c”);printf(“%cn”,c);printf(“%dn”,c);}检查运行结果,分析为什么后面两行输出的变量名一样而输出结果不一样。进一步,将%d改为%x、%o,再运行程序比较结果并分析原因。3.运行下面的程序main(){chari=-1;intp;p=123;p=i;printf(“Hello,c”);printf(“p=%un”,p);}变量p的输出结果为65535,分析为什么不是123或–1。再将p=123;和p=i;改为p=0oxff61;和i=p;,将printf(“p=%un”,p);改为printf(“p=%cn”,i);,运行并分析结果。4.运行下面的程序main(){chari=-1;intp;i*=-3;p=10*(i+2)/255;printf(“p=%dn”,p);printf(“Hello,c”);122 }先分析程序并判断输出结果,再运行程序检查结果是否与判断的结果相同,若不同试分析原因。5.运行下面的程序main(){intp;p=1;p++;printf(“p=%dn”,p);printf(“p=%dn”,p,p++);}先分析程序并判断输出结果,再运行程序检查结果是否与判断的结果相同,若不同试分析原因。6.运行下面的程序main(){intp,q=2;p=1,(q+2);printf(“Hello,c”);printf(“p=%dn”,p);}先分析程序并判断输出结果,再运行程序检查结果是否与判断的结果相同,若不同试分析原因。再将p=1,(q+2);改为p=(1,(q+2)),再运行后分析结果。7.运行下面的程序main(){chari=‘+’;i<<=1;printf(“i=%cn”,i);}先分析程序并判断输出结果,再运行程序检查结果是否与判断的结果相同,若不同试分析原因。8.运行下面的程序main(){inti=0xfb12,p=0xf;i=i∧pprintf(“i=%dn”,i);}先分析程序并判断输出结果,再运行程序检查结果是否与判断的结果相同,若不同试分析原因。9.运行下面的程序main()122 {chari=-3;intp;p=(int)(i+1);printf(“p=%d%un”,i,p);}先分析程序并判断输出结果,再运行程序检查结果是否与判断的结果相同,若不同试分析原因。10.运行下面的程序main(){intp;p=sizeof(“”3\n’”);printf(“p=%dn”,p);}先分析程序并判断输出结果,再运行程序检查结果是否与判断的结果相同,若不同试分析原因。实验三顺序程序设计一.实验目的:1.掌握赋值语句的使用。2.掌握数据的输入输出方法,能正确使用各种格式转换符。二.实验内容及步骤:1.运行下面的程序,分析输出结果。(1)main(){inti=45;printf(²n(1)i=%d,%u,%ld²,i,i,i);printf(²n(2)i=|%+8d|%2d|%-8d|%08d|²,i,i,i);}将i的值改成-45,重新运行。(2)main(){unsignedk=200;printf(²n(1)k=%d,%u,%ld²,k,k,k);printf(²n(2)k=|%+10u|%-10o|%10x|²,k,k,k);}将k的值改成50000,重新运行。(3)main(){longa=178L;printf(²n(1)a=%ld,(0)%lo,(0x)%lx²,a,a,a);printf(²n(2)a=|%8ld|(0)%-8lo|(0x)%08lx|²,a,a,a);}122 (4)main(){floatx=12.374;printf(²n(1)x=%f,%e,%g²,x,x,x);printf(²n(2)x=|%12f|%12.2f|%.0f|²,x,x,x);}将x的值改成6.72e-7,并将第二条输出语句改为printf(²n(2)x=|%12e|%12.2e|%.1e|²,y,y,y);然后重新运行。(4)main(){charch=¢E¢;intm=65;printf(²n(1)ch1=%c,%d²,ch,ch1);printf(²n(2)m=%d,%c²,m,n);}将m的值依次改成180、400,然后重新运行。(5)main(){printf(²n%s²,²abcdefg²);}将%s依次改成%-10s、%10.2s、%.4s,然后重新运行。2.输入以下程序:main(){intm;floatx;printf(²n请输入数据:²);scanf(²%d%f²,&m,&x);printf(²nm=%d,x=%f”);}(1)运行程序,输入10↙20↙或者输入1020↙或者输入10.0↙20.0↙(2)将输入语句改为scanf(²%3d%4f²,&m,&x);,运行程序输入1345.7↙或者输入234567↙观察输出结果,并分析原因。3.输入以下程序:main(){inti;charc1,c2,c3;scanf(²%c²,&c1);scanf(²%c²,&c2);scanf(²%c²,&c3);printf(²%c²,c1);printf(²%c²,c2);printf(²%c²,c1);}(1)运行程序,输入abc↙(2)运行程序,输入a↙b↙c↙(3)在每个scanf语句后面加上语句:getchar();运行程序,输入a↙b↙c↙122 (4)在源程序的基础上,将scanf语句的%c前面加一空格,即改为:scanf("%c",¼);运行程序,输入a↙b↙c↙或输入abc↙观察程序的执行结果,并分析原因。4.编制一程序,用getchar函数输入字符,然后用putchar函数输出字符,同时要求输出字符的ASCII码。分别考虑用int和char型变量来接收键盘输入的字符,分析两者是否等价?5.输入x的值,据下面的多项表达式求y的值:y=x5+12x4-7.3x3-x2+2x-4实验四选择结构程序设计一、实验目的1.学会使用关系表达式及逻辑表达式。2.学会使用条件表达式。3.熟练地运用if语句的不同格式编写程序。4.掌握switch语句的编程方法。5.学会使用if-goto实现循环。6.掌握求和、求积的算法。二、实验内容及步骤1.下面是一个计算分段函数的程序,对x的各种取值进行运算后,找出程序中的错误并改正。1当x>0时y=0当x=0时-1当x<0时程序如下:main(){floatx;inty;scanf("%f",&x);if(x<0)y=-1;if(x=0)y=0;elsey=1;printf("x=%f,y=%dn",x,y);}2.从键盘上输入三个数,用条件表达式编程找出最大数和最小数。3.分别利用if语句的不同格式和switch语句编程,计算下面的分段函数。4x-8(-1≤x<0)y=3x2+10x-1(0≤x<1)8x3-3x2+2x-1(1≤x<2)4.水果店有苹果,一级5.50元/kg,二级4.20元/kg,三级3.00元/kg,四级122 2.50/kg,输入苹果的等级、数量以及顾客的付款数,显示出苹果的等级、数量、应付款数以及找给顾客的钱数。5.编写一个求二次方程ax2+bx+c=0根的程序。要求考虑以下几种情况:(1)a=0不是二次方程的根。(2)b2-4ac=0有两相等的实根。(3)b2-4ac>0有两个不相等的实根。(4)b2-4ac=0有两个不相等的共轭复根。(5)一次输入5组数据,输出5个方程的根。实验五循环结构程序设计一、实验目的1.熟练地运用while、do-while、for语句实现循环结构的编程方法。2.通过实验进一步了解三种实现循环语句之间的异同点。3.掌握求最大数、最小数、递推、迭代以及枚举等算法。二、实验内容及步骤1.下面是求12+22+……+1002的程序main(){inti,sum;for(i=1;i<101;i++){i*=i;sum+=i;}printf("sum=%dn",sum);}(1)运行程序观察结果,若有错则改正。(2)用while循环结构编此程序。2.任意一个一位数每次加7,消去十位数可得十个不同得数字,编程序显示这10个不同得数字。3.求3.若口袋里有12个球,其中3个红球,3个白球,6个黑球,从中任取8个球,有多少不同得取法。4.“百马百瓦问题”:有100匹马驮100块瓦,大马驮3块,小马驮2块,两个马驹驮1块,求大马、小马、马驹各有多少。5.用循环语句编程序,显示下列图案*****************实验六数组122 一、实验目的1.掌握数组的定义和数组元素的引用。2.掌握数值型数组的赋初值、输入和输出。3.掌握字符型数组的赋初值以及字符串的输入和输出。4.掌握常用字符串函数的应用。5.掌握比较、选择和冒泡等排序方法。二、实验内容及步骤1.下面程序是统计20个整数中非负整数的个数以及计算非负整数之和,请将程序补充完整。#includemain(){inti,s,count,______;s=count=0;for(i=0;i<20;i++)scanf("%d",_____);for(i=0;i<20;i++){if(a[i]<0)_________s+=a[i];count++;}printf("s=%dtcount=%dn",s,count);}2.从键盘上任意输入一个字符串,显示出其长度。(不得使用strlen函数)3.输入m*n个数(m、n均小于20),组成m行n列的数组,求出其中最大的元素,并输出它在数组中的位置.4.若一个从小到大排列的序列中有10个数,现要插入5个数,使插入后的序列仍保持升序排列。5.有10名运动员参加400米跑的编号和成绩如下:编号T404T356T804T424T570T723T729T413T586T519成绩44.644.244.543.744.744.945.145.744.845.3编写程序,按成绩从优到劣的次序输出编号和成绩。实验七函数一、实验目的1.掌握函数的定义方法。2.掌握通过实参和形参在函数间进行“值传送”的编程方法。3.掌握函数嵌套调用和函数的递归调用。4.掌握全局变量和局部变量、动态变量和静态变量的定义和使用方法,以及编程时的差别。5.了解宏定义、带参宏和文件包含处理的方法。二、实验内容及步骤1.下面是判断一个数是否是素数的程序,若是显示“yes",若不是则显示“no”122 ,请补充完整并上机验证。main(){intx;scanf("%d",______);if(prime(x))________else__________;}prime(inta){inte,i=2,y=1;e=a/2;while((i<=e)_________)if(a%______==0)y=0;elsei++;_______________;}2.有键盘输入a,b,c的值,写一函数计算:3.计算下面的级数(1)用递推方式写出求xn和n!的函数,采用嵌套调用函数的方法编程。(2)用递归方法写出求xn和n!的函数,编程计算。4.编写一函数,统计字符串中字母、数字、空格和其它字符的个数,在主函数中输入字符串以及输出统计结果。实验八指针一、实验目的1.正确地定义和使用指针变量。2.掌握数组的指针以及指向数组的指针变量的应用。3.正确使用字符串的指针以及指向字符串的指针变量的应用。4.掌握指针数组的应用。5.掌握函数指针的使用方法。二、实验内容及步骤1.观察下面程序的执行结果main(){inti,j,*p[4],a[12]={1,2,3,4,5,6,7,8,9,10,11,12};p[0]=&a[0];p[1]=&a[3];p[2]=&a[6];p[3]=&a[9];122 for(i=0;i<4;i++){for(j=0;j<3;j++)printf("%4d",p[i][j]);printf("n");}}1.下面是删除字符串中相同字符(相同字符仅保留一个)的程序,将程序补充完整。#include#includemain(){charstr[80],*p=str;inti,j,k,n;_____________;n=strlen(str);for(i=0;istruncA{intm;floatx;charch[8];};unionB{intm;floatx;charch[8];}date;main(){inti;printf(“nA:%d”,sizeof(structA));printf(“nB:%d”,sizeof(structA));printf(“n请输入4个字符:”);for(i=0;i<4;i++)scanf(“%c”,&date.ch[i]);printf(“nm:%d”,date.m);printf(“nx:%f”,date.x);}实验十文件一.目的要求:1.掌握文件、文件指针的概念;2.学会使用文件打开、关闭、读、写等文件操作函数;二.实验内容122 1.文件的建立、修改,每次运行后查看文件内容。(1)从键盘输入一行字符存入文件file1中。(2)将file1中数据排序后重新放入文件file1中。(3)将一从键盘输入的字符插入到文件file1中。2.建立存放角度为0°~360°(每隔1°)的正弦函数值的文件;然后通过查找文件,求出角度x(整型)的正弦函数值。(1)要求以文本文件存放,两列形式。第一列为角度值,第二列为对应的正弦函数值。(2)要求以二进制文件存放。3.利用fputc函数写一函数myputw(w,fp)将整数w写入fp所指文件中;利用fgetc函数写一函数mygetw(fp)从fp所所指文件中读出一整数。然后编程利用myputw()将一整数写入文件中,再用mygetw()从文件中读出。第三部分教材习题解答122 第1章C语言程序设计基础知识习题一、单选题1.一个二进制数位也称为一个()。A.bitB.byteC.KBD.word2.存储容量1KB等于()。A.23字节B.210字节C.220字节D.230字节3.内存中每个基本单元都有唯一的序号,这个序号称为()。A.地址B.字节C.代码D.字4.与十进制39等值的二进制数是()。A.00100111B.01001001C.10100111D.010110005.下面数据中最大数是()。A.(1010001.101)2B.(121.3)8C.(97.6)10D.(51.5)166.以十六个二进制位表示–123,其补码是()。A.(1111111110010101)2B.(177606)8C.(ff86)16D.(FF85)167.(FFFF)16是一个数的补码表示,该数的值是()。A.-1B.32767C.-32767D.655368.(11111110)补和(00000001)补相加后,其结果所表示的十进制数是()。A.-1B.1C.0D.2559.计算机对编译型高级语言的执行方式是()。A.逐条语句边解释边执行,即解释一条就执行一条。B.将整个程序编译完成后再执行,不生成目标程序。C.将源程序编译成目标程序,生成并保留目标程序,连接后执行。D.将源程序解释完毕后再执行。10.计算机对解释型高级语言的执行方式是()。A.逐条语句边解释边执行,即解释一条就执行一条。B.将整个程序编译完成后再执行,不生成目标程序。C.将源程序编译成目标程序,生成并保留目标程序然后执行。D.将源程序解释完毕后再执行。二、填空题1.用高级语言编写的程序要变成目标程序,必须经过()程序处理。2.负整数在计算机中通常是以()码形式存储的。122 3.在计算机中,应用最普遍的字符编码是()编码。4.在计算机中,常用()个二进制数位表示一个字符。5.现有二进制数(11111111)2,若它是一个十进制数的原码,则该十进制数是()6.现有二进制数(11111111)2,若它是一个十进制数的补码,则该十进制数是()7.现有二进制数(01111010)2,若它是一个字符,则该字符是()8.国标汉字编码规定用连续的()个二进制位来表示一个汉字9.在连续的八位二进制位中,用补码表示法表示数据,其表示范围是()10.TurboC中规定标识符的长度不超过()字符。一、简答题1.简述机器语言、汇编语言和高级语言各自的特点。2.简述一个算法的基本特点。3.简述结构划程序设计三种基本结构的共同特点。4.简述C语言的基本结构。5.简述在C语言中定义用户标识符的规则和应注意的事项。附加题一、单选题1.下面哪种设备是输出设备()A.扫描仪B.键盘C.鼠标D.显示器2.微机中的主存储器一般由()组成。A.CD-ROM和RAMB.硬盘和RAMC.ROM和RAMD.硬盘和CD_ROM3..DOS是()的操作系统。A..单用户、单任务B.单用户、多任务C..多用户、单任务D.多用户、多任务4.Windows是()的操作系统。A..单用户、单任务B.单用户、多任务C..多用户、单任务D.多用户、多任务5,热启动就是同时按下()键。A.Ctrl+Alt+DelB.Shift+Alt+DelC.Ctrl+Alt+InsD.Shift+Alt+Ins6.通常3.5英寸的软盘其容量为()122 A.360KBB.720KBC.1.2MBD.1.44MB7.计算机对下列几种存储器中,访问速度最快的是()A.内存储器B.CD-ROMC.软盘D.硬盘8.断电后会使存储器失去信息的是()A.RAMB.CD-ROMC.ROMD.硬盘9.一个完整的计算机系统应包括()A.主机和外设B.主机和操作系统C.硬件系统和系统软件D.硬件系统和软件系统10.DOS的内部命令是()A.在CPU中固有的命令B.在ROM中固有的命令C.包含在conmmand.com中的命令D.在磁盘上的特定文件二、填空题1.DOS操作系统的内部命令都包含在()文件中。2.DOS对磁盘文件的管理是采用()结构的目录。3.要使二级及二级以下目录回到其上一级目录,通常使用的DOS命令是()4.写出将当前路径下名为MY.TXT的文件更名为MY.C的操作命令C:>()5.若当前盘为C,写出按页显示A盘根目录TC子目录下扩展名为C的操作命令C:>()6.若当前盘为C,在C盘根目录DOS子目录下带有常用的外部命令,写出对A盘格式化并传送系统的操作命令C:>()7.汉字编码一般是用()个字节表示一个汉字。8.二进制加法计算:1110.01+110.101=()9.一个完整的文件标识符应由[盘符]、()、[文件名]、[扩展名]组成。10.若内存的地址从十六进制0000到十六进制FFFF,则该机内存的容量为()KB.三、简答题1.冯。若依曼提出的计算机体系结构的设计思想是什么?2.简述计算机系统的组成。3.计算机存储器分为哪两大类?指出它们之间的异同点。4.简述一般操作系统的作用和功能?5.简述MS-DOS的内部命令和外部命令。习题答案一、1.A2.B3.A4.A5.C6.D7.A8.A9.C10.A二、1.编译2.补码3.ASCII4.85.2556.–17.z8.169.–128到12710.32122 三、略附加题答案一、1.D2.C3.A4.B5.A6.D7.A8.A9.D10.二、1.COMMAND.COM2.树型或层次型3.CD..4.RENMY.TXTMY.C5.DIRA:TC*.C/P6.DOSFORMATA:/S或DOSFORMATA:/S或C:DOSFORMATA:/S7.28.10100.1119.路径10.64三、略第2章基本数据类型及其运算习题一、单选题1.在有字符型、整型、实型常数的表达式运算中,其最后结果的类型是()A.Char型B.long型C.float型D.double型2.字符串"Iamstudent"在内存中占用的字节数是()A.12个B.13个C.14个D.15个3.TurboC2.0中,若定义unsignedlongb,则变量b在内存中分配的字节数是()A.1个B.2个C.4个D.8个4.下面表达式结果为3的是()A.(-7)%4B.(-7.0)%4.0C.7%(-4)D.7.0%4.05.若有inta,b;下面正确的表达式是()A.7.0%3.0B.(a+b)++C.7++D.a+"a"6.设有inta=4,b=-7;表达式(int)(a+b)/2.0+a/b的值是()A.4B.-7C.-1D.-1.57.设有inta=2,表达式(a<<=2/a)>>1的值是()A.1B.2C.4D.88.设有inta=3,a+=a-=a*a的值是()A.18B.9C.-12D.39.设有inta=3,b=-4,c=5;表达式a++-c+(++b)的值是()122 A.-7B.-5C.-4D.-310.运算符++、*、>>、=、,、sizeof的优先级由高到低排序值是()A.++、*、>>、=、,、sizeofB.*、++、>>、=、,、sizeofC.++、*、sizeof、=、,、>>D.sizeof、++、*、>>、=、,二、填空题1.C语言的标识符必须以()开头。2.字符常量是由()括起来的字符。3.C语言中“转义字符”是以符号()开头。4.字符变量中存放的是字符所对应的()编码值。5.在定义变量的同时给变量赋予初值,称为变量的()6.字符串"ab45\x66"的长度是()。7.代数表达式的C语言算术表达式是()。8.代数表达式||的C语言算术表达式是()。9.代数表达式的C语言算术表达式是()。10.代数表达式的C语言算术表达式是()。三、简答题1.下列那些是C语言中的合法常量。010181950xhh0xff21‘ff’e5-0.e51.0e0.5“123”‘ff1’2.下列那些是C语言中的合法标识符。9xy_year_123ABCπepiintint_file.c3.简述在C语言中字符与字符串的区别。4.在C语言中为什么变量要“先定义,后使用”。5.简述C语言中各种类型数据间运算的类型转换规则是什么?附加题一、单选题1.下面转义字符中,表示字符串结束的是()A.B.nC.rD.f2.下面几种运算符中,优先级最低的是()A.||B.,C.=D.?:122 3.设有inta=3,b=-4,c=5;表达式a=b=c=6+3/5的值是()A.3B.4C.6D.6.64.设有inta=3,b=-4,c=5;表达式(a+b,b*c,a+=b+4)的值是()A.-1B.-20C.0D.35.设有inta=3;表达式a=a*=a*=a的值是()A.3B.9C.81D.1626.设有inta=3,b=-4,c=5;表达式b%=a+b+c-1/10的值是()A.7.5B.0.5C.4D.-47.设有inta=3;表达式a%=a+=(a*=a)/3的值是()A.0B.3C.9D.128.TurboC2.0中,unsingned型数的取值范围是()A.-215∽(215-1)B.-231∽(231-1)C.0∽(216-1)D.0∽(232-1)9.退出TurboC2.0返回系统,在主菜单File项中可选择()A.LoadB.NewC.SaveD.Quit10.在TurboC2.0中,在主菜单File项中选择OsShell后,要重新回到TurboC2.0,应使用命令()A.ReturnB.ExitC.QuitD.Nwe二、填空题1.表达式10%3的结果是()。2.C语言中大小写字母被认为是()的字符。3.对符号常量进行定义的命令是()。4."x"在存储时占用()个字节。5.实型数据与整型数据进行算术运算,其结果是()型。6.八进制整型常量必须以()开头。7.整型常量后加U,则表示该数为()整型常量。8.将一个unsignedchar型变量赋值给long型变量时,long型变量的高位要充()。9.“―”作为单目运算符时比它作为双目运算符时的优先级别()。10.整型变量a的值为1,语句a<<1;执行后,变量a的值为()。三、简答题1.简述定义变量时要注意的事项。2.简述TurboC中符号扩展的规则。3.简述本章中所学到的各种数据类型及其长度、格式、取值范围。习题答案一、单选题1.D2.B3.C4.C5.D6.D7.B8.-129.B10.B二、填空题1.字母或下划线2.单引号或""3.4.ASCII5.初始化6.57.sqrt((sin(30*3.14/180)+1)*(sin(30*3.14/180)+1)/cos(30*3.14/180));8.fabs(1-pow(x,3.6));122 9.(exp(1.2)+exp(-1.2))/2.0;10.cos(30*3.14/180)/sin(30*3.14/180)+log(7)/log(2);三、简答题1.01、195、0xff21、"ff"、-0.e5、"123"2.year、123、ABC、e、pi、int_3.字符是用单引号括起来的一个字符,其长度为1,而字符串是用双引号括起来的多个字符且在其尾部有一个空字符‘’,其长度为字符个数加1。4.因为在C语言中,定义变量即通知系统按变量的类型分配一个单元,并建立意义对应的关系,以后程序中引用该变量名即引用该变量对应单元的内容。如果一个变量没有定义而被引用,由于系统没有为该变量分配内存单元,故对其引用是无意义的。所以要“先定义,后使用”。5.相同类型数据间的运算,其结果的类型不变。不同类型数据间的运算,其结果类型变化如图2-11所示。附加题解答一、单选题1.A2.B3.C4.D5.C6.A7.A8.C9.D10.B二、填空题1.12.不同3.#define4.25.double6.07.无符号8.09.高10.2三、简答题略第3章顺序结构程序设计习题一、单选题1.下面选项中不是语句。A.;B.x=a+b/c;C.a=5,b=4,c=a+b;D.printf(²nthisisasentence!²)2.可用格式说明%d输出一个数据。A.int型B.long型C.值为50000的unsigned型D.float型3.对于int型非负数据不可采用格式说明符输出。A.%xB.%dC.%ldD.%u4.若有char型变量ch=¢a¢,则下面的输出语句在编译或运行中会产生错误。A.printf(²n%d²,ch);B.putchar(ch);C.printf(²n%c²,ch);D.printf(²n%e²,ch);二、填空题1.在C语言中没有专门的输入输出语句,程序中的数据的输入输出都是通过来完成的。2.C语言中最简单的语句为。122 3.C语言程序中,只有函数和函数可以不加任何说明直接使用。4.若有赋值语句x=x+3;,则其含义为。三、阅读题1.若下面程序运行时输入为:001245.78392,试写出运行结果。main(){inta;floatx;charch;scanf(²%4d%5f%2c²,&a,x,ch);printf(²na=%dnx=%fnch=%c²,a,x,ch);}2.执行下面的程序时,为使变量m=12,n=9,x=9.34,y=17.2,c1=¢b¢,c2=¢G¢,请写出正确的输入方式。main(){intm,n;floatx,y;charc1,c2;scanf(²m=%d,n=%d²,&m,&n);scanf(²%f%f²,&x,&y);scanf(²%c,%c²,&c1,&c2);printf(²nm=%d,n=%dnx=%f,y=%enc1=%c,c2=%c²,m,n,x,y,c1,c2);}3.试写出下面程序的运行结果。main(){intm=10;unsignedu=42315;longk=600000;floatx=34.5;doubley=76.1;chara=¢0¢,b=¢a¢,c=¢A¢;printf(²nintm=%d,%-10d,%6o²,m,m,m);printf(²nunsignedu=%u,%10d,%x²,u,u,u);printf(²nlongk=%3ld,%15d²,k,k);printf(²nfloatx=%f,%e,%g²,x,x,x);printf(²ndoubley=%10.3f,%4.1e²,y,y);printf(²nchara=¢%c¢,b=%-5c,c=%d²,a,b,c);printf(²n%s,%-7s,%9.3s²,²string²,²abcd²,²1234567890²);}4.试写出下面程序的运行结果。main(){inta=4,b=9,c;122 printf(²na=%-8db=%-8d²,a,b);c=a;a=b;b=c;printf(²na=%-8db=%-8d²,a,b);}四、编程题1.已知三角形的两条边a、b及其夹角a,求第三边c及其面积s。2.输入x的值,据下面的多项表达式求y的值:y=x5+12x4-7.3x3-x2+2x-43.输入一个三位正整数,然后逆序输出。如输入为123,则输出为321。4.编写程序,用1分、2分、5分的硬币凑成300元以下的钱数,要求硬币的数目最少。附加题一.单选题1.利用scanf函数输入整型时,键入的内容应是相同类型的。A.常数B.常量表达式C.变量D.含变量的表达式2.若有scanf(²%d²,&ch);现在想将字符¢A¢输入给字符变量ch。输入数据时,键入的内容是,才不会导致读入错误。A.AB.65C.101D.413.若有charch;利用getchar(ch);语句将字符¢A¢输入给变量ch,则输入方式是正确的。A.A↙B.65↙C.41↙D.101↙4.若有intm;doublex;利用scanf(²%d%lf²,&m,&x);语句,则输入方式是正确的。A.10,20↙B.1020.0↙C.10.020↙D.10.020.00↙5.是C语言中的正确的赋值语句。A.i++;B.x=4,y=1;C.x=4*y=2;D.x=floatm;6.若变量已正确说明为float类型,要通过语句scanf(²%f%f%f²,&a,&b,&c);给a赋于10.0,b赋予20.0,c赋予30.0,不正确的输入形式是。A.10↙B.10.0,20.0,30.0↙20↙30↙C.10.0↙D.1020↙20.030.0↙30↙7.若有以下定义和语句:intu=010,v=0x10,w=10;printf(²%d,%d,%dn²,u,v,w);122 则输出结果是。A.8,16,10B.10,10,10C.8,8,10D.8,10,108.若有以下定义和语句charc1=¢b¢,c2=¢e¢;printf(²%d,%cn²,c2-c1,c2+¢a¢-A);则输出结果是。A.2,MB.3,EC.2,ED.输出项与对应的格式控制不一致,输出结果不确定9.若有定义:intx,y;chara,b,c;并有以下输入数据:12ABC则能给x赋整数1,给y赋整数2,给a赋字符¢A¢,给b赋字符¢B¢,给c赋字符¢C¢的正确程序段是。A.scanf(²x=%dy%d²,&x,&y);a=getchar();b=getchar();c=getchar();B.scanf(²%d%d²,&x,&y);a=getchar();b=getchar();c=getchar();C.scanf(²%d%d%c%c%c²,&x,&y,&a,&b,&c);D.scanf(²%d%d%c%c%c%c%c%c²,&x,&y,&a,&a,&b,&b,&c,&c);10.设i是int型变量,f是float型变量,用下面的语句给这两个变量输入值:scanf(²i=%d,f=%f²,&i,&f);为了把100和765.12分别赋给i和f,则正确的输入为。A.100,765.12B.i=100,f=765.12C.100765.12D.i=100f=765.1211.以下叙述中正确的是。A.输入项可以是一个实型常量,如:scanf(²%f²,3.5);B.只有格式控制,没有输入项,也能正确输入数据到内存,如:scanf(²a=%d,b=%d²);C.当输入一个实型数据时,格式控制部分可以规定小数点后的位数,如:scanf(²%4.2f²,&d);D.当输入数据时,必须指明变量地址,如:scanf(²%f²,&f);二.填空题1.以下程序的输出结果是。main(){inta=5,b=9;a=a+b;b=a-b;a=a-b;printf(²%d,%dn²,a,b);}2.下列程序的输出结果是12.00,请填空。main(){inta=9,b=2;floatx=,y=1.1,z;122 z=a/2+b*x/y+1/2;printf(²%5.2fn²,z);}3.下列程序执行后的输出结果是(小数点后只写一位)。main(){doubled;floatf;longl;inti;i=f=l=d=20/3;printf(²n%d%ld%f%f²,i,l,f,d);}4.请读程序:#includemain(){inta;floatb,c;scanf(²%2d%3f%4f²,&a,&b,&c);printf(²na=%d,b=%f,c=%fn²,a,b,c);}若运行时从键盘上输入9876543210,则上面程序的输出结果是。5.若想通过以下输入语句使a=5.0,b=4,c=3,则输入数据的形式应该是_______。intb,c;floata;scanf(²%f,%d,c=%d²,&a,&b,&c);6.若有定义intm=98;,则语句printf(²n|%-5d|,|%05d|,|%-05d²,m,m,m);的输出为。三.阅读题1.试写出下面程序的运行结果。main(){inti=178,j=-34;printf(²n(1)i=%d,%u,%ld²,i,i,i);printf(²n(2)i=|%+8d|%2d|%-8d|%08d|²,i,i,i);printf(²n(3)j=%d,%u,%ld²,j,j,j);printf(²n(4)j=|%8d|%2d|%08d|²,j,j,j);}2.试写出下面程序的运行结果。main(){unsignedk=178,n=65502;printf(²n(1)k=%d,%u,%ld²,k,k,k);printf(²n(2)k=|%+10u|%-10o|%10x|²,k,k,k);printf(²n(3)n=%d,%u,%ld²,n,n,n);}3.试写出下面程序的运行结果。main(){longa=178L;printf(²n(1)a=%ld,(0)%lo,(0x)%lx²,a,a,a);printf(²n(2)a=|%8ld|(0)%-8lo|(0x)%08lx|²,a,a,a);}122 4.试写出下面程序的运行结果。main(){floatx=12.374,y=6.72e-7;printf(²n(1)x=%f,%e,%g²,x,x,x);printf(²n(2)x=|%12f|%12.2f|%.0f|²,x,x,x);printf(²n(3)y=%f,%e,%g²,y,y,y);printf(²n(4)y=|%12e|%12.2e|%.1e|²,y,y,y);}5.试写出下面程序的运行结果。main(){charch1=¢E¢,ch2=¢8¢;printf(²n(1)ch1=%c,(ASCII)%d:(0)%o:(0x)%x²,ch1,ch1,ch1,ch1);ch1=ch1-¢A¢+¢a¢;printf(²n(2)%c,(ASCII)%d²,ch1,ch1);printf(²n(3)ch2=%c,(ASCII)%d²,ch2,ch2);printf(²n(4)%d,%c²,ch2-¢0¢,ch2+1);}6.试写出下面程序的运行结果。main(){printf(²n(1)|%s|%10s|%-10s|²,²12345²,²12345²,²12345²);printf(²n(2)|%10.2s|%.3s|²,²12345²,²12345²);}四.编程题1.已知圆锥体的底部圆的半径和锥体的高度,求其体积。2.输入一个实数,分别输出其整数部分和小数部分。如输入76.35,输出为76和0.35。3.输入一个四位正整数,然后分别显示其千位数、百位数、十位数和个位数及其每位数字对应的ASCII码。如若输入为7592,则要求输出为:7592555357504.按年率r%存入本钱A,n年末本利合计为T=A*((100+r)/100)n,试编写一程序,输入A、r和n的值,输出T的值。5.输入一小写英文字母,首先输出它及其ASCII码,然后输出其对应的大写字母及其ASCII码。6.编程将单词“GOOD”转换成“good”。要求采用getchar()、putchar()函数。习题答案一、单选题1.D2.A3.C4.D二、填空题1.输入输出函数2.;3.printf(),scanf()4.将x原来的值加上3以后重新赋给变量x122 三.、阅读题1.a=98x=45.78c=92.m=12,n=99.3417.2b,G或m=12,n=99.3417.2b,G3.intm=10,10,12unsignedu=42315,-23221,a54blongk=600000,10176floatx=34.500000,3.45000e+01,34.5doubley=76.100,8e+01chara=¢0¢,b=a,c=65string,abcd,1234.a=4b=9a=9b=4四、编程题1.#include#definePI3.14159main(){floata,b,c,alfa,p,area;printf(²n请输入三角形的两条边的边长及夹角:²);scanf(²%f%f%f²,&a,&b,&alfa);c=sqrt(a*a+b*b-2*a*b*cos(alfa*PI/180));p=(a+b+c)/2;area=sqrt(p*(p-a)*(p-b)*(p-c));printf(²n该三角形的第三条边边长为:%6.1f²,c);printf(²n该三角形的面积为:%6.2f²,area);}2.#includemain(){floatx,y;printf(²n请输入x的值:²);scanf(²%f²,&x);y=((((3.0/4*x+12)*x-7.5)*x-8.0/3)*x+2)*x-4;printf(²n多项式的值为:%f²,y);}或者/*3.4.2.2y=3/4*x**5+12*x**4-7.5*x**3-8/3*x**2+2*x-4*/122 #includemain(){floatx,y;printf(²n请输入x的值:²);scanf(²%f²,&x);y=3.0/4*pow(x,5)+12*pow(x,4)-7.5*pow(x,3)-8.0/3*x*x+2*x-4;printf(²n多项式的值为:%f²,y);}3.main(){intm,a,b,c,n;printf(²n请输入一个三位正整数:²);scanf(²%d²,&m);a=m/100;b=m%100/10;c=m%10;n=c*100+b*10+a;printf(²n逆序的整数为:%d²,n);}或者/*3431123---->321*/main(){inta,b,c;printf(²n请输入一个三位正整数:²);scanf(²%c%c%c²,&a,&b,&c);printf(²n逆序的整数为:%c%c%c²,c,b,a);}4.main(){intm,num1,num2,num5;floatx;printf(²n请输入钱的数目:²);scanf(²%f²,&x);m=(int)(x*100);num5=m/5;m=m%5;num2=m/2;m=m%2;num1=m;printf(²n最少的硬币数为:²);printf(²n需要1分硬币%d个,2分硬币%d个,5分硬币%d个²,num1,num2,num5);}附加题答案122 一、单选题1.A2.B3.A4.B5.C6.B7.A8.B9.D10.B11.D二、填空题1.9,52.4.43.666.0000006.0000004.a=98,b=765.000000,c=4321.0000005.5.0,4,c=36.|98|,|00098|,|98|三、阅读题1.(1)i=178,178,92930226(2)i=|+178|178|178|00000178|(3)j=-34,65502,92995550(4)j=|-34|-34|-0000034|2.(1)k=178,178,91488434(2)k=|+178|262|b2|(3)n=-34,65502,915537583.(1)a=178,(0)262,(0x)b2(2)a=|178|(0)262|(0x)000000b2|4.(1)x=12.374000,1.23740e+01,12.374(2)x=|12.374000|12.37|12|(3)y=0.000001,6.72000e-07,6.72e-07(4)y=|6.72000e-07|6.7e-07|7e-07|5.(1)ch1=E,(ASCII)69:(0)105:(0x)45(2)e,(ASCII)101(3)ch2=8,(ASCII)56(4)8,96.(1)12345|12345|12345|(2)|12|123|四、编程题1.main(){floatr,h,v;printf(²n请输入圆锥体的底部圆的半径和锥体的高度:²);scanf(²%f%f²,&r,&h);v=1.0/3*3.14*r*r*h;printf(²n圆锥体的体积为:%f²,v);}2.122 main(){intm,a,b,c,d;printf(²n请输入一个四位正整数:²)scanf(²%d²,&m);a=m/1000;m=m%1000;b=m/100;m=m%100;c=m/10;m=m%10;d=mprintf(²n%8d%8d%8d%8d²,a,b,c,d);printf(²n%8d%8d%8d%8d²,a+¢0¢,b+¢0¢,c+¢0¢,d+¢0¢);}3.#includemain(){intn;floata,r,t;printf(²n请输入本钱(元)和年利率:²);scanf(²%f%f²,&a,&r);printf(²请输入存储年数:²);scanf(²%d²,&n);t=a*pow((100+r)/100,n);printf(²nt=%.2f²,t);}4.main(){charch;printf(²n请输入一个小写英文字母:²);scanf(²%c²,&ch);printf(²n%5c%5d²,ch,ch);ch-=¢a¢-¢A¢;printf(²n%5c%5d²,ch,ch);}5.#includemain(){charch1,ch2,ch3,ch4;intm=¢a¢-¢A¢;printf(²n请输入英文单词(GOOD)²);ch1=getchar();ch2=getchar();ch3=getchar();ch4=getchar();122 putchar(¢n¢);putchar(ch1+m);putchar(ch2+m);putchar(ch3+m);putchar(ch4+m);}6.main(){intm;floatx,y;printf(²n请输入一个实数:²);scanf(²%f²,&x);m=x;y=x-m;printf(²n%d,%f²,m,y);}第4章选择结构程序设计习题一、单选题1.设intyear;要使!(year%4==0&&year%100!=0||year%400==0)的值为1,year可取的数据是A.1600B.1900C.2000D.20082.下面哪一个不是逻辑运算符A.^B.!C.||D.&&3.若有inta=1,b=2,c=3,d=4;则表达式ad)?c:d:b的值是A.1B.2C.3D.44.下面程序段所表示的逻辑关系是if(a________________3.若a=2,b=3,c=-1,d=5;下面表达式的值为:__。a+b>c+d&&a>=c+d||!c>0||d<0122 4.用表达式表示:x=100且y、z都大于80,或者y=100且x、z都大于80。________________三、阅读题1.main(){inta=0,b=0,c;c=a++&&(b=1);printf("a=%d,b=%d,c=%dn",a,b,c);}2.main(){inta,b,c;intx=8,y=10;a=(++x==--y)?--x:++y;b=x++;c=++y;printf("a=%d,b=%d,c=%dn",a,b,c);}3.main(){floaty;ntx=2;if(x<0)y=0.0;elseif((x<=2.0)&&(x!=2.0))y=1.0/(x+2.0);elseif(x<10.0)y=1.0/x;elsey=10.0;printf("y=%fn",y);}4.main(){intx=1,y=1;switch(x){case1:switch(--y){case0:printf("%dn",++x);break;case1:printf("%dn",++x);break;}case2:printf("%dn",++x);}}四、编程题1.编写完成以下计算的程序:x+exx>0y=0x=0lg|x|+x4x<02.当键盘输入字符“k”或“K”时,输出KOREAWORLDCUP;当键盘输入字符“j”或“J”时,输出JAPANWORLDCUP;当键盘输入字符“c”或“C”时,输出BEIJIN122 OLYMPICGAMES;若输入其他字符则原样输出。 3.从键盘上任意输入三个整数,按从小到大的次序排列出来。4.任意输入一个成绩显示出其等级。90分以上为A等、80分以上为B等、70分以上为C等、60分以上为D等、60以下为E等。若输入数据大于100或小于0,则显示“dataerror”。附加题一、单选题1.设intyear;要使(year%4==0&&year%100!=0||year%400==0)的值为0,year可取的数据是A.1600B.1900C.2000D.20082.下面哪一个不是关系运算符A.=B.==C.>=D.!=3.若有inta=1,b=2,c=3,d=4;则表达式ac)?a:b:c的值是A.1B.2C.3D.44.指出下列程序段if(a=0)y=1;B.y=1;if(x<0)y=-1;if(x<0)y=-1;C.if(x>=0)y=1;D.if(x>=0)y=1;y=-1;elsey=-1;6.执行下面程序段后i的值为:{inti=10;switch(i){122 case9:i+=1;case10:i+=1;case11:i+=1;default:i+=1;}A.10B.11C.12D.13二、填空题:1.在C语言中,关系表达式的结果为:__或__。2.若a=2,b=3,c=-1,d=5;下面表达式的值为:__。a+b=c+d||!c>=0&&d>03.在if(表达式)语句;的格式中要使语句被执行,则要求表达式的值__。4.若a=1,f=2,表达式((!a>2)?1:0)<(f!=1)?0:1)的结果为:__。5.用表达式表示:整数p不能被整数q整除。________________6.用表达式表示:整数a不是偶数。________________三、阅读题1.main(){inta=0,b=0,c;c=++a||(b=1);printf("a=%d,b=%d,c=%dn",a,b,c);}2.main(){inta=1,b=1,x=3,y=5;if(x>0)a=a+1;if(x>y)b=b+1;elseif(x==y)b=5;elseb=2*x;printf("a=%d,b=%dn",a,b);}3.main(){inta=1,b=1,x=3,y=5;if(x>0)x++;if(x>y)b=b+1;elseif(x==--y)a--;elseb=2*y;printf("a=%d,b=%dn",a,b);}4.main()   {intx=20,y=0;if(x>20)y=5;if(x>10)y=y+5;if(x>1)y+=5;printf("y=%dn",y);}122 5.main(){intx=2,a=0,b=0;switch(x){case1:a++;b++;case2:++a;++b;case3:a++;b++;case4:a+=b;b+=a;}printf("a=%d,b=%dn",a,b);}6.main()    {inti=1,sum=0;    loop:sum+=i;      if(sum<100)       {++i;       gotoloop;}    printf("sum=%dn",sum-i);    }四、编程题1.从键盘上输入一个英文字母,若为大写字母则转换成小写字母输出;若为小写字母则原样输出;若输入的不是英文字母则输出“cuole”。  2.求二次方程ax2+bx+c=0(a≠0)的根3.用switch语句编写完成以下计算的程序:x+exx>0y=0x=0lg|x|+x4x<04.从键盘输入年、月,显示出该年该月的天数。5.从键盘上输入一个1~15之间的整数n,求n!。6.输入若干个成绩显示出各等级的人数。90分以上为A等、80分以上为B等、70分以上为C等、60分以上为D等、60以下为E等。若输入数据大于100或小于0,则显示“dataerror”重新输入,以-999为结束标记。习题答案一、单选题1.B2.A3.B4.B二、填空题1.102.!、%、>、&&、||、?:、=3.14.(x==100&&y>80||y==100&&x>80)&&z>80三、阅读题1.a=1,b=0,c=02.a=8,b=8,c=103.y=0.5000004.2122 3四、编程题1.#includemain(){floatx,y;scanf("%f",&x);if(x>0)y=x+exp(x);if(x==0)y=0;if(x<0)y=log10(abs(x))+pow(x,4);printf("y=%fn",y);}2.#include"stdio.h"main(){charc;c=getchar();if(c=="k"||c=="K")printf("KOREAWORLDCUP");elseif(c=="j"||c=="J")printf("JAPANWORLDCUP");elseif(c=="c"||c=="C")printf("BEIJINOLYMPICGAMES");elseprintf("%cn",c);}3.方法一:main(){inta,b,c,max,min;scanf("%d%d",&a,&b);min=(a=b)?a:b;scanf("%d",&c);if(cmax)printf("%d,%d,%dn",min,max,c);if(c>min&&cb){t=a;a=b;b=t;}122 if(a>c){t=a;a=c;c=t;}if(b>c){t=b;b=c;c=t;}printf("%d,%d,%dn",a,b,c);}4.main(){inte=0;floatscore;chargrade;printf("inputscore:");scanf("%f",&score);if(score>100||score<0){printf("ndataerror");e=1;}switch(score/10){case10:case9:grade="A";break;case8:grade="B";break;case7:grade="C";break;case6:grade="D";break;case5:case4:case3:case2:case1:case0:grade="E";}if(e==0)printf("scoreis%6.2f,gradeis%cn",score,grade);}若将switchz中的条件稍作改动,程序可写为:main(){inte=0;floatscore;chargrade;printf("inputscore:");scanf("%f",&score);if(score>100||score<0){printf("ndataerror");e=1;}switch(score/10-5){case5:grade="A";break;case4:grade="A";break;case3:grade="B";break;case2:grade="C";break;case1:grade="D";break;default:grade="E";}if(e==0)printf("scoreis%6.2f,gradeis%cn",score,grade);}附加题答案122 一、单选题1.B2.A3.C4.B5.C 6.D一、填空题1.102.13.非04.05.p%q!=06.a%2!=0三、阅读题1.a=1,b=0,c=12.a=2,b=63a=0,b=14.y=105.a=4,b=66.sum=91二、编程题1.#include  main()   {charx;   x=getchar();   if("a"<=x&&x<="z")putchar(x);    elseif("A"<=x&&x<="Z")putchar(x+32);   elseprintf("cuole");   }2.分析:对a≠0应考虑下面的情况:(1)b2-4ac>0时,方程有两个不等的实根(2)b2-4ac=0时,方程有两个相等的实根(3)b2-4ac<0时,方程有两个复数根方法一:用嵌套的if语句#includemain(){floata,b,c,disc,x1,x2,real,imag;scanf("%f%f%f",&a,&b,&c);disc=b*b-4*a*c;if(disc>=0)if(disc>0){x1=(-b+sqrt(disc))/(2*a);x2=(-b-sqrt(disc))/(2*a);printf("x1=%0.2ftx2=%0.2fn",x1,x2);}else{x1=x2=(-b)/(2*a);printf("x1=x2=%0.2fn",x1);}else{real=(-b)/(2*a);122  imag=sqrt(fabs(disc))/(2*a);printf("x1=%.2f+%.2fitx2=%.2f-%.2fin",real,imag,real,imag);}}方法二:用if-elseif语句#includemain(){floata,b,c,disc,x1,x2,real,imag;scanf("%f%f%f",&a,&b,&c);disc=b*b-4*a*c;if(disc>0){x1=(-b+sqrt(disc))/(2*a);x2=(-b-sqrt(disc))/(2*a);printf("x1=%0.2ftx2=%0.2fn",x1,x2);}elseif(disc==0){x1=x2=(-b)/(2*a);printf("x1=x2=%0.2fn",x1);}elseif(disc<0){real=(-b)/(2*a);imag=sqrt(fabs(disc))/(2*a);printf("x1=%.2f+%.2fitx2=%.2f-%.2fin",real,imag,real,imag);}}3.#includemain(){floatx,y,z;scanf("%f",&x);z=1*(x>0)+2*(x==0)+3*(x<0);switch(z){case1:y=x+exp(x);break;case2:y=0;break;case3:y=log10(abs(x))+pow(x,4);}printf("y=%fn",y);}4.main(){intyear,month,days,leap;scanf("%d%d",&year,&month);switch(month){case1:case3:case5:122 case7:case8:case10:case12:days=31;break;case4:case6:case9:case11:days=30;break;case2:if(year%4==0&&year%100!=0||year%400==0)days=29;elsedays=28;}printf("%d%ddays:%dn",year,month,days);}5.main(){intn,i=1;longs=1;scanf("%d",&n);loop:if(i<=n){s*=i;++i;gotoloop;}printf("n!=%ldn",s);}6.main(){inta=0,b=0,c=0,d=0,e=0;floatscore;loop1:printf("inputscore:");scanf("%f",&score);if(score==-999)gotoloop2;if(score>100||score<0){printf("ndataerror");gotoloop1;}switch(score/10-5){case5:a=a+1;gotoloop1;case4:a=a+1;gotoloop1;case3:b=b+1;gotoloop1;case2:c=c+1;gotoloop1;case1:d=d+1;gotoloop1;default:e=e+1;gotoloop1;}loop2:printf("A=%d,B=%d,C=%d,D=%d,E=%dn",a,b,c,d,e);}122 第5章循环结构程序设计习题一、单选题1.结束while(表达式)循环的条件是A.当表达式的值为0时B.当表达式的值不为0时C.当表达式的值为1时D.当表达式的值为非1时2.在do—while(表达式);结构的循环中,下面哪种说法是正确的A.只要表达式的值不为0就开始执行循环B.当表达式的值为0时循环体一次也不执行C.循环体仅能执行一次D.循环体至少被执行一次3.下面哪种说法是正确的A.在循环体中可以用break语句结束本次循环B.在循环体中可以用continue语句结束本次循环C.break语句仅能使用在switch结构中D.可以使用continue语句跳出switch结构4.下面程序段的执行结果为:main(){charx=97;while(x<"d"){printf("%c",x);x++;printf("n");}}A.aB.aC.aD.abbbccd 二、填空题1.若e1,e2,e3为表达式,正常结束for(e1;e2;e3)循环的条件是______。2.Break语句可用于___结构和___结构中。3.若有intx=5;while(x^x){循环体}则循环体执行的次数为___次4.若有inta=10,s=0;while(s+=a--,--a;);执行完循环后,a的值为___;s的值为___。三、阅读题1.#include122 main(){intk;for(k=1;k<=5;k++)switch(k%5){case0:printf("@");break;case1:printf("&");break;default:printf("n");case2:printf("#");}}2.main(){intk=1,j=1;do{k+=(j-1)*j;if(j>4)break;elsek+=2*j;j++;}while(j<10);printf("%dn",k);}3.main(){intx,y,z;for(x=0;x<2;x++)for(y=1;y<3;y++)for(z=2;z<4;z++)printf("%d,n",(x==0||y==1)+(z==2&&x==y)+!(z==3));}4.从键盘输入2473(回车),下面程序的结果是什么。#includemain(){intc;while((c=getchar())!="n"){switch(c-"2"){case0:case1:putchar(c+4);case2:putchar(c+4);break;case3:putchar(c+3);default:putchar(c+2);break;}}printf("n");}四、编程题122 1.求s=1*2!+2*3!+……+9*10!2.求s=a+aa+aaa+……+aaa…a,其中a是1~9之间的数字;n是1~9之间的数字。n个a3.输入20个字符,分别统计出其中大写英文字母、小写英文字母、数字和其它符号的个数。4.若有算式:ABCD-CDCABCA、B、C、D均为一位非负整数,求出A、B、C、D各值。附加题一、单选题1.执行while(表达式)循环的条件是A.当表达式的值为0时B.仅当表达式的值为1时C.当表达式的值为非0时D.当表达式的值不为1时2.下面哪种说法是正确的A.break语句仅能使用在switch结构中B.执行continue语句可以结束包含它的整个循环结构C.执行循环体中的break语句可以结束本次循环D.执行break语句可以结束包含它的循环结构3.下面程序段的执行结果是intx=100;dox+=1;while(x>120);printf("%d",x);A.100B.101C.120D.1214.下面程序段的执行结果为:main(){inti,j,a=0,b=0;for(i=0;i<2;i++)for(j=0;j<2;j++)if(j>=i)a=1;b++;printf("a=%d,b=%dn",a,b);}A.a=1,b=1B.a=3,b=3C.a=1,b=3D.a=3,b=15.下面程序段的执行结果为:main(){inti,j;for(i=1;i<3;i++){for(j=1;j<=i;j++)printf("%d",i+j);printf("n");122 }}A.2345B.234C.23D.234346.下面程序段的循环次数为:intk=2;while(k=0)printf("%d",k);k--;printf("n");A.无限次B.0次C.1次D.2次二、填空题:1.除用while、do—while、for外,还可以用___语句和___语句构成循环。2.要从嵌套循环结构的内层循环体直接离开整个循环结构,可使用___语句实现。3.若有for(a=0;a<10;a++){a++;}则循环体执行的次数为___次4.若有intx=1;while(x++<5);正常结束循环后x的值为___5.若有inta,x=0;for(a=0;a<9&&x<=99;a++)scanf(“%d”,&x);问,循环最多执行次数为___;循环最少执行次数为___。6.若有inta=10,s=0;while(a!=0){a--;s+=--a;}执行完循环后,a的值为___;s的值为___。三、阅读题1.main(){inti,j,k;for(i=0;i<5;i++){for(j=0;j<10;j++)printf("");for(k=0;k<=i;k++)printf("$");printf("n");}}2.main(){intx,y,z,s=0;for(x=1;x<4;x++)for(y=1;y<=x;y++)for(z=y;z<4;z++)s+=2;printf("s=%dn",s);122 }3.main(){intx=0;do{x+=3;if(x%5)printf("%3d",x/5);elseprintf("%3d",x);}while(x<=15);}4.main(){intx=678,y=0;while(x!=0){y+=x%10;y=y*10;x=x/10;}printf("y=%dn",y/10);}5.从键盘输入Programming(回车),下面程序的结果是什么。#includemain(){inti=0,j=0;charch;while((ch=getchar())!="n"){switch(ch){case"a":case"A":case"e":case"E":case"o":case"O":default:i++;case"i":case"I":case"u":case"U":case3:j++;}}printf("%d%dn",i,j);}6.main(){inti,j,k;printf("");for(i=1;i<10;i++)printf("%4d",i);printf("n");for(i=1;i<10;i++)122 printf("-");printf("n");for(i=1;i<10;i++){printf("%d",i);for(k=0;k<4*(i-1);k++)printf("");for(j=i;j<10;j++)printf("%4d",i*j);printf("n");}}四、编程题1.求两个整数的最大公约数和最小公倍数。2.求100~300之间的素数。3.如果一个三位数等于其各位数字之和,则称为“水仙花数”,求所有的“水仙花”数。例如153=13+53+33,所以153是“水仙花数”。4.用循环语句编程,显示出ZzYyXxWw&……CcBbAa。5.用矩形法求函数f(x)=x2+x+1在[0,2]区间的定积分,即6.用牛顿迭代法求下面方程在1.5附近的根。2x3-4x2+3x-6=0习题答案一、单选题1.A2.D3.B4.C二、填空题1.e2等于02.switch、循环或循环、switch3.04.030执行结果为:k=61三、阅读题1.&###@2.613.2,1,2,1,3,1,1,04.668977四、编程题1.main(){longs=0,t=1;inti;for(i=1;i<5;i++){t*=i+1;122 s+=i*t;}printf("s=%ldn",s);}2.main(){longs=0,a,b=0;intn,i;scanf("%ld%d",&a,&n);for(i=0;imain(){charc;inti,dx=0,xx=0,sz=0,qt=0;for(i=0;i<20;i++){c=getchar();if("A"<=c&&c<="Z")dx+=1;elseif("a"<=c&&c<="z")xx+=1;elseif("0"<=c&&c<="9")sz+=1;elseqt+=1;}printf("dx=%d,xx=%d,sz=%d,qt=%dn",dx,xx,sz,qt);}4.main(){inta,b,c,d,x,y,z;for(a=1;a<=9;a++)for(b=0;b<=9;b++)for(c=1;c<=9;c++)for(d=0;d<=9;d++){x=1000*a+100*b+10*c+d;y=100*c+10*d+c;z=100*a+10*b+c;if(x-y==z)gotoloop;}loop:printf("A=%d,B=%d,C=%d,D=%dn",a,b,c,d);printf("%d-%d=%dn",x,y,z);}附加题答案122 一、单选题1.C2.D3.B4.A5.D6.B二、填空题1.ifgoto2.goto3.54.55.916.020三、阅读题1.$$$$$$$$$$$$$$$2.s=283.01121534.y=8765.10116.123456789---------11234567892468101214161839121518212427416202428323652530354045636424854749566386472981四、编程题1.main(){inta,b,r,m;scanf("%d%d",&a,&b);m=a*b;r=a%b;while(r!=0){a=b;b=r;r=a%b;}printf("%d,%dn",b,m/b);}2.#includemain(){inti,j,a,m;for(j=100;j<=300;j++){m=sqrt(j);for(i=2;i<=m;i++)122 {if(j%i==0)break;continue;}if(i>m)printf("%5d",j);}}3.main(){inti,j,k,n;for(n=100;n<1000;n++){i=n/100;j=(n-100*i)/10;/*或j=n/10-i/10;*/k=n-100*i-10*j;/*或k=n%10;*/if(n==i*i*i+j*j*j+k*k*k)printf("%dn",n);}}执行结果为:1533703714074.main(){charch;for(ch="Z";ch>="A";ch--)printf("%c%c",ch,ch+32);}5.main(){intn=1000,i;floata=0.0,b=2.0,h,x,f0,f1,s=0.0,s1;x=a;h=(b-a)/n;f0=x*x+x+1.0;for(i=1;i<=n;i++){s1=f0*h;s+=s1;x+=h;f0=x*x+x+1.0;}printf("n=%d,a=%5.2f,b=%5.2f,s=%8.2fn",n,a,b,s);}6.#includemain(){floatx,x0,f,f1;x=1.5;122 do{x0=x;f=((2*x0-4)*x0+3)*x0-6;f1=(6*x0-8)*x0+3;x=x0-f/f1;}while(fabs(x0-x)>=1e-5);printf("%5.2fn",x);}第6章数组习题一、单选题1.以下对数组描述正确的是A.数组一旦定义其大小是固定的,但数组元素的类型可以不同。 B.数组一旦定义其大小是固定的,且数组元素的类型必须相同。C.数组一旦定义其大小是可变的,且数组元素的类型可以不同D.数组一旦定义其大小是可变的,但数组元素的类型必须相同。2.若有inta[4]={1,2,3,4};则a[a[0]+2*a[2]-a[3]]的值为A.1B.2C.3D.43.以下能正确将字符串“Boy”进行完整赋值操作的是A.chars[3]={‘B’,’o’,’y’};B.chars[]=“Boy”;C.chars[3]={“Boy”};D.chars[3];s[0]=’B’;s[1]=’o’;s[2]=’y’;4.下面程序段的输出结果是for(i=0;i<2;i++)for(j=0;j<2;j++)if(i==j){a[i][j]=0;printf(“%d”,a[i][j]);}else{a[i][j]=1;printf(“%d”,a[i][j]);}printf(“n”);A.1001B.0110C.10D.010110二、填空题1.数组元素下标可取的最小值是___。2.C语句中数组名是一个___常量,表示数组在内存中的___。3.描述将字符串“Iamateacher”用初始化的方法存于字符数组str中_______________。4.若有定义inta[3][5];排列在数组中的第8个元素是_____。三、阅读题1.main(){inta[]={1,2,3,4},i,j=1,sum=0;for(i=3;i>=0;i--)122 {sum+=a[i]*j;j*=10;}printf("sum=%dn",sum);}2.#defineN5main(){inta[N+1]={0,-1},i,j,x;for(i=0;i<=N-1;i++){for(j=1;j<=i+1;j++){x=2+i-j;a[x]=a[x]+a[x-1];;if(i>=N-1)printf("%3d",a[x]);}}printf("n");}3.main(){inta[3][3]={{1,0,2},{2,2},{0,2}},c[3][3],i,j;for(i=0;i<3;i++){for(j=0;j<3;j++){c[i][j]=a[a[i][j]][a[j][i]];printf("%5d",c[i][j]);}printf("n");}}4.阅读下面程序段,当键盘输入你的姓(用汉语拼音输入),写出执行结果#include"stdio.h"#include"string.h"main(){chart,a[20];inti,j,s;gets(a);s=strlen(a);for(i=0;i=0;i--)printf("%5d",x[i]);printf("n");}122 2.main(){inta[5],b[5],i;for(i=0;i<5;i++)a[i]=i-1;for(i=1;i<4;i++){b[i]=a[a[i+1]]+a[a[i]];printf("%3d%3d",a[i],b[i]);}}3.main(){inta[4][4],i,j,s1=0,s2=0;for(i=0;i<4;i++)for(j=0;j<4;j++)a[j][i]=i+j;for(i=0;i<4;i++){s1+=a[i][i];s2+=a[i][3-i];}printf("ns1=%ds2=%d",s1,s2);}4.main(){inta[6][6],i,j;for(i=0;i<6;i++){a[i][0]=1;a[i][i]=1;}for(i=2;i<6;i++)for(j=1;jmain(){charstr[10]="XLNKFGVI";intn,i;n=strlen(str);for(i=0;imain()122 {charstr[4][10]={"pen","paper","people","pencil"};inti;for(i=0;i<4;i++)if(str[i][3]!="p")printf("%sn",str[i]);elsebreak;}四、编程题1.把1~255之间任一个十进制整数转换成二进制的数。2.从键盘上任意输入10个1~99之间的整数,分别统计其个位数字0~9的数字各有多少。3.求两矩阵相乘。4.编写打印奇数阶“幻方”的程序。所谓“幻方”就是将1~n2个连续的自然数放在一个n*n的方阵中,使每行、每列以及两条对角线的和等于同一个数。例如:三阶“幻方”可将自然数1~9放成如下方阵:816357492奇数阶“幻方”的构造方法是,首先把1放在顶行正中间的位置上,然后把后继数按自然顺序放置在右上斜的对角线上并且作如下的修改:(1)当到达顶行时,下一个整数放在底行,好象它在顶行的上面。(2)当到达右端时,下一个整数放在左端列,好象它是紧靠右端列的右方。(3)当到达的方格已经填上数码或到达右上角时,下一个数就放在刚填写数的正下方。5.把两个字符串连接起来置于第三个字符串中。(不得使用strcat函数)6.从键盘上输入两个字符串c1和c2,若c1比c2长,检查c2是否是c1的子串,若c2是c1的子串则显示出两个串及c2在c1中的开始位置;若c2不是c1的子串则显示出“NO”。例如:若c1为shanghai,c2为han,显示结果为:shanghaihan2;若c1为shanghai,c2为wuhan,显示结果为:NO。习题答案一、单选题1.B2.C3.B4.B二、填空题1.02.地址起始3.charstr[16]=“Iamateacher”;4.答案:a[1][2]三、阅读题1.sum=12342.–1–4–6–4–13.2200022014.将按所输入的字符按从大到小的次序排列出来。四、编程题122 1.main(){floata[10],max,t;inti,j,k;for(i=0;i<10;i++)scanf("%f",&a[i]);for(i=0;i<9;i++){max=a[i];k=i;for(j=i+1;j<10;j++)if(max=a[j][3])continue;{t=a[i][0];a[i][0]=a[j][0];a[j][0]=t;t=a[i][1];a[i][1]=a[j][1];a[j][1]=t;t=a[i][2];a[i][2]=a[j][2];a[j][2]=t;t=a[i][3];a[i][3]=a[j][3];a[j][3]=t;}}122 for(i=0;i<30;i++){for(j=0;j<4;j++)printf("%5d",a[i][j]);printf("n");}}4.#include"string.h"main(){chara[80],b[80];inti=0,j,k=0;gets(a);while(a[i]!="x")i++;for(j=i+1;a[j]!="x";j++){b[k]=a[j];k++;}b[k]="";puts(b);printf("%dn",strlen(b););}附加题答案一、单选题1.2.3.4.5.6.二、填空题1.不确定的2.连续的3.行4.取整5.答案:将回车符转换成''6.换行符三、阅读题1.543212.0–111233.s1=12s2=124.111121133114641151010515.COMPUTER6.penpaper四、编程题1.main(){inta[8],i,k=0,x,y;122 scanf("%d",&x);while(x!=0){y=x/2;a[k]=x-2*y;k+=1;x=y;}for(i=k-1;i>=0;i--)printf("%d",a[i]);}2.main(){inta[10]={0},i,j,x;for(i=0;i<10;i++){scanf("%d",&x);j=x-(x/10)*10;a[j]=a[j]+1;}for(i=0;i<10;i++)printf("%3d",a[i]);}3.#defineM20#defineL30#defineN20main(){inta[M][L],b[L][N],c[M][N],i,j,k;intm,l,n;scanf("%d%d%d",&m,&l,&n);for(i=0;iN)j=1;if(a[i][j]==0)a[i][j]=k;else{i=row+1;j=colum;a[i][j]=k;}}for(i=1;i<=N;i++){for(j=1;j<=N;j++)printf("%5d",a[i][j]);printf("n");}}5.#include"stdio.h"main(){charc1[30],c2[30],c3[80];inti,k1,k2;gets(c1);gets(c2);k2=strlen(c2);for(i=0;iy?x:y;returnz;}main(){floata=8.6,b=7.8;122 intc;c=max(a,b);printf("%dn",c);}2.intk=0;voidfan(){intm=0;staticintn=0;k++;m++;n++;printf("n%4d%4d%4d",k,m,n);}main(){fan();fan();k=5;fan();}3.#defines(x)(x)*(x)#definet(x)((x)*(x))#defineu(x)x*xmain(){floata,b,c;intn=5;a=27.0/s(3.0);b=27.0/t(3.0);c=u(n-1);printf("a=%5.2f,b=%5.2f,c=%5.2fn",a,b,c);}4.main(){intm=5;longs,fun1(int),fun2(int);s=fun1(m);printf("s=%ldn",s);}longfun2(intn){if(n>0)returnn*fun2(n-1);elsereturn1l;}longfun1(intk){longsum=0;inti;for(i=1;i<=k;i++)sum+=fun2(i);returnsum;}四、编程题122 1.分别编写求两个数的最大公约数和最小公倍数的函数,在主函数中输入和输出。2.编写一函数求xn(n为整数),并调用它分别求9.74和10-2的值。3.若从键盘上输入一串字符,字符串中含有英文大、小写字母及其它字符,编一个将英文大小写进行转换的函数,即将大写字母转换成小写字母输出,小写字母转换成大写字母输出,其余字符原样输出。4.编一个求素数的函数,求3~1000之间的所有孪生素数。(两个素数仅相差2称为孪生素数,例如:3和5,5和7,11和13等是孪生素数)附加题一、单选题1.下面说法正确的是A.C语言程序由一个和多个函数组成。B.一个C语言程序必须包含在一个源文件中。C.在一个C语言的函数中可以定义其它C语言函数。D.被调用函数和调用函数必须在一个源文件中。2.对于C语言的函数,下面叙述中正确的是A.函数不能嵌套定义,但可以嵌套调用。B.函数可以嵌套定义,但不能嵌套调用。C.函数不能嵌套定义,也不能嵌套调用。D.函数能嵌套定义,也能嵌套调用。3.如果一个被调用函数没有返回语句,则函数的返回值的类型为A.char型B.int型C.没有返回值D.无法确定4.一般全局变量的作用域为A.整个源文件B.所定义函数C.整个程序D.从定义位置起到本文件结束5.对宏命令的处理是A.在程序执行时进行的B.与程序中其它语句同时进行编译C.在程序连接时进行的D.在对程序中其它语句进行编译前进行的6.下面对编译预处理的叙述中正确的是A.预处理命令只能位于程序的开始处。B.预处理功能是指完成宏替换和文件包含的调用。C.只要行首以“#”标识的控制行都是预处理命令。D.编译预处理就是对源程序进行初步的语法检查。二、填空题1.C语言程序从___函数开始执行,在___函数中结束。2.C语言允许函数返回___个值,函数的返回值是通过___语句实现的。3.函数调用语句f((a,b,c),(x,y));中含有___个实参。1.若一个变量的存储类别被定义为static,则该变量存储在___存储区中。5.定义变量可以在函数的内部,也可以在函数的外部,在函数外部定义的变量一般称为___变量。6.可以用___命令终止宏定义的作用域。三、阅读题1.main(){inti;for(i=0;i<4;i++)122 print(i);}print(intj){inti;for(i=0;i<10-j;i++)printf("");for(i=0;i<=j;i++)printf("*");printf("n");}2.jc(inti){intk,s=1;for(k=1;k<=i;k++)s*=k;return(s);}main(){ints;s=jc(jc(3));printf("s=%dn",s);}3.inti=10;main(){intj=1;j=func();printf("%d,",j);j=func();printf("%d",j);}func(){intk=0;k=k+i;i=i+10;return(k);}4.main(){inta[5][5],i,j;floats=0,sum(int);for(i=1;i<5;i++)for(j=1;j<=i;j++)a[i][j]=i+j;for(i=1;i<5;i++)s+=sum(a[i][i]);printf("s=%6.2fn",s);122 }floatsum(inti){statick=0;k+=i;return(k);}5.main(){chara[26]={"AbCdEfGhIjKlMnOpQrStUvWxYz"};inti;for(i=0;i<26;i++){a[i]=change(a[i]);printf("%c",a[i]);}printf("n");}change(charstr){charch;if("A"<=str&&str<="Z")ch=str+32;elsech=str-32;returnch;}6.#includevoidchen(intn){inti,j;if(n%2||n==2){printf("Error:%disanoddorequalsto2!n",n);return;}for(i=n-2;i>=n/2;i--){for(j=2;i%j;j++);if(j!=i)continue;for(j=2;(n-i)%j;j++)if(j!=n-i)continue;printf("%d=%d+%dn",n,i,n-i);}}inttest_data[]={6,8,10};main(){inti;for(i=0;i<3;i++)chen(test_data[i]);}122 四、编程题1.求a,b两数的和、差、积、商运算分别用一个函数实现,从键盘输入两个数并输入运算符+、-、*、/之一,求出其运算结果。2.编一个求n!的函数,求s=1*1!+2*2!+……+n*n!3.编一个求和的函数,求func(x)=x+x2/(1+2)+x3/(1+2+3)+……+xn/(1+2+…+n)4.哥得巴赫猜想:任何一个大于2的偶数可分成两个素数之和,例如:4=2+2,6=3+3,8=3+5,……。编写程序对1000以内的偶数验证该命题。5.用递归方法求n阶勒让德多项式的值,递归公式为:1(n=0)pn(x)=x(n=1)((2n-1)*x*pn-1(x)-(n-1)*pn-2(x))/n(n>=1)6.编写一个求任意函数的定积分的函数,求下面的定积分。已知求任意函数定积分的梯形公式为:其中:h=(b-a)/n,i=1,2,3,……,n-1。习题答案一、单选题1.B2.C3.D4.A二、填空题1.void或空2.int3.单向的值传递4.程序执行结束三、阅读题1.82.1112126133.a=27.00,b=3.00,c=-1.004.s=153四、编程题1.main(){intm,n,x,y;scanf("%d%d",&m,&n);x=ged(m,n);122 y=gbs(m,n,x);printf("ged=%d,gbs=%dn",x,y);}ged(inta,intb){intr,t;if(a0)z*=x;elsez/=x;returnz;}main(){floata,b;a=f(9.7,4);b=f(10,-2);printf("%f,%fn",a,b);}3.#include#includemain(){chara[20],ch,change(char);inti,l;gets(a);l=strlen(a);for(i=0;iintss(intx){intm,n;m=sqrt(x);for(n=2;n<=m;n++)if(x%n==0)break;if(n>m)return(1);elsereturn(0);}main(){inti,j,k=3,c;for(i=5;i<=1000;i+=2){c=ss(i);if(c==1&&i-2==k){printf("%d,%d",k,i);k=i;}elseif(c==1&&(i-2)!=k)k=i;}}附加题答案一、单选题1.2.3.4.5.6.二、填空题1.main()main()2.一return3.24.静态5.全局6.#undef三、阅读题1.**********2.s=7203.10,204.s=40.005.aBcDeFgHiJkLmNoPqRsTuVwXyZ6.6=3+38=5+310=7+310=5+5四、编程题1.floatadd(intx,inty){return(x+y);}floatminus(intx,inty)122 {return(x-y);}floatmul(intx,inty){return(x*y);}floatdiv(intx,inty){return((float)x/y);}main(){inta,b;floatc;charch;scanf("%d%c%d",&a,&ch,&b);switch(ch){case"+":c=add(a,b);break;case"-":c=minus(a,b);break;case"*":c=mul(a,b);break;case"/":if(b==0)printf("error");elsec=div(a,b);}if(b!=0)printf("%d%c%d=%5.2fn",a,ch,b,c);}2.main(){inti,n;longsum=0,func(int);scanf("%d",&n);for(i=1;i<=n;i++)sum+=i*func(i);printf("s=%ldn",sum);}longfunc(intj){longt=1;intk;for(k=1;k<=j;k++)t*=k;return(t);}3.floatfunc(inti){statics=0;s+=i;returns;}main(){floatsum=0.0,x,y;inti,n;scanf("%d%f",&n,&x);y=x;122 for(i=1;i<=n;i++){sum+=x/func(i);x*=y;}printf("sum=%fn",sum);}4.#includeintss(intx){intm,n;m=sqrt(x);for(n=2;n<=m;n++)if(x%n==0)break;if(n>m)return(1);elsereturn(0);}main(){inti,j;for(i=4;i<=1000;i+=2){for(j=2;j<=i/2;j++)if(ss(j)&&ss(i-j)){printf("%d=%d+%d,",i,j,i-j);break;}elsecontinue;}}5.floatp(intn,floaty){floatc;if(n==0)c=1;elseif(n==1)c=y;elsec=((2*n-1)*y*p(n-1,y)-(n-1)*p(n-2,y))/n;returnc;}main(){intn,x;floats;scanf("%d%d",&n,&x);s=p(n,x);printf("%fn",s);}6.#includefloatfunc(floatx)122 {floats1;s1=exp((-x*x)/2.0);return(s1);}floattrap(floata,floatb,intn){floats,h;inti;s=(func(a)+func(b))/2.0;h=(b-a)/n;for(i=1;ipx,则py-px的值表示______。三、阅读题1.voidswap1(intx,inty)122 {intt;t=x;x=y;y=t;}voidswap2(int*p1,int*p2){intp;p=*p1;*p1=*p2;*p2=p;}main(){inta=3,b=5,*x1=&a,x2=&b;swap1(a,b);printf("a=%d,b=%dn",a,b);swap2(x1,x2);printf("a=%d,b=%dn",a,b);}2.main(){inta[]={1,2,3,4,5,6},*p=a;printf("%d,",*p);printf("%d,",*(++p));printf("%d,",++(*p));printf("%d,",*(p--));p+=3;printf("%d,%dn",*p,*(p+2));}3.#defineMAX6main(){inta[MAX][MAX];voidsub1(),sub2();sub1(a);sub2(*a);}voidsub1(int(*s)[MAX]){inti,j;s[0][0]=1;for(i=0;icharb[]="program";char*a="PROGRAM";122 main(){inti=0;printf("%c%sn",*a,b+1);while(putchar(*(a+i)))i++;printf("i=%dn",i);while(--i)putchar(*(b+i));printf("n%sn",&b[3]);}6.#includefloat*search();voidmain(){inti,j;float*p;staticfloatscore[3][3]={{60,70,80},{50,89,67},{91,78,90}};for(i=0;i<3;i++){p=search(score+i);if(p!=NULL){for(j=0;j<3;j++)printf("%8.2f",*(p+j));printf("n");}}}float*search(float(*pointer)[3]){inti;float*pt=NULL;for(i=0;i<3;i++)if(*(*pointer+i)<60){pt=*pointer;break;}return(pt);}四、编程题1.用指针方法编程,从键盘上输入一个字符串,按字符从小到大的次序排列出来。2.从键盘上输入3个字符串(每个串不超过7个字符),用指针的方法编程,将3个字符串按从小到大的次序排列出来。3.在主函数中输入10个整数存放在一个数组中,用另一个函数将10个整数按逆序存放,然后在主函数中输出结果。4.用指针方法编程,从键盘上任意输入一个字符串求该字符串的长度。(不能使用strlen函数)。5.用指针方法编程,将字符串2拷贝到字符串1中(不能使用strcpy函数)。122 6.用指针方法编程,找出四行五列的数组中的最大值及所在的行和列。习题答案一、单选题1.B2.B3.B4.C二、填空题1.变量的指针2.23.实参数组的地址4.两指针之间的数据个数三、阅读题1.a=3,b=5a=5,b=32.1,2,3,3,4,63.111121133114641151010514.1000101010001000101010001四、编程题1.voidswap(float*p1,float*p2,float*p3){floatt;if(*p1>*p2){t=*p1;*p1=*p2;*p2=t;}if(*p1>*p3){t=*p1;*p1=*p3;*p3=t;}if(*p2>*p3){t=*p2;*p2=*p3;*p3=t;}}main(){inti;floata,b,c;for(i=0;i<10;i++){scanf("%f%f%f",&a,&b,&c);swap(&a,&b,&c);printf("%f,%f,%fn",a,b,c);}}2.#includemain(){chara[80],b[80],*p,*q;intm;gets(a);122 scanf("%d",&m);for(p=&a[m-1],q=b;*p!="";p++,q++)*q=*p;*q="";puts(b);}3.#include"stdio.h"#include"string.h"main(){char*p[10],*q,a[10][16];inti,j;for(i=0;i<10;i++)scanf("%s",a[i]);for(i=0;i<10;i++)p[i]=a[i];for(i=0;i<9;i++)for(j=i+1;j<10;j++)if(strcmp(p[i],p[j])>0){q=p[i];p[i]=p[j];p[j]=q;}for(i=0;i<10;i++)printf("%s,",p[i]);}4.#includemain(){inti,j;floata[4][5],s;floatfunc1(float(*q)[5]);voidfunc2(float(*p)[5]);voidfunc3(float(*p)[5]);for(i=0;i<4;i++)for(j=0;j<5;j++)scanf("%f",&a[0][i*5+j]);s=func1(a);printf("s=%6.2fn",s);func2(a);func3(a);}floatfunc1(float(*q)[5]){intk;floatsum=0.0,average;for(k=0;k<4;k++)sum+=*(*(q+k)+0);average=sum/4;return(average);}122 voidfunc2(float(*p)[5]){inti,j,n=0;floatsum,average;for(i=0;i<4;i++){n=0;sum=0.0;for(j=0;j<5;j++){sum+=*(*(p+i)+j);if(*(*(p+i)+j)<60.0)n+=1;}average=sum/5.0;if(n>=2){for(j=0;j<5;j++)printf("%8.2f",*(*(p+i)+j));printf("average=%8.2fn",average);}}}voidfunc3(float(*p)[5]){inti,j,n=0;floatsum,average;for(i=0;i<4;i++){n=0;sum=0.0;for(j=0;j<5;j++){sum+=*(*(p+i)+j);if(*(*(p+i)+j)>=85.0)n+=1;}average=sum/5.0;if(n>=5||average>=90.0){for(j=0;j<5;j++)printf("%8.2f",*(*(p+i)+j));printf("average=%8.2fn",average);}}}程序也可以用指向数组元素的指针变量来完成。例如,函数func1可以用指向数组元素的指针变量,主函数中floatfunc1(float(*q)[5]);改为:floatfunc1(float*q);函数func1程序如下:floatfunc1(float*q){intk;floatsum=0.0,average;for(k=0;k<4;k++)sum+=*(q+k*5);average=sum/4;return(average);122 }附加题答案一、单选题1.D2.A3.D4.D5.C6.B二、填空题1.float*fp;2.x=*fp;3.&*4.ab5.指针变量6.函数的入口地址三、阅读题1.18,182.ff3.55974.x=175.ProgramPROGRAMi=7margorgram6.50.0089.0067.00四、编程题1.#includemain(){chara[30],t,*p,*q;intn;gets(a);n=strlen(a);for(p=a;p*q){t=*p;*p=*q;*q=t;}printf("%sn",a);}2.#include"stdio.h"#include"string.h"main(){char*p[3],a[3][8],*q;inti;for(i=0;i<3;i++){gets(a[i]);p[i]=a[i];}if(strcmp(p[0],p[1])>0){q=p[0];p[0]=p[1];p[1]=q;}if(strcmp(p[0],p[2])>0){q=p[0];p[0]=p[2];p[2]=q;}if(strcmp(p[1],p[2])>0){q=p[1];p[1]=p[2];p[2]=q;}122 puts(p[0]);puts(p[1]);puts(p[2]);}3.main(){inta[10],i;for(i=0;i<10;i++)scanf("%d",&a[i]);func(a);for(i=0;i<10;i++)printf("%5d",a[i]);printf("n");}func(int*p){inti,t;for(i=0;i<5;i++){t=*(p+i);*(p+i)=*(p+9-i);*(p+9-i)=t;}}4.main(){chara[50],*p;intn=0;gets(a);for(p=a;*p!="";p++)n+=1;printf("n=%dn",n);}5.main(){chara[50],b[50],*p,*q;intn=0;gets(a);gets(b);p=a;q=b;while(*q!="")*p++=*q++;*p="";p=a;printf("%sn",p);}6.main(){inta[4][5],i,j,k,l,max,(*p)[5]=a;122 for(i=0;i<4;i++)for(j=0;j<5;j++)scanf("%d",&a[i][j]);max=*p;k=0;l=0;for(i=0;i<4;i++)for(j=0;j<5;j++)if(max<*(*(p+i)+j)){max=*(*(p+i)+j);k=i;l=j;}printf("max=%d,i=%d,j=%dn",max,k,l);}第9章结构体、共用体和枚举习题一.单选题1.结构体类型中成员的类型可以。A.必须一致B.可以不一致C.是任何类型D.只能是简单类型2.当说明一个结构体变量时,系统在内存中分配给它的存储空间大于或等于。A.各成员所需空间的总和B.成员中占空间最大所需空间C.最后一个成员所需空间D.第一个成员所需空间3.枚举类型变量可以直接。A.输入其值B.赋以一个整型常数C.输出其值D.赋以一个枚举常量4.有关共用体类型,说法是正确的。A.其成员所占存储单元长度依类型不同而不同B.其各成员的存储单元的起始地址不一样C.所有成员可以同时驻留在内存中D.被赋值的成员在程序中的任何时刻有效二.填空题1.结构体变量成员的引用方式有、和。2.枚举类型的常量只能是。3.共用体变量所占内存的长度等于占内存的成员的长度。4.有一结构体类型structstu变量x,指针变量p指向structstu类型数据,通过赋值语句,可使p指向x.122 三.阅读题1.下面程序为求一五边形的边长,请在上填上适当的内容。#includetypedefstructdot{floatx,y;}DOT;floatsidelength(DOT*one,DOT*two);main(){inti;DOTdots[5];floatlength,total=0.0;printf(²n请依次输入五边形的五个顶点的坐标:²);for(i=0;i<5;i++)scanf(²%f%f²,);for(i=0;i<5;i++){if(i==4)length=sidelength(&dots[0],&dots[4]);elselength=sidelength(&dots[i],&dots[i+1]);total+=length;}printf(²n五边形的总周长为%.1f²,total);}floatsidelength(DOT*one,DOT*two){floata,b;return(sqrt(a*a+b*b));}2.试分析下面程序的功能。#include#includemain(){structnode{chardata;structnode*link;}*p,*q;charch;q=NULL;printf(²n请输入一串字符(以F6结束):²);while((ch=getchar())!=EOF){p=(structnode*)malloc(sizeof(structnode));p->data=ch;p->link=q;122 q=p;}printf(²n²);while(q!=NULL){printf(²%c²,q->data);q=q->link;}}3.试分析下面程序的运行结果。main(){intk=1,i;unionabc{intm;intn;}x[3],*p;for(i=0;i<3;i++){x[i].m=k;x[i].n=x[i].m+1;k++;}p=&x[0];printf(²输出结果为:²);for(i=0;i<3;i++){printf(²%5d²,p->n);p++;}}4.阅读下面的程序,分析其功能和实现过程。main(){floattmp;structstudent{longnum;enumgrade{A,B,C,D,E,F}grade;}stu;printf(²n请输入一位同学的学号和一门功课的成绩:²);scanf(²%ld%f²,&stu.num,&tmp);if(tmp>=90)stu.grade=A;elseif(tmp>=80)stu.grade=B;elseif(tmp>=70)stu.grade=C;elseif(tmp>=60)stu.grade=D;elsestu.grade=F;printf(²n%10ld%6c²,stu.num,¢A¢+stu.grade);}122 四.编程题1.利用结构体类型分别写出复数的加、减、乘及除运算的函数,并在主程序中调用这些函数,求任意两复数的和、差、积与商。2.输入10个学生的信息(包括学号、姓名、性别、年龄、成绩),组成结构体数组,分别统计男、女生人数,计算全体学生的平均年龄、平均成绩,并将高于平均成绩的学生的信息输出。3.输入今天是星期几的序号,给今天和昨天赋予成枚举值,并输出昨天是星期几的枚举值.4.N个孩子围成一圈,并给他们依次编号,老师指定从第s个孩子开始报数,报到第m个孩子出列.然后从下一个孩子开始报数,依次重复下去,直至所有的孩子都出列。试利用动态数据结构体求孩子的出列顺序。附加题一.单选题1.已知字符¢0¢的ASCII码为十六进制的30,下面程序的输出是。A.6B.9C.0D.3main(){union{unsignedcharc;unsignedinti;}z;z.i=0x39;printf(²%c²,z.c);}2.设有以下说明语句structex{intx;floaty;charz;}example;则下面的叙述中不正确的是。A.struct结构体类型的关键字B.example是结构体类型名C.x,y,z都是结构体成员名D.structex是结构体类型3.假定建立了以下链表结构,指针p、q分别指向相邻的两结点(指针q所指结点链在p所指结点之后),则以下可以将q所指结点从链表中删除并释放该结点的语句组是。A.free(q);p->next=q->next;B.(*p).next=(*q).next;free(q);C.q=(*q).next;(*p).next=q;free(q);D.q=q->next;p->next=q;p=p->next;free(p);4.设有如下定义:structsk{inta;floatb;}data,*p;若有p=&data;,则对data中的成员a的正确引用是。A.(*p).data.aB.(*p).aC.p->data.aD.p.data.a5.以下对枚举类型名的定义中正确的是。A.enuma={one,two,three};B.enuma{one=1,two,three};C.enuma={one=1,two,three};D.enuma{one;two;three};6.若已建立一有两个结点的链表,链表中结点具有如下所定义的结构,链表的头指针为p,则不能将s所指的结点链到链末尾的语句组是。122 structnode{intdata;structnode*next;};A.s->next=NULL;p=p->next;p->next=s;B.p=p->next;s->next=p->next;p->next=s;C.p=p->next;s->next=p;p->next=s;D)p=(*p).next;(*s).next=(*p).next;(*p).next=s;}7.若程序中有下面的说明和定义,则。structabc{intx;chary;};structabcs1,s2;则会发生的情况是A.编译时产生错误B.程序将顺利编译、连接、执行C.能顺利通过编译、连接,但不能执行D.能顺利通过编译,但连接出错8.以下是对C语言中共用体类型数据的正确叙述。A)一旦定义了一个共用体变量后,即可引用该变量或该变量中的任意成员B)一个共用体变量中可以同时存放其所有成员C)共用体变量成员的所占存储单元长度依成员类型不同而不同,且起始地址也不同D)共用体类型数据可以出现在结构体类型定义中,但结构体类型不能出现在共用体类型数据中9.若有定义:enumweekday{mon,tue,wed,thu,fri}workday;则是不正确的语句。A.weekday=(enumweekday)(6/2)B.weekday=(enumweekday)3;C.weekday=3D.weekday=thu;10.enumcolor(red,green,yellow=5,while,black)定义了一个枚举类型,编译程序为值表中各枚举常量分配的枚举值依次为。A)0、1、2、3、4B)0、1、5、2、3C)0、1、5、6、7D)3、4、5、6、711.有以下结构体说明和变量的定义:structnode{chardata;structnode*next;}a,b,*p=&a,*q=&b;则不能把结点b连接到结点a之后的语句是。A.a.next=q;B.p.next=&b;C.p->next=&b;D.(*p).next=q;12.若有定义unionU{charst[4];inti;doubleb;};structA{intc;unionUu;}a;则变量a所占内存字节数是。A.20B.6C.16D.10122 二.填空题1.只能对或结构体变量进行初始化.2.结构体变量所占内存的长度等于或大于各成员占的内存长度.3.共用体变量的成员同时存在并起作用,每一时刻只能有个成员起作用.4.以下程序用来输出结构体变量ex所占存储单元的字节数,请填空。structst{charname[20];doublescore;};main(){structstex;printf(²nexsize:%d²,sizeof());}5.为了建立一个双向链表,即每个结点含两个域:data是数据项,last是指向前一结点的指针,next是指向后一结点的指针,请定义一合适的结构体类型:structlink{chardata;}node;6.用可以对已经存在的类型重新增加一个类型名,有利于程序的通用和移植。7.设有以下说明和定义:typedefunion{longi;intk[5];charc;}DATE;structdate{intcat;DATEcow;doubledog;}zoo;DATEmax;则语句printf(²%d²,sizeof(structdate)-sizeof(max));的执行结果是。三.阅读题1.试分析下面程序运行的输出结果。#includestructstu{intnum;charname[10];intage;};voidfun(structstu*p){printf(²n%s²,(*p).name);}main(){structstustudents[3]={{9801,²Zhang²,20},{9802,²Wang²,19},{9803,²Zhao²,18}};fun(students+1);}2.下面程序程序能计算两个整数集合A与B的差,其中A与B122 的元素都以值的递增次序存放中单链表中,A中的同一元素允许在单链表中出现多次,A与B的差也以值的递增次序存于单链表内,但是同一元素不允许出现多次。假定调用diff前a,b的值已创建。#includetypedefstructnode{intd;structnode*next;}tnode;voiddiff(a,b,c)tnode*a,*b,;{intlast_a;tnode*p;*c=NULL;last_a=-9999;while(a&&b){if(a->d==b->d)a=a->next;elseif(a->d>b->d)else{if(a->d!=last_a){last_a=a->d;p=(tnode*)malloc(sizeof(tnode));p->d=last_a;p->next=*c;*c=p;}a=a->next;}}while(a){if(){p=(tnode*)malloc(sizeof(tnode));last_a=a->d;p->d=last_a;p->next=*c;*c=p;}a=a->next;}}voidprint(h)tnode*h;{printf(²n²);while(h){printf(²%d²,h->d);h=h->next;122 }}main(){tnode*a,*b,*c;...diff(a,b,&c);print(c);}3.下面程序功能是输入一串字符,动态地存入一个链表,然后按相反的次序输出后释放各结点所在的空间。请填空。#include#include#defineLENsizeof(structnode)main(){structnode{chardate;structnode*link;}*p,*top;charch;top=NULL;while((ch=getchar())!=¢n¢){p=(structnode*)malloc(LEN);p->date=ch;p->link=top;}printf(²n²);while(p!=NULL){printf(²%c²,p->date);free(p);p=top;}}4.下面程序在运行时,若输入数据为:12108911130试分析其输出结果。#include#include122 typedefstructnode{intd;structnode*next;}t_node;voidcreate(h)t_node**h;{inti,m=0;t_node*p,*q;printf(²n请输入数据(以0结束):²);scanf(²%d²,&i);while(i){p=(t_node*)malloc(sizeof(t_node));p->d=i>m?i:m;m=i;p->next=NULL;if(*h){q->next=p;q=p;}else{*h=p;q=p;}scanf(²%d²,&i);}}main(){t_node*h=NULL,*p;create(&h);p=h;printf(²n输出结果为:n²);while(p){printf(²%4d²,p->d);p=p->next;}}5.以下函数creat用来建立一个带头结点的单向链表,新产生的结点总是插在链表的末尾。单向链表的头指针作为函数值返回。请填空:#includestructlist{chardata;structlist*next;};structlist*creat(){structlist*h,*p,*q;charch;122 p=q=h;ch=getchar();while(ch!=¢?¢){p->data=ch;q->next=p;q=p;ch=getchar();}p->next=¢¢;return(h);}6.分析下面程序的运行结果。#includestructstudent{intx;charc;}a;voidf(structstudent*b){b->x=50;b->c=¢x¢;}main(){a.x=10;a.c=¢d¢;f(&a);printf(²n%d,%c²,a.x,a.c);}四.编程题1.输入10个数据,将它们按从大到小的顺序输出,并给出每个数据所对应的原来输入次序(利用结构体类型)。2.有m个人参加某项竞选,得票数排列在前n名的当选。试利用结构体类型,编写程序用于唱票统计,并输出当选人名单。3.建立一先进后出的动态栈。4.编程建立一双向链表并将输入的数据按输入的正反序输出。5.编程利用二叉树动态数据结构,将输入的英文字母按字典排列顺序输出。6.输入一系列整数,建立偶数链表和奇数链表,并输出两个链表的值。习题答案122 一、单选题1.B2.A3.D4.A二、填空题1.结构体变量名.成员名,指针名->成员名,(*指针名).成员名2.标识符3.最大空间4.p=&x;三、阅读题1.&dots[i].x,&dots[i].y,a=one->x-two->x;,b=one->y-two->y;2.该程序建立一先进后出栈,将输入的一串字符反序输出。3.输出结果为:2344.此程序的输入为一位同学的学号和一门功课的成绩(百分制),输出为学号和等级制成绩。在程序中使用了枚举类型,并充分利用了枚举常量及其序号值,使得对应的输出较为简洁。四、编程题1.#includetypedefstructmycomplex{floatre,im;}COMPLEX;voidadd(COMPLEX*x,COMPLEX*y,COMPLEX*z){z->re=x->re+y->re;z->im=x->im+y->im;}voidsub(COMPLEX*x,COMPLEX*y,COMPLEX*z){z->re=x->re-y->re;z->im=x->im-y->im;}voidmulti(COMPLEX*x,COMPLEX*y,COMPLEX*z){z->re=x->re*y->re-x->im*y->im;z->im=x->re*y->im+x->im*y->re;}main(){COMPLEXx,y,z;printf(²n请输入一个复数的实部和虚部:²);scanf(²%f%f²,&x.re,&x.im);printf(²n请输入另一个复数的实部和虚部:²);scanf(²%f%f²,&y.re,&y.im);add(&x,&y,&z);printf(²n和为%.1f%c%.1fi²,z.re,z.im>=0?¢+¢:¢-¢,fabs(z.im));sub(&x,&y,&z);printf(²n差为%.1f%c%.1fi²,z.re,z.im>=0?¢+¢:¢-¢,fabs(z.im));multi(&x,&y,&z);122 printf(²n积为%.1f%c%.1fi²,z.re,z.im>=0?¢+¢:¢-¢,fabs(z.im));}或者#includetypedefstructmycomplex{floatre,im;}COMPLEX;COMPLEXadd(COMPLEXx,COMPLEXy){COMPLEXz;z.re=x.re+y.re;z.im=x.im+y.im;return(z);}COMPLEXsub(COMPLEXx,COMPLEXy){COMPLEXz;z.re=x.re-y.re;z.im=x.im-y.im;return(z);}COMPLEXmulti(COMPLEXx,COMPLEXy){COMPLEXz;z.re=x.re*y.re-x.im*y.im;z.im=x.re*y.im+x.im*y.re;return(z);}main(){COMPLEXx,y,z;printf(²n请输入一个复数的实部和虚部:²);scanf(²%f%f²,&x.re,&x.im);printf(²n请输入另一个复数的实部和虚部:²);scanf(²%f%f²,&y.re,&y.im);z=add(x,y);printf(²n和为%.1f%c%.1fi²,z.re,z.im>=0?¢+¢:¢-¢,fabs(z.im));z=sub(x,y);printf(²n差为%.1f%c%.1fi²,z.re,z.im>=0?¢+¢:¢-¢,fabs(z.im));z=multi(x,y);printf(²n积为%.1f%c%.1fi²,z.re,z.im>=0?¢+¢:¢-¢,fabs(z.im));}说明:在Turbo2.0集成环境中,可以用结构体变量作为函数的参数2.#defineN10main(){inti,numm=0,numf=0;122 floatageave=0.0,gradeave=0.0;structstudent{longnum;charname[15];intsex;/*1:男;2:女*/intage;floatgrade;}stu[10];for(i=0;i=gradeave){printf(²n%10ld%15s²,stu[i].num,stu[i].name);if(stu[i].sex==1)printf(²%5s²,²男²);elseprintf(²%5s²,²女²);printf(²%6d%8.1f²,stu[i].age,stu[i].grade);}}}3.main(){intm;enumweekday{sun,mon,tue,wed,thu,fri,sat}today,tomorrow;printf(²n请输入今天的星期号(0~6):²);scanf(²%d²,&m);today=(enumweekday)m;if(today==sat)tomorrow=sun;elsetomorrow=today+1;printf(²n明天是星期%d²,tomorrow);122 }4.#defineMAX100#defineSIZEsizeof(CHILD)#includetypedefstructchild{intnum;structchild*next;}CHILD;main(){intcount,i,k,m,n,s;CHILD*p,*q,*start;printf(²n请输入参加游戏孩子的人数(1----%d):²,MAX);scanf(²%d²,&n);printf(²n请输入起始号码:²);scanf(²%d²,&s);printf(²n请输入每次所数人数:²);scanf(²%3d²,&m);start=p=q=(CHILD*)malloc(SIZE);for(i=1;i<=n;i++){p->num=i;if(i==n)q->next=start;else{p=(CHILD*)malloc(SIZE);q->next=p;q=p;}}if(s==1)k=n;elsek=s-1;while(start->num!=k)start=start->next;printf(²n%d²,start->num);p=start;printf(²n孩子出列顺序为:n²);for(count=1;count<=n;count++){i=1;while(i<=m){q=p;p=p->next;122 i++;}printf(²%5d²,p->num);q->next=p->next;free(p);p=q;}}附加题答案一、单选题1.B2.B3.B4.B5.B6.C7.B8.A9.C10.B11.B12.D二、填空题1.静态的,外部的2.之和3.不能,一个4.structst或ex5.structlink*last;,structlink*next;6.typedef7.6三、阅读题1.Wang2.**c,b=b->next;,a->d!=last_a3.top=p;,top=p->link;4.输出结果为:121210911135.h=malloc(sizeof(structlist));p=malloc(sizeof(structlist));6.50,x四、编程题1.#defineN10main(){inti,j;intt;structdate{intnum;intord;}x[N];printf(²n请输入十个实数:²);for(i=0;icondidate[tmp].total)tmp=j;printf(²n%d:%22s%5d²,i+1,condidate[tmp].name,condidate[tmp].total);condidate[tmp].total=0;}}3.#includemain(){structnode{intdata;structnode*link;}*p,*q;intn;q=NULL;printf(²n请输入一批整数(以-1结束):²);scanf(²%d²,&n);while(n!=-1){p=(structnode*)malloc(sizeof(structnode));p->data=n;p->link=q;q=p;scanf(²%d²,&n);}printf(²n²);while(q!=NULL){printf(²%10d²,q->data);q=q->link;}}4.#include#defineSIZEsizeof(structnode)typedefstructnode{chardata;structnode*last;structnode*next;}NODE;voidcreat(NODE**head,NODE**tail){NODE*p,*q;charn;printf(²n请输入一串字符:²);n=getchar();122 *head=p=(NODE*)malloc(SIZE);q=NULL;while(n!=EOF){p->data=n;p->last=q;q->next=p;q=p;p=(NODE*)malloc(SIZE);n=getchar();}q->next=NULL;*tail=q;}voidprint(NODE*q,intm){NODE*t;while(q!=NULL){printf(²%c²,q->data);if(m)q=q->next;else{t=q;q=q->last;free(t);}}}main(){NODE*head,*tail;charch;creat(&head,&tail);printf(²n正序输出为:n²);print(head,1);printf(²n反序输出为:n²);print(tail,0);}5.#include#defineSIZEsizeof(structnode)typedefstructnode{chardate;structnode*left,*right;}NODE;voidaddtree(NODE**t,charch){if((*t)==NULL){(*t)=(NODE*)malloc(SIZE);(*t)->date=ch;(*t)->left=(*t)->right=NULL;return;122 }elseif(ch<(*t)->date)addtree(&((*t)->left),ch);elseaddtree(&((*t)->right),ch);}voidprint(NODE*p){if(p!=NULL){print(p->left);printf("%c",p->date);print(p->right);}}main(){NODE*root;charch;root=NULL;while((ch=getchar())!=EOF)addtree(&root,ch);printf("n输出为:n");print(root);}6.#includetypedefstructnode{intdata;structnode*link;}NODE;voidcreat(NODE**x,NODE**y,intn){(*x)=(structnode*)malloc(sizeof(NODE));(*x)->data=n;(*x)->link=(*y);(*y)=(*x);}voidprint(NODE*q){while(q!=NULL){printf("%6d",q->data);q=q->link;}}main(){NODE*p,*q,*s,*t;122 intn;q=t=NULL;printf("n请输入系列整数(以0结束):");scanf("%d",&n);while(n!=0){if(n>0)creat(&p,&q,n);elsecreat(&s,&t,n);scanf("%d",&n);}printf("n正数为:n");print(q);printf("n负数为:n");print(t);}第10章文件习题一.选择题1.若想将对文本文件只能进行读操作,打开此文件的方式可为。A.²r²B.²w²C.²a²D.²r+²2.一般情况下,文件占用存储空间较多;A.二进制文件B.文本文件C.随机文件D.顺序文件3.在写入文件中,回车换行符会转换为回车符。A.二进制文件B.文本文件C.随机文件D.顺序文件4.用fopen()函数打开缓冲文件,使用完毕后可用函数关闭它。A.fopenB.openC.fcloseD.close二.填空题1.C语言中文件按存放方式分为文件和文件。2.文件使用之前必须先文件,使用完毕后必须文件。3.按²r²方式打开的文件只能进行操作。4.文件的顺序读写时,文件位置指针的移动由控制;文件的随机读写时,文件位置指针的移动由控制。三.阅读题122 1.#includemain(){intch;charoutname[20];FILE*out;printf(²n请输入文件名:²);scanf(²%s²,outname);out=fopen(outname,²r²);ch=fgetc(out);while(ch!=EOF){putchar(in);ch=fgetc(out);}fclose(out);}试分析此程序的功能。2.#includemain(){intx[10],i;charoutname[20];FILE*fp;printf(²n请输入文件名:²);scanf(²%s²,outname);fp=fopen(outname,²rb+²);while(!eof(fp)){fread(x,sizeof(int),10,fp);for(i=0;i<10;i++)x[i]+=10;fseek(fp,-10L*sizeof(int),SEEK_CUR);fwrite(x,sizeof(int),10,fp);}fclose(out);}试分析此程序的功能。3.下面程序用变量count统计文件中英文字母的个数。请在处填上适当的内容。#includemain(){intch;FILE*fp;longcount;if(fp==NULL)122 {printf(²不能打开文件file.txtn²);exit(0);}while(!eof(fp)){if(ch>=¢a¢&&ch<=¢z¢||ch>=¢A¢&&ch<=¢Z¢)count++;}fclose(fp);}}4.要在文件中追加由键盘输入的内容,阅读下面程序,在上填上适当的内容。#includemain(){intx[10],i;charfilename[20];printf(²n请输入文件名:²);scanf(²%s²,filename);fp=fopen(outname,);for(i=0;i<10;i++)scanf(²%d²,&x[i]);fwrite(x,sizeof(int),10,fp);}}四.编程题1.从键盘输入10个实型数据存入文件file1中。2.将file1中数据排序后重新放入文件file1中。3.将一从键盘输入的一实数插入到文件file1中。4.编程,将全班同学的姓名、地址和电话号码写到一文件address中。附加题一.选择题1.有关文件,下列叙述是正确的。A.在程序开始运行时,系统自动打开所有在程序中使用的文件。B.用EOF可检测对任何文件的操作是否已到文件尾。C.C语言文件只能进行顺序读写,而不能进行随机读写。D.在程序运行结束时,应该关闭所有在程序中使用的文件。2.若fp是指向某文件的指针,且已读到文件末尾,则库函数feof(fp)的返回值是A.EOFB.-1C.非零值D.NULL3.系统输出的标准文件是指。A.键盘B.显示器C.软盘D.硬盘4.可以作为fopen函数中的第一个参数的正确格式是。A.c:\tmp\file1B.²c:\tmp\file1²122 C.c:tmpfile1D.²c:tmpfile1²5.不能使文件的位置指针移到文件的开头的函数调用是。A.rewind(fp);B.feek(fp,0L,0);C.feek(fp,0L,SEEK_SET);D.FEEK(fp,0L,1);6.若对文件的操作未到文件尾时,feof(fp)函数的返回值是。A.EOFB.1C.0D.不定的非零值7.若想对已有的文件进行改写,则能用方式打开此文件。A.²w+²B.²w²C.²r+²D.²a²二.填空题1.设有文件指针fp,则将文件位置指针移到文件的开头位置的函数调用有和。2.C语言中的文件可看作是一连串的字符(字节),而不考虑记录的界限,因此也将其称为文件。3.ANSIC语言中,在时,系统自动打开三个标准文件:标准输入、标准输出和标准出错输出。4.用方式打开文件,意味着该文件已经存在,可以读,也可以写。用方式打开文件,意味着新建此文件,需先写后读。用方式打开文件,若有文件,意味着文件位置指针已移到文件尾,可写也可读;若没有此文件,则建立此文件,先写后读。5.利用函数可以根据需要任意移动文件位置指针,即意味可以对文件进行随即读写。6.对于在程序中用fopen()函数打开的文件,一旦不再使用,最好应及时用fclose()函数关闭它,一方面是为了节省内存资源,另一方面是为了。三.阅读题1.下面程序片段是把从终端读入的文本(用@作为文本结束标志)输出到一个名为bi.dat的新文件中。请在处填上适当内容。FILE*fp;charch;if((fp=fopen())==NULL)exit(0);while((ch=getchar())!=¢@¢)fputc(ch,fp);fclose(fp);2.以下程序的功能是:从键盘上输入一个字符串,把该字符串中的小写字母转换为大写字母,输出到文件test.txt中,然后从该文件读出字符串并显示出来。请填空。#includemain(){FILE*fp;charstr[100];inti=0;if((fp=fopen(²text.txt²,))==NULL){printf(²ncan"topenthisfile.²);exit(0);}printf(²ninputastring:²);122 gets(str);while(str[i]){if(str[i]>=¢a¢&&str[i]<=¢z¢)str[i]=str[i]-¢a¢+¢A¢;i++;}fclose(fp);fp=fopen(²test.txt²,);fgets(str,100,fp);printf(²n%s²,str);fclose(fp);}3.有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件C中。请在上填上适当的语句。#includemain(){inti,j,n,ni;charc[160],t,ch;if((fp=fopen(²file1²,²r²))==NULL){printf(²nfilefile1cannotbeopened²);exit(0);}printf(²nfile1contentsare:n²);for(i=0;(ch=fgetc(fp))!=EOF;i++){c[i]=ch;putchar(c[i]);}fclose(fp);if((fp=fopen(²file2²,²r²))==NULL){printf(²filefile2cannotbeopenedn²);exit(0);}printf(²nfile2contentsare:n²);for(i=ni;(ch=fgetc(fp))!=EOF;i++){c[i]=ch;putchar(c[i]);}fclose(fp);n=i;for(i=0;ic[j]){t=c[i];c[i]=c[j];c[j]=t;}printf(²nCfileis:n²);fp=fopen(²file3²,²w²);for(i=0;imain(){FILE*fp;longnum=0L;if((fp=fopen(²file1²,²r²))==NULL){printf(²nCan"topenfile.²);exit(1);}while(){fgetc(fp);}printf(²nnum=%ld²,num);fclose(fp);}5.有五个学生,每个学生有3门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成绩),计算出平均成绩,并将原有的数据和计算出的平均分数存放在磁盘文件“stud”中。请填空。#includestructstudent{charnum[6];charname[8];intscore[3];floatavr;}stu[5];main(){inti,j,sum;FILE*fp;for(i=0;i<5;i++){printf(²npleaseinputNo.%dscore:n²,i);printf(²stuNo:²);scanf(²%s²,stu[i].num);printf(²name:²);122 scanf(²%s²,stu[i].name);sum=0;for(j=0;j<3;j++){printf(²score%d.²,j+1);scanf(²%d²,&stu[i].score[j]);sum+=stu[i].score[j];}}fp=fopen(²stud²,²w²);for(i=0;i<5;i++)fclose(fp);}6.下面程序是利用fputc函数写一函数putd(d,fp)将double类型量d写入fp所指文件中并返回d的值。请填空。doubleputd(doubled,FILE*fp){s=(char*)&d;putc(s[0],fp);putc(s[1],fp);putc(s[2],fp);putc(s[3],fp);}四.编程题1.文本文件file中存放有10个整数,求其平均值,并将其中与平均值最接近的数删除。2.将两文件file2、file3合并后存放在file1中。3.建立存放角度为0°~360°(每隔1°)的正弦函数值的文件;然后通过查找文件,求出角度x(整型)的正弦函数值。4.利用fputc函数写一函数myputw(w,fp)将整数w写入fp所指文件中;利用fgetc函数写一函数mygetw(fp)从fp所所指文件中读出一整数。然后编程利用myputw()将一整数写入文件中,再用mygetw()从文件中读出。5.编程,输出一文本文件,并在每行前输出行号。6.编程,找出一个文本文件中最长和最短的行(假设文件中每行不超过80个字符)。习题答案一、单选题1.A2.B3.B4.C二、填空题1.二进制文件,文本文件2.打开,关闭3.读4.系统自动,程序语句122 三、阅读题1.在屏幕上显示一个文本文件的内容2.将一二进制文件中每个整型数据增加10。3.fp=fopen(²file.txt²,²r²);ch=getchar(fp);4.FILE*fp;,fclose(fp);四、编程题1.#includemain(){inti;floatx[10];FILE*fp;printf(²n请输入十个实数:²);for(i=0;i<10;i++)scanf(²%f²,&x[i]);fp=fopen(²file1²,²wb²);fwrite(x,sizeof(float),10,fp);fclose(fp);}2.#includemain(){inti,j,k;floatx[10],tmp;FILE*fp;fp=fopen(²file1²,²rb+²);fread(x,sizeof(float),10,fp);printf(²n²);for(i=0;i<10;i++)printf(²%6.1f²,x[i]);for(i=0;i<10;i++)for(j=i;j<10;j++)if(x[i]main(){floatx;FILE*fp;printf(²n²);scanf(²%f²,&x);fp=fopen(²file1²,²ab²);fwrite(&x,sizeof(float),1,fp);fclose(fp);}4.#defineN40#includemain(){inti,n;structstndent{charname[8];charadd[50];chartele[15];}stu[N];FILE*fp;printf(²n请输入全班人数:²);scanf(²%d²,&n);fp=fopen(²address²,²w²);for(i=0;i#includemain(){intm[10],i=0,k;floatave=0;FILE*fp;fp=fopen(²file²,²r²);for(i=0;i<10;i++){fscanf(fp,²%d²,&m[i]);ave+=m[i];}fclose(fp);ave/=10;k=0;for(i=1;i<10;i++)if(fabs(m[i]-ave)main(){charch;FILE*in,*out;out=fopen(²file2²,²r²);in=fopen(²file1²,²w²);while(!feof(out))122 fputc(fgetc(out),in);fclose(out);out=fopen(²file3²,²r²);while(!feof(out))fputc(fgetc(out),in);fclose(out);fclose(in);}3.#include#includemain(){intx,t;floaty;FILE*fp;fp=fopen(²sinusoid²,²w+²);for(x=0;x<360;x++){y=sin(x*3.14/180);fwrite(y,sizeof(float),1,fp);}wrind(fp);printf(²n请输入一角度(整型,单位:度):²);scanf(²%d²,&x);t=x%360;fseek(fp,t*sizeof(float),SEEK_SET);fread(&y,sizeof(float),i,fp)fclose(fp);print(²nsin(%d)=%6.4f²,y);}4.#includeintmygetw(FILE*fp){char*s;intm;s=(char*)&m;s[0]=getc(fp);s[1]=getc(fp);return(m);}intmyputw(intm,FILE*p){char*s;122 s=(char*)&m;putc(s[0],fp);putc(s[1],fp);reurn(m);}main{intm;FILE*fp;printf(²n请输入一个整数:²);scanf(²%d²,&m);fp=fopen(²file²,²w²);myputw(m,fp);fclose(fp);fp=fopen(²file²,²r²);m=mygetw(fp);fclose(fp);printf(²n%d²,m);}5.#includemain(){intm=0;charstring[81];FILE*fp;fp=fopen(²file²,²r²);while(!feof(fp)){fgets(string,80,fp);m++;printf(²%d%s²,m,string);}fclose(fp);}6.#include#includemain(){intmax=0,min=81,tmp,i=0,m,n;charstring[81];FILE*fp;fp=fopen(²file²,²r²);122 while(!feof(fp)){fgets(string,80,fp);i++;tmp=strlen(string);if(tmp>max){m=i;max=tmp;}if(tmp#includevoidinitg();floatprod[7],perc[7];char*fruit[]={"Apple","Banana","Pear","Orange","Grape","Peach",""};122 main(){inti,j;floatsum=0;printf("Entertheoutputoffruit:n");for(i=1;i<7;i++){printf("%s:",fruit[i-1]);scanf("%f",&prod[i]);perc[i]=prod[i];sum=sum+prod[i];}for(i=1;i<7;i++){perc[i]=perc[i]/sum*100;printf("%fn",perc[i]);}prod[0]=0;prod[7]=6.28;for(i=1;i<7;i++)prod[i]=prod[i]/sum*2*3.1415;for(i=1;i<7;i++)prod[i]=prod[i]+prod[i-1];initg();}voidinitg(){inti,x,y,x1,y1,driver=DETECT,mode;detectgraph(&driver,&mode);initgraph(&driver,&mode,"d:\tc\bgi");setbkcolor(BLUE);setcolor(WHITE);x=300+150*cos(prod[0]);y=230-150*sin(prod[0]);for(i=1;i<8;i++){setcolor(i+1);outtextxy(10+80*i,400,fruit[i-1]);arc(300,230,prod[i-1]*180/3.14,prod[i]*180/3.14+1,150);line(300,230,x,y);x=300+150*cos(prod[i]);y=230-150*sin(prod[i]);x1=300+130*cos((prod[i-1]+prod[i])/2);y1=230-130*sin((prod[i-1]+prod[i])/2);line(300,230,x,y);setfillstyle(7,i+1);floodfill(x1,y1,i+1);}122 for(i=0;i<26;i++)printf("n");printf("");for(i=1;i<7;i++){printf("%5.2f%",perc[i]);}getch();closegraph();}3.根据题意,编程如下:#include#includevoidinitg();floatprod[7],perc[7];char*fruit[]={"Apple","Banana","Pear","Orange","Grape","Peach",""};main(){inti,j;floatsum=0;printf("Entertheoutputoffruit:n");for(i=1;i<7;i++){printf("%s:",fruit[i-1]);scanf("%f",&prod[i]);perc[i]=prod[i];sum=sum+prod[i];}for(i=1;i<7;i++){perc[i]=perc[i]/sum*100;printf("%fn",perc[i]);}prod[0]=0;prod[7]=6.28;for(i=1;i<7;i++)prod[i]=prod[i]/sum*2*3.1415;for(i=1;i<7;i++)prod[i]=prod[i]+prod[i-1];initg();}122 voidinitg(){inti,x,y,x1,y1,driver=DETECT,mode;detectgraph(&driver,&mode);initgraph(&driver,&mode,"d:\tc\bgi");setbkcolor(BLUE);setcolor(WHITE);x=300+150*cos(prod[0]);y=230-150*sin(prod[0]);for(i=1;i<8;i++){setcolor(i+1);outtextxy(10+80*i,400,fruit[i-1]);arc(300,230,prod[i-1]*180/3.14,prod[i]*180/3.14+1,150);line(300,230,x,y);x=300+150*cos(prod[i]);y=230-150*sin(prod[i]);x1=300+130*cos((prod[i-1]+prod[i])/2);y1=230-130*sin((prod[i-1]+prod[i])/2);line(300,230,x,y);setfillstyle(7,i+1);floodfill(x1,y1,i+1);}for(i=0;i<26;i++)printf("n");printf("");for(i=1;i<7;i++){printf("%5.2f%",perc[i]);}getch();closegraph();}4.略122'