当前位置:文档之家› Visual C++程序设计与应用教程课后答案

Visual C++程序设计与应用教程课后答案

Visual C++程序设计与应用教程课后答案
Visual C++程序设计与应用教程课后答案

1.6 习题

1. 填空题

(1) 项目工作区一般在集成开发环境的左侧。它展示一个项目的几个方面,它们分别是ClassView、ResourceView和FileView。

(2) 编译程序的快捷键是Ctrl+F7,链接程序的快捷键是F7,运行程序的快捷键是Ctrl+F5。

(3) 项目工作区文件的扩展名为.dsw 。

(4) 应用程序向导AppWizard的作用是帮助用户一步步生成一个新的应用程序,并且自动生成应用程序所需的基本代码。通过ClassWizard 可以增加消息映射和成员变量。

(5) 菜单选择可以通过两种方法来进行:一种是鼠标操作;另一种是键盘操作。

(6) 编译微型条工具栏最右边按钮的功能是Insert/Remove Breakpoint 。

(7) 快捷键或菜单及相关资源的资源符号的前缀是IDR_。

(8) 用户可以通过项目工作区窗口的ResourceView视图来查看资源。

2. 选择题

(1) 项目文件的扩展名是( )。

A. .exe

B. .dsp

C. .dsw

D. .cpp

(2) 设置断点的默认方式是( )。(第2章)

A. Location

B. Data

C. Message

D. Breakpoints

(3) 用应用程序向导AppWizard创建C++源文件,应选择( )选项卡。

A. Files

B. Projects

C. Workspaces

D. Other Documents

(4)Standard工具栏中最左边按钮与( )菜单命令的功能一样。

A. New

B. New File

C. New Text File

D. New Workspace

(5) Windows资源提供的资源编辑器不能编辑( )。

A. 菜单

B. 工具栏

C. 状态栏

D. 位图

3. 判断题

(1) 打开一个项目,只需打开对应的项目工作区文件。( T )

(2) 用户可以通过Tools | Customize菜单命令设置集成开发环境的工具栏。( T )

(3) 通过应用程序向导AppWizard建立的程序不能被立即执行。( F )

(4) 在同一项目中,Visual C++在内部用来标识资源的资源符号不能重复。( T )

(5) 在Windows环境下,资源与程序源代码紧密相关。( F )

4. 简答题

(1) 什么是项目? 它是由什么组成的?

在Visual C++集成开发环境中,把实现程序设计功能的一组相互关联的C++源文件、资源文件以及支撑这些文件的类的集合称为一个项目。项目是Visual C++ IDE开发程序的基本单位,一个项目至少包含一个项目文件,项目文件的扩展名为.dsp。项目文件保存了项目中所用到的源代码文件和资源文件的信息,如文件名和路径等。同时,项目文件还保存了项目的编译设置等信息,如调试版(debug)和发布版(release)。另外,根据项目类型的不同,一个项目包含有不同的源文件、资源文件和其他类别的文件。

(2) 解释项目工作区中各个视图的功能。

ClassView用于显示项目中定义的类;ResourceView用于显示项目中所包含的资源文件;FileView 用于显示所创建的项目。

(3) WizardBar工具栏的作用是什么?

WizardBar工具栏可以对ClassView和ClassWizard中的命令进行快速访问,使类和成员函数的操作更加方便,WizardBar会自动跟踪用户程序的上下文。

(4) 简述向项目添加一个资源的方法。

用户可以通过在Insert菜单中选择Resource菜单项来创建新的资源。单击Resource菜单项,弹出Insert Resource对话框。首先在对话框的左侧选择资源类型,然后根据具体情况,单击右侧的不同按钮。若资源需要临时创建,则单击New按钮,在打开的相应资源编辑器中创建资源。若资源文件已经存在,则单击Import按钮,在Import Resource对话框中选择资源文件,然后单击Import按钮。

2.5 习题

1.填空题

(1) MFC的全称是Microsoft Foundation Class 。

(2) Windows是一个基于事件的消息驱动系统。

(3) 句柄是Windows使用的一种无重复整数,主要用来标识应用程序中的一个对象。

(4) 利用MFC AppWizard[exe]可以创建三种类型的应用程序,即单文档、多文档和基于对话框的应用程序。

(5) 一个单文档的MFC应用程序框架一般包括5个类,它们分别是应用程序类、框架窗口类、视图类、文档类和文档模板类。

(6) Windows消息主要有3种类型,即标准Windows消息、控件消息和命令消息。

(7) MFC采用消息映射来处理消息。

(8) CWinApp提供4个成员函数来实现传统SDK应用程序WinMain( )函数完成的工作。

2.选择题

(1) Windows应用程序是按

照()非顺序的机制运行的。

A.事件→消息→处理

B.消息→事件→处理

C.事件→处理→消息

D.以上都不对

(2) 下面( )不是MFC应用程序外观的选项。

A.Docking toolbar B.Context-sensitive Help

C.ActiveX Controls D.Printing and print preview

(3) 对MFC类的下列描述中,( )是错误的。

A.应用程序类CWinApp是CWinThread的子类

B.窗口类CWnd提供了MFC中所有窗口类的基本功能

C.CView是CWnd类的子类

D.CDocTemplate类是Template类的子类

(4) 下列( )不是MFC 消息映射机制有关的宏。

A.DECLARE_MESSAGE_MAP( )宏

B.BEGIN_MESSAGE_MAP( )宏

C.DECLARE_SERIAL( )宏

D.END_MESSAGE_MAP( )宏

3.判断题

(1) 窗口是Windows应用程序的基本操作单元,是应用程序与用户之间交互的接口环境,也是系统管理应用程序的基本单位。( t )

(2) 所有的Windows应用程序都是消息驱动的。

(t )

(3) 所有的Windows应用程序都是用MFC AppWizard[exe]向导创建的。( f )

(4) 使用MFC AppWizard[exe]向导创建应用程序框架时,向导生成的文件名和类名是不可更改的。( f )

(5) 消息映射是将消息处理函数与它要处理的特定消息连接起来的一种机制。(t )

(6) 命令消息是由菜单项、工具栏按钮、快捷键等用户界面对象发出的WM_COMMAND 消息。( t )

(7) 利用MFC编程时,所有的消息与消息处理函数的添加都必须采用ClassWizard类向导来完成。( f )

(8) WinMain函数是所有Windows应用程序的入口。( t )

(9) 用快捷键F9既可设置断点,又可取消断点。

( t )

(10)调式程序时,会同时出现Variable窗口和Watch窗口。( t )

4.简答题

(1) 简述MFC应用程序的执行过程。

MFC应用程序启动时,首先创建应用程序对象theApp。这时将自动调用应用程序类的构造函数初始化对象theApp,然后由应用程序框架调用MFC提供的WinMain( )主函数。在WinMain( )主函数中,首先通过调用全局函数GetApp( )来获取theApp的指针pApp,然后通过该指针调用theApp的成员函数InitInstance( )来初始化应用程序。在应用程序的初始化过程中,同时还构造了文档模板,产生最初的文档、视图和主框架窗口,并生成工具栏和状态栏。当InitInstance( )函数执行完毕后,WinMain( )函数将调用成员函数Run( ),进入消息处理循环,直到函数Run( )收到WM_QUIT消息。MFC首先调用CWinApp类的成员函数ExitInstance( ),然后调用静态对象的析构函数,包括CWinApp对象,最后退出应用程序,将控制权交给操作系统。

在初始化的最后,应用程序将收到WM_PAINT消息,框架会自动调用视图类的OnDraw()函数绘制程序客户区窗口。这时,应用程序的基本窗口已经生成,应用程序准备接收系统或用户的消息,以便完成用户需要的功能。如果消息队列中有消息且不是WM_QUIT消息,则将消息分发给窗口函数,以便通过MFC消息映射宏调用指定对象的消息处理函数。如果消息队列中没有消息,函数Run( )就调用函数OnIdle( )进行空闲时间的处理。

(2) 简述文档/视图与其他类对象的关系。

在MFC应用程序中,文档类和视图类是用户最常用的两个类,它们之间是密切相关的。文档/视图体系结构是MFC应用程序框架结构的基石,它定义了一种程序结构,这种结构利用文档对象保存应用程序的数据,依靠视图对象控制视图显示数据,文档与视图的关系是一对多的关系,也就是说,文档中的数据可以以不同的方式显示。MFC在类CDocument和CView中为文档和视图提供了基础结构。CWinApp、CFrameWnd和其他类与CDocument 和CView共同把所有的程序片段连在一起。文档/视图与其他类对象的关系如下图所示。

(3) 简述MFC消息映射机制。

MFC采用消息映射来处理消息。这种消息映射机制包括一组消息映射宏,用于把一个Windows消息和其消息处理函数联系起来。MFC应用程序框架提供了消息映射功能,所有从CCmdTarget类派生出来的类都能够拥有自己的消息映射。

(4) 消息WM_LBUTTONDOWN的消息映射宏和消息处理函数是什么?

消息WM_LBUTTONDOWN的消息映射宏是ON_WM_LBUTTONDOWN( ) ,消息处理函数是OnRButtonDown()。

(5) 如何自定义消息?如何发送自定义消息?

Windows将所有的消息值分为4段:0x0000~0x03FF消息值范围段用于Windows系统消息,0x0400~0x7FFF段用于用户自定义的窗口消息,0x8000~0xBFFF段为Windows保留值,0xC000~0xFFFF段用于应用程序的字符串消息。

常量WM_USER(为0x0400)与第一个自定义消息值相对应,用户必须为自己的消息定义相对于WM_USER的偏移值,利用#define语句直接定义自己的消息,如下所示:#define WM_USER WM_USER+3 ;// 自定义消息WM_USER

也可以调用窗口消息注册函数RegisterWindowMessage( )来定义一个Windows消息,由系统分配消息一个整数值。该函数原型为:

UINT RegisterWindowMessage(LPCTSTR lpString);

其中参数lpString是要定义的消息名,调用成功后将返回该消息的ID值。

发送自定义消息消息采用的函数是SendMessage( )函数。(文中未讲清楚)

3.7 习题

1.填空题

(1) Windows引入GDI的主要目的是为了实现设备无关性。

(2) 与DOS字符方式下的输出文本不同,Windows是按图形方式输出的。

(3) 为了体现Windows的设备无关性,应用程序的输出面向一个称之为设备环境的虚拟逻辑设备。

(4) 在一个MFC应用程序中获得DC的方法主要有两种:一种是接受一个参数为指向CDC对象的指针;另一种是声明一个MFC设备环境类的对象,并使用this 指针为该对象赋值。

(5) Windows用COLORREF 类型的数据存放颜色,它实际上是一个32 位整数。它采用3个参数表示红、绿、蓝分量值,这3个值的取值范围为0~255 。

