首页 C课件计算机C实验指导书(新)

C课件计算机C实验指导书(新)

举报
开通vip

C课件计算机C实验指导书(新)集美大学计算机工程学院 《高级级语言程序设计实验指导及习题集》 共84页 第14页 第一部分 上机实验总的目的和要求 一、上机实验目的 学习C语言程序设计课程必须重视实践环节。即独立编写出程序,独立上机调试程序。必须保证有足够的上机实验时间。 上机实验的目的,绝不仅是为了验证教材和讲课的内容或者验证自己所编的程序正确与否。学习程序设计,上机实验的目的: 1 、加深对讲授内容的理解,尤其是一些语法规定,光靠课堂讲授,既枯燥无...

C课件计算机C实验指导书(新)
集美大学计算机 工程 路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理 学院 《高级级语言程序 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 实验指导及习 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 集》 共84页 第14页 第一部分 上机实验总的目的和要求 一、上机实验目的 学习C语言程序设计课程必须重视实践环节。即独立编写出程序,独立上机调试程序。必须保证有足够的上机实验时间。 上机实验的目的,绝不仅是为了验证教材和讲课的内容或者验证自己所编的程序正确与否。学习程序设计,上机实验的目的: 1 、加深对讲授内容的理解,尤其是一些语法规定,光靠课堂讲授,既枯燥无味又难以记住,但它们都很重要。通过多次上机,就能自然地、熟练地掌握。通过上机来掌握语法规则是行之有效的方法。 2 、熟悉所用的计算机系统的操作方法,也就是了解和熟悉C语言程序开发的环境。一个程序必须在一定的外部环境下才能运行,所谓"环境",就是指所用的计算机系统的硬件和软件条件。使用者应该了解为了运行一个C程序,需要哪些必要的外部条件(例如硬件配置、软件配置),可以利用哪些系统的功能来帮助自己开发程序。每一种计算机系统的功能和操作方法不完全相同,但只要熟练掌握一、二种计算机系统的使用,再遇到其它的 系统时便会触类旁通,很快地学会。 3 、学会上机调试程序。也就是善于发现程序中的错误,并且能很快地排除这些错误,使程序能正确运行。经验丰富的人,当编译时出现"出错信息"时,能很快地判断出错误所在,并改正之。而缺乏经验的人即使在明确的出错提示下也往往找不出错误而求救于别人。计算机技术是实践性很强的技术,要求从事这一领域的人不仅能了解和熟悉有关理论和方法,还要求自己动手实现。对程序设计来说,要求会编程序并上机调试通过。因此调试程序本身是程序设计课程的一个重要的内容和基本要求,应给予充分的重视。调试程序的经验固然可以借鉴他人的现成经验,但更重要的是通过自己的直接实践来累积,而且有些经验是只能"会意"难以"言传"。别人的经验不能代替自己的经验,调试程序的能力是每个程序设计人员应当掌握的一项基本功。 因此,在实验时千万不要在程序通过后就认为万事大吉、完成任务了,而应当在已通过的程序基础上作一些改动(例如修改一些参数、增加程序一些功能、改变输入数据的方法等卜再进行编译、连接和运行。甚至于"自设障碍",即把正确的程序改为有错的(例如用scanf函数输入变量时,漏写"&"符号:使数组下标出界;使整数溢出等),观察和分析所出现的情况。这样的学习才会有真正的收获,是灵活主动地学习而不是固板被动的学习。 2、 上机实验前的准备工作 在上机实验前应事先做好准备工作,以提高上机实验的效率,准备工作至少应包括如下五个方面: · 了解所用的计算机系统的性能和使用方法(包括C编译系统) · 复习和掌握与本实验有关的教学内容 · 准备好上机所需的程序。程序应书写整齐,并经人工检查无误后才能上机,以提高上机效率。初学者切忌不编程序或抄别人程序去上机,应从一开始就养成严谨的科学作风。 · 对运行中可能出现的问题应事先作出估计;对程序中自己有疑问的地方,应作上记号,以便上机时给予注意。 · 准备好调试和运行时所需的数据。 三、 上机实验的步骤 一个C源程序编写完成后,就可以进入输入、编译连接与运行的过程。 1.源程序的输入 用户编写好的C源程序只有输入进行计算机经处理后才能运行。因此,上机运行程序的第一步是输入源程序、建立源文件。 2.编译 编译通过后,即生成相应的目标程序,它是由计算机能识别的机器代码所组成的。 3.连接 所谓连接,是指将编译生成的目标程序文件与被调用函数的目标模块进行连接,最后生成一个计算机真正能执行的可执行文件。 在连接的过程中,也要进行查错,主要是检查调用、各模块之间的联系以及存储空间等方面的错误。如果发现有连接错误,则要对源程序进行编辑修改,然后重新进行编译和连接。 4.运行 源程序经过文件的编辑、编译和连接过程,并且无错误发生,最后生成可执行文件后,就可以运行该可执行文件,得到所需要的结果。 必须指出,编译连接过程虽然能发现源程序中的大部分语法等错误,但不能发现程序中的全部错误,特别是不能发现逻辑错误(应该实现的功能未实现)。在这种情况下,还需要对源程序进行编辑修改,然后再进行编译连接,直到运行结果正确为止。 上机过程出现的问题,除了系统的问题外,一般应自己独立处理,不要轻易举手问老师,尤其对“出错信息“,应善于自己分析判断。这是学习调试程序的良好机会,上机实验一般应包括以下几个步骤: · 调出C编译系统,进入C工作环境(如Turbo C集成环境,VC++6.0集成环境) · 输入自己编好的程序(默认扩展名.C,应采用正确的指法击键) · 检查一遍已输入的程序是否有错(包括输入时打错的和编程中的错误),如发现有错,则及时改正。 · 进行编译,生成目标文件(扩展名为.OBJ)与可执行文件(扩展名为.EXE)。若在编译和连接过程中发现错误,屏幕上会出现“出错信息“,根据提示找到出错位置和原因,加以改正,再进行编译……直到顺利通过编译和连接为止。 · 运行程序,并分析运行结果是否合理和正确。如果在这一步中发现有错误,则要重新调用编辑程序对源程序进行编辑修改,再进行编译、连接与运行,直到没有错误为止。 · 输出程序清单和运行结果 四、 实验后应完成实验报告的填写 实验结束后, 要整理实验结果并认真分析和总结, 根据教师要求写出实验报告.。 实验报告一般包括如下内容: · 实验内容:     实验题目与要求. · 算法说明:    用文字或流程图说明. · 程序清单: · 运行结果:    原始数据, 相应的运行结果和必要的说明. · 分析与思考:  调试过程及调试中遇到的问题及解决办法;调试程序的心得与体会;其他算法的存在与实践等. 若最终未完成调试, 要认真找出错误并分析原因等. 五、 程序错误类型及测试 1 程序错误的类型 为帮助同学调试程序和分析程序,下面简单介绍程序出错的种类 1、语法错误:不符合C语言的语法规定。 1)函数、语句拼写错误(printf写为pintf) 2)括弧不匹配 3)语句最后漏了分号 2、逻辑错误:程序无语法错误,也能正常运行,但结果不对。 这类错误可能是设计算法时的错误,也可能是算法正确而在编写程序时出现,一般较难发现,必须认真检查。 3、运行错误:有时程序既无语法错误,又无逻辑错误,但不能正常运行或结果不对。多数情况是数据不对,包括数据本身不合适以及数据类型不匹配。 2 程序的调试(debugging) 1、程序调试的任务:是排除程序中的错误,使程序能顺利地运行并得到预期的效果。 程序的调试阶段不仅要发现和消除语法上的错误,还要发现和消除逻辑错误和运行错误。 2、程序测试的任务:是尽力寻找程序中可能存在的错误。 在测试时要设想到程序运行时的各种情况,测试在各种情况下的运行结果是否正确。程序测试是程序调试的一个组成部分 3.Visual C++ 调试功能: Visual C++内置了强大的调试功能。调试发生在你已经成功地进行了编译、连接,得到了可执行程序,但是程序执行的结果不正确的情况下。调试是修改你的代码以便它能够正确工作的过程。Developer Studio提供了许多工具帮助你跟踪和定位错误。调试系统提供特殊的菜单、窗口、对话框等来为开发者提供帮助。 · 调试命令: 有关调试的命令分散在Build、Debug、View和Edit菜单中。 Build菜单包含一个Start Debug子菜单,其中的命令是Debug菜单命令的子集,包括:启动调试过程(Go)、单步跟踪( Step Into) 和运行到光标处( Run To Cursor).当启动调试进程后,Build菜单会被Debug菜单代替,Debug菜单包含各种控制程序执行的命令,如单步执行、进入函数体、从函数体中出来、运行到光标所在位置等。View菜单包含一些命令,可以控制显示各种与调试有关的窗口,如变量窗口(Variables window)、调用栈窗口(Call Stack window)等。Edit菜单下的Breakpoints命令可以打开一个对话框,在其中可以插入、删除、启动、停止各个断点。 · 设置断点:你可以控制程序直接运行到指定地点,然后查看运行到这个地方时程序的状态,如变量的值、调用栈的情况等。你可以通过设置断点来达到这一目的。设置断点的方式是:将光标移到要设置断点的地方,按F9,这时会有一个红的圆点出现在代码行的左边。如果你想取消断点,将光标移动到设置断点的代码行,按F9。 · 启动调试:按F5或者在Build菜单中,选择Start Debug然后选择Go,就可以启动调试程序。程序会一直运行到需要用户输入或者有断点的代码处。 · 查看变量值: 查看变量值有多种方式,你可以选择你喜欢的方式进行。1)你可以将鼠标移动到程序的变量名处,系统会自动为你显示变量的值;2)复杂变量(如对象)可以通过QuickWatch查看,方法是:将光标定位到所要查看值的变量处,按鼠标右键,选择QuickWatch菜单,就可以看到变量值。3)启动调试程序后,屏幕下方将会出现两个输出窗口,一个是Watch,另一个是Variable。Watch窗口显示变量名和变量值,你可以在Watch窗口中加上你想观察值的变量名,也可以直接从源代码中选择变量名,并把它拖动到Watch窗口中。Variable窗口显示程序当前运行上下文涉及的变量的值。 · 控制程序执行: 你可以控制程序单步执行(F10)、跟踪到一个函数内部(F11)、从一个函数运行出来(shift+F11)、运行到光标所在位置(Ctrl+F10),以便方便地调试程序。这些命令用于在某个局部范围详细地调试程序。你也可以通过设置断点(F9)然后用直接运行(GO或者F5)来控制程序直接运行到断点位置。如果你设置了多个断点,程序将会在遇到的第一个断点处停下来。要从断点处继续运行,可以用上面所说的各种命令(F5, F10, F11, Shift+F11, Ctrl+F10)。 · 结束调试:要结束调试,可以按shift+F5或者选择菜单Debug|Stop Debugging。当结束调试后,所有调试窗口会自动关闭,Debug菜单也会自动还原为Build菜单。 第二部分 实验环境介绍 一、Turbo C的使用 1. 编辑一个新文件 1)按〈F10〉键激活【File】主菜单,按回车键弹出子菜单(或者按〈Alt〉+〈F〉组合键),选择子菜单【New】,(见图1),回车后进入编辑状态。光标定位在左上角(第一行、第一列)。 图1 文件菜单 2)编辑过程中,可用〈Ins〉键转换插入/改写状态和〈Del〉键删除字符。 3)按〈Ctel〉+〈Y〉组合键可删除光标所在一行。 4)按〈Ctel〉+〈N〉组合键可插入一行。 2.保存文件 按〈F10〉键并按回车(或者按〈Alt〉+〈F〉组合键),选择子菜单【Save】,按回车键后,Tc会弹出一个对话框。用户可按自己的习惯指定文件名,然后,此源文件就以此文件名存在用户工作目录中。如果用户指定目录路径,则文件存入用户指定的目录中。 用户可设置改变用户工作目录,方法是按〈Alt〉+〈F〉组合键,选择【Change dir】,回车后,就会弹出新目录输入框,提示用户输入自己选择的(或建立的)工作目录名,如图2。但应注意,输入的目录必须已存在,否则,系统会报错。 图2 改变用户工作目录 3. 打开一个已存在的文件 按〈Alt〉+〈F〉组合键,选择【Load】,这时屏幕上会出现一个*.c的“装入文件”对话框,用户可以在此处输入要打开的文件名,或者直接按回车,则Turbo C会显示当前工作目录下所有后缀为.c的文件名,可以通过光标移动键移到要打开的文件上(“..”表示到上级目录),按回车键就可进入编辑窗口,对此文件进行编辑。 文件修改完后,若要另外保存文件(原文件还将保存),可在【File】菜单下选择【Write to】(相当于“另存为”),回车后,显示的窗口,输入要保存的文件名即可。 4.编译和连接 编辑好源程序后, 应对源程序进行编译、连接。可用以下方法中的任一种。 1)按〈F10〉键,将亮条移到【Compile】处后按回车键(或按〈Alt〉+〈C〉组合键),选择【Complie to OBJ】,按回车键就可进行编译。编译完成后,选择【Compile】中的【Link EXE file】,然后按回车键,就可以执行连接,见图3。 图3 对源程序进行编译 2)按〈Alt〉+〈C〉组合键选中编译菜单,从中选择【Make EXE file】项,按回车键后一次完成编译和连接。 3)按〈F9〉键可一次完成编译和连接。 · 注意:生成的中间文件*.obj和最终文件*.exe保存在当前工作目录和配置文件TC-CONFIG(TC的工作环境配置文件)指定的目录中。 5.运行 1)DOS环境下运行。在DOS窗口下,输入所生成的最终输出文件名即可运行(注意路径要正确)。 2)TC集成环境下运行。按〈F10〉键,选择【Run】(或者直接按〈Alt〉+〈R〉组合键),按回车键后,在弹出的子菜单上选择【Run】并按回车键即可运行。 3)直接按〈Ctrl〉+〈F9〉组合键即可运行。实际上此方法是将编译、连接和运行一起完成。 · 注意:此时按〈Alt〉+〈F5〉组合键可观看运行结果,按任一键可返回编辑状态。 6.确立TC工作环境 按〈F10〉键,选择【Options】主菜单后按回车键,在弹出的窗口选择【Directories】项,按回车键后又弹出的窗口。 其中: >Include directories: C:\TC\INCLDE表示头文件的默认目录。 >Library directories: C:\TC\LIB表示TC的库文件默认目录。 >Output directory: C:\TC\Liq.OUT表示用户可指定自己存放*.exe和*.obj文件的目录。 >Turbo C directory: C:\TC表示Install建立的默认目录。这个用户无需改。 用户设置完成后,还应当把这些信息保存下来。方法是选择【Options】主菜单,并按回车键后选择【Save options】子菜单,再按回车键后,系统提示输入配置文件名,直接按回车键使用系统默认即可。 二、Visual C++6.0的使用 1. Visual C++简介 Visual C++是Microsoft公司的Visual Studio开发工具箱中的一个C++程序开发包。VisualStudio提供了一整套开发Internet和Windows应用程序的工具,包括VisualC++, Visual Basic, Visual Foxpro, Visual InterDev, Visual J++以及其他辅助工具,如代码管理工具Visual SourceSafe和联机帮助系统MSDN。Visual C++包中除包括C++编译器外,还包括所有的库、例子和为创建Windows应用程序所需要的文档。 从最早期的1.0版本,发展到最新的6.0版本,Visual C++已经有了很大的变化,在界面、功能、库支持方面都有许多的增强。最新的6.0版本在编译器、MFC类库、编辑器以及联机帮助系统等方面都比以前的版本做了较大改进。Visual C++一般分为三个版本:学习版、专业版和企业版,不同的版本适合于不同类型的应用开发。实验中可以使用这三个版本的任意一种。 Visual C++集成开发环境(IDE) 集成开发环境(IDE)是一个将程序编辑器、编译器、调试工具和其他建立应用程序的工具集成在一起的用于开发应用程序的软件系统。Visual C++软件包中的Developer Studio就是一个集成开发环境,它集成了各种开发工具和VC编译器。程序员可以在不离开该环境的情况下编辑、编译、调试和运行一个应用程序。IDE中还提供大量在线帮助信息协助程序员做好开发工作。Developer Studio中除了程序编辑器、资源编辑器、编译器、调试器外,还有各种工具和向导(如AppWizard和ClassWizard),以及MFC类库,这些都可以帮助程序员快速而正确地开发出应用程序。 向导(Wizard) 向导是一个通过一步步的帮助引导你工作的工具。Developer Studio中包含三个向导,用来帮助程序员开发简单的Windows程序,它们是: AppWizard:用来创建一个Windows程序的基本框架结构。AppWizard向导会一步步向程序员提出问题,询问他所创建的项目的特征,然后AppWizard会根据这些特征自动生成一个可以执行的程序框架,程序员然后可以在这个框架下进一步填充内容。AppWizard支持三类程序:基于视图/文档结构的单文档应用、基于视图/文档结构的多文档应用程序和基于对话框的应用程序。也可以利用AppWizard生成最简单的控制台应用程序(类似于DOS下用字符输入输出的程序)。 ClassWizard:用来定义AppWizard所创建的程序中的类。可以利用ClassWizard在项目中增加类、为类增加处理消息的函数等。ClassWizard也可以管理包含在对话框中的控件,它可以将MFC对象或者类的成员变量与对话框中的控件联系起来。 ActiveX Control Wizard:用于创建一个ActiveX控件的基本框架结构。ActiveX控件是用户自定义的控件,它支持一系列定义的接口,可以作为一个可再利用的组件。 MFC库 库(library)是可以重复使用的源代码和目标代码的集合。MFC(Microsoft Fundamental Casses)是Visual C++开发环境所带的类库,在该类库中提供了大量的类,可以帮助开发人员快速建立应用程序。这些类可以提供程序框架、进行文件和数据库操作、建立网络连接、进行绘图和打印等各种通用的应用程序操作。使用MFC库开发应用程序可以减少很多工作量。 2. 项目开发过程 在一个集成的开发环境中开发项目非常容易。一个用C++开发的项目的通用开发过程可以用左图表示。 建立一个项目的第一步是利用编辑器建立程序代码文件,包括头文件、代码文件、资源文件等。然后,启动编译程序,编译程序首先调用预处理程序处理程序中的预处理命令(如#include,#define等),经过预处理程序处理的代码将作为编译程序的输入。编译对用户程序进行词法和语法分析,建立目标文件,文件中包括机器代码、连接指令、外部引用以及从该源文件中产生的函数和数据名。此后,连接程序将所有的目标代码和用到的静态连接库的代码连接起来,为所有的外部变量和函数找到其提供地点,最后产生一个可执行文件。一般有一个makefile文件来协调各个部分产生可执行文件。 可执行文件分为两种版本:Debug和Release。Debug版本用于程序的开发过程,该版本产生的可执行程序带有大量的调试信息,可以供调试程序使用,而Release版本作为最终的发行版本,没有调试信息,并且带有某种形式的优化。学员在上机实习过程中可以采用Debug版本,这样便于调试。 选择是产生Debug版本还是Release版本的方法是:在Developer Studio中选择菜单Build|Set Active Configuration,在弹出的对话框中,选择所要的类型,然后选择OK关闭对话框。 Visual C++ 集成开发环境中集成了编辑器、编译器、连接器以及调试程序,覆盖了的开发应用程序的整个过程,程序员不需要脱离这个开发环境就可以开发出完整的应用程序。 3. 运行方法 将C程序分为单文件程序和多文件程序。下面分别介绍在Visual C++6.0系统中运行这两类程序的方法。 1. 运行单文件程序 所谓单文件程序是指一个程序只由一个源文件组成,在初学C语言时,大多数情况下编写的程序都是这类程序。编辑运行单文件程序的步骤如下: 【第1步】双击桌面上的“Microsoft Visual C++ 6.0”图标,出现如图 1所示的 Visual C++ 6.0系统界面。 图 1 “Microsoft Visual C++ 6.0”系统界面 【第2步】从File菜单中选择“New”命令,出现“New”对话框,从中选择“Files”选项卡,选择“C++ Source File”选项,如图 2所示。 图 2 “New”对话框 【第3步】单击右侧的“...”命令按钮(用于设置存放C程序文件的文件夹),出现如图 3所示的“Choose Directory”对话框。选取d:盘中的“C实验教程”文件夹,单击“OK”命令按钮返回。 图 3 “Choose Directory”对话框 【第4步】在“File”文本框中输入“charp1_1”(表示以c1.cpp文件存放当前程序),如图 4所示,单击“OK”命令按钮返回。 图 4 “New”对话框 【第5步】在出现的charp1_1.cpp编辑框中输入程序,如图 5所示。 在输入程序时要随时保存程序文件(使用“Files”菜单中的“Save”命令,或单击左上方的保存图标),以免出现意外导致程序丢失。 图 5 “charp1_1.cpp”编辑框 【第6步】在程序输入完毕,选择“Build”菜单中的“Compile c1.cpp”命令,在出现的所示提示框中选择“Yes”。这样产生了charp1_1.exe可执行文件。 【第7步】选择“Build”菜单中的“Execute c1.exe”命令,执行该程序。 【第8步】在执行程序中输入:2 5↙ 执行结果为:最大值:5 。最后用户按任一键返回。 2 运行多文件程序 所谓多文件程序是指一个程序中至少包含两个文件,可以是两个以上文件组成的一个程序。下面以举例来说明编译连接和运行这种程序的方法。该程序由三个文件组成: file1.cpp文件: #include extern void f1(),void f2(); main() { f1(); f2(); } file2.cpp文件: #include static void f3() { printf("file2:f3()\n"); } void f1() { printf("file2:f1()\n"); f3(); } file3.cpp文件: #include static void f3() { printf("file3:f3()\n"); } void f2() { printf("file3:f2()\n"); f3(); } 运行上述程序的步骤如下: 【第1步】在某个指定的目录下创建好C++的源文件(采用 1节的步骤)。例如,在d:\CBook\student1文件夹中建立好C++的源文件file1.cpp、file2.cpp和file3.cpp。 【第2步】创建一个新的项目文件。方法是先选择主菜单中的“File”,在它的下拉菜单中选择“New”命令,屏幕上出现“New”对话框,选择“Projects”选项卡,在“Project name”选框中输入所指定项目名字,如“stu”。在“Location”选框中,输入你要建立项目文件所需的源文件所在的路径,如“D:\C\stu”,如图 9所示。选中“Win32 Console Application”选项(一定要选中此选项,表示建立控制台应用程序,即建立和Turbo C运行环境相似的C程序),单击“OK”命令按钮。 图 6 “New”对话框的“Projects”选项卡页面 【第3步】在出现的如图 10所示“Win32 Console Application”对话框中单击“An empty project”选项(默认值),再单击“Finish”命令按钮。 图 7 “Win32 Console Applications”对话框 【第4步】在出现如图 11所示的“New Project Information”对话框中单击“OK”命令按钮。 图 8 “New Project Information”对话框 【第5步】在出现如图 12所示的“stu”项目界面中,选择Project菜单中“Add To Project”命令,再在出现的子菜单中选择“Files”命令,出现打开文件对话框,把file1.cpp、file2.cpp和file3.cpp依次添加到该项目中。 图 9 “Excise”项目界面 【第6步】选择“Build”菜单中的“Build Excise.exe”命令进行编连,结果如图 13所示,表示编连正确。 图 10 stu项目编连结果 【第7步】选择“Build”菜单中的“Execute Excise.exe”命令运行程序,即运行输出如下: file2:f1() file2:f3() file3:f2() file3:f3() 第三部分 上机实验内容 实验一 基础实验 一、实验目的: · 熟悉C语言的集成编译环境;掌握C程序的编辑、编译、链接以及运行等步骤;熟悉常用的调试信息并根据系统提示的信息进行C程序的修改;掌握查看程序运行结果的方法。 · 熟练掌握C语言中数据类型的概念和定义、声明变量的方式及对变量赋值的方法。 · 熟练掌握C程序各种运算符及其运算符的优先级和结合性、运算规则、运算对象、表达式(特别是关系表达式与逻辑表达式的使用方法)以及表达式运算过程中的类型转换。 · 熟练掌握scanf(getchar)/printf(putchar)库函数的调用格式及其使用,能够正确使用各种格式转换控制符。掌握各种类型数据的输入/输出的方法。 · 体会编程的方法。 · 进一步训练C程序的编辑、编译、链接和运行的过程并体会输出函数。 二、实验内容 1.下面C程序的功能是:通过键盘输入数据,计算并输出这些数据的和。(该程序有部分错误) #include void main() { int a,b,c,sum1; float x,y,z;sum2=0.0; printf(“Input int data:\n”); scanf(“%d%d%d”,&a,&b,&c); Sum1=a+b+c printf(“Output sum1=%d\n”,sum1); printf(“Input float data:\n); scanf(“%f,%f,%f”,&x,&y,&z); SUM2+=sum1; printf(Output sum2=%d\n,sum2); } 要求: (1)输入该程序,进行编译、链接,在编译的过程发现错误,根据信息窗口的提示检查源程序并进行修改,然后再进行编译链接,直到成功通过为止。并解释错误的原因。 (2)运行该程序、察看运行结果并体会输入格式。 2.计算三角形面积的程序源代码:程序有错请检查错误。 # include # include void main() { float a,b,c,s,area; scanf(“%f,%f,%f”,&a,&b,&c); s=(a+b+c)/2; area=sqrt(s*(s-a)*(s-b)*(s-c)); printf(“area=%d\n”,area); } 将上述文件保存到sy1_2.c。 这个源程序没有任何语法错误,能顺利通过编译和连接。在运行时输入:2.5,3.6,4.7↙输出结果为:area=0, 为什么? 4.输入下列程序: void main() { int a,b; float x,y; char c1,c2; scanf((a=%d,b=%d(,&a,&b); scanf((x=%f,y=%f(,&x,&y); scanf((c1=%c c2=%c(,&c1,&c2); printf((a=%d,b=%d,x=%f,y=%f,c1=%c,c2=%c\n(,a,b,x,y,c1,c2); } 要求: 1) 为了使变量的值为:a=10,b=255,x=123.456,y=-1.9,c1='a',c2='A', 则正确的数据输入形式是什么?体会输入格式串,说明为什么? 2) 什么样的输入格式最容易发现存在的错误?假定仍要得到上面的结果,你还可以将输入语句怎样改写? 5.按上面“输入、调试、编译、链接、执行”程序的步骤,完成下面程序的输入、编译、执行。 void main() { int x,y; x=32767; y=x+1; printf(“x=%d,y=%d\n”,x,y); } 分析上面程序的运行结果(分别在turboc2下及VC++6.0下执行),写出不同环境下的运行结果___________;并给出运行结果的说明。 6.编程,实现取一个整数a从右端开始的4~7位。 [问题讨论] 1.小结上机各个环节所出现的错误及解决的办法。 2 .记下在调试过程中所发现的错误、系统给出的出错信息和对策。分析讨论对策成功或失败的原因。 3. 总结C程序的结构和书写规则。 实验二 顺序结构和选择结构程序设计 一、实验目的 · 了解C语言表示逻辑量的方法(以0代表“假”,以1代表“真”) · 学会正确使用逻辑运算符和逻辑表达式; · 熟练掌握if 、if…else、if…elseif语句和switch语句格式及使用方法,掌握if语句中的嵌套关系和匹配原则,利用if语句和switch语句实现分支选择结构。 二、实验内容 1.输入下列程序,找出错误的地方,并说明错误原因。 a) 以下程序用来求一元二次方程实根,求根之前先判断有无实根,第一次输入"a=2.0,b=-2.0,c=1.0"; 第二次 输入"a=1.0,b=-4.0,c=4.00",分别输出正确的结果。 #include "stdio.h" void main() { float a,b,c,d,x1,x2; scanf("%f,%f,%f",&a,&b,&c); d=b*b-4*a*c; if (d<0) printf("该方程无实根。\n"); else if (fabs(d)0时,y=1。程序从第3行开始有3处错误,请改正并运行之,并说明原因,运行3次,分别输入2.30,-4.10,0,输出正确的函数值。 void main() { float x,y; printf("请输入x的值:\n x="); scanf("%f",x); if(x<0) y=-1; if(x=0) y=0; else y=1; printf("x=%3.2f,y=%3.2f",x,y); } 二、编程题: 1.编写程序,输入三角形三边 a、b、c,判断a、b、c能否构成三角形,若不能则输出相应的信息,若能则判断组成的是等腰、等边、直角还是一般三角形。 实验步骤与要求: (1) 输入一组数据3,4,8,观察程序运行结果,并与实验一中程序2做比较 (2)如果程序有误,可采用“跟踪打印”的调试方法,确定错误的出处。 2.计算表达式(形如3+5,9/3的四则运算式)的值 3.给出一个百分制成绩,要求输出成绩等级‘A’、‘B’、‘C’、‘D’、’E’,其中90分以上为‘A’,80-89分为‘B’,70~79分为‘C’,60~69分为‘D’,60分以下为‘E’。要求分别用if和switch来实现。修改程序,使能正确处理任何数据,当输入数据大于100或小于0时,显示“输入数据错误”,程序结束 [问题讨论] 1、 C语言中如何表示“真”和“假”? 2、 C编译系统中如何判断一个量的“真”“和“假”? 3、 如何实现交换两个变量的值? 4、 什么情况下的if语句可以用switch代替? 实验三、 循环结构程序设计 一、实验目的 · 熟练掌握while语句、do ...while语句和for语句格式及使用方法,掌握三种循环控制语句的循环过程以及循环结构的嵌套,利用循环语句实现循环结构。 · 掌握简单、常用的算法,并在编程过程中体验各种算法的编程技巧。进一步学习调试程序,掌握语法错误和逻辑错误的检查方法。 二、实验内容 1. 编写程序:根据 公式 小学单位换算公式大全免费下载公式下载行测公式大全下载excel公式下载逻辑回归公式下载 输出 π的值。 要求: 1) 变量π为单精度类型,n为整型; 2) 计算当n的取值分别为20,50 ,100,200时的π值,说明什么问题? 3) 修改程序,不给出n值,而改为求π值,直到最后一项的数值小于10-4 为止。 4) 对修改后的程序,输出π值以及总的项数n。输出格式为:π=值;n=值。  2. 从键盘输入一个0~1000之间的任意整数,输出该整数的所有因子(例如:输入12,其因子为1,2,3,4,6,12)。 要求: 1) 采用while循环语句实现。 2) 输出格式为:Input:12 Output:1,2,3,4,6,12  3 计算并输出1000以内最大的10个素数以及它们的和。 要求: 1) 在程序内部加必要的注释。 2) 由于偶数不是素数,可以不考虑对偶数的处理。 3) 虽然在1000以内的素数超过10个,但是要对1000以内不够10个素数的情况进行处理。 4) 输出形式为:素数1+素数2+素数+…+素数10=总和值。 4. 编程实现:由用户从键盘输入一串字符(以回车键结束),统计其中数字、大、小写字母、空格、其它字符的个数。(用系统提供的函数) 要求: 1) 通过键盘输入字符。 2) 给出相应的输入/输出信息提示。并按照数字、大写字母、小写字母、空格、其它字符数的顺序输出结果。 6. 请编程:将大于整数m且紧靠m的k个素数输出。例如:若输入17,5,则应输出:19,23,29,31,37。 7..计算 S = f(-n) + f(-n+1) +…+ f(0) + f(1) + f(2) +…+ f(n)的值。例如,当n为5时,函数值应为:10.407143。 ┌(x+1)/(x-2) x>0 f(x) = ┤0 x=0 或 x=2 └(x-1)/(x-2) x<0 8. 用C语言编程实现模拟电子时钟显示:要求显示在屏幕上的第15行30列上,其格式:小时:分钟:秒 { 提示:在Turboc2或WIN_TC环境下,用到以下函数: gotoxy(x,y); 光标定位 clrscr(); 清屏,包含在 #include 取系统时间: unsigned char hour, min,sec; struct time t; gettime(&t);/*包括在#include */ hour=t.ti_hour; min=t.ti_min; sec=t.ti_sec; ---------------- 在VC++环境下,用到以下函数: struct tm *ptr; time_t t; t=time(NULL); ptr=localtime(&t); } [问题讨论] 1、 C程序可以用几种方法实现循环结构? 2、 while(1)代表什么意思? 3、 用for语句可以代替do while语句吗? 4、 While 、do while、for哪一个更灵活些? 实验四、 函数 一、实验目的 1.掌握C函数的定义方法、函数的调用方法、参数说明以及返回值。掌握实参与形参的对应关系以及参数之间的“值传递”的方式;掌握函数的嵌套调用及递归调用的设计方法。 2.掌握全局变量和局部变量、动态变量与静态变量的概念和使用方法。 3.在编程过程中加深理解函数调用的程序设计思想。 4.掌握自定义头文件的方法,学会建立和调试多文件程序 二、实验内容 1. 递归与非递归函数 编写一个函数,求从n个不同的数中取r个数的所有选择的个数。其个数值为: 其中: n! = n*(n-1)*(n-2)*...*1。 [测试数据]: 输入:5 3 输出:10 输入:10 20 输出:Input Invalid ! 输入:-1 4 输出:Input Invalid! 输入:50 3 输出:19600 输入:0 0 程序结束 [实现要求]: (1) 分别用递归和非递归两种方式完成程序设计; (2) 主程序中设计一个循环,不断从输入接收n和r的值,计算结果并输出,当用户输入0 0时,程序结束; (3)能检查输入数据的合法性,要求n>=1并且n>=r; (4)上面的测试数据能得到正确结果。 [实验步骤] (1) 利用一个非递归函数fn(int n)计算n!,利用另一个函数Cnr(int n, int r)计算Cnr,在该函数中调用fn(), 问题:你打算用什么样的变量类型来存放n!函数返回的值?注意各种数据类型的内存字长不同,整数能存放的数据范围有限,你如何解决? (2) 利用一个递归函数实现,实现时利用公式: C(n,r) = C(n, r-1) * (n – r + 1) / r 递归实现. [实现提示]: (1) 可以用double数据类型来存放函数的计算结果 (2) 递归结束条件: 如果 r = 0 ,则C(n, r) = 1 如果 r = 1, 则C(n, r) = n 2. 将上面的程序改成多文件结构 [实验要求] 将上面用非递归方式写成的程序改成用多文件结构表示。要求将main()函数放在一个文件中,将另外两个函数放在另一个文件中,将函数原型说明放在一个头文件中。建立一个项目,将这三个文件加到你的项目中,编译连接使你的程序正常运行。 [实验步骤] (1) 新建一个项目,命名为“multifile” (2) 用File|New创建一个新的”C++ Source File”,命名为main.cpp (3) 用File|New创建一个新的”C++ Source File”,命名为func.cpp (4) 用File|New创建一个新的”C/C++ Header File”,命名为func.h (5) 用File|Open打开你前面实验中用非递归方式求C(n,r)的C++源程序文件,将其中的主函数部分拷贝到main.cpp中,将其中的两个函数实现放到func.cpp中,再将两个函数的原型写到func.h中 (6) 在main.cpp 中包含进头文件: #include “func.h” (7) 编译连接该项目,运行它。你得到的结果应该和上一个实验一样。 3.编写一个函数primeNum(int num),它的功能是判别一个数是否为素数。如果num是素数,返回该数;否则返回0值。 要求: 1) 在主函数输入一个整数num,调用该函数后,输出num是否是素数的信息。输出格式为:num is prime或num is not prime。 2) 分别输入以下数据:0,1,2,5,9,13,59,121,运行程序并检查结果是否正确。  4.编写函数computNum( int num),它的功能是计算任意输入的一个正整数的各位数字之和,结果由函数返回(例如:输入数据是123,返回值为6)。 要求: num由主函数输入,调用该函数后,在主函数内输出结果。  5. 请编写一个函数int fun(int x),它的功能是:判断整数x是否是同构数。若是同构 数,函数返回1;否则返回0。 所谓“同构数”是指这样的数,它出现在它的平方数的右边。 例如:输入整数5,5的平方数是25,5是25中右侧的数,所以5是同构数。 [问题讨论] 1、为什么要在编程时使用函数?有什么好处? 2.编写和调试包含多模块的程序时,容易出现什么样的错误?根据自己的实践总结一下。 3. 多文件结构中头文件的作用是什么? 4. 将程序划分为多个文件有什么好处? 4. 你对各种数据类型的字长是否有了新的认识? 5. 递归函数的书写要点是什么? 6. 你觉得递归和非递归函数哪种好些? 实验五 数 组 一、实验目的 · 掌握数组的基本概念,包括:数组的定义、数组的类型、数组的初始化、数组的赋值、数组元素下标的范围、数组元素的正确以及引用数组元素的输入/输出。 · 掌握字符数组与字符串的使用方法。理解字符数组与其它数组的区别、理解字符串及其特点。掌握常用的字符串处理库函数的用法并清楚对字符串的简单处理。 · 掌握与数组相关的算法,包括排序算法和查找算法等。 二、实验内容 1、编写程序:输入十进制数,将十进制数转换为二进制数 2.编程实现:对任意一个一维数组,从中找出数组元素的最大值和最小值。 要求: (1)数组为整型数组(10个元素)。 (2)使用scanf函数实现数组元素的输入。在输入前给出必要的提示。 (3)输出时给出必要的说明,首先输出原始的10个元素,换行后输出最大值以及最大值在数组中的位置、最小值以及最小值在数组中的位置。 (4)如果现改为20个元素的数组,怎样修改程序?修改程序后,运行程序进行检查。如果需要数组元素不断改变,应怎样修改程序?  2.编程实现:在给定的字符串中查找满足条件的第一个字符。 要求: (1)字符串采用初始化的方式处理。 (2)通过scanf函数读入一个任意字符。 (3)在字符串中查找该字符,如果存在该字符,输出该字符在字符串中的位置以及相应的说明。如果不存在该字符,则要给出相应的信息。 3.编程实现:首先任意输入一个大于2且小于10的整数n,再输入一个由n决定的二维整型数组(n ╳ n),形成n ╳ n阶矩阵,将矩阵中最大元素所在的行和最小元素所在的行对调后,再输出该矩阵(注意:数组不允许动态定义)。 例如: 原始数据: n=4 结果数据: 1 2 3 4 8 11 14 16 3 5 9 10 3 5 9 10 8 11 14 16 1 2 3 4 15 2 7 6 15 2 7 6 要求: 1) 本题中所涉及到的循环都采用for语句。 2) 在输入/输出时进行必要的说明。 3) 对输入的2~10之间的整数(例如4)以n=4的格式输出。 4) 输入一个n ╳ n矩阵(假定最大值与最小值不在同一行上),输出原始矩阵数据(按上述矩阵形式)。 5) 查找最大值与最小值,将矩阵中最大元素所在的行和最小元素所在的行对调,输出对调后的矩阵数据。 6) 修改程序,对最大值与最小值可能出现在一行上的情况做出说明。 7) 对n为3,4,5时,输入数组元素是要注意哪些问题?执行程序,检查程序的正确性。 4.使用二维数组设计一个打印“杨辉三角形”的程序。 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 5.编程实现“折半查找”的过程。折半查找的处理过程是:在一个数据已排好序的数组中,首先比较关键字与数组中间的元素,如果两者相等,则查找结束;如果前者比后者小,则要查找的数据必然在数组的前半部,此后只需在数组的前半部中继续折半查找;如果前者的数值比后者大,则要查找的数据必然在数组的后半部,此后只需在数组的后半部继续进行折半查找。 要求: 1) 设定一个数组存放20个数据,用赋初值的方法在程序中给出(假设这些数据已排序)。 2) 用scanf函数输入一个要找的数。 3) 对查找的结果给出相应的说明,如果找到该数,则给出该数是数组中第几个元素。如果该数不在数组中,则输出“无此数”信息。 4) 任意输入一些数据,检查程序的正确性。 5) 修改程序,设定输入的数据是无序的,采用scanf函数的形式输入,首先要对这些无序的数据进行排序,然后再采用“折半查找”。最后通过测试几组差别较大的数据检查程序的正确性。 6) 修改程序,改为函数调用的形式。编写一个选择法排序函数,对无序数据进行排序;编写一个查找函数对已排好序的数据进行查找。在主函数中输入数据(无序),调用上述函数,输出结果。 6.编程实现:三个学生、五门课程的成绩分别存放在4×6矩阵的前3×5列,计算出每个学生的平均成绩存放在该数组的最后一列的对应行上。计算单科的成绩总和存放在最后一行的对应列上,并输出单科成绩的平均分。输入/输出格式举例如下: Input(输入成绩): 65 87 68 56 78 83 94 67 85 91 71 75 69 84 89 Output(输出结果) : 65 87 68 56 78 70.5 83 94 67 85 91 84.0 71 75 69 84 89 77.5 219.0 256.0 204.0 258.0 232.0 0 average: 73.0 85.3 68.0 86.0 77.3 要求: 1) 数组类型为实型,输入成绩由scanf函数实现。 2) 输出已输入的原始成绩数据(3×5)。 3) 计算每个学生的平均成绩以及单科的成绩总和并按要求填入到数组中,输出填入结果后的数组(4×6)。 4) 计算单科平均成绩后输出。 5) 修改程序,采用函数调用的方式实现。 a) 编写一个函数输入数据,函数名为enter()。功能是输入原始学生成绩。 b) 2)编写一个函数计算平均值,函数名为aver()。功能是计算平均成绩(包括每个学生的平均成绩和每个单科的平均成绩)。并将计算结果分别填入 4×6矩阵的最后一列和最后一行中。 c) 编写一个函数输出数据,函数名为outarray()。功能是输出数组元素。 d) 在主调函数中调用上述三个函数。 e) 如果想将2)再进一步划分,应如何处理? 7.编程函数 deleteARR( int *arr,int n ) 的功能是将指定的有序数组压缩成诸元素互不相同的有序数组,即相同数只保留一个,多余的被删除。函数返回值是互不相同的元素的个数。 [问题讨论] 1、选择法排序与冒泡法排序的区别在哪? 2、数组中各元素的类型是否可以不一样? 实验六 指 针 一、实验目的 · 掌握指针的基本概念和基本用法。包括:变量的地址和变量的值,指针变量的说明、指针变量的初始化、指针的内容与定义格式、指针的基本运算等。 · 掌握数组与指针的关系并能够利用指针解决数组的相关问题。 · 掌握字符串与指针的关系并能够利用指针处理字符串的问题。 · 掌握指针与函数的关系并能够利用指针处理函数问题。 · 了解指向指针的指针的概念及其使用方法。 · 能够使用指针进行程序设计。 二、实验内容 3. 数组排序: 从键盘读入若干整数,将它们按由低到高排序输出。 [测试数据]: 程序先输出: Please input array number: 用户输入: 5 程序再输出: Please input all the integer: 用户输入: 300 700 600 450 500 程序输出: 300 450 500 600 700 [实现要求]: (1) 用一个数组存放各个整数; (2) 在主函数main()中实现数据的输入和输出操作,并用一个函数实现对数组元素的排序操作。 (3) 排序函数调用另一个函数swap()实现两个数组元素的交换。可以使用指针、引用两种方式实现函数参数的传递: swap(int *pa, int *pb); swap(int & a, int & b); [实验步骤] (1) 用数组实现程序要求 说明:用一个长度为10的数组存放待排序的数据,数组的定义为 int iArray[10]; 数组排序函数的原型为: void sort(int num, int iArray[]); 其中num表示数组元素的个数,iArray是数组。 (2) 用动态申请空间的方式实现程序要求。 说明:使用指针来实现前面数组的功能 int *piArray; piArray = new int[num]; 其中数组的大小num需要由用户预先输入。 [思考问题] (1) 上面两种实现方式对程序的改动大吗? (2) 尝试用不同的方式访问数组中的元素 iArray[i], *(iArray+i), piArray[i], *(piArray+i), (3) iArray和piArray有何共同点? 4. 字符排序 修改上面的程序,将数组的操作改为对字符串操作,即从键盘输入一串字符,将它们存放在字符数组中(形成一个字符串),然后对字符数组中的各个字符排序。 [测试数据]: 输入内容:kapdobc 输出内容:abcdkop [实现要求]: (1) 用字符数组代替上一个实验的整数数组; (2) 不要先输入字符串的长度,在程序中自动计算出字符串的长度。 [实现提示]: (1) 字符串的输入输出操作可以简化,不用一个字符一个字符的输入输出 (2) 字符的长度可以借助于预定义的函数strlen()求出,该函数所在的库函数名为 string.h [思考问题] 对字符的比较遵循什么样的约定(为什么字符a比字符b小)? 5. 字符串操作 要求和上面类似,但数组中的元素变为字符串。程序对已有的字符串进行排序,并输出排序后的结果。字符串数组中的元素为: January, February, March, April, May, June, July, September [测试数据]: 程序直接输出排序后的结果: May July June April March January Februrary September [实现要求]: (1) 排序的规则为:先比较两个字符串的长度,长度短的字符串排在前面,如果长度相等,则比较字符串的值,按从小到大排序输出。 (2) 用字符串数组存放各字符串,并在定义数组时对其进行初始化 (3) 利用库函数实现排序操作 4.上机完成下列函数的实现: 1.请编写void fun(int x,int pp[],int *n) 其功能是:求出能整除x的各整数并放在 pp数组中,这些除数由n返回,本函数x限制在1到100之间,如x=20,有6个数能整除它,分别是1,2,4,5,10,20, #define M 50 void fun ( int x, int pp[], int *n ) { } void main( ) { int x, aa[M], n,i; printf( "\nPlease enter a integer numbers:\n" ); scanf ( "%d", &x ); fun ( x, aa, &n ); for( i = 0; i < n; i++ ) printf ( "%d,", aa[i] ); } 2.编写函数fun , a数组中n个整数从小到大排列,函数功能是:从a中删除第一个遭到与x值相同的数组元素,删除后a的数组仍然由小到大有序排列 #define M 20 void fun ( int a[ ], int x, int *n ) { } void main( ) { int k, m, x, aa[M]; printf( "\nPlease enter a number: " ); scanf( "%d", &m ); printf( "\nPlease enter %d numbers(from small to large): ", m ); for( k = 0; k < m; k++ ) scanf( "%d", &aa[k] ); printf ("\nEnter x : "); scanf ( "%d", &x ); fun (aa, x, &m ); printf( "\nAfter deleter:\n" ); for( k = 0; k < m; k++ ) printf( " %d,", aa[k] ); } 3.编函数:从所读入的若干字符中(以****为结束输入的标志)中找出长度最大的字符串,并输出 #include void fun(char(*a)[81],int num,char **max) { } void main() { char ss[10][81],*ps; int n,i=0; gets(ss[i]); puts(ss[i]); while(!strcmp(ss[i],"****")==0) { i++; gets(ss[i]); } n=i; fun(ss,n,&ps); printf("\nmax=%s\n",ps); } 4.编一个函数fun(int *a,int n,int *odd,int *even),函数的功能是分别求出数组中所有奇数之和以及所有偶数之和。形参n给了数组中数据的个数:利用指针odd返回奇数之和,利用指针even返回偶娄这和。例如:数组中的值依次为:1,8,2,3,11,6;则利用指针odd返回奇数之和24;利用指针even返回偶数之和8。 #define N 20 fun(int *a,int n,int *odd,int *even) { } main() { int a[N]={1,9,2,3,11,6},i,n=6,odd,even; printf("The original data is:\n"); for(i=0;i3?2:1 21. 若有以下定义,则能使值为3的表达式是( ) int k=7,x=12 A. x%=(k%=5) B. x%=(k-k%5) C. x%=k-k%5 D. (x%=k)-(k%=5) 22. 设以下变量均为整型,则值不为7的表达式是 ( ) A. (x=y=6,x+y,x+1) B. (x=y=6,x+y,y+1) C. (x=6,x+1,y=6,x+y) D. (y=6,y+1,x=y,x+1) 23. 设有值均为5.0的单精度变量f,g,使f为10.0的表达式是 ( ) A. f+=g B. f-=g+5 C. f*=g-15 D. f/=g*10 24. 设f为实型变量,下列表达式中不是逗号表达式的是( ) A. f=3,4,5 B. f=(3,2,1,0) C. f>=3,f<2,0 D. f=2,f=1 25. 设a,b均为整型变量,下列表达式中不是赋值表达式的是 ( ) A. a=3,4,5 B. a=3*2 C. a=a&&b D. a=b=4 26. 整型变量a,b,c的值分别为2,3,4,运算表达式”a*=16+(b++)-(++c)”后,a的值是(<1>),b的值是(<2>),c的值是(<3>) <1> A. 31 B. 30 C. 29 D. 28 <2> A. 2 B. 3 C. 4 D. 5 <3> A. –5 B. –4 C. 5 D. 4 27. 设有整型变量n1,n2,其值均为3,执行语句”n2=n1++,n2++,++n1;”后,n1的值是(<1>),n2的值是(<2>) A. 3 B. 4 C. 5 D. 6 28. 执行语句”x=(a=3,b=a--);”后,x,a,b的值依次是( ) A. 3,3,2 B. 3,2,2 C. 3,2,3 D. 2,3,2 29. 以下说法正确的是( ) A. 输入项可以为一个实型常量,如scanf(“%f”,3.5); B. 只有格式控制,没有输入项,也能进行正确输入,如scanf(“a-%d,b=%d”); C. 当输入一个实型数据时,格式控制部分应规定小数点后的位数,如scanf(“%4.2f”,&f) D. 当输入数据时,必须指明变量的地址,如scanf(“%f”,&f) 30. putchar函数可以向终端输出一个( ) A. 实型变量值 B. 整型变量表达式值 C.字符串 D.字符或字符型变量值 31. 下面输入语句正确的是( ) A. scanf(“a=b=%d”,&a,&b); B. scanf(“a=%d,b=%f”,&m,&f); C. scanf(“%3c”,c); D. scanf(“%5.2f”,&f) 32. 已有如下定义和输入语句,若要求a1,a2,c1,c2的值分别为10,20,A和B,当从第一列开始输入数据时,正确的输入方式是( ) int a1,a2; char c1,c2; scanf(“%d %c %d %c”,&a1,&c1,&a2,&c2); A. 10A└┘20B B.10└┘A└┘20└┘B C. 10A20B D.10A20└┘B 33. 已有如下定义和输入语句,若要求a1,a2,c1,c2的值分别为10,20,A和B,当从第一列开始输入数据时,正确的数据输入方式是( ) int a1,a2;char c1,c2; scanf(“%d %d”,&a1,&a2); scanf(“%c %c”,&c1,&c2); A. 1020AB B. 10└┘20AB C. 10└┘└┘20└┘└┘AB D. 10└┘20AB 34. 已有定义int x;float y;且执行语句scanf(“%3d %f”,&x,&y);语句时,从第一列开始输入数据12345└┘678,则x的值为(<1>),y的值为(<2>) <1> A. 12345 B. 123 C. 45 D. 345 <2> A. 无定值 B.45.000000 C. 678.000000 D. 123.000000 35. 已有程序段和输入数据的形式,程序中输入语句的正确形式应当为   main () { int a; float f; printf(“\input number:”); 输入语句 printf(“\nf=%f,a=%d\n”,f,a); } Input number:4.5└┘└┘2 A. scanf(“%d,%f”,&a,&f); B. scanf(“%f,%d”,&f,&a); C. scanf(“%d%f”,&a,&f); D. scanf(“%f%d”,&f,&a); 36. 有输入语句:scanf(“a=%d,b=%d,c=%d”,&a,&b,&c);为使变量a,b,c的值依次为1,3,2,从键盘上输入数据的正确方式应当是( ) A. 1 3 2 B. 1,3,2 C. a=1└┘b=3└┘c=2 D. a=1,b=3,c=2, 37. 根据题目中已给出的数据输入形式和输出形式,程序中输入输出语句的正确内容为 main () { int x;float y; printf(“enter x,y:”); 输入语句 输出语句 } A. scanf(“%d%f”,&x,&y); B.scanf(“%d%f”,&x,&y); printf(“\nx+y=%4.2f”,x+y); printf(“\nx+y=%4.2f”,x+y); C. scanf(“%d%f”,&x,&y); D. scanf(“%d%3.1f”,&x,&y); printf(“\nx+y=%6.1f”,x+y); printf(“\nx+y=%4.2f”,x+y); 38. 根据下面的程序及数据的输入和输出形式,程序中输入语句的正确形式 main() { char ch1,ch2,ch3; 输入语句 printf(“%c%c%c”,ch1,ch2,ch3); } 输入形式ABC 输出形式AB A. scanf(“%c%c%c”,&ch1,&ch2,&ch3); B. scanf(“%c,%c,%c”,&ch1,&ch2,&ch3); C. scanf(“%c,%c”,&ch1,&ch2,&ch3); D. scanf(“%c%c”,&ch1,&ch2,&ch3); 39. 下列程序执行后的输出结果是 ( ) main () {int a=1,b=1; a+=b+=1; { int a=10,b=10; a+=b+=10; printf(“b=%d”,b); } a*=a*=b*10; printf(“ a=%2d\n”,a); } A. b=20 a=180 B. b=20 a=36 C. b=20 a=3600 D. b=20 a溢出 40. printf函数中用到格式符%5s,如果字符串长度大于5,则输出按方式( <1> );如果字符串长度小于5,则输出按方式(<2> ) A. 左对齐输出该字符串,右补空格 B. 右对齐输出该字符串,左补空格 C. 按字符串长从左到右全部输出 D. 输出错误信息 41. 以下C程序的运行结果是 ( ) main() { int y=2456; printf(“y=%3o\n”,y); printf(“y=%8o\n”,y); printf(“y=%#8o\n”,y);} 42. 指出下面不正确的赋值语句( ) A. a++; B. a==b; C. a+=b D. a=1,b=1 43. 若有以下定义,则正确的赋值语句是( ) int a,b; float x; A. a=1,b=2 B. b++; c. a=b=5 D. b=int(x) 44. 设有说明:double y=0.5,z=1.5;int x=10;则能够正确使用C语言库函数的赋值语句是( ) A. z=exp(y)+fabs(x); B. y=log10(y)+pow(y); C. z=sqrt(y-z); D. x=(int)(atan2((double)x,y)+exp(y-0.2)); 45. 下列数据中,不属于常量的是( ) A.123L B. ‘\012’ C. “12.3L” D12.3L 46. 设字符变量x的值是064,表达式“~x^x<<2&x”的值是( ) A. 0333 B. 333 C. 0x333 D.020 47.下列表达式中,不属于逗号表达式的是( ) A. a=b,c B. a,b=c C.a=(b,c) D.a,(b=c) 2、 多项选择题 1. 以下叙述正确的是 ( ) A. 函数是C程序的基本单位 B. C程序的每行只能写一个语句 C. C语言本身没有输入输出语句 D. 在C程序中,注释说明只能位于一条语句的后面 E. 在对C程序进行编译过程,可发现注释中的拼写错误 2. 以下叙述不正确的是 ( ) A. 在C程序中,SUM和sum是两个不同的变量名 B. 在C程序中,无论是整数还是实数,都能被准确无误的表示 C. 当从键盘输入数据时,对于整型变量只能输入整型数值,对于实型变量只能输入实型数值 D. 若a是实型变量,C程序中允许赋值a=10,因此实型变量中允许存放整型数 E. 在C程序中,%是只能用于整型数运算的运算符 3. 已知ch是字符型变量,下面正确的赋值语句是( ) A. ch=’y+9’; B. ch=’7’+’9’ C. ch=7+9 D. ch=’\xff’ E. ch=’\08’ 3、 填空题 1. C语言的双重性意指它具有______________的功能,又具有_____________的许多功能。 2. C语言程序的三种基本结构是_____________、______________、______________。 3. C语句分为__________语句、________语句、__________语句、___________语句、和____________语句五大类。 4. 一个C程序中至少应包含_______函数,无论该函数在程序中的位置如何,C程序总是从该函数开始。 5. 在C语言中,输入操作是由库函数____________完成的,输出是由库函数_________完成的。 6. C语言规定,标识符只能由___________________三种字符组成,且第一个字符必须为_______________。 7. C语言规定,对所有用到的变量要“先定义,后使用”。这样做有______________、________________和_____________________三大好处。 8. C语言的实型可分为___________型(其类型说明符是__________)和_____型(其类型说明符是__________);整型变量的类型说明符有_______(整型)、_________(短整型)和_________(长整型)。 9. 若有以下定义,则计算表达式y+=y-=m*=y后y的值是________。 Int m=5,y=2; 10. 若a是int型变量时,则表达式(a=4*5,a*2),a+6的值为__________。 11. 若有定义:int b=7;float a=2.5,c=4.7;则表达式a+(int)(b/3*(int)(a+c)/2)%4的值为________。 12. 若所有变量均为整型,则表达式(a=2,b=5,a++,b++,a+b)的值为________。 13. 若有定义:int e=1,f=4,g=2;float m=10.5,n=4.0,k;则计算赋值表达式k=(e+f)/g+sqrt((double)n)*1.2/g+m后,k的值为________。 14. 表达式8/4*(int)2.5/(int)(1.24*(3.7+2.3))值的数据类型为________。 15. 下列语句执行后的输出结果是____________________________。 int a=3; printf(“%d%8.5s%8s”,a,”Three Third”,”third”); 16. 以下程序的输出结果为_____________________________________。 main() {short I; I=-4; printf(“\ni:dec=%d,oct=%o,hex=%x,unsigned=%u\n”,I,I,I,I); } 17. 以下程序的输出结果为______________________________________。 main() {char c=’x’; printf(“c:dec=%d,oct=%o,hex=%x,,ASCII=%c\n”,c,c,c,c); } 18. 以下程序的输出结果为________________________________________ _________________________________________ main() { int a=1,b=2,c=3; ++a; b+=++c; { int b=4,c=5; c=b*c; a+=b+=c; printf(“a1=%d,b1=%d,c1=%d\n”,a,b,c); } printf(“a2=%d,b2=%d,c2=%d\n”,a,b,c); } 19. 假设变量a,b和c均为整型,以下语句借助中间变量t把a,b和c的值进行交换,即把b中的值给a,把c中的值给b,把a中的值给c。请填空:_______________;a=b; b=c;___________; 20. 若变量a和b均为int型变量,则以下语句的功能是__________________________。 a+=b;b=a-b;a-=b; 21. 以下printf中的”-“号的作用是_____________________。 该程序的输出结果是: #include main() {int x=12;double a=3.1415926; printf(“%6d##\n”,x); printf(“%-6d##\n”,x); printf(“%14.101f##\n”,a); printf(“%-14.101f##\n”,a); } 22. 给下列程序加上必要的注释。 main() {float f; int d1,d2,d3; printf(“Enter a number:”); scanf(“%f”,&f); printf(“Enter 3 interger:”); scanf(%d-%d-%d”,&d1,&d2,&d3); /*输入格式是_________________________________________________*/ printf(“f=%.2f\n”,f);/*输出格式是________________________________*/ printf(“d1=%-8dd2=%-7dd3=%-6d”,d1,d2,d3); /*输出格式是_________________________________________*/ printf(“%10s”,”End”); } 23. 请给下列程序补上必要的语句和注释。 #define PI 3.1416 main() { float r,s; printf(“Enter a number__r:”; ____________________;/*_____________________________________*/ s=PI*r*r; /*_____________________________________*/ ____________________;/*_____________________________________*/ } ************************************************************** 第4章 程序控制 1、 填空题 1. C语言中可以用来实现循环的四种语句是________________、__________________、_______________、____________________。 2. C语言程序的三种基本结构是____________、____________、________________。 3. C语言程序的三种逻辑运算符是________、________、_________。为了避免嵌套的条件语句if –else 的二义性,C语言规定else与__________if配对。 4. 在C语言中,&作为双目运算符表示的是_____________而单目运算符表示的是________________。 5. C语言没有逻辑数据,在给出逻辑运算结果时,以_______代表“真”,以______代表“假”,但在判断一个量是否为真时,以_______代表“真”,以_______代表“假”。 6. 条件“2 a||b+c&&b==c 结果为________________ <2> !(x=a)&&(y=b)&&0 结果为________________ <3> !(a+b)+c-1&&b+c/2 结果为________________ 9. 设I为整型变量,则for(i=2;i==0;) printf(“%d”,i--);循环__________次。 10. 判断char型变量c1是否为大写字母的正确表达式____________。 11. 设int x=0,y=1;则表达式x++*x--!=’y’?8-4:y的值为_____________。 12. 设有变量定义:int a=5,c=4;则(--a==++c)?—a:c++的值是____________,此时c的存储值为__________。 13. 关于运算符优先顺序的描述中正确的是__________________________。 2、 选择题 1. 若要求在if后面一对圆括号中表示a不等于0的关系,则能正确表示这一关系的表示式为 ( ) A. a<>0 B. !a C. a=0 D. a 2. C语言中while与do…while语句的区别是 ( ) A. do—while 的循环体至少无条件执行一次 B. do—while 允许从外部转到循环体内 C. do—while 的循环体不能是复合语句 D. while的循环控制条件比do—while 的循环控制条件严格 3. 以下的for 循环 ( ) for (x=0,y=0;(y!=123)&&(x<4);x++) A. 循环3次 B. 执行4次 C. 循环次数不定 D. 无限循环 4. 若 w=1,x=2,y=3,z=4则条件表达式wy&&x!=y); B. if (x==y) x+=y; C. if (x!=y) scanf(“%d”,&x) else scanf(“%d”,&y); D. if (x=a)&&(c1<=z) C. (‘a’<=c1)&&(‘z’>=c1) D. (c1>=’a’)&&(c1<=’z’) 10. 以下关于switch语句和break语句的描述,只有( )是正确的。 A. 在switch语句中必须使用break语句 B. break 语句中只能用于switch语句中 C. 在switch语句中,可以根据需要使用或不使用break语句 D. break语句是switch语句一部分 11. 若a为int变量,则执行以下语句后的结果为 ( ) a=5; do{ printf(“%2d\n”,a--); }while (!a); A. 5 B. 不打印任何内容 C. 4 D. 陷入死循环 12. 以下描述正确的是 ( ) A. goto语句只能用于退出多层循环 B. switch语句中不能出现continue语句 C. 只能用continue语句来终止本次循环 D. 在循环中break语句不能孤立出现 13. 下面程序段的运行结果是 ( ) a=1;b=2;c=3 while (a7) { n--; printf(“%d\n”,n); } A. 10 B. 9 C. 10 D. 9 9 8 9 8 8 7 8 7 6 19. 若a,b为int型变量,则执行以下语句后,b的值为 (<1>),a的值为(<2>) a=1;b=10; do { b=a; a++; }while(b--<0); <1> A. 9 B. –2 C. –1 D. 8 <2> A. 4 B. 2 C. 1 D. 3 20. 下面关于for循环的循环正确描述的是 ( )。 for循环只能用于循环次数已经确定的情况 for循环是先执行循环体语句,后判断表达式 在for循环中,不能用break语句跳出循环体 for循环的循环体语句中,可以包含多条语句,但必须用花括号括起来 21. 下列程序段后的输出是( ) x=1; while(x<=3) x++, y=x+++x; printf(“%d,%d”,x,y); A 6,10 B. 5,8 C. 4,6 D.3,4 写出下列程序的运行结果 1. main() 2. main() { int x,y,z; { int i=1; x=4;y=5;z=6; while(i<=15) x=y--<=x||x+y!=z; if (++i%3!=2) continue; printf(“%d,%d”,x,y); else printf(“%d “,i); } printf(“\n”); } 3. #include 4. #include main() main() { int i,j=4; { int i; for(i=j;i<=2*j;i++) for(i=0;i<=10;i++) switch (i/j) printf(“%d”,i); { case 0: } case 1:printf(“*”);break; case 2:printf(“#”); } } 5. main() 6. #include { int i,j,k; main() char space= ‘ ’; { int a,b,c; for (i=0; i<=5;i++) a=2;b=3;c=1; { for (j=1;j<=i;j++) if (a>b) printf(“%c”,space); if (a>c) for(k=0;k<=5;k++) printf(“%d\n”,a); printf(“%c”,’*’); else printf(“%d\n”,b); printf(“\n”); printf(“end.\n”); } } } 7. main() { int w=2,k; fun(int x) for (k=0;k<3;k++) { int y=0; { w=fun(w); static z=3; printf(“%d\n”,w); y++;z++; } return (x+y+z); } } 8. main() { int x=18,i; for(i=2;i<9;i++) if(x%i==0) {printf(“%ld",i); x=x/i--; if(x==0) break; } 3、 } 4、 填空题 1. 以下函数fun用于求两个正数a和b的最大公约数。 fun(a,b) int a,b; { int i,j,m,n; if (a>b) { m=a;a=b;_____________;} i=a;j=b; while((n=________!=0) {j=i;i=___________;} return (i); } 2. 输入三个整数,按从小到大的顺序输出 main() { int a,b,c; scanf(“%d,%d,%d”,&a,&b,&c); if _______________ {t=a;a=b;b=t;} if _______________ {t=b;b=c;c=t;} if ________________ {t=c;c=a;a=t;} printf(“%d,%d,%d”,a,b,c); } 3. 从键盘上输入若干个学生的成绩,统计并输出最高成绩和最低成绩。当输入负数时结束。 main() { float x,amax,amin; scanf(“%f”,&x); amax=x; amin=x; while (______________) { if (x>amax) amax=x; if (_______________) amin=x; scanf(“%f”,&x); } printf(“\namax=%f\naming=%f\n”,amax,amin); } 4. 若用0至6之间不同的三个数构成一个三位数,将统计出共有多少种方式。 #include main() { int i,j,k,count=0; for (i=1;i<=6;i++) for (j=0;j<=6;j++) if ______________ continue; else for (k=0;k<=6;k++) if ____________ count++; printf(“%d”,count); } 5. 利用牛顿迭代法求方程ax3+bx2+cx+d=0实根。其中x0为根的初值。 #include “math.h” float solut(a,b,c,d,x0) float a,b,c,d,x0; { float x,f,f1; x=____________; do { x0=x; f=((a*x0+b)*x0+c)*x0+d; f1=(3*a*x0)+2*b)*x0+c; x=x0-f/f1; } while (____________>=1e-5); return ____________; } main () { float a,b,c,d,x0; scanf(“%f,%f,%f,%f,%f”,&a,&b,&c,&d,&x0); printf(“x=%7.3f\n”,________________); } 6. 下列程序输出的结果是_________________。 main() { char ch[2][5]={“6934”,”8254”},*p[2]; int i,j,s=0; for (i=0;i<2;i++) p[i]=ch[i]; for (i=0;i<2;i++) for(j=0;p[i][j]>’0’&&p[i][j]<=’9’;j+=2) s=10*s+p[i][j]-‘0’; printf(“%d\n”,s); } 7. 执行下面的程序后,a的值为______________。 main() { int a,b; for (a=1,b=1;a<=100;a++) { if (b>=20) break; if (b%3 ==1) { b+=3; continue; } b=5; } } **************************************************************** 第5章 函数 1、 选择题 1. C语言程序的基本单位是 ( )。 A. 程序行 B. 语句 C. 函数 D. 字符 2. 函数的两个组成部分是 ( )。 A. 函数名与变量名 B. 函数说明部分与函数体 B. 主函数与子函数 D. 函数名与花括号 3. C程序运行的正确说法是 ( )。 A. 按程序结构顺序执行 B. 从程序中的main函数开始 C. 从用户指定的地方开始 D. 由函数说明部分决定 4. 以下正确的函数定义形式是 ( )。 A. int f(int x,int y); B. float f(int x;int y) C. double f(int x,char y) D. int f(int x,y) 5. 以下正确的函数定义形式是( )。 A. double f(x,y) B. f(int x,y) C. f(x;y) D. int f(x,y) int x,y; { int z; {int x,y,z; z=x+y; char x;int y; {z=x+y;return z;} z=x+y;return z;} return z; } {int z; z=x+y; return z;} 6. 以下说法正确的是 ( )。 A. C语言程序总是从第一个定义的函数开始执行 B. 在C语言中,要调用的函数必须在主调函数中定义 C. C语言中的main函数必须放在程序的开头 D. C语言规定,程序中各函数之间既允许直接递归调用也允许间接递归调用 7. 设有如下函数: fun( float x) {printf(“%d”,x*x);} 则函数值的类型是 ( )。 A. float B. void C. int D. 无法确定 8. 以下正确的说法是 ( )。 A. 实参与其对应的形参共占一个存储单元 B. 实参与其对应的形参各占独立的存储单元 C. 仅当实参与其对应的形参同名时才共占一个存储单元 D. 形参不占存储单元 9. 当调用一个函数,且函数中没有return 语句,则正确的说法是 ( )。 A. 返回系统默认值 B.能返回用户指定的函数值 C. 没有返回值 D. 返回一个不确定的值 10. 以下正确的是 ( )。 A. return后的值只能是常数 B. 定义函数时,形参的类型说明可放在函数体内 C. 当函数值的类型与返回值的类型不一致时,以函数值类型为准 D. 若形参与实参类型不一致时,以实参类型为准 11. 用简单变量做实参时,它与对应形参之间的数据传递方式是 ( )。 A. 单向值传递 B. 变量地址传递 C. 双向值传递 D.由用户在调用时指定传递方式 12. 以下不正确的是 ( )。 A. 形参可以是常量、变量、表达式 B. 实参可以是常量、变量、表达式 C. 实参可以是任意类型 D.形参必须与其对应的实参类型一致 13. 函数值类型缺省定义时,默认的类型为 ( )。 A. float B. double C. int D. char 14. 下面函数调用语句含有实参的个数为 ( )。 fun((参数1,参数2),(参数3,参数4)) A. 1 B. 2 C. 3 D. 4 15. 以下函数的功能是计算函数F=(a+b)*(a-b)+(c+b)*(c-b) float fun(x,y) scanf(“%f%f%f”,&x,&y,&z); float x,y; s=fun(____<1>__) +fun(__<2>__); { float z; z=x*y;return z;} printf(“s=%f”,s); main() } { float x,y,z,s; <1> A. x-y,x+y B. x+y,x-y C. z+y,z-y D. z-y,z+y <2> A. x-y,x+y B. x+y,x-y C. z+y,z-y D. z-y,z+y 16. 用数组名作为函数调用的实参,传递给形参的是 ( )。 A. 数组第一个元素的值 B. 数组的首地址 C. 数组元素的个数 C. 整个数组的值 17. 若使用一维数组名作为函数实参,则以下正确的是 ( )。 A. 必须在主调函数中说明此数组的大小 B.实参数组类型与形参数组类型可以不匹配 C.在被调用函数中,不需考虑形参数组的大小 D.实参数组名与形参数组名必须一致 18. 有以下的数组定义及f函数调用语句,则在函数说明中,错误的是 ( )。 int a[3][4]; f(a); A. f(int b[][6]) B. f(int b[3][]) C. f(int b[][4]) D. f(int b[2][3]) 19. 以下程序是选出能被5 整除且至少有一位是7的两位数,打印出所有这样的数及其个数,请选择填空。 sub(k,n) main() int k,n; {int n=0,k,m; { int a1,a2; for(k=10;k<=99;k++) a2=_____<1>_______; { m=sub(k,n); a1=k-_____<2>_______; if (m!=-1) n=m; if ((k%5==0&&a2==7)||(k%5==0&&a1==7)) } { printf(“%d”,k); printf(“\nn=%d”,n); n++; } return n;} else return –1;} <1> A. k%10 B. k/10 C. k*10 D. k*10%10 <2> A. a2 B. a2/10 C. a2*10 D. a2%10 20. 以下说法正确的是 ( )。 若在一个函数中的复合语句中定义了一个变量,则该变量 A. 是本程序中可用的局部变量 B. 在该函数中有效 C.在本程序范围中有效 D. 只在该复合语句中有效 21. 以下说法不正确的是 ( )。 A. 在同一个程序中,同名变量的作用相同 B. 在不同函数中,同名变量的作用是不同的 C. 形参是局部变量 D. 函数可以自调用 22. 以下说法正确的是 ( )。 A. 外部变量一定可以在整个程序文件中有效 B. 形式参数在函数定义时即分配存储单元 C. 函数调用最多可返回一个值 D. 主函数main中定义的变量是全局变量 23. 以下程序的输出结果是 ( )。 main() sub(a,b) { int a,b,c; int a,b; a=1;b=2;c=sub(a,b); { int c; printf(“%d,%d,%d”,a,b,c); c=a;a=b;b=c; } return c; } A. 1,2,1 B. 1,2,2 C. 2,1,1 D. 2,1,2 24. 函数中未说明存储类别的局部变量,默认的存储类别为 ( )。 A. 静态(static) B. 自动(auto) C. 外部(extern) D. 寄存器(register) 25. 以下说法正确的是 ( )。 A. 外部变量a与某函数的局部变量a必然相同 B. 在函数中定义的静态存储变量在生存期中可被其他函数调用 C. 外部变量定义与外部变量说明是相同的 2、 填空题 1. 如下函数的输出结果是 ( )。 max(int x,int y) main() { int z; { int a=5,b=7,c; z=x>y?x:y; c=max(a,b); return z;} printf(“%d”,c);} 2. 如下函数的输出结果是 ( )。 main() int f(int a,int b) { int i=2,p; { int c; p=f(i,++i); if (a>b) c=1; printf(“%d”,p); else if (a==b) c=0; } else c=-1; return c;} 3. 如下函数的输出结果是 ( )。 main() { int i=0,sum=1; do{ sum+=i++;}while(i<6); printf(“%d\n”,sum);} 4. 下面函数的功能是求两参数之和,并将和值返回调用函数,函数中错误部分是( ),应改为 ( )。 void add(float a,float b) float a,b; { float c; c=a+b; return c;} 5. 以下程序运行的结果是 ( )。 main() fun(int i,int j) { int i=2,x=5,j=7; { int x=7; fun(j,6); printf(“i=%d,j=%d;x=%d\n”,i,j,x); printf(“i=%d,j=%d;x=%d\n”,i,j,x); } } 6. 以下程序运行的结果是 ( )。 main() fun() {fun(); {int x=1; fun(); x+=1; } printf(“%d”,x);} 7. 以下程序运行的结果是 ( )。 main() {int x=0,y=1,z; max(int a,int b) z=max(x,y); { int c=(a>b)?a:b; printf(“max=%d\n”,z);} return c;} 8. 以下程序的功能是:由输入的“Y”,“y”与“N”,“n”,在屏幕上分别显示出“结束程序”与“继续执行”。请填空。 void Fun(char yn) void main() { switch( yn) { char ch; { case ‘Y’: printf(“\n结束请按Y或y,继续请按N或n\n”); case ‘y’:printf(“\n结束程序\n”); ch=________________________; ______________________; printf(“\n选择:%c”,ch); case ‘N’: Fun(ch); case ‘n’:printf(“\n继续执行\n”); } } } 9. 现输入一个整数9,以下程序的运行结果是 ( )。 main() Sub(int a) { int a,b[16],c,i=0; { printf(“请输入一个整数:\n”); int c; scanf(“%d”,&a); c=a%2; while(a!=0) return c; { c=Sub(a); } a=a/2; b[i++]=c; } for(;i>0;i--) printf(“%d”,b[i-1]); } 10. 已有函数fun,当不使用变量i后,为使之功能不变,如何修改。 原函数:fun(int x, int y) 修改为:fun(int x, int y) { int i,j=1; { int j; for (i-1;i<=y;++i) j=j*x; for(_______;_____;____) j=j*x; return j; return j; } } 11. 以下程序的运行结果是输出如下图形。 * * * * * * * * * * * * * * * * * * * * * * * * * main() { int i,j, k; for(i=1 ;i<=7;i++) { for(j=_____; j<=____________;j++) printf(“ “); for(k=1;k<=___________;k++) printf(“*”); printf(“\n”); } } 12. 以下程序运行的结果是( )。 void add(int x,int y,int z) void main() { { int x=2,y=3,z=0; z=x+y; printf(“x=%d y=%d z=%d\n”,x,y,z); y=y*y; /*结果为____________________*/ printf(“x=%d y=%d z=%d\n”,x,y,z); add(x,y,z); /*结果为____________________*/ printf(“x=%d y=%d z=%d\n”,x,y,z); } /*结果为____________________*/ } 13. 下面程序的功能是用递归调用计算年龄,已知第一人年龄最小,为10岁,其余学生一个比一个大2岁,求第五位学生的年龄。 递归公式如下: int Age(int n) void main() { int c; { int n=5; if (n==1) c=10; printf(“年龄:%d\n”,___________); else c=__________________; } return c; } 14. 下面程序的运行结果是 ( )。 main() Fun(int a[][3]) {int a[3][3]={1,3,5,7,9,11,13,15,17,19}; { int i,j,sum=0; int s; for(i=0;i<3;i++) s=Fun(a); for(j=0;j<3;j++) printf(“s=%d\n”,s); { a[i][j]=i+j; } if (i==j) sum+=a[i][j]; } return sum; } 15. 下面程序的运行结果是 ( _______________ )。 函数sort()的作用是 ( _______________________________)。 void main() void Sort(int a[]) { int a[5]={3,8,-2,6,4}; { int i,j,t; Sort(a); for(i=0;i<4;i++) for (i=0;i<=4;i++) for(j=0;j<4-i;j++) printf(“%d “,a[i]); if (a[j]>a[j+1]) } {t=a[j];a[j]=a[j+1];a[j+1]=t;} } 16. 函数swap(int x,int y)可完成对x与y 值的交换。在运行调用函数中的下面语句后,a[0]=_________________,a[1]=____________。 原因是________________________________________________________。 a[0]=0;a[1]=1; swap(a[0],a[1]); 17. 函数swap(arr,n)可完成对数组arr从第一个元素到第n个元素两两交换,在运行调用函数中的下面语句后,a[0]=_________________,a[1]=____________。 原因是________________________________________________________。 a[0]=0;a[1]=1; swap(a,2); 18. 以下程序可计算10名学生某门课的平均分,请填空。 float ave(float a[10]) main() { int i; { float score[10],aver; float av,sum=a[0]; int i; for(i=1;____________;i++) printf(“\n输入10个数:\n”); sum+=_______________; aver=______________________; av = sum/10; printf(“\n平均分数为:%5.2f”,aver); return av; } } 19. 以下程序的运行结果是______、_________、_________。 void main() { int a=1,b=2,c=3; ++a; c+=++b; { int b=4,c; c=b*3; a+=c; printf(“第一次:%d,%d,%d”,a,b,c); a+=c; printf(“第二次:%d,%d,%d”,a,b,c); } printf(“第三次:%d,%d,%d”,a,b,c); } 20. 以下程序的运行结果是_________________________。 int a=3,b=5; void main() int Max(int a,int b) { int a=8; { int c; printf(“%d”,Max(a,b)); c=a>b?a:b; } return c; } 21. 以下程序的运行结果是_____________________。 int x=5,y=7; Plus(int a, int b) void main() { { int x=4,y=5,z; int c; z=Plus(x,y); c=a+b; printf(“X+Y=%d\n”,z); return c; } } 22. 以下程序的运行结果是______________________。 int x; void main() { x=5; Fun(); printf(“%d\n”,x); } void Fun() { x=x*x*x; } 23. 以下程序的运行结果是____________________。 void main() void ad() { ad(); { static int x=0; ad(); ad(); x+=1; printf(“%d”,x); } } 24. 以下程序的功能是_____________________。 int Fac(int n) void main() { int p=1,k; { int i; for(k=1;k<=n;k++) for(i=1;i<=5;k++) p=p*k; printf(“%d!=%d\n”,i,Fac(i)); return p; } } 25. 以下程序运行的结果是___________________。 int a=30,b=40; Sub(int x , int y) void main() { int a; { int c=10,d=20; a=x; Sub(c,d); x=y; Sub(b,a); y=a; printf(“%d,%d,%d,%d\n”,c,d,a,b); } } 3、 编程题。 函数功能:a数组存放n个由大到小的有序数,把x插入到a数组中,插入后a数组中的数仍有序。 #include #define M 50 void fun(int a[ ], int x, int * n) { } void main() { int a[M],x,n,k; printf(“\nPlease enter n:”); scanf(“%d”,&n); printf(“\nEnter %d number (from large to small):\n”,n); for(k=0;k #include main() { char a[80]=”AB”,b[80]=”LMNP”; int i=0; strcat(a,b); while(a[i++]!=’\0’) b[i]=a[i]; puts(b); } A. LB B. ABLMNP C. AB D. LBLMNP 18. 当运行以下程序时,从键盘输入:aa└┘bb cc└┘dd (└┘代表空格,表示回车),则下面程序的运行结果是 ( )。 #include main() {char a1[5],a2[5],a3[5],a4[5]; scanf(“%s%s”,a1,a2); gets(a3);gets(a4); puts(a1);puts(a2); puts(a3);puts(a4); } A. aa B. aa C. aa D. aa bb bb bb bb cc cc cc dd dd cc dd dd ee 19. 有两个字符数组a,b,则以下正确的输入语句是 ( )。 A. gets(a,b); B. scanf(“%s%s”,a,b); C. scanf(“%s%s”,&a,&b); D. get(“a”);gets(“b”); 20. 有两个字符数组a[80],b[80],则以下正确的输出语句是 ( )。 A. puts(a,b) B. printf(“%s,%s”,a[],b[]); C. putchar(a,b) D. puts(a);puts(b); 21. 判断字符串a和b是否相等,应当使用 ( )。 A. if (a==b) B. if (a=b) C. if (strcpy(a,b)) D. if (strcmp(a,b)) 22. 判断字符串s1是否大于字符串s2,应当使用 ( )。 A. if (s10) D. if (strcmp(s1,s2)>0) 23. 下面程序的功能是将字符串s中所有字符c删除,请选择填空。 #include main() { char s[80]; int i,j; gets(s); for(i=j=0;s[i]!=’\0’;i++) if (s[i]!=’c’) ______________________; s[j]=’\0’; puts(s); } A. s[j++]=s[i] B. s[++j]=s[i] C. s[j]=s[i];j++ D. s[j]=s[i] 24. 下面程序段的运行结果是 ( )。 char a[7]=”abcdef” char b[4]=”ABC” strcpy(a,b); printf(“%c”,a[5]); A. 空格 B. \0 C. e D. f 25. 下面程序段的运行结果是 ( )。 main() { char str[]=”SSSWLIA”,c; int k; for(k=2;(c=str[k])!=’\0’;k++) { switch(c) { case ‘I’:++k;break; case ‘L’:continue; default: putchar(c); continue; } putchar(‘*’); } } A. SSW* B. SW* C. SW*A D. SW 3、 程序阅读题,给出下列程序的运行结果。 1. 运行结果______________。 2. 运行结果______________。 main() main() { int num[10]={10,1,-20,-203,-21,2,-2,-2,11,-2}; { int i,j,row,col,min; int sum=0,i; int a[3][4]={{1,2,3,4},{9.8,7,6},{-1,-2,0,5}}; for(i=0;i<10;i++) min=a[0][0]; if (num[i]>0) for(i=0;i<3;i++) sum=num[i]+sum; for(j=0;j<4;j++) printf(“sum=%6d”,sum); if (a[i][j]a[i]) else if (x 5. 运行结果______________。 6. 运行结果___________________。 #include “stdio.h” #include “stdio.h” #define LEN 4 main() main() { int i=5; { int j,c; char c[6]=”abcd”; static char n[2][LEN+1]={“8980”, “9198”}; do {c[i]=c[i-1];} while(--i>0); for (j=LEN-1;j>=0;j--) puts(c); { c=n[0][j]+n[1][j]-2*’0’; } n[0][j]=c%10+’0’; } for(j=0;j<=1;j++) puts(n[j]); } 7. 运行结果_________________。 8. 运行结果_____________________。 main() main() { char s[80]; {char a[2][6]={“Sun”,”Moon”}; int i=0; int i,j,len[2]; gets(s); for(i=0;i<2;i++) while(s[i]!=’\0’) {for(j=0;j<6;j++) { if (s[i]<=’z’&&s[i]>=’a’) if (a[i][j]==’\0’) s[i]=’z’+’a’-s[i]; {len[i]=j;break;} i++; printf(“%6s:%d\n”,a[i],len[i]); } } puts(s); } } 程序输入AabD 9 . 运行结果_________________。 10. 运行结果_____________________。 #include #define SIZE 30 main() main() { char s[]=”ABCCDA”; {float a[SIZE],b[SIZE/5],sum; int k; char c; int i,k; for(k=1;(c=s[k]!=’\0’;k++) for (k=2,i=0;i=1;j--) } printf(“%5d”,num[j]); } 程序输入:3245 8 4、 编程题 1. 请用“两路合并法”把两个已按升序排列的数组合并成一个升序数组。 main() { int a[3]={5,9,14},b[5]={12,24,26,37,48}; int c[10],i=0,j=0,k=0; while(i<3&&j<5) if ______________________{ c[k]=b[j];k++;j++;} else { c[k]=a[i];k++;i++;} while (____________________) { c[k]=a[i];i++;k++; } while (____________________) { c[k]=b[j];k++;j++; } for(i=0;i=0&&m>a[j]) { ____________________; j--; } for(i=0;i<5;i++) printf(“%d”,a[i]); printf(“\n”); } 5. 求出矩阵x的上三角元素之积。其中矩阵x的行、列数和元素值均由键盘输入。 #define M 10 main() { int x[M][M],n,i,j; long s=1; printf(“Enter a interger (<=10):\n”); scanf(“%d”,&n); printf(“Enter %d data on each line for the array x\n”,n); for(_________________) for(j=0;j=0;i--) { k=a[5]; for (___________;j>=0;j--) a[j+1]=a[j]; ___________________; for(m=0;m<6;m++) printf(“%d”,a[m]); printf(“\n”); } } 9. 输入5个整数,找出最大数和最小数所在的位置,并把两者对调,然后输出调整后的5个数。 main() { int a[5],max,min,i,j,k; for(i=0;i<5;i++) scanf(“%d”,&a[i]); min=a[0]; for(i=1;i<5;i++) if (a[i]max) {max=a[i];___________________;} ___________________________________________ printf(“\nThe position of min is :%3d\n”,k); printf(“\nThe position of max is :%3d\n”,j); for(i=0;i<5;i++) printf(“%5d”,a[i]); } 10. 生成并打印某数列的前20项,该数列的第1,2项分别为0和1,以后每个奇数编号的项是前两项之和,偶数编号的项是前两项差的绝对值。生成的20个数存在一维数组x中,并按每行4项的形式输出。 main() for(i=1;i<=20;i++) { int x[21],i,j; {printf(“%5d”,x[i]); x[1]=0;x[2]=1; if (i%4==0) i=3; printf(“\n”); do{ } x[i]=___________; } x[i+1]=___________________; i=___________________; }while(i<=20); ******************************************************************** 第7章 指针 一、填空题 1. 若有以下定义和语句: int a[4]={0,1,2,3},*p; p=&a[1]; 则++(*p)的值是_______________。 2. 若有定义: int a[2][3]={2,4,6,8,10,12};则*(&a[0][0]+2*2+1)的值是_____________,*(a[1]+2)的值是___________________。 3. 若有定义:int a[]={2,4,6,8,10,12},*p=a;则*(p+a)的值是___________,*(a+5)的值是_____________。 4. 若有以下定义和语句: int a[4]={0,1,2,3},*p; p=&a[2]; 则*--p的值是________________。 5. 若有以下定义和语句: int s[2][3]={0},(*p)[3]; p=s; 则p+1表示数组是______________________________。 6. 若有定义:int a[2][3]={2,4,6,8,10,12};则a[1][0]的值是________,*(*(a+1)+0)的值是____________。 7. 请完成以下有关数组描述的填空。 (1) C语言中,数组名是一个不可改变的_________,不能对它进行赋值运算。 (2) 数组在内存中占用一段连续的存储空间,它的首地址由______________表示。 8. 设main函数的说明为:main(int argc,char *argv[]),且有命令行为 FILE 1 2 3(表示回车),则argc的值是________,argv[1]的值是___________。 9. 定义语句 int *f();和int (*f)();的含义分别为_________________和_______________。 10. 变量的指针,其含义是指该变量的_______________________。 11. 下面程序的功能是用递归法将一个整数转换成字符形式输出。例如输入483,应输出字符串"483"。请填空。 #include void convert(int n) { int i; if ((_____________)!=0) convert(i); putchar(__________+'0'); } main() { int number; scanf("%d",&number); if (number<0) {putchar('-'); number=-number;} convert(number); } 12. 若有定义:int (*p)[4];则表示符p 是_______________________。 13. 若有以下定义,则*(p+5)表示_________________________。 int a[10],*p=a; 14. 若有定义:int *p[4];则标识符p____________________________。 15. 以下语句有错,错误原因是___________________________________。 #include main() { int *p; *p=100; ... } 二、选择题 1. 有四组对指针变量进行操作的语句,以下判断正确的选项是 ( )。 [1] int *p,*q; q=p; [2] int a,*p,*q;q=&a; p=*q; int a,*p,*q; p=q=&a; int a=20,*p; *p=a; [3] int a=b=0,*p;p=&a; b=*p; [4] int a=20,*p,*q=&a; p=q; int a=20,*p,*q=&a;*p=*q; int p,*q;q=&p; A. 正确:[1] 不正确:[2],[3][4] B. 正确:[1],[4]; 不正确:[2][3] C. 正确:[3]; 不正确[1][2][4] D. 以上结论都不正确 2. 已有定义int k=2; int *ptr1,*ptr2;且ptr1和ptr2均已指向变量k,下面不能正确执行的赋值语句是 ( )。 A. k=*ptr1+*ptr2; B. ptr2=k; C. ptr1=ptr2; D. k=*ptr1*(*ptr2); 3. 若有语句 int *point,a=4;和point=&a;下面代表地址的一组选项是 ( )。 A. a,point,*&a B. &*a,&a,*point C. *&point,*point,&a D. &a,&*point,point 4. 若需要建立如下图所示的存储结构,且已有说明float *p,m=3.14;则正确的赋值语句是________________。 p m A. p=m; B. p=&m; C. *p=m; D. *p=&m; 5. 若有说明: int *p,m=5,n; 以下正确的程序段是 ( )。 A. p=&n; B. p=&n; C. scanf("%d",&n); D. p=&n; scanf("%d",&p); scanf("%d",*p); *p=n; *p=m; 6. 设有下面程序段: char s[]="china";char *p; p=s; 则下列叙述正确的是 ( )。 A. s和p完全相同 B. 数组s中的内容和指针变量p中的内容相等 C. s数组长度和p所指向的字符串长度相等 D. *p与s[0]相等 7. 以下正确的程序段是 ( )。 A. char str1[]="12345",str2[]="abcdef"; strcpy(str1,str2); B. char str[10],*st="abcde"; strcat(str,st); C. char str[10]=" ",*st="abcde"; strcat(str,st); D. char *st1="12345",*st2="abcde"; strcat(st1,st2); 8. 下面程序段的运行结果是 ( )。 char str[]="ABC",*p=str; printf("%d\n",*(p+3)); A. 67 B. 0 C. 字符'C'的地址 D. 字符'C' 9. 下面程序段的运行结果是 ( )。 char *p="abcdefgh"; p+=3; printf("%d\n",strlen(strcpy(p,"ABCD"))); A. 8 B. 12 C. 4 D. 7 10. 下面说明不正确的是 ( )。 A. char a[10]="china"; B. char a[10],*p=a; p="china"; C. char *a; a="china"; D. char a[10],*p;p=a="china"; 11. 若已定义char s[10];则在下面表达式中不表示s[1]的地址是 ( )。 A. s+1 B. s++ C. &s[0]+1 D. &s[1] 12. 若有以下定义和语句,则对a数组元素的正确引用为 ( )。 int a[2][3],(*p)[3]; p=a; A. (p+1)[0] B. *(*(p+2)+1) C. *(p[1]+1) D. p[1]+2 13. 若有定义:int a[5];则a数组中首元素的地址可以表示为 ( )。 A. &a B. a+1 C. a D. &a[1] 14. 若有以下定义和赋值语句,则对b数组的第i行第j列(假设i,j已正确说明并赋值)元素的非法引用为( )。 A. *(*(p+i)+j) B. *(p[i]+j) C. *(p+i)+j D. (*(p+i))[j] 15. 以下正确的说明语句是( )。 A. int *b[]={1,3,5,7,9}; B. int a[5],*num[5]={&a[0],&a[1],&a[2],&a[3],&a[4]}; C. int a[]={1,3,5,7,9}; int *num[5]={a[0],a[1],a[2],a[3],a[4]}; D. int a[3][4], (*num)[4];num[1]=&a[1][3]; 16. 设有一个名为file1的C源程序,且已知命令行为:FILE1 CHINA BEIJING SHANGHAI,则可得以下语句结果得C源程序为( )。 CHINA BEIJING SHANGHAI A. main(int argc,char *argv[]) B. main(int argc,char *argv[]) { while(--argc>0) { while(argc-->1) printf("%s%c",*++argc,(argc>1)?' ':'\n');} printf("%s\n",*argv);} C. main(int argc,char *argv[]) D. main(int argc,char *argv[]) { while(argc>0) { while(argc>1) printf("%s%c\n",*++argv,(argc>1)?' ':'\n'); {++argv; } printf("%s\n",*argv); --argc;}} 17. 以下正确得叙述是 ( )。 A. C语言允许main函数带形参,且形参个数和形参名均由用户指定 B. C语言允许main函数带形参,形参名只能是argc和argv C. 当main函数带有形参时,传给形参得值只能从命令行中得到 D. 若有说明:main(int argc,char *argv),则形参argc的值必须大于1 18. 若有说明:char *language[]={"FORTRAN","BASIC","PASCAL","JAVA","C"};则表达式*language[1]>*language[3]比较的是 ( )。 A. 字符F和字符P B. 字符串BASIC 和字符串JAVA C. 字符B 和字符J D. 字符串FORTRAN和字符串PASCAL 19. 若有说明:char *language[]={"FORTRAN","BASIC","PASCAL","JAVA","C"}; 则language[2]的值是( )。 A. 一个字符 B. 一个地址 C. 一个字符串 D. 一个不定值 20. 若有说明:char *language[]={"FORTRAN","BASIC","PASCAL","JAVA","C"};则以下不正确的叙述是 ( )。 A. language+2表示字符串"PASCAL"的首地址 B. *language[2]的值是字符P C. language是一个字符型指针数组,它包含5个元素,每个元素是一个指向字符串变量的指针 D. language是一个字符型指针数组,它包含5个元素,其初值分别是:"FORTRAN","BASIC","PASCAL","JAVA","C" 21. 若有函数max(a,b),并且已使函数指针变量p指向函数max,当调用函数时,正确的调用方法是( )。 A. (*p)max(a+b); B. *pmax(a,b); C. (*p)(a,b); D. *p(a,b); 22. 若有函数max(a,b),为了让函数指针变量p指向函数max,正确的赋值方式是。 A. p=max; B. *p=max; C. p=max(a,b); D. *p=max(a,b); 23. 已有定义 int (*p)();则指针p可以 ( )。 A. 代表函数的返回值 B. 指向函数的入口地址 C. 表示函数的类型 D. 表示函数返回值的类型 24. 下面程序的运行结果是 ( )。 #include main() { char *p,s[]="ABCDEFG"; for(p=s;*p!='\0';) { printf("%s\n",p); p++; if (*p!='\0') p++; else break; } } A. ABCDEFG B. ABCDEFG C. A D. ABCDEFG ABCDE BCDEF C CDEFG ABC CDE E EFG A D G G 25. 下面程序段的运行结果是 ( )。 char s[6]; s="abcd";printf("\"%s\"\n",s); A. "abcd" B. "abcd " C. \"abcd\" D. 编译出错 三、阅读程序题 1. 若输入值分别为1,3,5,下面程序的运行结果是________________。 void main() { int a=0,i,*p,sun; p=&a; for(i=0;i<=2;i++) { scanf("%d",p); sum=Fun(p); printf("sum=%d\n",sum); } } Fun(int *p) { int sum=0; sum=sum+*p; return (sum); } 2. 下面程序的运行结果是________________________。 void main() { int i,k; for(i=0;i<4;i++) { k=Sub(&i); printf("%3d ",k); } } void Sub(int *s) { static int t=0; t=*s+t; } 3. 下面程序的运行结果是________________________。 #include void Fun(char *w,int n) { char t,*s1,*s2; s1=w; s2=w+n-1; while(s2表示回车),则下面程序的运行结果是________________________。 char Fun(char *s) { if (*s<='Z' && *s>='A') *s+=32; return *s; } void main() { char c[80], *p; p=c; scanft("%s",p); while(*p) { *p=fun(p); putchar(*p); p++; } } 5. 下面程序的运行结果是________________________。 void main() { int x[5]={2,4,6,8,10},*p,*pp; p=x; pp=&p; printf("%d",*(p++)); printf("%3d\n",**pp); } 6. 下面程序的运行结果是_______________________。 #define SIZE 12 void main() { char s[SIZE]; int i; for(i=0;i Fun(char *a,char *b) { int num=0,n=0; while (*(a+num)!='\0') num++; while (b[n]) {*(a+num)=b[n];num++;n++;} return num; } void main() { char s1[81],s2[81],*p1=s1,*p2=s2; gets(p1) ; gets(p2); printf("%d\n",Fun(p1,p2)); } 9. 下面程序的运行结果是________________________。 char str[]="abc\0def\0ghi", *p=str; printf("%s",p+5); 10. 下面程序的运行结果是________________________。 void main() { static float score[][4]={{60,70,80,90},{50,89,67,88},{34,78,90,66},{80,90,100,70}}; float *Search(); float *p; int i,j; for(i=0;i<=3;i++) { p=Search(score+i); if (p==*(score+i)){ printf("No.%d scores:",i); for(j=0;j<4;j++) printf("%5.2f",*(p+j)); } } } float *Search(float (*pointer)[4]) { int i; float *pt; pt=*(pointer+1); for (i=0;i<=3;i++) if (*(*(pointer)+i)<60) pt=*pointer; return (pt); } 四、编程题 1. 将字符串中的数字字符删除后输出。 void Delnum(char *s) { int i,j; for(i=0,j=0;s[i]!='\0';i++) if (s[i]<'0' _________ s[i]>'9') {s[j]=s[i];j++} _______________________; } void main() { char *item; printf("\n input a string:"); gets(item); Delnum(item); printf("\n%s",_________________); } 2. 将十进制正整数转换成十六进制。 #include void main() { int a,i; char s[20]; printf("Input a:\n"); scanf("%d",&a); C10_16(s,a); for(i=____________;i>=0;i--) printf("%c",*(s+i)); printf("\n"); } C10_16(char *p , int b) { int j; while(b>0) { j=b%16; if ( ______________ ) *p=j+48; else *p=j+55; b=b/16; _______________________; } *p='\0'; } 3. 求矩阵A的转置矩阵B,并按矩阵形式打印出两矩阵。 void main() { int a[2][3]={1,2,3,4,5,6},b[3][2]; int (*p)[3],(*q)[2],i,j; p=a; q=b; for(i=0;i<2;i++) for(j=0;j<3;j++) ______________________; p=a[0]; for (i=0;I<2;i++) { for(j=0;j<3;j++) printf("%4d",_________); printf("\n"); } q=b[0]; for(i=0;i<3;i++) { for(j=0;j<2;j++) printf("%4d",______________); printf("\n"); } } 4. 以下程序在a数组中查找与x值相同的元素的所在位置。 void main() { int a[11],x,i; printf("Enter 10 integers"\n"); for(i=1;i<=10;i++) scanf("%d",a+i); printf("Enter x:"); scanf("%d",&x); *a=______________; i=10; while(x!=*(a+i)) ____________________; if (_________________) printf("%5d's position is :%4d\n",x,i); else printf("%d Not been found!\n",x); } 5. 以下程序对数组a中的数据进行降序排序。 #define N 10 main() { int a[N],i,j,k; k=N; printf("Enter %2d data that will be sorterd:\n",k); for (i=0;i0) && (k<=n+1)) { for _________________________ *(a+i+1)=*(a+i); *( ____________ ) =x; ________________; } for(i=1;i<=n;i++) printf("%4d",*(a+i)); } 9. 下面程序的功能是输出正文中含有字母's'的所有行。函数getline的作用是输入一行字符到数组中,并返回最后一个字符。 #include char Getline(char s[],int lim) { int i; char c; for (i=0;i void main() { int a,i; char s[20]; printf("Input a:\n"); scanf("%d",&a); C10_16(s,a); for(i=____________;i>=0;i--) printf("%c",*(s+i)); } C10_16(char *p,int b) { int j; while(b>0) { j=b%16; if ( ______________ ) *p=j+48; else *p=j+55; b=b/16; _______________________; } *p='\0'; } 11. 下面findmax函数将计算数组中的最大元素及其下标值和地址值,请编写*Findmax()函数。 Findmax(int *s,int t,int *k); { } main() { int a[10]={12,33,34,45,56,67,78,89,11,22},k,*add; add=findmax(a,10,&k); printf("%d,%d,%o\n",a[k],k,add); } 12. 函数功能:从数组a中删除第一个遇到与x值相同的数组元素,删除后,数组元素仍由小到大排列。 #include #define M 20 void fun(int a[],int x,int *n) { } main() { int k,m,x,aa[M]; clrscr(); printf("\nPlease enter a number:"); scanf("%d",&m); printf("\nPlease enter %d numbers(from small to large):",m); for(k=0;k void Fun(char *tt,int pp[]) { } void main() { char aa[1000]; int bb[26],k,n; printf("\nPlease enter a char string:"); scanf("%s",aa); fun(aa,bb); for(k=0;k<26;k++) printf("%d ",bb[k]); } 14. 函数功能:判断str中的字符串是否是回文,若是则返回1,否则返回0 #include #include int fun(char *str) { } main() { char s[81]; clrscr(); printf("\nPlease enter 1 line string:"); gets(s); if (fun(s)) printf("YES"); else printf("NO"); } 15. 函数功能:删除字符串中指定位置,其中a存放原字符串,b存放删除后字符串,例如:原字符串为world,输入3,则输出word。 #include #define LEN 20 void fun(char a[],char b[],int n) { } main() { char str1[LEN],str2[LEN]; int n; clrscr(); printf("Enter the string:\n"); gets(str1); printf("Enter the position of the string deleted:"); scanf("%d",&n); fun(str1,str2,n); printf("The new string is :%s\n",str2); } 第10章 结构、联合、位运算和枚举 一、填空 1. 在下面程序段中,"student"表示_______________, student1表示____________。 struct student { int num[20]; char sex; int age; float score;} student1; 2. 结构体的类型与结构体变量是不同的概念,二者区别可见于____________。 3. 一个结构体变量的指针就是_______________________________地址。 4. 以下程序的运行结果是__________________________________。 struct name { int x; char c;} main() { struct name a={10,'y'}; printf("%d",a.x);} 5. 以下程序用以输出结构体变量zjs所占内存单元的字节数,那么在其中记号AB处应填上的内容为________________________________________。 struct ps { double k; char array[15];} main() { struct ps zjs; printf("zjs=%d\n",__AB__);} 6. 以下程序的运行结果是____________________。 main() { struct EXP {struct { int x; int y;} in; int a; int b;} e; e.a=4;e.b=3; e.in.x=e.a*e.b; e.in.y=e.a+e.b; printf("%d,%d",e.in.x,e.in.y);} 7. 若已定义 struct number { int a,b; float f;} da={1,3,6.5}; struct number *pda=&da; 则表达式pda->b/da.a*++pda->b的值是____________________。 8. 为建立如图所示的存储结构(即每个结点两个域,data是数据,next是指向结点的指针域),请将定义补充完整。 data next struct { char data; ________________;}node; 9. ____________________________________________成为“共用体”类型的结构。 10. 下面程序段的最后一句想要输出a的成员的值,应填写的是____________。 union { int i; char ch; float f}a; scanf("%d %c %f",&a.i,&a.ch,&a.f); printf( ____________________ ); 11. 测试char型变量a第六位是否为1的表达式是___________(设最右位为第1)。 12. 设x=10100011,若要通过x^y使x的高4位取反,低4位不变,则y的二进制数是_________________。 13. 下面程序段的输出结果是____________。 int x=1; printf("%d\n",~x); 14. 下面程序段的输出结果是________________________________。 main() { unsigned a=0361,x,y; int n=5; x=a<<(16-n); printf("x=%o\t",x); y=a>>n; printf("y1=%o\t",y); y|=x; printf("y2=%o\t",y);} 二、选择题 1. 运行时一个结构体变量系统分配给它的内存是 ( )。 A. 各成员所需内存量的总和; B. 结构体中第一个成员所需内存量 C. 成员中占内存量最大者所需的容量; D. 结构体中最后一个成员所需的内存量 2. 设有以下说明语句 struct stu { int a; float b; }stutype; 则下面叙述不正确的是 ( )。 A. struct是结构体类型的关键字 B. struct stu是用户定义的结构体类型 C. stutype是用户定义的结构体类型名 D. a和b都是结构体成员名 3. 根据下面的定义,能打印出字母M的语句是 ( )。 struct person { char name[a]; int age;}; struct person class[10]={"John",17,"Panl",19,"Mary",18,"Adam",21}; A. printf("%c\n",class[3].name); B. printf("%c\n",class[3].name[1]); C. printf("%c\n",class[2].name[1]); D. printf("%c\n",class[2].name[0]); 4. 以下scanf函数调用语句中,对结构体变量成员的不正确引用是( )。 struct pupil { char name[20]; int age; int sex;} pup[5],*p; p=pup; A. scanf("%s",pup[0].name); B. scanf("%d",&pup[0].age); C. scanf("%d",&(p->sex)); D. scanf("%d",p->age); 5. 设有以下语句 struct st { int k; struct st *next;} static struct st a[3]={5,&a[1],7,&a[2],9,'\0'},*p; p=&a[0]; 则以下表达式 ( )的值是6。 A. p++->k B. p->k++ C. (*p).k++ D. ++p->k 6. 若已建立下面的链表结构,指针p,q分别指向图中所求结点,则不能将q所指的结点插入到链表末尾的一组语句是 ( )。 A. q->next=NULL; p=p->next; p->next=q; B. p=p->next; q->next=p->next; p->next=q; C. p=p->next; q->next=p; p->next=q; D. p=(*p).next; (*q).next=(*p).nxt; (*p).next=q; 7. 以下对共用体类型数据叙述正确的是 ( )。 A. 可以对共用体变量名直接赋值 B. 一个共用体变量中可以同时存放其所有成员 C. 一个共用体变量不能同时存放其他成员 D. 共用体类型定义中不能出现结构体类型的成员 8. 以下程序的运行结果是 ( )。 main() { union {long a; int b; char c;} ss; printf("%d\n",sizeof(ss));} A. 2 B. 7 C. 4 D. 8 9. 使用typedef 定义一个新类型的正确步骤是 ( )。 (1) 把变量名换成新类型名 (2)按定义变量的办法写出定义体 (3) 用新类型名定义变量 (4)在最前面加上关键字typedef A. 2,4,1,3 B. 1,3,2,4 C. 2,1,4,3 D. 4,2,3,1 10. 下面对typedef的叙述中不正确的是 ( )。 A. 用typedef可以定义各种类型名 B. 用typedef可以用来定义变量名 C. 用typedef只是将已存在的类型用一个新的标识符来代表 D. 用typedef有利于程序的通用和移植 11.设有以下语句 char x=3,y=6,z; z=x^y<<2; 则z的二进制值是。A. 00010100 B. 00011011 C. 00011100 D. 00011000 三、编程题 1. 以下程序对输入的两个数进行正确性判断,若数据满足要求,则打印正确信息,并计算结果,否则打印出相应的错误并继续读数,直到输入正确为止。请在空格处填上正确内容。 enum erroData {Right,Less0,Greate100,MinMaxErr}; char *ErrM[]={"Enter Data Right","Data<0 Error","Data>100 Error","x>y Error"}; void main() { int status,x,y; do { printf("Please enter two number:(x,y)"); scanf("%d%d",&x,&y); status=___________________________; printf(ErrM[___________]); } while (status!=Right); printf("Result=%d",x*x+y*y); } int Err(int min,int max) { if (max100) return Great100; else if (min<0) return Less0; else _________________________;} 2. 编一个统计候选人得票情况的程序,设有4个候选人,每次输入一个得票的候选人的名字,要求最后输出各人得票的结果,在下面空格处填上正确的内容。 struct person { char name[20]; int count;} leader[4]={"Li",0,"Wu",0,"Lin",0,"Gao",0}; main() { int i,j; char lname[20]; for(i=1;i<=10;i++) { scanf("%s",lname); for(j=0;j<4;j++) if (___________________________) leader[j].count++; } printf("\n"); for(i=0;i<4;i++) printf("%5s:%d\n",___________________________________);} 3. 有4位学生,每位学生的记录包括学号、姓名、成绩。要求找出成绩最高者的姓名和成绩,编程要求用到指向结构体的指针变量作为函数的参数。 4. 以下程序用以读入两位学生的情况存入结构数组,每位学生的情况包括姓名、学号、性别。若是男同学,则还登记视力是否正常(正常用Y,不正常用N表示);对女生则还登记身高和体重,请在空格处填上正确的内容。 struct { char name[20]; int num; char sex; union body { char eye; struct { int len; int wt;}f; }body1; }person[2]; main() { int i; for(i=0;i<2;i++) { scanf("%s%d%c",&person[i].name,&person[i].name,&person[i].sex); if (person[i].sex=='m') scanf("%c",______________________); else if (person[i].sex=='f') scanf("%d%d",____________________); else printf("input error\n"); } } 5. 已知head指向单链表的第一个结点,以下函数del完成从单向链表中删除值为num的第一个结点。请在空格处填上正确内容。 struct stu { int info; struct stu *link;}; struct stu *del(struct stu *head,int num) { struct stu *p1,*p2; if (head==NULL) printf("\nlist null!\n"); else { p1=head; while (_______________________) { p2=p1;p1=p1->link;} if (num==p1->info){ if (p1==head) _____________________; else _________________________; printf("delete :%d\n",num);} else printf("%d not been found!\n",num); return (head);} 6. 请编写程序:从终端读入16进制无符号整数m,调用函数rightrot将m中的原始数据循环右移n位,并输出移位前后的内容。 7. 设计一个函数,使给出一个数的原码,能得到该数的补码,请填空。 void main() { unsigned int a; unsigned int getbits(); printf("请输入一个八进制数:"); scanf("%o",&a); printf("它的补码是:%o\n",getbits(a)); } unsigned int getbits(unsigned int value) { unsigned int z; z=value &01000000; if (z==___________) z=~value+1; else z=_________________; return z; } ********************************************************************* 第11章 文件处理 一、填空题 1. 在C语言中,文件的存取是以_______为单位的,这种文件称为________文件。 2. 函数调用语句:fgets(buf,n,fp),从fp指向的文件中读入_____个字符放到buf字符数组中,函数的返回值为____________。 3. feof(fp)函数用来判断文件是否结束,如果遇到文件结束,函数值为___________,否则为______________。 4. 在执行fopen函数时,ferror函数的初值是 __________。 5. 当顺利执行了文件关闭操作时,fclose函数的返回值是________________。 二、选择题 1. fscanf函数的正确调用形式是 ( )。 A. fscanf(fp,格式字符串,输出表列) B. fscanf(格式字符串,输出表列,fp) C. fscanf(格式字符串,文件指针,输出表列) D.fscanf(文件指针,格式字符串,输入表列) 2. 若调用fputc函数输出字符成功,则其返回值是 ( )。 A. EOF B. 1 C. 0 D. 输出的字符 3. 设有以下结构体类型 struct st { char name[8]; nt num; loat s[4];} student[50]; 并且结构体数组中的元素都已有了值,若要将这些元素写到硬盘文件fp中,以下不正确的形式是 ( )。 A. fwrite(student,sizeof(struct st),50,fp); B. fwrite(student,50*sizeof(struct st),1,fp); C. fwrite(student,25*sizeof(struct st),25,fp); D. for(i=0;i<50;i++) fwrite(student+i,sizeof(struct st),1,fp); 4. fseek函数的正确调用形式是 ( )。 A. fseek(文件类型指针,起始点,位移量);B. fseek(fp,位移量,起始点); A. fseek(位移量,起始点,fp); D. fseek(起始点,位移量,文件类型指针); 5..以"只读"方式打开文本文件a:\aa.dat,下列语句中哪一个是正确的( ) A. fp=fopen(″a:\\aa.dat″,″ab″); B. fp=fopen(″a:\aa.dat″,″a″); C. fp=fopen(″a:\aa.dat″,″wb″); D. fp=fopen(″a:\\aa.dat″,″r″); 6..写字符到磁盘文件的fpuc函数,其函数原型(头)正确的是( ) A. FILE* fputc(char) B. int fputc(FILE *) C. int fpuc(char,FILE *) D. int fputc(FILE *,char) 三、编程题 1. 以下程序的功能是将磁盘文件的内容在打印机上输出。请在下划线的空白处填上适当的内容。 #define SIZE 256 main(int argc,char *argv[]) { char buff[SIZE]; FILE *fpr,*fpd; if (argc!=2) { puts("\7 useage:type file name"); exit();} if ((fpr=fopen(argv[1],"r")==NULL) { printf("\7 file %s can't opened\n",_________________); exit();} if ((fpd=fopen("PRN","w"))==NULL) { printf("\7 printer can't used\n"); exit();} while(fgets(_____________________)!=NULL) fputs(_______________________); fclose(fpr); fclose(fpd); } 2. 以下程序的功能是将文件file1.c的内容输出到屏幕上并复制到文件file2.c中,请在下划线的空白处填上适当的内容。 main() { FILE _____________; fp1=fopen("file1.c","r"); fp2=fopen("file2.c","w"); while(!feof(fp1)) putchar (getc(fp1)); ______________________________; while (!feof(fp1)) putc(_______________________); fclose(fp1); fclose(fp2); } 3. 请编写程序:从键盘输入一个字符串,将其中的小写字母全部换成大写字母,输出到磁盘文件"upper.txt"中保存,输入的字符串以"!"结束。 ***************************************************************** 第13章 编译预处理 1、 选择题 1. 在宏定义#define PI 3.1415926535中,用宏名PI代替一个 ( )。 A. 单精度数 B. 双精度数 C. 常量 D. 字符串 2. 以下程序运行结果是 ( )。 #define MIN(a,b) (a)<(b)?(a):(b) main() { int i=10,j=15,k; k=10*MIN(i,j); printf(“%d\n”,k);} A. 10 B. 15 C. 100 D. 150 3. 以下说法正确的是 ( )。 A. 在程序的一行上可出现多个有效的预处理命令行 B. 使用带参数的宏时,参数的类型应与宏定义时的一致 C. 宏替换不占用运行时间,只占用编译时间 D. 在以下定义中,CH y是称为宏名的标识符 4. 以下说法不正确的是 ( )。 A. 宏名无类型 B.宏替换不占用运行时间 C.宏替换只是字符替换 D. 宏名必须用大写字母表示 5. 编译系统对宏命令的处理是 ( )。 A. 在程序运行时运行的 B. 在程序连接时进行的 C.在程序中其他语句同时进行编译的 D.在对源程序中其他成分正式编译之前进行的 6. 有如下的宏定义: #define N 2 #define Y(N) ((N+1)*n) 则执行语句 z=2*(N+Y(5));后的结果是 ( )。 A. 语句有错误 B. z=34 C. z=70 D. z无定值 7. 以下程序的输出结果为 ( )。 #define PT 5.5 #define S(x) PT*x*x main() { int a=1,b=2; printf("%4.1f\n",S(a+b)); } A. 12.0 B. 9.5 C. 12.5 D. 33.5 8. 对下面的程序段,正确的说法是 ( )。 #define A 3 #define B(a) ((A+1)*a) x=3*(A+B(7)); B. 程序错误,不允许嵌套定义 B. x=93 C. 程序错误,宏定义不许有参数 D. x=21 9. 有宏定义 #define MOD(a,b) a%b ,执行以下语句后的输出为 ( )。 A. 11 B. 10 C. 6 D. 宏定义不合法 10. #define 能做简单的替代,用宏替换计算多项式 4*x*x+3*x+2之值的函数f,正确的宏定义是 ( )。 A. #define f(x) 4*x*x+3*x+2 B. #define f 4*x*x+3*x+2 C. #define f(a) (4*(a)*(a)+3*(a)+2) D. #define 4*x*x+3*x+2 f(x) 11. 下面程序运行的结果是 ( )。 #define MUL(x,y) (x)*y main() { int a=3,b=4,c; c=MUL(a++,b++); printf("%d\n",c); } A. 12 B. 15 C. 20 D. 16 12. 下面程序运行结果是 ( )。 #define MUL(x,y) (x)*y main() { int a=3,b=4,c; c=MUL(a+b,a+b); printf("%d\n",c); } A. 49 B. 25 C. 46 D. 28 13. 以下程序中 #define M 3 #define N (M+1) #define NN N*N/2 main() { printf("%d\n",NN); printf("%d\n",5*NN); } 第一个输出值是 ( )。 A. 3 B. 4 C. 6 D. 8 第二个输出值是 ( )。 A. 17 B. 18 C. 30 D. 40 14. 在“文件包含”预处理语句的使用形式中,当#include 后的文件名用双引号括起时,寻找被包含文件的方式是 ( )。 A. 先在源程序所在目录搜索,再按系统设定的 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 方式搜索 B. 直接按系统设定的标准方式搜索目录 C. 仅仅搜索源程序所在目录 D. 仅仅搜索当前目录 15. 以下正确的描述是 ( )。 A. C语言的编译预处理就是对源程序进行初步的语法检查 B. C语言的预处理功能是指完成宏替换和包含文件的调用 C. 凡是C源程序中行首以#标识的控制行都是预处理指令 D. 预处理执行只能位于C 源程序文件的首部 二、填空 1. 下面程序的结果是 ( )。 #define CJ(x) x*x main() { int a=1,b=2,c; c=CJ(a+b); printf("%d",c); } 2. 下面程序的结果是 ( )。 #define MUL(x,y) x*y+x main() { printf("%d\n", MUL(1+2,3)); } 3. 请填写下面程序的结果 #define CJ(x) (x)*(x) main() { int i=1,j=1,k; k=(j++)*(j++); printf("k=%d,j=%d",k,j); ____________,____________ while (i<=4) printf("%d,",CJ(i++)); ___________________________ printf("\n"); } 4. 下面程序的结果是 ( )。 #define CHANGE(a,b) { int t; t=a;a=b;b=t;} main() { int x=5, y=9; CHANGE(x,y); printf("x=%d,y=%d",x,y); } 5. 下面程序的结果是 ( )。 #define SELECT(a,b) ab?a:b)+1 main() { int i=6,j=8,k; printf("%d\n",MAX(i,j)); } 7. 下面程序的结果是 ( )。 #define PR(x) printf("%d ",x) main() { int j,a[]={1,3,5,7,9,11,13,15},i=5; for(j=3;j>0;j--) { switch(j) { case 1: case 2: PR(a[i++]);break; case 3: PR(a[--i]); } } } 8. 下面程序的结果是 ( )。 #define A 4 #define B(x) A*x/2 main() { float c,a=4.5; c=B(a); printf("%5.1f",c);} 9. 设有以下程序,为使之正确运行,请在______中填入应包含的指令。(try()函数在myfile.c中有定义) ______________________ main() { printf("\n"); try(); printf("\n"); } ********************************************************************** 综合题 阅读下列函数说明和C代码,并填空 1.函数strcat(char *si,char *s2)是将字符串s2连接在字符串si之后,构成一个首指 针为s1的字符串。 void strcat(char *sl,char *s2) { while(*s1!='\0') (1) ; for( ; (2) ;s1++,s2++); } 2. 本函数输入n(<1000)个整数到指定数组,求该数组中最大元素的值和此元素的下标,最大元素值以函数值返回,此元素的下标通过指针形参带回调用处。 #define MAXLINE 1000 int maxindex(int a[],int *index) { int i,n; do { printf("Please input n\n"); scanf("%d",&n); }while( (3) );/*保证输入的n在限定范围内*/ for(i=0 ; i=2;i--){ s1=(s1+m-1)%i; if(s1==0) __________; w=p[s1-1]; for(j=s1;j=0;i--){ printf(\ %4d\ ,p[i]); fprintf(fp,\ %4d\ ,p[i]); if(i % 10==0){ printf("\n" ); fprintf(fp,"\n" ); } } fclose(fp); } 6. 函数ReadDat()实现从文件IN.DAT中读取一篇英文文章存入到字符串数组xx中,请编制函数SortCharD(),其函数的功能是:以行为单位 对字符按从大到小的顺序进行排序, 排序后的结果仍按行重新存入字符串数组xx中,最后调用函数writeDat()把结果xx输出到文件OUT2.DAT中。 例:原文:dAe,BfC. CCbbAA 结果:fedCBA. bbCCAA 原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格。 部分源程序已给出。请勿改动主函数main()、读数据函数ReadDat()和输出数据函数writeDat()的内容。 #include #include char xx[50][80]; int maxline=0;/*文章的总行数*/ int ReadDat(void); void WriteDat(void); void SortCharD(void) { int i,j,k,strl; char ch; for(i=0;i=0 && t
本文档为【C课件计算机C实验指导书(新)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_730292
暂无简介~
格式:doc
大小:1013KB
软件:Word
页数:84
分类:
上传时间:2018-09-10
浏览量:60