(6) 库存对象是由操作系统维护的用于绘制屏幕的常用对象,包括库存画笔、画刷、字体等。

(7) 可以利用CGdiObject类的成员函数CreateStockObject( ) 将GDI对象设置成指定的库存对象。

(8) 创建画笔后必须调用CDC类的成员函数SelectOject( ) 将创建的画笔选入当前设备环境。

(9) 在默认情况下输出文本时,字体颜色是黑色,背景颜色是白色,背景模式为不透明模式。

(10) 创建画笔的方法有两种,一种是定义画笔对象时直接创建,另一种是先定义一个没有初始化的画笔对象,再调用CreatePen( )函数创建指定画笔。

2.选择题

(1) 下面( )不是MFC设备环境类CDC类的派生类。

A.GDI 类B.CPaintDC类

C.CClientDC类

D.CWindowDC类

(2) 下面( )不是GDI对象。

A.CFont类B.CPalette类

C.CClientDC类

D.CBitmap类

(3) 下列描述中,( )是错误的。

A.CreatePointFont( )是CFont类提供的创建函数

B.可使用SetTextAlign( )函数改变文本对齐方式

C.使用函数GetTextMetrics( )可以获得所选字体中指定字符串的宽度和高度

D.可使用DrawText( )函数在给定的矩形区域内输出文本

(4) 下列( )不是MFC CDC类中常用的文本输出函数。

A.TextOut( ) B.DrawText( )

C.ExtTextOut( )

D.ExtDrawText( ) 3.判断题

(1) CDC类是MFC设备环境类的基类。

( t )

(2) CClientDC代表整个窗口的设备环境。( f )

(3) CPen和CFont均是GDI对象。( t )

(4) 深绿色RGB值为(0,128,0) ( t )

(5) 删除CPen对象可调用CPen对象的DeleteObject( )函数。( f )

(6) 创建阴影画刷函数是CreateHatchBrush( )。( t )

(7) 默认的对齐方式是TA_LEFT| TA_BOTTOM。( f )

(8) DDB又称GDI位图,它依赖于具体设备,只能存在于内存中。( t )

4.简答题

(1) GDI创建哪几种类型的图形输出?

应用程序可以使用GDI创建3种类型的图形输出:矢量图形、光栅图形和文本。

(2) 什么是设备环境?它的主要功能有哪些?

设备环境DC也称设备描述表或设备上下文。设备环境DC是由GDI创建、用来代表设备连接的数据结构。DC的主要功能有以下几种:

●允许应用程序使用一个输出设备。

●提供Windows应用程序、设备驱动和输出设备之间的连接。

●保存当前信息,例如当前的画笔、画刷、字体和位图等图形对象及其属性,以及颜

色和背景等影响图形输出的绘图模式。

●保存窗口剪切区域(Clipping Region),限制程序输出到输出设备中窗口覆盖的区域。

(3) 什么是GDI,它有什么功能?MFC将GDI函数封装在哪个类中?

GDI是Windows提供了一个图形设备接口的抽象接口。GDI负责管理用户绘图操作时功能的转换,其主要功能是实现设备无关性。MFC将GDI函数封装在CDC类中。

(4) 请叙述设备无关性的含义,实现设备无关性需要哪几个环节?

所谓设备无关性,是指操作系统屏蔽了硬件设备的差异,使用户编程时一般无须考虑设备的类型,如不同种类的显示器或打印机。当然,实现设备无关性的另一个重要环节是设备驱动程序。不同设备根据其自身不同的特点(如分辨率和色彩数目)提供相应的驱动程序。下图描述了Windows应用程序的绘图过程。

(5)MFC提供了哪几种设备环境类?它们各自有什么用途?

MFC提供的设备环境类包括CDC、CPaintDC、CClientDC、CWindowDC和CMetaFileDC 等,其中CDC类是MFC设备环境类的基类,其他MFC设备环境类都是CDC类的派生类,各个设备环境类的功能如下表所示。

设备环境类功能描述

CDC 所有设备环境类的基类,对GDI的所有绘图函数进行了封装;可用来直接访问

整个显示器或非显示设备(如打印机等)的上下文

CPaintDC CPaintDC用于响应窗口重绘消息(WM_PAINT)的绘图输出,不仅可对客户区进行

操作,还可以对非客户区进行操作

CClientDC 代表窗口客户区的设备环境,一般在响应非窗口消息并对客户区绘图时要用到

该类

CWindowDC 代表整个窗口的设备环境,包括客户区和非客户区;除非要自己绘制窗口边框和

按钮,否则一般不用它

CMetaFileDC 代表Windows图元文件的设备环境;一个Windows图元文件包括一系列的图形

设备接口命令,可以通过重放这些命令来创建图形;对CMetaFileDC对象进行的

各种绘制操作可以被记录到一个图元文件中

(6) 简述传统的SDK获取设备环境的方法。

传统的SDK获取设备环境的方法有两种。在WM_PAINT消息处理函数中通过调用API 函数BeginPaint( )获取设备环境,在消息处理函数返回前调用API函数EndPaint( )释放设备环境。如果绘图操作不是在WM_PAINT消息处理函数中,需要通过调用API函数GetDC( )获取设备环境,调用API函数ReleaseDC( )释放设备环境。

(7) 简述创建和使用自定义画笔的步骤。

如果要在设备环境中使用自己的画笔绘图,首先需要创建一个指定风格的画笔,然后选择所创建的画笔,最后还原画笔。

(8) 简述采用MFC方法编程时,显示一个DDB位图的步骤。

采用MFC方法编程时,显示一个DDB位图需要执行以下几个步骤。

●声明一个CBitmap类的对象,使用LoadBitmap( )函数将位图装入内存。

●声明一个CDC类的对象,使用CreateCompatibleDC( )函数创建一个与显示设备环境

兼容的内存设备环境。

●使用CDC::SelectObject( )函数将位图对象选入设备环境中,并保存原来设备环境的指

针。

●利用CDC的相关输出函数输出位图。

●使用CDC::SelectObject( )函数恢复原来设备环境。

4.6 习题

(1) 常见的菜单类型有主菜单、弹出菜单和快捷菜单3种。

(2) 在Visual C++中,每一个快捷键除了ID属性外,还有两个属性:键和

类型。

(3) 基于对话框的应用程序在运行时没有菜单栏。

(4) 在MFC中,工具栏的功能由类CToolBar 实现。

(5) 调用CToolBar类的成员函数CToolBar::Create( )或CreateEx( ) 创建并初始化工具栏窗口对象。

(6) 设置工具栏停靠特性,需要调用EnableDocking( ) 函数。

(7) 状态栏实际上是一个窗口,一般分为几个窗格,用来显示不同的信息。

(8) 在MFC中,状态栏的功能由CStatusBar 类实现。

(9) 状态栏显示的内容由数组indicators 决定,需要在状态栏中显示各窗格的标识符、位置以及个数。

(10) CStatusBar类的成员函数SetPaneInfo() 用来设置给定索引值的窗格ID、风格和宽度,成员函数SetPaneText() 用来更新窗格的文本

2. 选择题

(1) 在编辑某菜单项时,若要指明该菜单项是一个弹出式子菜单,必须选择属性对话框中的( )。

A.Separator B.Pop-up

C.Inactive

D.Grayed

(2) 要使鼠标箭头在按钮上暂停时能显示工具栏按钮提示,必须设置工具栏的风格为( )。

A.CBRS_TOOLTIPS B.CBRS_FLYBY C.CBRS_NOALIGN D.WS_VISIBLE

(3) MFC应用程序框架为状态栏定义的静态数组indicators放在文件( )中。

A.MainFrm.cpp B.MainFrm.h

C.stdAfx.cpp D.stdAfx.h

(4) 下列有关菜单的叙述中不确的是( )。

A.“&”字符的作用是使其后的字符加上下划线

B.“\t”转移字符表示使快捷键按右对齐显示

C.自定义菜单项ID不能与系统菜单项ID相同

D.选中菜单项属性对话框中的Separator,指明菜单项是一个水平线分隔条

3. 判断题

(1) 给菜单项定义快捷键,只需在菜单项属性设置对话框的Caption文本框中说明

即可。( f )

(2) 弹出快捷菜单一般出现在鼠标箭头的位置。( t )

(3) UPDATE_COMMAND是更新命令用户接口消息。( t )

(4) 工具栏停靠特性只能设置一次。( t )

(5) 状态栏的功能由CStatusBar类实现。( t )

(6) CMenu类、CToolBar类和CStatusBar类的根基类是相同的。( t )

(1) 简述菜单设计的主要步骤。

菜单设计一般需要经过下面两步:

●使用菜单编辑器编辑菜单资源;

●使用ClassWizard进行消息映射,编辑成员函数,完成菜单所要实现的功能。

(2) 为应用程序创建快捷菜单主要有哪些方法?

为应用程序创建快捷菜单主要有以下两种方法:

●使用Component Gallery创建快捷菜单

●使用TrackPopupMenu( )函数创建快捷菜单

(3) 如何动态创建菜单?

动态创建菜单分为以下3个步骤。

●利用CreateMenu( )函数创建一个空的弹出式菜单

●调用AppendMenu( )或InsertMenu( )函数在菜单中加入菜单项

●调用函数SetMenu( )加载动态菜单

(4) 创建工具栏的基本步骤有哪些?

创建工具栏的基本步骤是:

●创建工具栏资源;

●构建一个CToolBar对象;

●调用CToolBar::Create( )或CreateEx( )函数创建工具栏窗口;

●调用CToolBar::LoadToolBar()载入工具栏资源。

(5) 简述MFC创建状态栏所做的工作。

首先构造一个CToolBar类的对象,然后调用CToolBar::Create( )或CreateEx( )函数创建工具栏窗口,最后调用CToolBar::LoadToolBar( )函数载入工具栏资源。

5.7 习题

1.填空题

(1) 对话框的主要功能是输出信息和接收用户的输入。

(2) 从对话框的工作方式看,对话框可分为模态对话框和非模态对话框两种类型。

(3) 对话框主要由对话框模板资源与对话框类两部分组成。

(4) 使用DoModal()函数可以创建模式对话框,使用Create()函数可以创建非模式对

话框。

(5) 为了支持属性页对话框,MFC提供了CPropertySheet类和CPropertyPage类。

2.选择题

(1) 对话框的功能被封装在( )类中。

A. CWnd

B. CDialog

C. CObject

D. CCmdTarget

(2) ( )是非模式对话框。

A.“查找”对话框

B.“字体”对话框

C.“段落”对话框

D.“颜色”对话框

(3) 要将模式对话框在屏幕上显示需要用到函数( )。

A. Create

B. DoModal

C. OnOK

D. 构造函数

(4) 通常将对话框的初始化工作在( )函数中进行。

A. OnOK

B. OnCancel

C. OnInitDialog

D. DoModal

(5) 使用( )通用对话框类可以打开文件。

A. CFileDialog

B. CColorDialog

C. CPrintDialog

D. CFontDialog

3.简答题

(1) 简述创建和使用模态对话框的主要步骤。

●使用对话框编辑器来创建包含不同控件的对话框模板资源

●从MFC的CDialog中派生出一个类,用来负责对话框行为。

●利用ClassWizard把这个类和先前你产生的对话框资源连接起来。

●对话框的初始化。

●创建一个对话框对象,调用CDialog::DoModal()函数打开对话框。

(2) 如何向对话框模板资源添加控件?如何添加与控件关联的成员变量?

在一个对话框资源中增加控件的操作十分方便,只需从控件工具栏中选中要增加的控件,再将此控件拖动至对话框模板中的确定位置上,松开鼠标按键即添加了一个控件。调整控件的位置和大小的操作与Word中对文本框的操作完全一样。

可以利用ClassWizard类向导的Member Variables页面为对话框类添加与对话框控件关联的成员变量。在Member Variables页面中,双击一个ID或选定ID后,单击Add Variable 按钮,将弹出Add Member Variable对话框。在Member variable name框用于输入成员变量名,在Category下拉框选择成员变量的类别。

(3) 什么是DDX和DDV?编程时如何使用MFC提供的DDX功能?

DDX为对话框数据交换,它用于将成员变量与对话框控件相连接,完成数据在成员变量和控件之间的交换。DDV为对话框数据验证,它能自动校验输入的数据是否符合设计要求。我们只需通过ClassWizard为对话框类添加与对话框控件关联的成员变量即可使用MFC 提供的DDX功能。

(4) 简述创建属性页对话框的主要步骤。

●设计对话框资源。分别为各个页创建对话框模板,每页的模板最好具有相同尺寸,

如果尺寸不统一,则框架将根据尺寸最大的页来确定属性页对话框的大小。

●用ClassWizard为每页创建新类,并加入与控件对应的成员变量。

●打开属性页对话框

6.11 习题

1.填空题

(1) Windows系统提供的标准控件主要包括静态控件、编辑框、按钮、列表框、组合框和滚动条等。

(2) Windows标准控件的属性设置通常由General、Style及Extend Styles三个属性页构成。

(3) 当编辑框中的文本已被修改,在新的文本显示之后发送EN_CHANGE通知消息。

(4) CButton类控件包括按键按钮、单选按钮、复选框和组框等4种类型。

(5) 一组单选按钮在对话框类中只能映射一个int类型值变量,对应单选按钮在组中的序号,序号从0开始。

(6) 向列表框增加列表项使用CListBox类成员函数AddString或InsertString。

(7) 组合框是多个控件的组合,包括编辑框、列表框和按钮。

(8) —个旋转按钮控件通常是与一个相伴的控件一起使用的,这个控件称为“伙伴窗口”。该控件的Tab键次序必须小于旋转按钮。

(9) 当滑块滑动时,滑块控件将发送滚动消息来通知父窗口。垂直滑块发送WM_VSCROLL消息,水平滑块发送WM_HSCROLL消息。

(10) MFC的CProgressCtrl类封装了进度条控件的各种操作,该类的成员函数SetRange()用来设置进度条的范围。

2.简答题

(1) 在应用程序中访问控件的方法有哪些?

应用程序访问控件一般有3种方法:

●利用对话框的数据交换功能访问控件

●通过控件对象来访问控件

●利用CWnd类的一些用于管理控件的成员函数来访问控件

(2) 单选按钮控件如何成组?

将一组单选按钮放在一个组框控件中,并为同组中的第一个单选按钮设置Group属性。

(3) 组合框与列表框相比有什么不同?如何给组合框添加初始的列表项?

列表框可列出各种可能的选项,但用户却不能在列表框中输入新的列表项。而组合框不仅可以显示列表项供用户进行选择,而且允许用户输入新的列表项。

可以通过组合框控件属性对话框的Data选项卡添加初始的列表项。

7.7 习题

1.填空题

(1) 在文档/视图结构中,文档是用来管理和组织数据的,视图的作用是显示和编辑文档数据。文档与视图的关系是一对多的关系。

(2) 在文档/视图应用程序中,文档模板负责创建文档/视图结构,而应用程序对象管理文档模板,可以在应用程序的InitInstance()函数中创建一个和多个文档模板。

(3) 在通常情况下,视图派生类的成员函数中通过调用GetDocument()函数得到当前文档对象的指针。

(4) 文档类的数据成员初始化和文档的清理工作分别在OnNewDocument()成员函数和DeleteContents()成员函数中完成。

(5) MFC提供了两种集合类,一种是基于模板的集合类,另一种是非模板集合类。

(6) MFC应用程序通过CDocument的protected类型成员变量m_bModified的逻辑值来判断程序员是否对文档进行过修改。程序员可以通过CDocument的SetModifiedFlag()成员函数来设置该值。

(7) MFC AppWizard在创建文档应用程序框架时已在文档类中重载了Serialize()函数,通过在该函数中添加代码可以达到实现文档序列化的目的。

(8) 调用create()成员函数创建动态分割窗口,而静态分割窗口是调用CreateStatic()成员函数创建的。

2.简答题

(1) 通过哪几个主要成员函数完成文档与视图之间的相互作用?并简述这些成员函数的功能。

文档与视图的交互是通过下面几个主要的成员函数完成的:

●视图类CView的成员函数GetDocument()

该函数得到与之相关联的文档对象的指针,利用这个指针就可以访问文档类及其派生类的公有数据成员和成员函数。

●CDocument类的成员函数UpdateAllViews()

该函数通知与文档相关联的所有或部分试图,更新窗口内容。

●视图类的成员函数OnUpdate()

当应用程序调用CDocument::UpdateAllViews()函数时,实际上是调用了所有相关视图的OnUpdate()函数,以更新相关的视图。需要时,可以直接在视图派生类的成员函数中调用该函数刷新当前视图。另外,在初始化视图成员函数CView::OnInitialUpdate()中也调用了OnUpdate()函数。

●CView类的OnInitialUpdate()函数

当应用程序被启动,或用户从“文件”菜单中选择了“新建”或“打开”命令时,CView 的OnInitialUpdate()函数会被调用,该函数是虚函数。CView的OnInitialUpdate()函数除了调用OnUpdate()函数之外,不做其他任何事情。

也可以利用派生类的OnInitialUpdate()函数对视图对象进行初始化。

(2) 简述文档序列化与一般文件处理的区别。

一般文件处理是通过文件句柄来实现磁盘输入和输出,一个文件句柄与一个磁盘文件相关联。而文档序列化与一般文件处理最大的不同在于:在序列化中,对象本身对读和写负责。CArchive类对象并不知道也不需要知道它所读写数的内部结构,CArchive类对象为读写CFile类对象中的可序列化数据提供了一种安全的缓冲机制,它们之间形成了如下关系:Serialize()函数CArchive类对象CFile类对象磁盘文件

可见序列化使得程序员可以不直接面对一个物理文件而进行文档的读写。

(3) 如何让用户定义的类支持序列化?

要让用户定义的类支持序列化,必须满足以下5个条件:

●从CObject类派生,这样派生类就具有RTTI(Run-time type information)、Dynamic

Creation等功能。

●类的声明部分必须有DECLARE_SERIAL宏,此宏需要1个参数:类名称。

●类的实现部分必须有IMPLEMENT_SERIAL宏,此宏需要3个参数:一是类名称,

二是基类名称,三是版本号。

●重新定义Serialize( )虚函数,使它能够适当地把类的成员变量写入文件中。

●为此类加上一个默认构造函数,这是因为如果一个对象来自文件,MFC必须先动态

地创建它,而且在没有任何参数的情况下调用构造函数,然后才从文件中读取对象

数据。

8.5 习题

1.填空题

(1) MFC通过CView类提供打印功能和打印预览功能。

(2) 在打印过程中,CPrintInfo类的主要作用是在框架窗口和CView类之间传递消息。

(3) CPrintInfo类中的成员变量m_nCurPage表示当前打印/预览的页号,成员函数SetMaxPage( )设置文档的最大打印页数。

(4) 在Windows操作系统中,存在两种类型的坐标:设备坐标和逻辑坐标。

(5) 不同的映射模式将影响输出设备显示的图形尺寸因子,Windows的缺省映射模式是MM_TEXT,在该映射方式中,每一个逻辑单位对应一个设备像素。

(6) 在MFC应用程序中,通过调用CDC类的SetMapMode()函数设置映射方式。

(7) 如果要使程序支持多页打印功能,首先在打印之前设置要打印的页数,然后设置每一页视图原点的打印坐标。

(8) 一般在OnBeginPrinting()函数中设置要打印的页数,在OnPrepareDC()函数中通过调用CDC类成员函数SetViewPortOrg( )设置当前页的视图原点坐标。

2.简答题

(1) 打印和屏幕显示有何异同?

相同点:在MFC应用程序中,打印和屏幕显示最终都是通过调用视图类的OnDraw()函数来完成的。OnDraw()函数有一个指向CDC类对象指针的参数,该对象代表了接收OnDraw()函数输出的设备上下文,它可以是代表显示器的显示设备上下文,也可以是代表打印机的打印设备上下文。

不同点:当窗口显示文档内容时,视图窗口将收到WM_PAINT消息,程序框架将调用OnPaint()函数,OnPaint()函数会调用OnDraw()函数,此时传递给OnDraw()函数的设备上下文参数为显示设备上下文,OnDraw()函数的绘制结果将会输出到显示器。进行打印时,用于打印和打印预览的OnPrint()函数也会调用OnDraw()函数,而此时传递给OnDraw()函数的设备上下文参数为打印机设备上下文,OnDraw()函数的绘制结果也会输出到打印机。

(2) 如何在打印和屏幕显示时输出不同内容?

有两种方法:

●分别在OnPaint()和OnPrint()这两个函数中完成屏幕输出和打印输出工作,而不必依

赖于OnDraw()函数。

●OnDraw()函数中,调用pDC->IsPrinting()或设置变量来识别目前进行的输出工作并区

别对待。

(3) 打印预览和打印有何异同?

相同点:在MFC应用程序中,打印和屏幕显示最终都是通过调用视图类的OnDraw()函数来完成的。

不同点:打印预览和打印不同,它是应用程序利用屏幕来模拟打印机输出的过程。进行打印时,传递给OnDraw()函数的设备上下文参数为打印机设备上下文。而为了实现打印预览的功能,MFC类库从CDC类中派生出CPreviewDC类。在进行打印预览时,传给OnDraw()函数的是一个指向CPreviewDC对象的指针。一般CDC类中保存有两套相同的设备描述表,而CPreviewDC类则保存有两套不同的设备描述表,其中的属性设备描述表指向打印机,而输出设备描述表指向屏幕。

(4) MM_LOMETRIC映射方式有何特点?

MM_LOMETRIC映射方式将一个逻辑单位映射到0.l mm,MM_LOMETRIC坐标系统Y轴方向与默认的MM_TEXT相反。

(5) 简述添加打印页眉、页脚的程序代码的步骤。

添加打印页眉、页脚的程序代码可以分两步进行:

●在OnPrint()函数中利用CPrintInfo*pInfo的成员变量m_rectDraw来设置打印页上打

印区域的大小。

●在m_rectDraw范围之外打印页眉和页脚。

9.5 习题

1.填空题

(1) Windows的库类型主要有静态链接库和动态链接库。

(2) DLL中一般定义有导出函数和内部函数两种类型的函数,其中导出函数可以被外部程序调用。

(3) 每个DLL都含有一个入口函数DllMain(),就像我们编写的应用程序必须有main()或WinMain()函数一样。该函数的作用是初始化DLL,并在卸载时清理DLL。

(4) Visual C++ 6.0支持多种DLL,包括非MFC DLL、MFC常规DLL和MFC扩展DLL。

(5) 非MFC DLL的内部不使用MFC,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序调用。

(6) 在MFC规则DLL的内部可以使用MFC,但是它与应用程序的接口不能是MFC,而是C函数或者C++类。

(7) MFC扩展DLL的主要功能是实现从现有MFC类库中派生出可重用的类。

(8) 从MFC DLL中导出函数常用使用模块定义文件和使用关键字_declspec(dllexport)两种方法。后者不仅可以导出函数,还可以导出一个完整的类。

(9) DEF文件是一个包含EXE文件或DLL文件声明的文本文件。每个.DEF文件至少必须包含LIBRARY语句和EXPORTS 语句。

(10) 应用程序与DLL链接的方式主要有隐式链接和显式链接。

(11) 应用程序分别使用AfxLoadLibrary()和AfxFreeLibrary()函数来加载和释放MFC扩展DLL。

(12) MFC扩展DLL除了可使用关键字_declspec(dllexport) 导出类外,还可以使用宏AFX_EXT_CLASS来导出类。

2.简答题

(1) 什么是动态链接库?它和静态链接库有何区别?生成的动态链接库应放在哪些目录下才能被应用程序使用?

动态链接库是一种用来为其它可执行文件(包括EXE文件和其它DLL)提供共享的函数库。它和静态链接库的主要区别是与应用程序的链接方式不同,前者进行的是动态链接,后者进行的是静态链接。

生成的动态链接库必须位于下面4个目录之一中:

●当前目录

●Windows的系统的目录,如Windows\system

●Windows所在的目录,如WINNT

●环境变量PATH中所指定的目录

(2) Visual C++支持哪几种DLL?如何选择选择DLL的类型?

Visual C++支持多种DLL,包括:

●非MFC DLL

●MFC常规DLL(MFC Regular DLL)

●MFC扩展DLL(MFC Extension DLL)

我们选择哪一种DLL的类型可以从以下几个方面来考虑:

如果DLL不需要使用MFC,那么使用非MFC DLL是一个很好的选择。如果需要创建使用了MFC的DLL,并希望MFC和非MFC应用程序都能使用所创建的DLL,那么可以选择MFC常规DLL。如果希望在DLL中实现从MFC派生的可重用的类,或者是希望在应用程序和DLL之间传递MFC的派生对象时,必须选择MFC扩展DLL。

(3) MFC常规DLL实际上包含哪两方面的含义?

MFC常规DLL实际上包含有两方面的含义。一方面它是“MFC的”,这意味着可以在这种DLL的内部使用MFC,另一方面它是“常规的”,这意味着它不同于MFC扩展DLL,在MFC规则DLL的内部虽然可以使用MFC,但是它与应用程序的接口不能是MFC,而是C函数或者C++类。

(4) 如何从MFC DLL中导出函数?

从MFC DLL中导出函数常用的有两种方法。

第一种是使用模块定义文件(.DEF)。DEF文件常用的模块语句如下:

(1) 第一个语句必须是LIBRARY语句,这个语句指出DLL的名字,链接器将这个名字放到DLL导入库(import library)中,DLL导入库包含了指向外部DLL的函数索引指针。

(2) EXPORTS 语句列出被导出函数的名字,以及导出函数的数值(由@号与数字构成)。序数值可以省略,编译器(Compiler)会为每个导出函数指定一个,但这样指定的值不如自己指定的明确。

(3) 使用DESCRIPTION语句描述DLL的用途,这个语句可以省略。

(4) 使用“;”开头的注释语句。

使用AppWizard创建一个MFC DLL时,AppWizard将创建一个.DEF文件的框架,并自动添加到项目中。建立DLL时,链接器使用.DEF文件来创建一个导出文件(.EXP)和一个导入库文件(.LIB),然后使用导出文件来创建.DLL文件。

另一种方法是在定义函数时使用关键字_declspec(dllexport)。这种情况下,不需要.DEF 文件。导出函数的形式为:

declspec(dllexport) <返回类型> <导出函数名>(<函数参数>);

(5) 应用程序与DLL链接的方式有哪两种?它们之间有何区别?

应用程序与DLL链接的方式主要有如下两种:隐式链接和显式链接。

隐式链接又称为静态加载,指的是使用DLL的应用程序先链接到编译DLL时生成的导入库LIB文件,执行应用程序的同时系统也加载所需的DLL。在应用程序退出之前,DLL 一直存在于该程序运行进程的地址空间中。

显式链接又称为动态加载,使用显式链接DLL的应用程序必须在代码中动态地加载所使用的DLL,并使用指针调用DLL中的导出函数,在使用完毕后,应用程序必须卸载所使用的DLL。使用显式链接的一个非常明显的好处是,应用程序可以在运行过程中决定需要加载的DLL。

10.6 习题

1.填空题

(1) 进程和线程都是操作系统的概念,进程是操作系统分配资源单位,线程是操作系统分配处理器的最基本单元。

(2) 可以用VC++所带的工具Spy++来观察操作系统管理的进程和线程。

(3) 每一个进程至少有一个主线程,该线程由系统创建。

(4) 一般可以使用全局变量和自定义消息进行线程间通信。

(5) 常用的同步对象有临界区、互斥、信号量和事件。

(6) 为了使用同步类,需要手动将头文件Afxmt.h加到应用程序中。

(7) 使用CSingleLock类的成员函数Lock()请求获得临界区。

(8) CEvent 类对象有人工事件和自动事件两种类型。

2.简答题

(1) 什么叫进程?什么叫线程?它们有什么区别和联系?

进程和线程都是操作系统的概念。进程是应用程序的执行实例,它是操作系统分配资源单位,每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过程中创建的资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。线程是操作系统分配处理器的最基本单元,它是进程内部的一个独立的执行单元。

进程是没有活力的,它是一个静态的概念。一个程序运行时,由系统自动创建一个进程。系统创建好进程后,实际上就启动执行了该进程的主线程,主线程以函数地址形式(一般为main()或WinMain()函数),将程序的启动点提供给操作系统。主线程终止了,进程也就随之终止。

每一个进程至少有一个主线程,它无需由用户去主动创建,是由系统自动创建的。用户根据需要在应用程序中创建其它线程,多个线程并发地运行于同一个进程中。一个进程中的所有线程都在该进程的虚拟地址空间中,共同使用这些虚拟地址空间、全局变量和系统资源。

(2) MFC中线程有哪两种类型?它们有何区别?如何创建它们?

MFC中有两类线程,分别称之为工作者线程和用户界面线程。

创建一个工作者线程,首先需要编写一个希望与应用程序的其余部分并行运行的自定义函数,该函数称为线程函数。然后,在程序中合适的地方调用全局函数AfxBeginThread()创建线程,以启动线程函数。

创建用户界面线程,首先需要从CWinThread类派生一个新类,并重写派生类的InitInstance()、ExitInstance()及Run()等函数,然后使用AfxBeginThread()函数的另一个版本创建并启动用户界面线程。

(3) 什么是线程函数?其作用是什么?如何给线程函数传递参数?

线程函数是新线程创建后要执行的函数,新线程要实现的功能是由线程函数实现的。线程函数带有一个参数LPVOID pParam,创建线程的AfxBeginThread()全局函数的第二个参数LPVOID pParam的类型与线程函数的参数类型完全一致,该参数为启动线程时传递给线程函数的入口参数。

(4) 如何终止线程?

当一个工作者线程的线程函数执行一个返回语句或者调用AfxEndThread()成员函数时,这个工作者线程就终止。对于用户界面线程,当一个WM_QUIT消息发送到它的消息队列中,或者该线程中的一个函数调用AfxEndThread()成员函数时,该线程就被终止。

一般来说,线程只能自我终止。如果要从另一个线程来终止线程,必须在这两个线程之间设置通信方式。

(5) 如何使用自定义消息进行通信?

使用Windows消息来进行通讯,首先需要定义一个自定义消息,然后,需要时在一个线程中调用全局函数::PostMessage()向另一个线程发送自定义消息。

(6) 什么叫线程的同步?为什么需要同步?

使隶属于同一进程的各线程协调一致地工作称为线程的同步。这是因为在多线程处理时线程之间经常要同时访问一些资源,这有可能导致错误。例如,对于像磁盘驱动器这样独占性系统资源,由于线程可以执行进程的任何代码段,且线程的运行是由系统调度自动完成的,具有一定的不确定性,因此就有可能出现两个线程同时对磁盘驱动器进行操作,从而出现操作错误;又例如,对于银行系统的计算机来说,可能使用一个线程来更新其用户数据库,而用另外一个线程来读取数据库以响应储户的需要,极有可能读数据库的线程读取的是未完全更新的数据库,因为可能在读的时候只有一部分数据被更新过。

(7) MFC提供了哪些类来支持线程的同步?它们分别用在什么场合?

MFC为我们提供了几个同步类和同步辅助类来支持线程的同步,这些类及其适用场合如下表所示。

类名说明

同步对象基类CSyncObject 纯虚类,为Win32中的同步对象提供通用性能

临界区类CCriticalSection 当在一个时间内仅有一个线程可被允许修改数据或某些其他控制资源

时使用,用于保护共享资源。

互斥类CMutex 有多个应用(多个进程)同时存取相应资源时使用,用于保护共享资源。

信号类CSemaphore 一个应用允许同时有多个线程访问相应资源时使用,主要功能用于资

源计数。

事件类CEvent 某个线程必须等待某些事件发生后才能存取相应资源时使用,以协调

线程之间的动作。

同步辅助类CSingleLock、CMultiLock 用于在一个多线程程序中控制对资源的访问。当在一个时间只需等待一个同步化对象时使用CSingleLock,否则使用CMultiLock

(8) 如何使用CSemaphore类实现多线程同步?

使用CSemaphore类实现多线程同步,有两种用法。

方法一:单独使用CSemaphore对象,步骤如下:

●定义CSemaphore类的一个全局对象(以使各个线程均能访问)

●在访问临界区之前,调用CSemaphore类的成员Lock()获得临界区。

●在本线程中访问临界区中的共享资源。

●访问临界区完毕后,使用CSemaphore的成员函数UnLock()来释放临界区。

方法二:与同步辅助类CSingleLock或CMutiLock类一起使用,步骤如下(以类CSingleLock为例):

●定义CSemaphore类的一个全局对象,如critical_section

●在访问临界区之前,定义CSingleLock类的一个对象,并将critical_section的地址传

送给构造函数

●使用CSingleLock类的成员函数Lock()请求获得临界区。

●在本线程中访问临界区中的共享资源。

●调用CSingleLock类的成员函数UnLock()来释放临界区。

11.6 习题

1. 填空题

(1) MFC的ODBC类主要包括5个类,分别是CDatabase类、CRecordset类、CRecordView类、CFieldExchange类、CDBException类,其中CRecordset类是用户实际使用过程中最关心的。

(2) CDatabase类的作用是建立与数据源的连接。

(3) CRecordset类的功能是对表记录进行操作的许多功能,如添加记录、删除记录、修改记录、查询记录等,并能直接为数据源中的表映射一个CRecordset类对象,方便用户的操作。

(4) CRecordView的作用是显示数据库记录。利用对话框数据交换机制DDX在记录集与表单视图的控件之间传输数据。

(5) 可以利用CRecordset类的成员函数AddNew() 添加一条新记录;可以利用CRecordset类的成员函数MoveFirst() 将记录指针移动到第一条记录上;可以利用CRecordset 类的成员函数Update() 完成保存记录的功能。

(6) 在CRecordset类中提供了两个公有数据成员m_strFilter和m_strSort,分别用来设置对记录的查找和排序。

(7) ADO对象模型提供了7种对象,它们分别是连接对象、命令对象、记录集对象、域对象、参数对象、属性对象、错误对象。

(8) 在Visual C++中使用ADO开发数据库之前,需要用#import引入ADO,其语句格式为:#import "c:\Program Files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")

(9) 在使用ADO开发数据库时,常用的三个智能指针为:_ConnectionPtr 、_CommandPtr 和_RecordsetPtr。

(10) Connection对象的ConnectionString属性表示连接数据库的字符串,CursorLocation 属性用来指定光标引擎的位置。

2.简答题

(1) Visual C++中都提供了哪些访问数据库的技术?它们有何特点?

Visual C++中都提供了ODBC、DAO、OLE DB和ADO等访问数据库的技术。

●ODBC

ODBC是为应用程序访问关系数据库时提供的一个标准的基于SQL的统一接口。对于不同的数据库,ODBC提供了一套统一的API,使应用程序可以利用所提供的API来访问任何提供了ODBC驱动程序的数据库,而且,ODBC已经成为一种标准,目前所有的关系数据库都提供了ODBC驱动程序,这使得ODBC的应用非常广泛,基本上可用于所有的关系数据库。

由于ODBC是一种底层的访问技术,因此,ODBC API可以使客户应用程序从底层设置和控制数据库,完成一些高层数据库技术无法完成的功能。

直接使用ODBC API编写应用程序需要编制大量的代码,Visual C++6.0提供了MFC ODBC类,其中封装了ODBC API,因此,使得用MFC来创建ODBC的应用程序非常简单。

●DAO

DAO提供了一种通过程序代码创建和操作数据库的机制。DAO类似于用Access或Visual Basic编写的数据库应用程序,它使用微软公司的Jet数据库引擎形成一系列的数据访问对象:数据库对象、表和查询对象、记录集对象等,各个对象协同工作。

DAO支持以下4个数据库选项:可以打开一个Access数据库文件(*.mdb文件),直接打开一个ODBC数据源,使用Jet引擎打开一个ISAM (被索引的顺序访问方法)类型的数据

源以及把外部表附属到Access数据库。

MFC DAO是微软公司提供的用于访问Microsoft Jet数据库文件(*.mdb)的强有力的数据库开发工具,它通过DAO的封装,向程序员提供了DAO丰富的操作数据库手段。

●OLE DB

OLE DB是Visual C++开发数据库应用中提供的新技术,它基于COM接口。因此,OLE DB对所有的文件系统包括关系型数据库和非关系型数据库都提供了统一的接口。这些特性使得OLE DB技术比传统的数据库访问技术更加优越。

与ODBC技术相似,OLE DB属于数据库访问技术中的底层接口。但直接使用OLE DB 来设计数据库应用程序需要编写大量的代码。

●ADO

ADO技术是基于OLE DB的访问接口,它继承了OLE DB技术的优点,并且ADO对OLE DB的接口进行封装,定义了ADO对象,使程序开发得到简化。ADO技术属于数据库访问的高层接口。

(2) 如何注册ODBC的数据源?

下面是以Visual FoxPro 6.0数据库StudentDB.dbc为例,注册ODBC的数据源的步骤。

●双击ODBC图标,进入ODBC数据源管理器。在这里用户可以设置ODBC数据源的

一些信息,其中的用户DSN选项卡中可以让用户定义的在本地计算机使用的数据

源名

●单击添加按钮,弹出创建新数据源对话框,为新的数据源选择数据库驱动程序。由

于使用的是Visual FoxPro6.0数据库,所以选择Microsoft Visual FoxPro Driver,并

单击“完成”按钮。

●在ODBC Visual FoxPro Setup对话框中,为该数据源起一个简短的名称。应用程序将

使用该名称来指定用于数据库连接的ODBC数据源配置,因此建议所起的名称能

反映出该数据库的用途,或者与使用该数据库的应用程序名称类似。对于该例,给

该数据源命名为Student,并在下一个编辑框中输入对该数据库的说明。

●指定数据库的位置。单击Browse按钮,出现Select Database文件选择对话框,定位

并选择StudentDB.dbc文件。

●单击“打开”按钮完成数据库选择,在ODBC Visual FoxPro Setup对话框中单击OK

按钮,完成数据源的创建。最后,单击ODBC数据源管理器对话框中的确定按钮,退出数据源管理器。

(3) 简述用MFC ODBC进行数据库编程的基本步骤。

Visual C++创建一个MFC ODBC数据库应用程序需要以下几个步骤:

●准备数据库

●在系统的数据源管理器中注册数据源

●用AppWizard创建基本的数据库应用程序

●向基本的数据库应用程序中添加代码,实现特定数据库功能

(4) 什么是动态记录集和快照集?它们的根本区别是什么?

动态集是与用户所做的更改保持同步的记录集,而快照集则是数据的一个静态视图。它们的根本区别是:当在一个动态集中滚动一条记录时,由其他用户或应用程序中的其他记录集对该记录所做的更改会相应地显示出来,而快照集则不会。

(5) 在使用CRecordset类成员函数进行记录的编辑、添加和删除等操作时,如何使操作有效?

在编辑、添加和删除时,必须遵循一些特定步骤才能得到正确结果。

要编辑改当前记录,应该按下列步骤进行:

●调用Edit()成员函数。

调用该函数后就进入了编辑模式,程序可以修改域数据成员。注意不要在一个空的记录集中调用Edit(),否则会产生异常。

●设置域数据成员的新值。

●调用Update()完成编辑。

Update()把变化后的记录写入数据源并结束编辑模式。

要向记录集中添加新的记录,应该按下列步骤进行:

●调用AddNew()成员函数。

调用该函数后就进入了添加模式,该函数把所有的域数据成员都设置成NULL。

●设置域数据成员。

●调用Update()。

Update()把域数据成员中的内容作为新记录写入数据源,从而结束了添加。

如果记录集是快照,那么在添加一个新的记录后,需要调用Requery()函数重新查询,因为快照无法反映添加操作。

要删除记录集的当前记录,应按下面两步进行:

●调用Delete()成员函数。

该函数会同时给记录集和数据源中当前记录加上删除标记。注意不要在一个空记录集中调用Delete()函数,否则会产生一个异常。

●滚动到另一个记录上以跳过删除记录。

在对记录集进行更新以前,程序最好先调用CanUpdate()函数、CanAppend()函数来判断记录集是否是可以更新的,因为如果在不能更改的记录集中进行修改、添加或删除将导致异常的产生。

(6) CRecordset类的成员函数Requery()有哪两个重要用途?

Requery()有两个重要用途:

●使记录集能反映用户对数据源的改变

●按照新的查找条件或排序方法查询记录并重新建立记录集

(7) 简述MFC的ODBC应用程序中的DDX和RFX数据交换机制。

下图显示了MFC的ODBC应用程序中的DDX和RFX数据交换机制:

记录视图记录集数据源中的表

控件域数据成员表中的字段

(8) 简述用ADO进行数据库编程的基本步骤。

用ADO进行数据库编程下列基本步骤:

●引入ADO库

●初始化COM环境

●ADO与数据库的连接

●操作数据库

●断开连接

C语言程序设计第三版习题库答案

C 语言程序设计(第三版)习题库 1、设圆半径r=,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。用scanf 输入数据,输出计算结果,输出时要求文字说明,取小数点后两位数字。请编程序。 #include<> main(){ floatr,h,C1,Sa,Sb,Va,Vb; scanf(__”%f ”__,&r); scanf(”%d ”,__&h _);; C1=2**r; Sa=*r*r; Sb=4*Sa; Va=4**r*r*r/3; Vb=Sa*h; printf(___”Cl=%.2fSa=%.2fSb=%.2fVa=%.2fVb=%.2f ”,Cl,Sa,Sb,Va,Vb ); } 2、输入一个华氏温度,要求输出摄氏温度。公式为c=5(F-32)/9 输出要求有文字说明,取位2小数。 #include<> main(){ floatF,c; scanf("%f",&F); ____c=5*(F-32)/9______; printf("c=%.2f",c); } 3、有一函数:?? ???≥-<≤-<=10113101121x x x x x x y 写一程序,输入x 值,输出y 值。 #include<> main(){ intx,y; printf("输入x :"); scanf("%d",&x); if(x<1){/*x<1*/ y=x; printf("x=%3d,y=x=%d\n",x,y);

}elseif(____x<10_______){/*1≤x-10*/ _____y=2*x-1_______; printf("x=%3d,y=2*x-1=%d\n",x,y); }else{/*x≥10*/ y=3*x-11; printf("x=%3d,y=3*x-11=%d\n",x#include"" main() { intx,y; scanf("%d",&x); if(x<1) {y=x;} elseif(x>=1&&x<10) {y=2*x-1;} else {y=3*x-11;} printf("%d",y); }#include"" main() { intx,y; scanf("%d",&x); if(x<1) {y=x;} elseif(x>=1&&x<10) {y=2*x-1;} else {y=3*x-11;} printf("%d\n",y); }#include"" main() { intx,y; scanf("%d",&x); if(x<1) {y=x;} elseif(x>=1&&x<10) {y=2*x-1;} else {y=3*x-11;} printf("%d",y); }scanf("%d",&x);

C语言程序设计试题集与答案解析

一.填空 1. 每个C程序都必须有且仅有一个________ 函数。 2. C语言程序开发到执行通常要经过6个阶段即编辑、预处理、________、链接、加载和执行。 3. 软件是程序,以及______、使用和维护所需要的所有文档。 4. 国标中规定:“计算机程序是按照具体要求产生的适合于计算机处理的_________”。 5. 程序设计语言按照书写形式,以及思维方式的不同一般分为低级语言和________两大类。 6. C语言是由________组成的。 7. C语言的函数可分为主函数main、标准库函数和_________。 8. 一个函数是由两部分组成的,即:________和函数体。 9. 编译是将C语言所编写的源程序________成机器代码,也称为建立目标代码程序的过程。 10. 程序是由某种程序设计语言编制出来,体现了编程者的控制思想和对计算机执行操作 的要求。不同的任务功能,就会需求不同的软件程序,如:控制计算机本身软硬件协调工作,并使其设备充分发挥效力,方便用户使用的系统软件程序,称为操作系统;而为办公自动化(OA)、管理信息系统(MIS)、人工智能、电子商务、网络互联等等应用而开发的软件程序,统称为_________。 11. 机器语言是以__________形式表示的机器基本指令的集合,是计算机系统唯一不需要翻译可以直接识别和执行的程序设计语言。 12. 与机器语言相比,使用汇编语言来编写程序可以用_______来表示指令的操作码和操作对 象,也可以用标号和符号来代替地址、常量和变量。

13. 在编译程序之前,凡以____开头的代码行都先由预处理程序预处理。 14. C程序的执行均是由执行_________开始。 15. 函数体即为包含在{}内的部分。它分为________和为完成功能任务由若干个C 语句 组成的执行部分。 16. C语言程序中一条简单语句是以________字符作为结束符的。 17. C语言是结构化、________的程序设计语言。 18. 由于计算机硬件不能直接识别高级语言中的语句,因此,必须经过“_______程序”,将用高级语言编写的程序翻译成计算机硬件所能识别的机器语言程序方可执行。 19. 用高级语言编写的程序需翻译成计算机硬件所能识别的机器语言程序方可执行。所以 说,用高级语言进行程序设计,其编程效率高,方便易用,但_______没有低级语言高。 20.

C语言程序设计期末考试试题(含答案)

C语言程序设计 期末考试试题及其答案 一、单项选择题(本大题共20题,每题2 分,共40分) 1、以下不是C语言的特点的是( ) A、C语言简洁、紧凑 B、能够编制出功能复杂的程序 C、C语言可以直接对硬件进行操作 D、C语言移植性好 2、以下不正确的C语言标识符是( ) A、ABC B、abc C、a_bc D、ab.c 3、一个C语言程序是由( ) A、一个主程序和若干子程序组成 B、函数组成 C、若干过程组成 D、若干子程序组成 4、一个算法应该具有“确定性”等5个特性,对另外4个特性的描述中错误的是( ) A、有零个或多个输入 B、有零个或多个输出 C、有穷性 D、可行性 5、设变量a是整型,f是实型,i是双精度型,则表达式10+‘a’+i*f值的数据类型为( ) A、int B、float C、double D、不确定 6、在C语言中,char型数据在内存中的存储形式是( ) A、补码 B、反码 C、源码 D、ASCII码 7、有如下程序,输入数据:12345M678<cR>后(表示回车),x的值是( ) 。 #include main(){ int x; float y; scanf("%3d%f",&x,&y); } A、12345 B、123 C、45 D、345 8、若有以下定义int a,b; float x,则正确的赋值语句是( ) A、a=1,b=2 B、b++; C、a=b=5 D、b=int(x); 9、以下程序的执行结果是( )

#include { int i=10,j=10; printf("%d,%d\n",++i,j--); } A、11,10 B、9,10 C、11,9 D、10,9 10、巳知字母A的ASCII码是65,以下程序的执行结果是( ) #include main() { char c1='A',c2='Y'; printf("%d,%d\n",c1,c2); A、A,Y B、65,65 C、65,90 D、65,89 11、下列运算符中优先级最高的是( ) A、< B、十 C、% D、!= 12、设x、y和z是int型变量,且x=3,y=4,z=5,则下面表达式中值为0是( ) 。 A、’x’&&’y’ B、x<=y C、x||y+z&&y-z D、!((x<y)&&!z ||1) 13、判断char型变量cl是否为小写字母的正确表达式为( ) A、’a’<=c1<=f’z’ B、(c1>=a)&&(c1<=z) C、(‘a’>=c1) (‘z’<=c1) D、(c1>=’a’)&&(c1<=’z’) 14、字符串"a"在内存中占据的字节个数为( ) A、0 B、 1 C、 2 D、 3 15、下面有关for循环的正确描述是( ) A、for循环只能用于循环次数已经确定的情况 B、for循环是先执行循环体语句,后判定表达式 C、在for循环中,不能用break语句跳出循环体 D、for循环体语句中,可以包含多条语句,但要用花括号括起来 16、下面程序的运行结果是( ) #include main() {int num=0; while(num<=2) {num++; printf(“%d ,num); } } A、 1 B、 1 2 C、 1 2 3

c语言程序设计第五版习题答案

习题解析与答案 第1章C语言概述 一.简答题 1.概述C语言的主要特点。 【解答】 (1)语言简洁、紧凑,使用方便、灵活。 (2)数据类型丰富,表达能力强。 (3)运算符多样。C语言中的运算符包含的范围非常广泛。 (4)具有结构化的控制语句。如if…else语句、while语句、do while语句、switch 语句、for语句。 (5)允许直接访问物理地址。C语言中含有的位和指针运算,能够直接对内存地址进行访问操作。 (6)所生成的目标代码质量高,可移植性好。 2.构成C语言程序的基本单位是什么?它由哪几部分组成? 【解答】函数是构成C语言程序的基本单位。一个完整的C程序一般由文件包含、宏定义、函数说明、变量和一个或若干个函数组成。 3.C语言程序的运行一般要经过哪几个步骤? 【解答】(1)编辑;(2)编译;(3)连接,生成EXE文件;(4)执行。 二.运行程序写结果 1.输入下面程序并运行。 main() { int a1,a2,x; a1=100; a2=50; x=a1-a2; printf(″x=%d\n″,x); } 【解答】运行结果为:x=50 2.输入下面程序并运行。 main() { int a1,a2,x; a1=10; a2=20; x=a1*a2; printf(″a1=%d,a2=%d\n″,a1,a2); printf(″x=%d\n″,x); } 【解答】运行结果为:a1=10,a2=20 x=200 3.输入下面程序并运行。

#include main() { printf("******\n"); printf(" *****\n"); printf(" ****\n"); printf(" ***\n"); printf(" **\n"); printf(" *\n"); } 【解答】运行结果为:****** ***** **** *** ** * 思考:可以修改程序,使之输出平行四边形,等腰三角形等图形。 三.编程题 1.参照本章例题,编写一个C程序,用于显示如下信息: ************************* I love C programs! ************************* 【分析与提示】 ①要有文件包含语句#include 。C语言中没有数据的输入、输出等功能,数据的输入、输出都是通过调用系统提供的库函数scanf和printf等来实现的。这些函数的说明都包括在stdio.h文件中。 ②main是主函数的名称。用{}括起来的内容是函数体,函数体由若干条语句组成,这是计算机要执行的部分,每条语句以分号“;”结束。 ③注意显示的信息有三行,所以要用到换行符“\n”。 参考代码: #include main() { printf("************************\n"); printf(" I love C programs! \n"); printf("************************\n"); }

04737c程序设计试题及答案20200_图文

全国2009年10月高等教育自学考试 C++程序设计试题 课程代码:04737 一、单项选择题(本大题共20小题,每小题1分,共20分) 在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。错选、多选或未选均无分。 1.对C++中主函数描述正确的是( ) A.名称为main,可为多个 B.名称不限,可为多个 C.名称为main,必须有且只能有一个 D.名称不限,必须有且只能有一个 2.调用声明为int result(int a,int b)的函数时,正确的方法是( ) A.result(1,2) B.result(1) C.result(0.1,0.3) D.result(1,2,3) 3.用于包含C++标准库iostream的预处理指令是( ) A.#define B.#include C.#define ‘iostream’ D.#include‘iostream’ 4.无类型标识符是指( ) A.void B.bool C.short D.long 5.从本质上看,引用是被引用变量的( ) A.拷贝 B.别名 C.复制 D.克隆 6.下面关于数组的初始化正确的是( ) A.char str[ ]={'a','b','c'}; B.char str[2]={'a','b','c'}; C.char str[1][2]={{'a','b'},{'e','d'}}; D.char str[ ][ ]={'a','b','c'}; 7.C++类中定义的成员默认访问属性为( ) A.public B.private C.protected D.friend 1文档来源为:从网络收集整理.word版本可编辑.

(完整版)C语言程序设计练习及答案

《C语言程序设计》练习及答案 得分评卷人复查人 一、单选题,每小题1分,共60分(将正确答案的序号写在题目的括号中)。 1、结构化程序设计的三种基本控制结构是(D )。 A、主程序、子程序、函数 B、输入、处理、输出 C、调用,返回,转移 D、顺序、选择、循环 2、下列关于C程序变量的叙述, ( D )是错误的。 A、变量名必须由字母或下划线开头。 B、程序中的变量必须在被使用之前定义。 C、不同的基本类型的变量之间可以混合运算。 D、变量的数据类型决定变量的"作用域"。 3、能将C语言编写的源程序转换为目标程序的软件是(C )。 A、编辑程序 B、汇编程序 C、编译程序 D、解释程序 4、以下符号中,合法的用户标识符是( D )。 A、-p B、int C、3ab D、_xt_ 5、以下选项中,与m=n++完全等价的表达式是( C )。 A、m=++n B、m+=n+1 C、m=n, n=n+1 D、n=n+1,m=n 6、若有定义:int aa[8];。则以下表达式中不能代表数组元aa[1]的地址的是(C )。 A、&aa[0]+1 B、&aa[1] C、&aa[0]++ D、aa+1 7、表达式!5&(7+3)&&(4+5)的值是(A)。 A、0 B、1 C、5 D、9 8、以下选项中非法的C语言表达式是(A )。 A、x+1=x+1 B、0<=x<100 C、i=j==0 D、(char)(65+3) 9、在TURBO C中, int类型变量所占字节数是(B )。 A、1 B、2 C、4 D、8 10、C语言中基本的数据类型包括(B)。 A、整型,实型,逻辑型 B、整型,实型,字符型

《C语言程序设计实践教程》答案-完整版

4.2练习题 一、选择题 1.D 2.B 3.A 4.B和D 5.C 6.A 7.B 二、填空题 1.//或/* */ 2.主或main 3.函数首部和函数体4.编译和连接 5.分号 5.2练习题 一、选择题 1.A 2.D 3.B 4.B 5.C 6.C 7.D 8.A 9.B 10.B 11.D 12.B 13.A或B 14.C 15.B

17.D 18.D 19.C 20.D 21.B 22.A 23.D 24.C 25.C 26.B 27.C 28.D 29.A 30.B 二、填空题 1.102,10 2.#define 宏名字符串 3.1 4.n=1 5.-4 6.a=1,b= ,c=2 7.c=A 8.n1=%d\nn2=%d 9.a+b>c&&a+c>b&&b+c>a 10.ch>=’a’&&ch<=’z’|| ch>=’A’&&ch<=’Z’11.7 12.0 13.11110000 14.8,4 6.2练习题 一、选择题 1.A 2.C 3.D 4.C 5.A

7.A 8.D 9.B 10.C 11.A 12.A 13.C 14.B 15.正确答案为:12345678 二、填空题 1.10 2.y=1 x%i==0 3.屏幕中间输出一个由星号组成的菱形4.1 5.13 6.(cx=getchar())!=-1 front=cx; 7.m%n 8.4 9.*p px=&x py=&y 三、读程序,写结果 1.-1 2.3,1,-1, 3.a=16,y=60 4.x=12,y=4 5.59 7.2练习题 一、选择题 1.B 2.C 3.C 4.A 5.D

C语言程序设计试题集及其答案

第一章基础知识 一.填空 1. 每个C程序都必须有且仅有一个________ 函数。 2. C语言程序开发到执行通常要经过6个阶段即编辑、预处理、________、链接、加载和执行。 3. 软件是程序,以及______、使用和维护所需要的所有文档。 4. 国标中规定:“计算机程序是按照具体要求产生的适合于计算机处理的_________”。 5. 程序设计语言按照书写形式,以及思维方式的不同一般分为低级语言和________两大类。 6. C语言是由________组成的。 7. C语言的函数可分为主函数main、标准库函数和_________。 8. 一个函数是由两部分组成的,即:________和函数体。 9. 编译是将C语言所编写的源程序________成机器代码,也称为建立目标代码程序的过程。 10. 程序是由某种程序设计语言编制出来,体现了编程者的控制思想和对计算机执行操作 的要求。不同的任务功能,就会需求不同的软件程序,如:控制计算机本身软硬件协调工作,并使其设备充分发挥效力,方便用户使用的系统软件程序,称为操作系统;而为办公自动化(OA)、管理信息系统(MIS)、人工智能、电子商务、网络互联等等应用而开发的软件程序,统称为_________。 11. 机器语言是以__________形式表示的机器基本指令的集合,是计算机系统唯一不需要翻译可以直接识别和执行的程序设计语言。 12. 与机器语言相比,使用汇编语言来编写程序可以用_______来表示指令的操作码和操作对 象,也可以用标号和符号来代替地址、常量和变量。 13. 在编译程序之前,凡以____开头的代码行都先由预处理程序预处理。 14. C程序的执行均是由执行_________开始。 15. 函数体即为包含在{}内的部分。它分为________和为完成功能任务由若干个C 语句 组成的执行部分。 16. C语言程序中一条简单语句是以________字符作为结束符的。 17. C语言是结构化、________的程序设计语言。 18. 由于计算机硬件不能直接识别高级语言中的语句,因此,必须经过“_______程序”,将用高级语言编写的程序翻译成计算机硬件所能识别的机器语言程序方可执行。 19. 用高级语言编写的程序需翻译成计算机硬件所能识别的机器语言程序方可执行。所以 说,用高级语言进行程序设计,其编程效率高,方便易用,但_______没有低级语言高。

C语言程序设计第二版习题参考答案

C语言程序设计第二版 习题参考答案 Document serial number【LGGKGB-LGG98YT-LGGT8CB-LGUT-

C语言程序设计习题参考答案 习题 1 一、判断题 1.在计算机中,小数点和正负号都有专用部件来保存和表示。 2.二进制是由0和1两个数字组成的进制方式。 3.二进制数的逻辑运算是按位进行的,位与位之间没有进位和借位的关系。 4.在整数的二进制表示方法中,0的原码、反码都有两种形式。 5.有符号数有三种表示法:原码、反码和补码。 6.常用字符的ASCII码值从小到大的排列规律是:空格、阿拉伯数字、大写英文字母、小写英文字母。 解:1.F2.T 3.T 4.T 5.T 6.T 二、单选题 1.在计算机中,最适合进行数值加减运算的数值编码是。 A. 原码 B. 反码 C. 补码 D. 移码 2.已知英文小写字母m的ASCII码为十进制数109,则英文小写字母y的ASCII 码为十进制数。 A. 112 B. 120 C. 121 D. 122 3.关于ASCII码,在计算机中的表示方法准确地描述是。 A. 使用8位二进制数,最右边一位为1 B. 使用8位二进制数,最左边一位为1 C. 使用8位二进制数,最右边一位为0 D. 使用8位二进制数,最左边一位为0 4.设在机器字长4位,X=0111B,Y=1011B,则下列逻辑运算中,正确的是 ___________。 A. X∧Y=1000 B. X∨Y=1111 C. X⊕Y=0011 D. ˉY=1000 5.下列叙述中正确的是()。 A.高级语言就是机器语言 B.汇编语言程序、高级语言程序都是计算机程序,但只有机器语言程序才是计算机可以直接识别并执行的程序 C.C语言因为具有汇编语言的一些特性,所以是汇编语言的一种 D.C源程序经过编译、连接,若正确,执行后就能得到正确的运行结果6.用C语言编写的源程序经过编译后,若没有产生编译错误,则系统将()。 A.生成可执行文件B.生成目标文件 C.输出运行结果D.自动保存源文件 7.下列叙述中不正确的是()。 A.main函数在C程序中必须有且只有一个 B. C程序的执行从main函数开始,所以main函数必须放在程序最前面 C. 函数可以带参数,也可以不带参数。

c程序设计教程与实验__吉顺如__实验一到七

实验1熟悉Visual C++环境及运行C程序 一、实验目的 1.掌握在Visual C++环境下C程序的建立、编辑、编译和执行过程。 2.掌握C程序的最基本框架结构,完成简单程序的编制与运行和调试。 3.掌握发现语法错误、逻辑错误的方法以及排除简单错误的操作技能。 二、实验内容 1.从键盘输入两个数a和b,求它们的平方和,并在屏幕上输出。输入该C程序,编译并运行之,记下屏幕的输出结果,以文件名保存。 #include <> main() { int a,b,sum; /*定义整型变量a、b、sum */ printf("Please Input a,b \n "); /*输出提示信息*/ scanf("%d%d",&a,&b); /*从键盘输入两个整数分别赋予a和b*/ sum=a*a+b*b; /*赋值语句,把a2+b2的结果赋给变量sum*/ printf("%d*%d+ %d*%d=%d\n",a,a,b,b,sum); /*输出语句*/ }

改错题 (1计算x*y 的值并将结果输出。试纠正程序中存在的错误,以实现其功能。程序以文件名保存。 #include <> main main () { int x=2;y=3;a int x=2,y=3,a ; A=x*y a =x*y ; print ('a=%d",A); print f ("a=%d",a ); printf("\n"); } (2)下程序的功能为:求两数中的较大数据并输出。纠正程序中存在的错误,以实现其功能。程序以文件名保存。 #include <> viod main() void main() { int a ,b , max; Scanf(“%d,%d ”,&a,&b); s canf(“%d,%d ”,&a,&b); Max=a; m ax=a; If (max

C语言程序设计试题集及答案

单项选择题 (002) 阅读程序题 (018) 程序填空题 (039) 编写程序题 (070) 一、单项选择题 导读:单项选择题要求从给出的四个备选答案中,选出一个最符合题意的答案。本类习题主要检查对C语言基本概念的掌握情况,读者可根据学习进度选做部分习题。在完成习题的过程中,不但要选出正确的答案,而且要清楚不正确的选项错在何处,以加深对概念的理解。对于掌握不准的问题,应该通过上机实验来检验。 【1.1】以下不正确的C语言标识符是____。 A) int B) a_1_2 C) ab1exe D) _x 【1.2】以下是正确的C语言标识符是____。 A) #define B) _123C) %d D) \n

【1.3】下列四组字符串中都可以用作C语言程序标识符的一组是。 ??? A) print B) i\am C) Pxq D) str_l ??? _3d one_half My->book Cpp ??? oodbs tart$it line# pow ??? aBc 3pai His.age while 【1.4】下面各选项组中,均是C语言关键字的组是。 A) auto,enum,include B) switch,typedef,continue C) signed,union,scanf D) if,struct,type 【1.5】下列不属于C语言关键字的是。 A) default B) register C) enum D) external 【1.6】C语言程序从main()函数开始执行,所以这个函数要写在____。 A) 程序文件的开始B) 程序文件的最后 C) 它所调用的函数的前面D) 程序文件的任何位置 【1.7】下列关于C语言的叙述错误的是____ A) 大写字母和小写字母的意义相同 B) 不同类型的变量可以在一个表达式中 C) 在赋值表达式中等号(=)左边的变量和右边的值可以是不同类型 D) 同一个运算符号在不同的场合可以有不同的含义 【1.8】在C语言中,错误的int类型的常数是。 A) 32768 (超过了范围) B) 0 C) 037 D) 0xAF 【1.9】执行语句printf("%x",-1);屏幕显示____。 A) -1 B) 1 C) –ffff D) ffff 【1.10】已知long i=32768;执行语句printf("%d",i);屏幕显示____。 A) -1 B) -32768C) 1 D) 32768 【1.11】已知long i=65539; 执行语句printf("%d",i);屏幕显示____。 A) 65539 B) -3 C) 3D) 程序不能执行 【1.12】在C语言中,整数-8在内存中的存储形式是。 A) 1111 1111 1111 1000B) 1000 0000 0000 1000 C) 0000 0000 0000 1000 D) 1111 1111 1111 0111 【1.13】C语言中字符型(char)数据在内存中的存储形式是____。

C语言程序设计期末考试试题及答案

C 语言程序设计 试 题 (2008 /2009 学年 第 二 学期) 一. 选择题(满分30分,每题2分) 1.若a 、b 、c 都定义为int 类型且初值为0,则以下不正确的赋值语句是 D 。 A. a=b=c+8; B. a+=y+3; C. c++; D. a+b+c 2. 已知int j ,i=1;执行语句“j=i++;”后,变量i 的值是 B 。 A. 1 B. 2 C. –1 D. -2 3.执行下面程序: #include "stdio.h" void main() { int a=1,b=2,c=3; c=(a+=a+2),(a=b,b+3); printf(“%d,%d,%d ”,a,b,c); } 则输出结果是: A 。 A. 2,2,4 B. 4,2,3 C. 5,5,3 D. 4,2,5 4.若要求在if 后一对圆括号中表示a 不等于0的关系,则能正确表示这一关系的表达式为 D 。 A. a< >0 B. !a C. a=0 D. a 5. for (j=0;j<11;j++);循环结束后,j 的值是 B 。 A. 12 B. 11 C. 10 D. 9 6. C 语言中函数返回值的类型由 D 决定的。 A. return 语句中的表达式类型 B. 调用该函数的主调函数的类型 C. 调用函数时临时决定 D. 定义函数时所指定的函数类型 7. 下列说法中正确的是 B 。 A 在调用用户自定义函数时,必须对其进行声明。 B 函数可以返回一个值,也可以什么值也不返回。 C 说明函数时,必须明确参数的类型和返回值。 D 在程序设计中空函数没有什么作用。 8. 若int i=10;执行下列程序后,变量i 的正确结果是 D 。 switch ( i ) {case 0: i+=1; case 10: i+=1; case 11: i+=1; default: i+=1; } A. 10 B. 11 C. 12 D. 13 9. 下列语句中不正确的字符串赋值或初始化的是 C 。 A . char str[10]={"strings"}; B.char str[8]={'s','t','r','i','n ','g','s','\0'}; C. char str[10]; str= "strings"; D. char str[]= "strings"; 10. 有如下程序: #include void main() { int a=1,b=0,c=0; if (a

C语言程序设计习题答案

C 语言程序设计习题答案 习题一 C 语言程序设计概述 一、名词解释 (1)程序P1 (2)程序设计P1 (3)机器语言P1 (4)汇编程序P2 (5)高级语言P2 (6)编译程序P3 (7)解释程序P3 (8)算法P4 (9)结构化的程序设计P9 二、简述题 1. 设计程序时应遵循哪些基本原则?P4 答:正确性、可靠性、简明性、有效性、可维护性、可移植性。 2. 算法的要素是什么?算法具有哪些特点? 答:算法的要素是:操作与控制结构;算法的特点有:有穷性、确定性、有效性、有零个或多个输入、有一个或多个输出。 3. 算法的表示形式有哪几种? 答:算法的表示形式有:自然语言、传统流程图、伪代码、结构化的流程图(N_S 流程图,盒图)。 4. 有哪三种基本结构? 答:三种基本结构是:顺序结构、选择结构和循环结构。 5. 传统流程图与N-S 流程图最大的区别是什么? 答:N-S 流程图去掉了在传统流程图中常用的流程线,使得程序的结构显得更加清晰、简单。 三、用传统流程图、N-S 图分别表示求解以下问题的算法。 1. 有3个数a ,b ,c ,要求按由大到小的顺序把它们输出。 2. 依次将10个数输入,求出其中最大的数 和最小的数并输出。 3. 求1+2+3+…+100的值。

5. 求下列分段函数的值。 6. 求100~200之间的所有素数。 7. 求一元二次方程ax 2+bx+c=0的根。分别考虑d=b 2-4ac 大于0、等于0和小于0三种情况。 四、注释下面C 程序的各个组成部分。 main() /*主函数 */ { /*程序开始 */ int a,k,m; /*定义三个用来存放整数的变量 */ a=10; /*将整数10赋值给变量a */ k=2; /*将整数2赋值给变量k */ m=1; /*将整数1赋值给变量1 */ a=(k+m)*k/(k-m); /*先求出算术表达式的值,并将其赋值给变量a */ printf("%d\n",a); /*在屏幕上打印出变量a 的值 */ } /*程序结束 */ 习题二 数据类型、运算符与表达式 一、选择题 1~10:BCDCB DDBCA 11~20: ADDAA DBADC 21~28: DABAD CDD Y= 3X (X<1) 4X-1 (X=1) 5(X-1)+6 (1

c语言程序设计题目及答案

一、程序设计共113 题第1 题题 号:319 #include "stdio.h" void wwjt(); int fun(int m) { int i,k=1; if(m<=1) k=0; for(i=2;i #include #define M 3 #define N 4 void wwjt(); void fun(int tt[M][N],int pp[N]) { int i,j; for(j=0;jpp[j]) pp[j]=tt[i][j]; } 第3 题题号:375 功能:从键盘上输入任意实数, 求出其所对应的函数值。 z=e 的x 次幂( x>10) z=log(x+3) (x>-3) z=sin(x)/((cos(x)+4) #include #include void wwjt(); double y(float x) { double z; if(x>10) z=exp(x); else if(x>-3) z=log(x+3); else z=sin(x)/(cos(x)+4); return(z); } 第4 题题号:334 功能:求给定正整数n 以内的素数之积。( n<28) #include #include"conio.h" void wwjt(); long fun(int n) { long i,k; long s=1; for(i=2;i<=n;i++) {for(k=2;k #include"conio.h" void wwjt(); long int fun(int n) { long s=1,i; for(i=2;i<=n;i++) if(n%i==0)s=s*i; return s; } 第6 题题号:50 功能:求出菲波那契数列的前一项与后一项之比的极限的 近似值例如:当误差为0.0001 时,函数值为0.618056 。 #include #include "math.h" void wwjt(); float fun() { float f1=1,f2=1,f3; float r1=2,r2; do {r2=r1; r1=f1/f2; f3=f1+f2; f1=f2; f2=f3; }while(fabs(r1-r2)>1e-4); return r1; } 第7 题题号:394 功能:产生20个[30,120] 上的随机整数放入二维数组 a[5][4] 中, 求其中的最小值。 #include "stdlib.h" #include void wwjt(); int amin(int a[5][4]) { int i,j,s; s=a[0][0];

C语言程序设计第三版谭浩强课后习题答案完整版

C语言程序设计第三版谭浩强 课后习题答案完整版 第一章 1.5请参照本章例题,编写一个C程序,输出以下信息:************************** V ery Good! ************************** 解: mian() {printf(“**************************”); printf(“\n”); printf(“V ery Good!\n”); printf(“\n”); printf(“**************************”); } 1.6 编写一个程序,输入a、b、c三个值,输出其中最大值。解: mian() {int a,b,c,max; printf(“请输入三个数a,b,c:\n”); scanf(“%d,%d,%d”,&a,&b,&c); max=a; if(max main() { char c1=?C?,c2=?h?,c3=?i?,c4=?n?,c5=?a?; c1+=4; c2+=4; c3+=4; c4+=4; c5+=4; printf("密码是%c%c%c%c%c\n",c1,c2,c3,c4,c5); } 运行结果: 密码是Glmre 3.9求下面算术表达式的值。 (1)x+a%3*(int)(x+y)%2/4 设x=2.5,a=7,y=4.7 (2)(float)(a+b)/2+(int)x%(int)y 设a=2,b=3,x=3.5,y=2.5 (1)2.5 (2)3.5 3.10写出程序运行的结果。 main() {int i,j,m,n; i=8; j=10; m=++i; n=j++; printf(“%d,%d,%d,%d”,i,j,m,n); } 解: 9,11,9,10 3.12 写出下面表达式运算后a的值,设原来a=12。设a和n都已定义为整型变量。 (1)a+=a (2)a-=2 (3)a*=2+3 (4)a/=a+a (5)a%=(n%=2),n的值等于5 (6)a+=a-=a*=a 解: (1) 24 (2) 10 (3) 60 (4) 0 (5) 0 (6) 0 第四章 4.4若a=3,b=4,c=5,x=1.2,y=2.4,z=-3.6,u=51274,n=128765,c1=’a’,c2=’b’。想得到以下输出格式和结果,请写出程序(包括定义变量类型和设计输出)。 a=_3_ _b=_4_ _c=_5 x=1.200000,y=2.400000,z=-3.600000 x+y=_3.600_ _y+z=-1.20_ _z+x=-2.40 c1=ˊaˊ_or_97(ASCII)

C语言程序设计试题及答案

C语言程序设计试题及 答案 内部编号:(YUUT-TBBY-MMUT-URRUY-UOOY-DBUYI-0128)

C语言程序设计 一、选择题(共40分,每小题2分) 1、以下叙述不正确的是() A、一个C源程序可由一个或多个函数组成 B、一个C源程序必须包含一个main函数 C、C程序的基本组成单位是函数 D、在C程序中,注释说明只能位于一条语句的后面 2、下列四个选项中,是不合法的用户标识符的选项是() A、abc B、12AC C、sun D、 A2 3、设有语句int a=4;则执行了语句a+=a- =a*a后,变量a的值是() A、-24 B、0 C、4 D、16 4、下列运算符中优先级最高的是() A、< B、+ C、&& D、== 5、在C语言中,运算对象必须是整型数的运算符是() A、% B、/ C、%和/ D、 + 6、以下关于运算符的优先顺序的描述正确的是() A、关系运算符<算术运算符<赋值运算符<逻辑与运算符 B、逻辑与运算符<关系运算符<算术运算符<赋值运算符 C、赋值运算符<逻辑与运算符<关系运算符<算术运算符 D、算术运算符<关系运算符<赋值运算符<逻辑与运算符 7、在C语言中,如果下面的变量都是int类型,则输出的结果是() sum=pad=5;pAd=sum++,pAd++,++pAd;

printf(“%d\n”,pad); A、7 B、6 C、5 D、4 8、x、y、z被定义为int型变量,若从键盘给x、y、z输入数据,正确的输入语句是() A、 INPUT x、y、z; B、scanf(“%d%d%d”,&x,&y,&z); C、 scanf(“%d%d%d”,x,y,z); D、read(“%d%d%d”,&x,&y,&z); 9、假定从键盘输入23456< 回车 >,下面程序的输出结果是:() void main ( ) { int m,n; scanf(“%2d%3d”,&m,&n); printf(“m=%d n=%d\n”,m,n); } A、m=23 n=45 B、m=234 n=56 C、m=23 n=456 D、语句有错误 10、若运行时,给变量x输入12,则以下程序的运行结果是() main( ) { int x,y; scanf(“%d”,&x); y=x>12?x+10:x-12; printf(“%d\n”,y); } A、 0 B、 22 C、 12 D、10 11、C语言中while和do-while循环的主要区别()

相关主题
文本预览
相关文档 最新文档