第一章:P56
1、列出在你过去学习工作中用过与计算机图形学有关的程序c语言:#include<graphics.h>
main()
{
intgraphdriver=VGA,graphmode=VGAHI;
initgraph(&graphdriver,&graphmode,””);
setbkcolor(BLUE);
setcolor(WHITE);
setfillstyle(1,LIGHTRED);
bar3d(100,200,400,350,100,1);
floodfill(450,300,WHITE);
floodfill(250,450,WHITE);
setcolor(LIGHTGREEN);
rectangle(450,400,500,450);
floodfill(470,420,LIGHTGREEN);
getch();
closegraph();
}
JAVA语言:
例1、画点
Importjava.io.*;
Classpoint
{
intax;
intay;
intbx;
intby;
publicpoint(intax,intay,intbx,intby){
floatk;//计算斜率
floatb;
k=(by-ay)/(bx-ax);
b=ay-ax*k;
system.out.println(“直线的方程为:y=”+k+”x”+”+”+b);}
}
例2、画矩形
classDrawPanelextendsJpanel
{publicvoidpaint(Graphicsg){
super.paint(g);
Graphics2Dg2=(Graphics2D);
Doubleleftx=200;
Doubletopy=200;
Doublewidth=300;
Doubleheight=250;
Rectangle2Drect=newRectangle2D.double(leftx,topy,width,height);
G2.draw(rect);
}
}
2、列出你所用过的窗口系统中与观感有关的元素的功能,如图标、滚动棒、菜单等使用滚动条
当文档、网页或图片超出窗口大小时,会出现滚动条,可用于查看当前处于视图之外的信息。下面的图片显示滚动条的组成部分。
使用菜单
大多数程序包含几十个甚至几百个使程序运行的命令(操作)。很多这些命令是组织在菜单下面。就像饭馆的菜单一样,程序菜单显示选择列表。为了使屏幕整齐,会隐藏这些菜单,只有在标题栏下的菜单栏中单击菜单标题之后才会显示菜单。例如,单击“画图”菜单栏中的“图像”可显示“图像”菜单:
3、列出你所用过的图形输入、显示及输出设备的名称、型号、生产厂商、出厂时间及其主要优缺点。
略
4、比较个人计算机与工作站的图形功能
个人计算机仅限于符合二维,又是单任务操作方式
工作站可处理二、三维,多任务操作方式
区别个人计算机工作站
显示分别率640X4801024X900以上
具有8个以上位面
显示器尺寸12~14英寸16、19、27英寸
图形处理能力符号或二维具有反走样、线和面消隐、
光照模型等处理硬件;同时
还具有丰富的图形生成和
处理软件
主要处理二维或三维图形、
图象
计算机性能主要取决于微处理器的性具有更强的处理功能,在操能作系统、页面虚拟存储器和
主要用途都有所不同
操作方式单任务多任务、多进程
l个人计算机的主要功能是字符处理,而工作站不仅有字符处理功能,还有较强的图形处理功能
l个人计算机的显示分辨率较小,一般在640X480的图形处理符号或二维图形;而工作站为了满足强大的图形处理,显示分辨率为一般为1024x1024的二维或三维图形l个人计算机的显示器相对工作站较小
l个人计算机的图形系统是由个人计算机加上图形输入输出设备和有关的图形支撑软件集成起来的系统,其性能取决于个人计算机所采用的微处理器芯片,个人计算机的图形功能由于受到软件和硬件的限制,只适合处理比较简单的事情;个人计算机的显示分辨率一般在640X480的图形处理符号或二维图形
l而工作站在处理器、总线设计、存储器、操作系统等多个方面都有比个人计算机优越的地方,它配有专业的图形输入输出设备,并配有图形处理器以处理大量的复杂的图形运算;它可以处理多任务进程、处理显示分辨率为1024x1024的二维或三维图形、具有高速的科学计算能力、丰富的图形处理、灵活的窗口及网络管理功能的交互式计算机系统,它的图形功能比个人计算机图形系统强德多,但在造价上远高于个人计算机。
6、具有相同分辨率的彩色光栅显示器与黑白光栅在结构上有何区别?
彩色:
对于红、绿、蓝的三个原色有三个位面的帧缓存和三个电子枪,每个位面的帧缓
冲对应一个电子枪即对应一种颜色;对每个颜色的电子枪可以通过增加帧缓存位面来提高颜色种类和灰度级,通过三种原色的组合可以产生不同种类的颜色。
彩色光栅显示器主要是有红、绿、蓝的三个原色所组成,每种原色电子枪有8个位
面的帧缓存和8位的数模转换器,每种原色有256种亮度,三种原色组合可为16771216种颜色,也可以通过颜色查找表查找,故帧缓存位数至少24位。
黑白:
黑白光栅显示器的帧缓存是一块连续的计算机存储器,每个像素需1位存储器,每
个存储器只有0或1两个状态。因此一个位面的帧缓存只能产生黑白图形。可以增加象素点的位面数,通过多个位面显示出多种灰度级。
7、在光栅显示器上显示斜线的45o角时常会发生锯齿状,请考虑减少锯齿状效果的各种方法并说明采用这些方法的代价。
在光栅图形显示器上显示斜线时常会发生锯齿,这是由于直线或多边形边界在光栅图形显示器的对应图形都是由一系列相同亮度的离散象素构成的。这种用离散量表示连续亮引起的失真称为走样,而用于减少或消除这种效果的技术,称为反走样。
一般而言,减少锯齿有三种方法,下面以直线扫描转换为例,分别介绍三种方法:
(1)提高分辨率
假设把显示器的分辨率提高一倍,虽然直线经过2倍的象素,锯齿也会增加一倍。但由于每个锯齿在X方向和Y方向都只有低分辨率的一半,所以效果看起来会好
一些,这种改进方法是以4倍的存储器代价和4倍的扫描转换时间获得的。因此增加分辨率是不经济的方法,它只能减轻,不能消除锯齿。
(2)简单的区域取样
在直线扫描算法假定象素是数学上的一个点,象素的颜色是由对应于象素中心的图形中一点的颜色决定的。但是,实际上象素不是一个点,而是一个有限区域。屏幕上所画的直线段不是数学意义上的无宽度的理想线段,而是一个宽度至少为一个象素单位的线条。因此,把屏幕上的直线看成是长方条形更为合理。在绘制直线条时,所有与该长方条相交的象素都采用适当的宽度给予显示。这要求显示器各象素可以用多灰度显示。例,设象素中心是在网格点上的不相交的正方形,象素的灰度与它落在直线条内的面积成正比。在多灰度黑白显示器上,若一个象素整个落在线条上,则将它置成前景色。若一个象素与线条部分相交,根据相交部分的大小来选择不同的灰度,相交部分大的象素前景色成分更多一些,相交部分小的象素前
景色成分更少一些。这种方法将产生模糊的边界,以此来减轻锯齿效应。在实际应用中,常采用盒式滤波器
(3)加权区域取样
加权区域取样方法采用更为优化的圆锥形滤波器。圆锥的底圆中心在当前象素中心,底圆半径为一个单位,锥高为1。当直线条经过该象素时,该象素的灰度值是在二者相交区域上对滤波器进行积分的积分值。用这种圆锥形滤波器有如下特点:一是接近理想直线的象素将被分配更多的灰度值。二是相邻两个象素的滤波器相交,所以直线条经过该相交区域时,将对这两个象素分配给适当的灰度值,这有利于缩小直线条上相邻象素的灰度差。
第二章:P128
1、为什么要制定和采用计算机图形标准?已经ISO批准的计算机图形标准软件有哪些?为了提高计算机图形软件、计算机图形的应用软件以及相关软件的编程人员在不同的计算机和图形设备之间的可移植性。
已获ISO批准的计算机图形标准软件有:
l计算机图形核心系统(GKS)及其语言联编
l程序员层次交互式图形系统(PHIGS)及其语言联编
l三维图形核心系统(GKS-3D)及其语言联编
l计算机图形元文件(CGM)
l计算机图形接口(CGI)
l基本图形转换规范(IGES)
l产品数据转换规范(STEP)等
2、CGI标准的主要功能是什么?试用CGI中的图形输出功能绘制一副机械零件图。CGI的目的是提供控制图形硬件的一种与设备无关的方法,它可以看成是图形设备驱动程序的一种标准。CGI在用户程序和虚拟设备之间,以一种独立于设备的方式提供图形信息
的描述和通信,使有经验的用户最大限度地、灵活地直接控制图形设备。它所提供的功能集包括:
l控制功能集
l独立于设备的图形对象输出功能集
l图段功能集
l输入和应答功能集l产生修改、检索和显示以像素数据形式存储的光栅功能集
3、CGM对文件管理的存储结构是采用何种形式?你认为应用这种结构有什么优缺点?采用生成多个与设备无关的图形定义,提供随机存取、传送、简洁定义图象的图形生成元文件的存储结构,它不是应用程序员的标准,而是为系统和系统开发而设计的,与CGI配套供用户使用。
优点是:它具有通用性,即CGM应能广泛适应各种设备、应用系统。例如同一个文件即可在低分辩率的单色图形终端上输出,也可在高分辨率的多笔绘图仪上输出,或在高性能的光栅图形显示器上输出。
这种结构的缺点是:它只是一个静态的图形生成元文件,即它不能产生和定义图形的动态效果,例如不能实现动态的几何变换。
4、GKS、PHIGS、GI在应用程序中起的作用?试比较它们在输入输出功能上的相同和不同之处?
GKS在应用程序和图形输入输出设备之间提供了功能接口,包括:控制功能、输出功能、输
出属性、变换功能、图段功能、输入功能、询问功能、实用程序、元文件处理和出错处理。PHIGS向应用程序提供控制图形设备的图形系统接口,能够在系统中高效率地描述应用模型,迅速地修改图形模型的数据;并能够绘制显示修改后的图形模型。
GL是工作站或UNIX上广泛应用的一个工业标准图形程序库,和PHIGS同样是提供用户与程序图形系统接口。包括基本图素、坐标变换、设置属性和显示方式、输入/输出处理、真实图形显示。
相同点:
三个都是提供用户与输入输出设备之间的图形系统接口的标准图形程序库。
不同点:
不同的数据结构
可修改性
属性的存储
输出流水线等
具体而言:
lGKS有6种输入功能和6种输出图素,在输入功能上可对各种设备初始化,设定设备工作方式、确定请求采样和事件输入;在输出功能上,可确定输出图形
的类型
lPHIGS的输出流水线有5个坐标系;具有高度的动态性、输出交互性的三维图形,可以在系统中高效率地描述应用模型,迅速修改图形模型的数据,并能绘
制显示修改后的图形模型
lGL的输入/输出处理用于启动输入输出设备,并对相应的事件队列进行处理,提供了更丰富的图元,如各种曲面。
6、GKS-3D与PHIGS的主要区别是什么?用GKS-3D输出图形的过程是什么?主要区别:(1)数据结构
GKS-3D:提供了单层、平面的图形数据结构
其图段用来表示的是图象信息而不是图形的构造信息,其图段数据经过坐标规格化变换后,不再是定义该图段的坐标空间的数
据
PHIGS:
其结构始终是在造型空间中定义的数据(2)可修改性
GKS-3D:产生的图段,其内容不能修改,但影响图段整体特征的某些属性,如可见性、可检测性、图段的几何变换等是可以修改
PHIGS:其任何结构,结构中的任何一部分元素则可以在任何时候进行修改
(3)属性的存储
GKS-3D:把图素属性和图素一起存入图形数据结构中,为了修改某图段中某个图素的属性,必须去除该图素的旧属性,重新生成一个新属性
PHIGS:只要当遍历一个结构并要显示该结构时,其中的图素才能变成输出图素,此时,那些属性结构元素是灵活的,图形数据的修改也是容易的。
(4)输出流水线
GKS-3D:采用三种坐标系,用户坐标系、设备坐标系和规格化设备坐标系
PHIGS:采用五种坐标系,造型坐标系、用户坐标系、观察坐标系、规格化的投影(空间)坐标系、设备坐标系
过程:
图素→规格化变换→图段变换→规格化裁减→视图变换→裁减操作和视图映象→工作站裁剪和变换→显示输出
10、IGES和STEP有什么共同点和不同点?
共同点:
IGES和STEP都是与CAD/CAM系统提供中性产品数据的公共资源和应用模型,它涉及到
土建工程、机械、结构、电气、电子工程及船舶结构等领域,为了解决数据在不同的CAD/CAM 系统之间进行数据传送的问题,定义了一套表示CAD/CAM系统中常用的几何和非几何数据格
式以及相应的文件结构。
不同点:
IGES是1982年ANSI标准,而STEP是ISO/IECJTCL下的SC4开发的ISO标准,它克
服了IGES的一些缺点:
(1)不能精确地完整地转换数据,其原因是不同的CAD/CAM系统之间许多概念不一样,使得某些定义数据像表面定义数据会丢失
(2)不能转换属性信息
(3)层信息常丢失
(4)不能把两个零部件的信息放在一个文件中
(5)产生的数据量太大,以至许多CAD系统难以处理(无论是时间还是存储容量上都不适应)
(6)在转换数据的过程发生的错误很难确定,常常需要人工去处理IGES
文件,对此要花费大量的时间和精力。
而STEP克服了IGES中存在的问题,扩大了转换CAD/CAM系统中几何拓扑数据的范围,STEP 即产品模型数据的公共资源和应用模型。STEP的产品模型数据是覆盖产品整个生命
周期的应用而全面定义的产品所有数据元。在STEP中采用了形状特征信息模型进行各种产品模型定义数据的转换,强调建立能存入数据库中的一个产品模型的完整表示,而不只是它的图形或可视的表示
IGES采用了对实体单元进行数据描述的文件结构,而STEP采用了形状特征信息模型进行各种产品模型定义数据的转换的概念模式;
IGES的文件格式为目录入口、参数节、整体节、结束节和定义信息5个节;STEP的产品信息分为应用层、逻辑层和物理层3个层结构。
第三章:P163
1、你所用的图形软件是属于子程序库、专业语言和交互命令,还是这三种形式的混合形式,或是其他的形式。你认为你所用的图形软件的成功和不足之处是什么?有哪些改进意见?(1)使用的图形软件采用C语言作为主语言,属于子程序库、专用语言和交互命令混合;(2)成功之处:使用方便、便于扩充、便于用户加入用户自己编写的源程序或目标代码;不足之处是格式随所用主语言格式而定,修改源程序比较麻烦;
(3)实现与其他语言(非主语言)的兼容运行,交互式修改运行结果,而不需要人为地查看、修改源程序。
2、面向应用程序的接口通常有哪几种形式?你认为哪一种形式更方便应用和扩充应用功
能?
面向应用程序的接口有子程序库、专用语言和交互命令三种形式;
交互任务是用户最关注的事,交互技术是完成交互任务的手段,故交互命令是用户接口中应用最普遍、效率最高的一种形式,对交互设备、交互任务、交互技术以及控制方式等的综合处理是完成交互命令和实现交互命令的依据。总的来说,交互命令更方便应用和扩充应用功能。
3、请列出你所用的交互系统中所涉及到的交互任务和交互技术,是否有本章书中没有提及的交互任务和交互技术?若有,能否对其进行分解,使之和本章书中介绍的交互任务和交互技术相匹配。
就目前有用过的交互任务和交互技术而言,均在本章范围内;
(1)交互任务:区域选择、文本输入、定路径和控制
(2)交互技术:选择技术、定位技术、定路径技术、文本技术、徒手画技术和拖动技术。
6、常见的交互任务有哪几种?你认为哪一种交互任务最难完成?
常见的交互任务有8种
定位、选择、文本、定向、定路径、定量、三维交互任务、组合交互任务
其中三维交互任务和组合交互任务最难完成,因为三维交互任务涉及定位、选择和旋转,用户难以区分屏幕上游标选择到对象的深度值和其他显示对象的深度值。
组合交互任务主要包含对话框、构造和动态控制三种,其实现前面几种的结合,是动态的,故其完成难度最大。
7、常见的交互技术有哪几种?你认为哪一种交互技术最容易使用?
交互技术指通过计算机输入、输出设备,以有效的方式实现人与计算机对话的技术。它包括机器通过输出或显示设备给人提供大量有关信息及提示请示等,人通过输入设备给机器输入有关信息及提示请示等,人通过输入设备给机器输入有关信息,回答问题等。人机交互技术是计算机用户界面设计中的重要内容之一。它与认知学、人机工程学、心理学等学科领域有密切的联系。
常见的交互技术有:选择技术、定位技术、定向技术、定路径技术、定量技术、文本技术、橡皮筋技术、徒手画技术、拖动技术;其中定量技术最容易使用。
11、交互式用户接口常见的工作方式有几种?你认为哪一种较实用?用户接口工具箱使你能够为你的应用程序建立复杂的用户接口。用户接口可以包括窗口、对
话、菜单条、附件(域、列表框,等等)、标记和公用对话(文件选择对话、信息对话,等等)。用户接口工具箱包括各种公用对话,例如选择一个文件或显示错误信息的对话。为了使用一个公用的对话,只需简单地实例化它,设置合适的参数,以及把它连接到你的应用程序中。
固定域输入输出方式
问答方式
表处理方式
命令语言
菜单方式
图形符号方式
12、请用菜单驱动方式、数据表格驱动方式和事件驱动方式完成同一个实际的交互任务。并
比较它们之间的难易程度和工作量。
事件驱动的真实工作过程
数据表格驱动方式:
程序和表格关联,用表格(如EXCEL)的形式将变量传递到程序中进行一系列操作,或再用表格输出,不同于消息驱动的WINDOWS程序机制。使用表格驱动建立菜单,可以很方便很简单地管理自定义菜单,节约开发与维护成本。
《太平洋保险终端系统》交易界面实现了参数化的配置方式,系统使用屏幕定义文件
和表格定义文件来定义交易屏幕,表格定义文件定义了表格的基本属性和表格的列,屏幕定义文件定义了屏幕的基本属性和屏幕上的栏位和表格的位置。屏幕和表格定义文件都需要引用数据字典里面的栏位定义。
界面驱动包括屏幕驱动和表格驱动,其功能包括设置栏位缺省值和缺省属性(是否可
输入、是否必输入、是否绑定下拉菜单pklist),响应各种系统事件(屏幕前后事件、栏位前后事件、最后栏位后事件等),响应热键(ESC、DEL、PAGEUP、PAGEDOWN、CTRL_XX等),动态改变屏幕属性(多页显示的翻页、拆分屏幕等),发起二段式交易等等。屏幕驱动和表格驱动是提供给开发人员的统一接口,开发人员通过实现该接口的方式开发功能模块。
事件驱动方式:
1、启动应用程序,装载和显示窗体,产生Form_Load和Form_Show事件
2、窗体或窗体上的控件接收事件,事件可由用户引发(例如键盘或鼠标操作),可由系统引发(例如定时器事件),也可由代码间接引发(例如当代码装载其他窗体时产生的Load事件)
3、如果在相应的事件过程中存在代码,就执行代码
4、应用程序等待下一次事件
例:.获取和修改计算机名字的方法1.)插入一个新模块,在其中添加如下代码:
′声明GetComputerName
DeclareFunctionGetComputerNameLib〃kernel32〃Alias〃
GetComputerNameA〃(ByvallpBufferAs
String,nSizeAsLong)AsLong
′声明SetComputerName
DeclareFunctionSetComputerNameLib〃kernel32〃Alias〃
SetComputerNameA〃(ByvallpComputerNameAsString)AsLong
′定义一个获取计算机名字的函数
PublicFunctionGetCName(CName)AsBoolean
DimsComputerNameAsString?计算机的名字
DimlComputerNameAsLong
?计算机名字的长度
DimlResultAsLong
?GetComputerName的返回值
DimRVAsBoolean
′GetCName返回值,若为TRUE则表示操作成功
lComputerNameLen=256
sComputerName=Space(lComputerNameLen)
lResult=GetComputerName(sComputerName,lCompputerNameLen)
IflResult〈〉0ThenCname=Left$(sComputerName,lComputerNameLen)RV=True
ElseRV=False
EndIf
GetCName=RV
EndFunction
′定义一个修改计算机名字的函数
PublicFunctionSetCName(CName)AsBoolean
DimlResultAsLong
DimRVAsBoolean
lResult=SetComputerName(CName)
IflResult〈〉0Then
RV=True′修改成功
ElseRV=False
EndIf
SetCName=RV
EndFunction
2).在窗体中添加一命令按钮Command1,双击该按钮并在其中添加如下代码:SubCommand1-Click()
DIMCNASString
x=GetCName(CN)Print〃ThisComputerNameis:〃,CNCN=〃MYCOMPUTER〃
x=SetCName(CN)
Print〃NowtheComputernameis:〃,CN
EndSub
1)对于完成同一个实际的任务来说,一般而言菜单驱动方式较数据表格驱动方式和事件驱动方式容易
2)相对于用户的工作量来说,菜单驱动方式较数据表格驱动方式和事件驱动方式的工作量大。
第四章:P215
1、将中点画线算法推广以便能画出任意斜率的直线
算法设计:
(1)输入直线的起点坐标P0(x0,y0)和终点坐标P1(x1,y1).
(2)定义直线当前点坐标x和y,定义中点偏差判别式d、直线斜率k、
像素点颜色rgb
(3)x=x0,y=y0计算d=0.5-k,k=(y1-y0)/(x1-x0),rgb=RGB=(0,0,255).
(4)绘制点(x,y),判断d的符号,若d<0,则(x,y)更新为(x+1,y+1),
d更新为d+1-k,否则(x,y)更新为(x+1,y),d更新为d-k.
(5)如果当前点x小于(x1,重复步骤(4),否则结束。
程序主要代码:
MidPointLine(x0,y0,x1,y1,color)
{
inta,b,delta1,delta2,d,x,y;
a=y0–y1;
b=x1–x0;
d=2*a–b;
delta1=2*a;
delta2=2*(a+b);
x=x0;
y=y0;
if(a<b)
drawpixel(x,y,color);
else
drawpixel(y,x,color);
while(x>x1){
If(d<0)
{
x++;
y++;d+=delta2;
}
Else
{
X++;
D+=delta1;
}
Putpixel(x,y,color);
}
Else
While(x<x1)
{
If(d<0)
{
x--;
y++;
d-=delta3;
}
Else
{
x--;
d-=delta1;
}
Putpixel(x,y,color);
}
}
2、采用整数Bresenham算法,为一台计算机编制直线扫描转换程序。从键盘敲入两端点坐标,就能在显示器屏幕上画出对应的直线。
VoidDrawLine(intcolor)
{
intx0,y0,x1,y1,color,I;
scanf(“%d,%d,%d,%d”,&x0,&y0,&x1,&y1);
dx=x1–x0;
dy=y1–y0;
e=-dx;
x=x0;
y=y0;
for(i=0;i<=dx;i++){
putpixel(x,y,color);
x=x+1;
e=e+2*dy;
if(e>=0)
{y=y+1;
e=e–2*dy;
}
}
}
4、试编写按逆时针方向生成第二个8分圆的中点算法
算法设计:
(1)输入圆的半径
(2)定义圆当前点坐标x和y、中点偏差判别式d、像素点颜色rgb
(3)计算d=1.25-R,x=0,y=R,rgb=RGB=(0,0,255).
(4)绘制点(x,y),及其在八分圆中的另外7个对称点…
(5)判断d的符号,若d<0,则(x,y)更新为(x+1,y),d更新为d+2x+3,否则(x,y)更新为(x+1,y-1),d更新为d+2(x-y)+5.
(6)当x小于等于y,重复步骤(4)和(5),否则结束。
MidpointCircle(r,color)intr,color;
{
floatx,y;
floatd;
x=0;
y=r;
d=1.25–r/1.414;
drawpixel(x,y,color);
while(x<y)
{
if(d<0)
{
d+=2*x+3;
x++;
}
else
{
d+=5+2*(x-y);x++;
y--;
}
drawpixel(x,y,color);
}
}
5、假设圆的圆心不在原点,试编写算法对整个圆进行扫描转换
算法设计:
(1)输入圆的半径r,圆心坐标为(xc,yc)
(2)定义圆当前点坐标x和y、中点偏差判别式d、像素点颜色rgb
(3)计算d=1.25-R,x=0,y=R,rgb=RGB=(0,0,255).
(4)绘制点(x+xc,y+yc),及其在八分圆中的另外7个对称点…
(5)判断d的符号,若d<0,则(x,y)更新为(x+1,y),d更新为d+2x+3,否则(x,y)更新为(x+1,y-1),d更新为d+2(x-y)+5.
(6)当x小于等于y,重复步骤(4)和(5),否则结束。
(1)用bresenham画圆法,设圆心坐标为(xc,yc)
bresenham_circle(r,color)
intr,color;
{
intx,y,delta,delta1,delta2,direction;
x=xc;
y=yc+r;delta=2*(1-r);
while(y>=0)
{
drawpixel(x,y,color);
if(delta<0)
{
delta1=2*(delta+y-b)-1;
if(delta1<=0)
direction=1;
else
direction=2;
}
elseif(delta>0)
{
delta2=2*(delta-x+xc)-1;
if(delta2<=0)
direction=2;
else
direction=3;
}
elsedirection=2;
switch(direction)
{
case1:x++;
delta+=2*(x-xc)+1;break;
case2:x++;
y++;
delta+=2*(x-a-y+yc+1);break;
case3:y--;
delta+=-2*(y-yc)+1;break;
}
}
}
(2)采用中点画圆算法
#include<stdio.h>
#include<conio.h>
#include<graphics.h> MidpointCircle(r,color)
intr,color;
{floatx,y;
floatd;
x=0;
y=r;
d=1.25–r/1.414;
putpixel(xc+x,yc+y,color);while(x<y) {
if(d<0)
{
d+=2*x+3;
x++;
}
else
{
d+=5+2*(x-y);
x++;
y--;
}
putpixel(xc+x,yc+y,color);}}
putpixel(x,y,color);
putpixel(xc+yc-y,yc+xc-x,color); putpixel(xc+yc-y,yc+xc-x,color);
putpixel(x,yc+yc-y,color);
putpixel(xc+xc-x,yc+yc-y,color);
putpixel(xc-yc+y,yc-xc+x,color);
putpixel(xc-yc+y,yc+xc-x,color);
putpixel(xc+xc-x,y,color);
}
voidmain()
{
intgdriver=DETECT,gmode,xc,yc,r;
initgraph(&gdriver,&gmode,“”);
printf(“Pleaseenterthexc:”);
scanf(“%d”,&xc);
print f(“Pleaseentertheyc:”);
scanf(“%d”,&yc);
printf(“PleaseentertheR:”);
scanf(“%d”,&r);
cleardevice();MidpointCircle(xc,yc,r,RED);
getch();
closegraph();
}
6、试编写可以对一段任意圆弧进行扫描转换的算法
将360度的区域分成8个部分
32
41
58
67
编写可以对一段任意圆弧进行扫描转换的算法的关键在于,对这段圆弧的起点和终点分别判定是否在同一区域
如果起点和终点在同一区域,调用中点画圆算法,但要根据实际情况对参数进行修正;
如果起点和终点不在同一区域,则要根据实际情况对圆弧段进行分割,分割的原则是将每一段的起点和终点放在同一区域,然后分别调用中点画圆算法画圆弧,同样在画的过程中,要根据实际情况对参数进行修正及算法进行修正;
设圆弧的起点为(x1,y1),终点为(x2,y2),半径为r
如图
A(x1,y1)
D(x0-r,y0)C(x0,y0)
B(x2,y2)
将整个圆弧分为两段,弧AC和弧CB,分别进行扫描转换,转换过程中利用中点画圆方法进行,代码如下:
midpoint(x1,y1,x2,y2,r,color,k)
{
intx,y;
floatd;
x=x1;
y=y1;
d=(x1+1)^2+(y1-0.5)^2-r^2;
putpixel(x,y,color);
while(x<=x2)
{
if(d<0)
{
d+=2*x+3;
x++;}
else
{
d+=2*(x-y)+5;
x++;
y=y+k;
}
}
putpixel(x,y,color);
main()
{
scanf(“%d”,&n);//分割的圆弧数
for(i=1;i<=n;i++)
{
scanf(“%d,%d,%d,%d,%d”,&x1,&y1,&x2,&y2,,&k);//要求x1<x2midpoint(x1,y1,x2,y2,r,color,k);
7、设计一个多边形区域填充算法,使其边界像素具有一个值,而内部的像素具有另一个值。算法设计:
(1)使用画线语句绘制多边形
(2)计算窗口客户区的水平边界最大值MaxX和垂直边界最大值MaxY
(3)调用系统调色板,设置颜色值FillColor为调色板上取得的颜色,CBackColor为白色。(4)对于每一条边,y从ymin开始,执行下面的循环。
(5)x从扫描线和边的交点处开始到窗口客户区右边界,先获得(x,y)位置的像素颜色,如果是填充色,则置成背景色,否则所有填充色填充。执行x=x+1/k,计算下一个x起点值。(6)如果y=ymin,则扫描结束,否则y++,转(5)。
主要代码:
intMaxX,MaxY;
VoidGetMaxX()//求屏幕最大x值
{
CRectrect;
GetClientRect(rect);
MaxX=rect.riht;
}
VoidGetMaxY()//求屏幕最大y值
{
CRectrect;GetClientRect(rect);
MaxX=rect.bottom;
}
VoidDraw()//填充多边形函数
{
COLORREFCBackColor=RGB(255,255,255);//白色
CClientDCdc(this);
intm,n,ymin,ymax;
doublex,y,k;
for(inti=0;i<=6;i++)
{
m=i,n=i+1;
if(7==n)n=0;
k=(double(Point[m].x-Point[n].x)/(Point[m].y-Point[n].y);//计算1/k;if((Point[m].y<Point[n].y)//得到每条边y的最大和y最小值{
ymin=Point[m].y;
ymax=Point[n].y;
x=Point[m].x;//得到x|ymin
}
else
{
ymin=Point[n].y;
ymax=Point[m].y;
x=Point[n].x;
}
For(y=ymin;y<ymax;y++){
For(intj=ROUND(x);j<MaxX;j++)//对每一条扫描线与边的交点的右侧像素循环
{
If(dc.GetPixel(j,ROUND(y)==FillColor)//如果像素的颜色是填充色{
dc.SetPixel(j,ROUND(y),CBackColor);//改为背景色
}
else
{
dc.SetPixel(j,ROUND(y),FillColor);//改为填充色
}
}
x+=k;//计算下一个x起点值
}
}}
DrawPolygon()//绘制多边形函数
{
CClientDCdc(this);
intm,n;
for(intj=0;j<=6;j++)
{
M=j;n=j+1;
If(7==n)n=0;
dc.MoveTo(Point[m]);
dc.LineTo(Point[n]);
}
}
10、试设计一个生成具有宽度的直线条的算法,使得在直线条连接处不出现图示的缺口对于第一种方案:
c
d
e
abf
可以把整个线条分成两个部分,
对于左半部分:先计算出线条的四个顶点,a,b,c,d
再用直线段把相邻角点连接起来,
最后调用多边形填充算法把所得的四边形进行填色
同样,对于右半部分,依法处理
对于第二种方案:
c
e
df
g
abh
可以把整个线条分成三个部分,对于左半部分:
先计算出线条的四个顶点,a,b,c,d
再用直线段把相邻角点连接起来,
最后调用多边形填充算法把所得的四边形进行填色
对于中间部分:
先计算出线条的四个顶点,c,d,e,f
再用半径为某个值如R圆弧分别把c,e和d,f连接起来,
最后调用区域填充算法把所得的圆环段c,e,d,f进行填色
同样,对于右半部分,依法处理
先计算出线条的四个顶点,e,f,g,h
再用直线段把相邻角点连接起来,
最后调用多边形填充算法把所得的四边形进行填色
12、为26个英文大写字母设计5X7的字符掩膜矩阵。
13、编写一程序实现线段裁剪的中点分割算法
算法设计:
(1)输入直线段的两端点坐标:P0(x0,y0),P1(x1,y1)绘制坐标为(wxl,wyt),(wxr,wyb)的窗口(2)P0点的编码为RC0,P1点的编码为RC1。
(3)若RC0|RC1=0,对直线段应“取”,转步骤(6);否则若RC0|RC1≠0,对直线段应“弃”,转步骤(6)。
(4)如果直线段有一个端点在窗口内,则计算该直线的中点坐标
P[x=(x0+x1)/2,y=(y0+y1)/2],并计算其编码RC。如果中点P和P0在规定的误差范围内(例如10-6
)不重合,则判断中点是否也在窗口内,如果在,PP0“取”
之,否则,PP0“弃”之。将中点P赋给点P1,转步骤(6)。
(5)如果直线段的两个端点都不在窗口内,则必定与窗口相交,求该直线中点坐标P[x=(x0+x1)/2,y=(y0+y1)/2]和其编码RC。当中点P在窗口外时,如果RC0&RC1=0,则PP1在窗口外,“弃”之;否则PP0在窗口外,“弃”之,直到中点P在窗口内。对于中点在窗口内的直线段PP1和PP0,重复步骤(4)。(6)输出裁减后的线段。
主要代码:
VoidMidClip(doubleP0x,doubleP0y,doubleP1x,doubleP1y,BOOLflag){
Doublex,y;
UnsignedintRCT0,RCT1;RCT0=EnCode(P0x,P0y);RCT1=EnCode(P1x,P1y);
x=(P0x+P1x)/2;
y=(P0y+P1y)/2;RCT=EnCode(x,y);
while(abs(x-P0x)>1e-6||abs(y-P0y)>1e-6)
{
if(RCT==0)//中点也在窗口内,则P=P0
{
P0x=x;
P0y=y;
RCT0=RCT;
}
else//否则舍弃P1点
{
P1x=x;
P1y=y;
RCT1=RCT;
}
x=(P0x+P1x)/2;
y=(P0y+P1y)/2;RCT=EnCode(x,y);
}
if(flag==true)
{
Pointx[1]=x;
Pointy[1]=y;
}
else
{
Pointx[0]=x;
Pointy[0]=y;
}
}
14编写一程序实现逐次多边形裁剪算法
算法设计:
(1)输入第一个顶点坐标:F(x0,y0)
第二个顶点坐标:S(x1,y1)
(2)当顶点输入完毕,转(7)(3)输入顶点P坐标:P(x2,y2)
(4)SP与裁剪线相交吗?是,求SP与裁剪线的交点I(x,y),并输出I坐标:I(x,y) (5)P位于可见一侧吗?是,输出顶点P坐标:P(x2,y2)
(6)将顶点P坐标:P(x2,y2)=》顶点S坐标:S(x1,y1),转(2)
(7)将顶点F坐标:F(x0,y0)=》顶点P坐标:S(x2,y2),形成闭合,
(8)SP与裁剪线相交吗?是,求SP与裁剪线的交点I(x,y),并输出I坐标:I(x,y) (9)P位于可见一侧吗?是,输出顶点P坐标:P(x2,y2)
(10)结束
程序代码:
/*Sutherland-Hodgman算法*/
#defineLENsizeof(structnode)
#include<math.h>
#include"display.h"
structnode{
intdx,dy;
structnode*next;
};
structnode*creat()
{structnode*h,*q,*r;
int
p[8][2]={100,120,160,50,180,100,200,80,240,160,210,220,170,160,140,19
0};
inti;
setcolor(12);
for(i=0;i<7;i++)line(p[i][0],p[i][1],p[i+1][0],p[i+1][1]);
line(p[0][0],p[0][1],p[7][0],p[7][1]);
rectangle(120,200,230,70);
h=NULL;
for(i=0;i<8;i++)
{q=(structnode*)malloc(LEN);
q->dx=p[i][0];q->dy=p[i][1];
if(h==NULL)h=q;
elser->next=q;
r=q;
}
r->next=NULL;
return(h);
}
structnode*builx(h,x)
structnode*h;
intx;
{ints[2],j[2];structnode*hh,*p,*r,*q;
intmax,min;p=h;hh=NULL;
s[0]=p->dx;s[1]=p->dy;
p=p->next;
while(p!=NULL)
{j[0]=x;
j[1]=s[1]+(p->dy-s[1])*(x-s[0])/(p->dx-s[0]);max=s[0];min=p->dx;
if(s[0]<p->dx){max=p->dx;min=s[0];}if((j[0]>=min)&&(j[0]<=max)) {q=(structnode*)malloc(LEN);
q->dx=j[0];q->dy=j[1];
if(hh==NULL)hh=q;
elser->next=q;
r=q;
}
if(p->dx>=x)
{q=(structnode*)malloc(LEN);
q->dx=p->dx;q->dy=p->dy;
if(hh==NULL)hh=q;
elser->next=q;
r=q;
}
s[0]=p->dx;s[1]=p->dy;
p=p->next;
}
p=h;
j[0]=x;j[1]=s[1]+(p->dy-s[1])*(x-s[0])/(p->dx-s[0]);max=s[0];min=p->dx; if(s[0]<p->dx){max=p->dx;min=s[0];}if((j[0]>=min)&&(j[0]<=max)) {q=(structnode*)malloc(LEN);
Java程序设计练习题 一、选择题 1、为使Java程序独立于平台,Java虚拟机把字节码与各个操作系统及硬件( A ) A)分开B)结合 C)联系D)融合 2、Java语言与C++语言相比,最突出的特点是( C ) A)面向对象B)高性能 C)跨平台D)有类库 3、下列Java源程序结构中前三种语句的次序,正确的是(D) A)import,package,public class B)import必为首,其他不限 C)public class,package,import D),import,public class 4、在JDK目录中,Java程序运行环境的根目录是( A ) A)bin B)demo C)lib D)jre 5、下列运算符中属于关系运算符的是(A ) A)== B).= C)+= D)-= 6、下列布尔变量定义中,正确并且规范的是( B ) A)BOOLEAN canceled=false; B)boolean canceled=false; C)boolean CANCELED=false; D)boolean canceled=FALSE; 7、下列关键字中可以表示常量的是( A ) A)final B)default C)private D)transient 8、下列运算符中,优先级最高的是( A ) A)++ B)+ C)* D)> 9、Java中的基本数据类型int在不同的操作系统平台的字长是( B ) A)不同的B)32位 C)64位D)16位
10、给一个short类型变量赋值的范围是( C ) A)-128 至 +127 B)-2147483648至 +2147483647 C)-32768至 +32767 D)-1000至 +1000 11、下列运算中属于跳转语句的是( D ) A)try B)catch C)finally D)break 12、switch语句中表达式(expression)的值不允许用的类型是( C ) A)byte B)int C)boolean D)char 13、下列语句中,可以作为无限循环语句的是( A ) A)for(;;) {} B)for(int i=0; i<10000;i++) {} C)while(false) {} D)do {} while(false) 14、下列语句中执行跳转功能的语句是( C ) A)for语句B)while语句 C)continue语句D)switch语句 15、下列表达式中,类型可以作为int型的是( C ) A)“abc”+”efg”B)“abc”+’efg’ C)‘a’+’b’D)3+”4” 17、数组中各个元素的数据类型是( A ) A)相同的B)不同的 C)部分相同的D)任意的 18、在Java语言中,被成为内存分配的运算符是( A ) A)new B)instance of C)[] D)() 19、接口中,除了抽象方法之外,还可以含有( B ) A)变量B)常量 C)成员方法D)构造方法 20、下列能表示字符串s1长度的是( A ) A)s1.length()B)s1.length C)s1.size D)s1.size() 21、StringBuffer类字符串对象的长度是( C ) A)固定B)必须小于16个字符 C)可变D)必须大于16个字符 22、构造方法名必须与______相同,它没有返回值,用户不能直接调用它,只能通过new调用。( A ) A)类名B)对象名 C)包名D)变量名 23、子类继承了父类的方法和状态,在子类中可以进行的操作是( D ) A)更换父类方法B)减少父类方法 C)减少父类变量D)添加方法 24、String、StingBuffer都是______类,都不能被继承。( C )
习题解答 习题(第章) 一、问答题 . .需个步骤: 1)用文本编辑器编写源文件。 2)使用编译源文件,得到字节码文件。 3)使用解释器运行程序。 .源文件由若干个类所构成。对于应用程序,必须有一个类含有( [])的方法,含有该方法的类称为应用程序的主类。不一定,但至多有一个类。 .:\\\\;.; .和 . .独行风格(大括号独占行)和行尾风格(左大扩号在上一行行尾,右大括号独占行)二、选择题 .。.。 三、阅读程序 .()。()两个字节码,分别是和。()得到“”,得到“: ”,得到“您好,很高兴认识您”习题(第章) 一、问答题 .用来标识类名、变量名、方法名、类型名、数组名、文件名的有效字符序列称为标识符。标识符由字母、下划线、美元符号和数字组成,第一个字符不能是数字。不是标识符。.关键字就是语言中已经被赋予特定意义的一些单词,不可以把关键字作为名字来用。和不是关键字。个关键字:。 .,,,,,,,。 .常量必须用或为后缀。常量用或为后缀,但允许省略后缀。 .一维数组名。二维数组名。 二、选择题 .。.。.。.。.【代码】【代码】【代码】【代码】。.。 三、阅读或调试程序 .属于操作题,解答略。
.属于操作题,解答略。.属于操作题,解答略。.【代码】:。【代码】:[]。.【代码】:。【代码】:四、编写程序 . { ( []) { (()'你'); (()'我'); (()'他'); } } . { ( [ ]) { 'α''ω'; ( <) (" "); } } 习题(第章) 一、问答题 . .不可以 . . 不是必须的 .结束语句的执行 .可以 二、选择题 .。.。.。 三、阅读程序 .你,苹,甜 .好好 . 四、编程序题 .{
《Java语言程序设计基础教程》练习思考题参考答案
第1章 Java程序设计概述 练习思考题 1、 Java运行平台包括三个版本,请选择正确的三项:() A. J2EE B. J2ME C. J2SE D. J2E 解答:A,B,C 2、 Java JDK中反编译工具是:() A. javac B. java C. jdb D. javap 解答:D 3、 public static void main方法的参数描述是:() A. String args[] B. String[] args C. Strings args[] D. String args 解答:A,B 4、在Java中,关于CLASSPATH环境变量的说法不正确的是:() A. CLASSPATH一旦设置之后不可修改,但可以将目录添加到该环境变量中。 B. 编译器用它来搜索各自的类文件。 C. CLASSPATH是一个目录列表。 D. 解释器用它来搜索各自的类文件。 解答:A 5、编译Java Application源文件将产生相应的字节码文件,扩展名为() A. .java B. .class C. .html D. .exe 解答:B 6、开发与运行Java程序需要经过的三个主要步骤为____________、____________和____________。 7、如果一个Java Applet源程序文件只定义有一个类,该类的类名为MyApplet,则类MyApplet必须是______类的子类并且存储该源程序文件的文件名为______。 8、如果一个Java Applet程序文件中定义有3个类,则使用Sun公司的JDK编译器编译该源程序文件将产生______个文件名与类名相同而扩展名为______的字节码文件。 9、开发与运行Java程序需要经过哪些主要步骤和过程? 10、Java程序是由什么组成的?一个程序中必须要有public类吗?Java源文件的命名规则是怎么样的? 11、编写一个简单的Java应用程序,该程序在命令行窗口输出两行文字:“你好,很高兴学习Java”和“We are students”。
课程代码:座位号: 新疆大学期末考试 《Java2实用教程》试卷 姓名:王多强 学号:20102006014专业:机械工程及自动化 第一部分选择题(共12分) 一、单项选择题(本大题共4小题,每题只有一个正确答案,答对一题得3分,共12分) 1、下面的代码段中,执行之后i 和j 的值是什么?【C 】 inti=1; intj; j=i++; A 、1,1 B 、1,2 C 、2,1 D 、2,2 2、已知如下的命令执行javaMyTestabc 【C 】 请问哪个语句是正确的? A 、args[0]="MyTestabc" B 、args[0]="MyTest" C 、args[0]="a"
D、args[2]='b' 3、以下哪个方法用于定义线程的执行体?【B】 A、start() B、init() C、run() D、main() 4、下面哪个函数是publicvoidexample(){...}的重载函数【A】 A、publicvoidexample(intm){...} B、publicintexample1(){...} C、publicvoidexample2(){...} D、以上都不对 第二部分非选择题(共88分) 二、名词解释(本大题3小题,每题4分,共12分。) 1、方法重载 答:方法重载就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同个数和类型的参数来决定具体使用哪个方法。 2、构造方法 答:在Java中,任何变量在被使用前都必须先设置初值.Java提供了为类的成员变量赋初值的专门方法即构造方法,它是一种特殊的成员方法。 3、多态 答:多态就是一个方法名可以通过不同参数(参数名,参数个数)来重复使用,表示不同的意思,即一个名字多种功能用法,分为通用的多态和特定的多态两种。
“Java程序设计基础”课程习题 一、填空 1.Java程序分两类___Applet___和application,Java Application 类型的程序,程序从 ___main方法___开始执行。 2.定义一个Java类时,通过关键字__extends____指明该类的父类。一个类可以有___1___ 个父类。 3.用public修饰的类称为_公有类或公用类__。用public修饰的类成员称为公有成员。被 说明为public的内容可以被__所有其他类___ 使用。如果public类文件与使用它的类文件不在同一目录中,需要通过__import____语句引入。 4.用___private___ 修饰的类成员称为私有成员。私有成员只能在__本类__ 中使用。 5.如果子类定义的成员变量与父类的成员变量同名,称为___方法覆盖___ ,要表明使用 子类的成员变量,可以在成员变量前加上关键字__super___ 。 6.____Object__ 类是Java类库中所有类的父类。 7.Java字符使用__16位的字符集,该字符集成为__Unicode____ 。 8.当子类中定义的方法与父类方法同名时,称子类方法___覆盖___ 父类方法,子类默认 使用自己的方法。使用父类的同名方法,必须用关键字__super__ 说明。 9.Java源程序文件名的后缀是___.java___,Java字节码文件名的后缀是_.class_____。 10.Java类名的第一个字母通常要求___大写___。 11.Java程序由____类__组成,每个程序有一个主类,Java程序文件名应与____主__类的 名称相同。 12.Java__Application_类型的程序需要main()方法,程序从__main____开始执行。 13.布尔型数据类型的关键字是_boolean__ ,占用位数是___1位___ ,有__true__ 和_false_ 两种值。整型数可以采用_十_ 、__八_ 和__十六_三种进制表示。 14.八进制整数以数字__0_开头。十六进制整数以_0x或0X_ 开头。 15.int整型数占用__32位内存。long整型数占用__64 位内存。 16.127L表示__长整型____ 常量。 17.根据占用内存长度将浮点常量分为_double_____ 和__float____ 两种。 18.单精度浮点常量占用__32_ 位内存,双精度浮点常量占用__64 位内存。 19.在Java语言中,字符串“ABC\tD\b\n”中包括__7个字符。 20.数学关系4
Java2(第5版)最新答案耿祥义 第1章 一、问答题 1.James Gosling 2.需3个步骤: 1)用文本编辑器编写源文件。 2)使用javac编译源文件,得到字节码文件。 3)使用解释器运行程序。 3.由类所构成,应用程序必须有一个类含有public static void main(String args[])方法,含有该方法的类称为应用程序的主类。不一定,但最多有一个public类。 4.set classpath=D:\jdk\jre\lib\rt.jar;.; 5.java和class 6. java Bird 7.独行风格(大括号独占行)和行尾风格(左大扩号在上一行行尾,右大括号独占行) 二、选择题 1.B。2.D。 三、阅读程序 1.(a)Person.java。(b)两个字节码,分别是Person.class和Xiti.class。(c)得到“NoSuchMethodError”,得到“NoClassDefFoundError: Xiti/class”,得到“您好,很高兴认识您nice to meet you” 第2章 一、问答题 1.用来标识类名、变量名、方法名、类型名、数组名、文件名的有效字符序列称为标识符。标识符由字母、下划线、美元符号和数字组成,第一个字符不能是数字。false不是标识符。2.关键字就是Java语言中已经被赋予特定意义的一些单词,不可以把关键字作为名字来用。不是关键字。class implements interface enum extends abstract。 3.boolean,char,byte,short,int,long,float,double。 4.float常量必须用F或f为后缀。double常量用D或d为后缀,但允许省略后缀。5.一维数组名.length。二维数组名.length。 二、选择题 1.C。2.ADF。3.B。4.BE。5.【代码2】【代码3】【代码4】【代码5】。6.B。 三、阅读或调试程序
习题 1 1.James Gosling 2.需3个步骤: 1)用文本编辑器编写源文件 2)使用Java编译器(javac.exe)编译源文件,得到字节码文件。 3)使用java解释器(java.exe)来解释执行字节码文件。 3.D:\JDK 1) 设置path 对于Windows 2000/2003/XP,右键单击“我的电脑”,在弹出的快捷菜单中选择“属性”,弹出“系统特性”对话框,再单击该对话框中的“高级选项”,然后单击“环境变量”按钮,添加系统环境变量path。如果曾经设置过环境变量path,可单击该变量进行编辑操作,将需要的值d:\jdk\bin加入即可(注意:修改系统环境变量path后要重新打开DOS窗口编译)。或在DOS窗口输入命令行: set path=d:\jdk\bin(注意:用此方法修改环境变量每次打开DOS窗口都需要输入该命令行重新进行设置)。 2) 设置classpath 对于Windows 2000/2003/XP,右键单击“我的电脑”,在弹出的快捷菜单中选择“属性”,弹出“系统特性”对话框,再单击该对话框中的“高级选项”,然后单击“环境变量”按钮,添加系统环境变量classpath。如果曾经设置过环境变量classpath,可单击该变量进行编辑操作,将需要的值d:\jdk\jre\lib\rt.jar;.;加入即可。或在DOS窗口输入命令行: set classpath= d:\jdk\jre\lib\rt.jar;.;。 4.(B)javac 5.Java源文件的扩展名是”.java”,Java字节码的扩展名是”.class” 6.Java应用程序主类的main申明(D)public static void main(String args[])
习题解答 习题1(第1 章) 一、问答题 1. James Gosling 2.需 3 个步骤: 1)用文本编辑器编写源文件。 2)使用 javac 编译源文件 ,得到字节码文件。 3)使用解释器运行程序。 3 .源文件由若干个类所构成。对于应用程序,必须有一个类含有 public static void main(String args[]) 的方法,含有该方法的类称为应用程序的主类。不一定,但至多有一个 public 类。 4. set classpath=D:\jdk\jre\lib\rt.jar;.; 5.java 和 class 6.java Bird 7.独行风格(大括号独占行)和行尾风格(左大扩号在上一行行尾,右大括号独占行) 二、选择题 1.B。 2. D。 三、阅读程序 1. ( a) Person.java。 ( b)两个字节码,分别是 Person.class 和 Xiti.class。 ( c)得到 “ NoSuchMethodError ”,得到“ NoClassDefFoundError: Xiti/class ”,得到“您好,很高兴认识您nice to meet you” 习题2(第2 章) 一、问答题 1.用来标识类名、变量名、方法名、类型名、数组名、文件名的有效字符序列称为标识符。标识符由字母、下划线、美元符号和数字组成,第一个字符不能是数字。 false 不是标识符。 2.关键字就是 Java 语言中已经被赋予特定意义的一些单词,不可以把关键字作为名字来 用。 true 和 false 不是关键字。 6 个关键字: class implements interface enum extends abstract。 3. boolean, char, byte, short, int, long, float, double。 4. float 常量必须用 F 或 f 为后缀。 double 常量用 D 或 d 为后缀,但允许省略后缀。 5.—维数组名.length。二维数组名.length。 二、选择题 1.C。 2. ADF 。 3. B。 4. BE。 5.【代码2】【代码3】【代码4】【代码5】。 6. B。
Java程序设计题库 第一部分绪论 1、下列关于Java语言的特点,描述错误的是(C) A.Java是跨平台的编程语言B.Java支持分布式计算 C.Java是面向过程的编程语言D.Java支持多线程 2、Java语言具有许多优点和特点,下列选项中,哪个反映了Java程序并行机制的特点?(B) A、安全性 B、多线性 C、跨平台 D、可移植 3、Java JDK中调试器的命令是(C)。 A、javac B、java C、jdb D、avah 4、运行jar文件中class文件需要在java命令后面加的参数为(A)。 A、-cp B-g C-d D-verbose 5、下面哪项在java中是不合法的标识符?(C) A、$user B、point C、You&me D、_endline 6、下面关于Java语言说法正确的是(ABCD)。 A、Java语言是面向对象的、解释执行的网络编程语言。 B、Java语言具有可移植性,是与平台无关的编程语言。 C、Java语言可对内存垃圾自动收集。 D、Java语言编写的程序虽然是“一次编译,到处运行”,但必须要有Java的运行环境。 7、在Java程序设计中,程序员创建()文件,然后编译器把它们转化为()文件。( B) A、源, HTML B、源, 字节代码 C、字节代码, 源 D、HTML, 字节代码 8、Java的JVM是指(B)。 A、由Java操作的家用设备(通常是一个漂亮的小烤箱) B、Java字节代码的解释程序 C、Java源代码的编译器 D、运行Java 所需的硬件设备 9、在Java中,关于CLASSPA TH环境变量的说法不正确的是(A)。 A、CLASSPATH一旦设置之后不可修改,但可以将目录添加到该环境变量中。 B、编译器用它来搜索各自的类文件。 C、CLASSPATH是一个目录列表。 D、解释器用它来搜索各自的类文件。 10、一个可以独立运行的Java应用程序(D)。
习题解答 习题一(第1章) 一、问答题 1.James Gosling 2.需3个步骤: 1)用文本编辑器编写源文件。 2)使用javac编译源文件,得到字节码文件。 3)使用解释器运行程序。 3.由类所构成,应用程序必须有一个类含有public static void main(String args[])方法,含有该方法的类称为应用程序的主类。不一定,但最多有一个public类。 4.set classpath=D:\jdk\jre\lib\rt.jar;.; 5.java和class 6. java Bird 7.独行风格(大括号独占行)和行尾风格(左大扩号在上一行行尾,右大括号独占行) 二、选择题 1.B。2.D。 三、阅读程序 1.(a)Person.java。(b)两个字节码,分别是Person.class和Xiti.class。(c)得到“NoSuchMethodError”,得到“NoClassDefFoundError: Xiti/class”,得到“您好,很高兴认识您nice to meet you” 习题二(第2章) 一、问答题 1.用来标识类名、变量名、方法名、类型名、数组名、文件名的有效字符序列称为标识符。标识符由字母、下划线、美元符号和数字组成,第一个字符不能是数字。false不是标识符。2.关键字就是Java语言中已经被赋予特定意义的一些单词,不可以把关键字作为名字来用。不是关键字。class implements interface enum extends abstract。 3.boolean,char,byte,short,int,long,float,double。 4.float常量必须用F或f为后缀。double常量用D或d为后缀,但允许省略后缀。5.一维数组名.length。二维数组名.length。 二、选择题 1.C。2.ADF。3.B。4.BE。5.【代码2】【代码3】【代码4】【代码5】。6.B。
J a v a程序设计总复习题 1、编写一个Java程序,用if-else语句判断某年份是否为闰年。(分支) // Programme Name LeapYear.java public class LeapYear{ public static void main(String args[]){ int year=2010; if(args.length!=0) year=Integer.parseInt(args[0]); if((year%4==0 && year%100!=0)||(year%400==0)) 年是闰年。"); else 年不是闰年。"); } }//if-else语句 2、编写一个Java程序在屏幕上输出1!+2!+3!+……+10!的和。(循 环) // programme name ForTest.java public class ForTest { public static void main( String args[] ) { int i,j,mul,sum=0; for(i=1;i<=10;i++) { mul=1; for(j=1,j<=i;j++) { mul=mul*j; } sum=sum+mul; } “1!+2!+3!+……+10!= ”+sum); } } 3、依次输入10个学生成绩,判断学生(优秀、良好、中等、及格、不及格) 并计算人数(switch) 4、使用冒泡排序(数组) public class BubbleSort { public static void main(String[] args) {
第1章Java 语言入门 1-1开发与运行Java程序需要经过哪些主要步骤和过程? 1-2怎样区分应用程序和小应用程序?应用程序的主类或小应用程序的主类必须用public修饰吗? 1-3Java程序是有什么组成的?一个程序中必须要有public类吗?Java源文件的命名规则是怎样的? 1-4在运行小应用程序的html文件中可以使用codebase属性制定小应用程序的字节码所驻留的目录。如果不使用codebase属性,小应用程序的字节码文件必须和运行它的html在同一目录中,编写一个小应用程序并将它的字节码存放在某个目录中,比如c:\Boy. 把运行该小应用程序的html文件(注意其中的codebase属性): < applet code=你的小程序的字节码wdith=20 height=30 codebase=c:\boy> 存放在另一个目录中(查阅有关编写网页方面的书籍,会有更 详细的关于怎样在一个网页中嵌入一个小应用程序的讲解)。 第2章标识符、关键字和数据类型 2-1上机运行下列程序,注意观察输出的结果。
public class E { public static void main ( string args [ ] ) { for (int i=20302; i<=20302; i++) { System.out. println (( char ) i ); } } 2-2System.out. println (“你好”);可输出字符串值,也可以使用System.out. println()输出变量或表达式的值,只需使用并置 符号:“+”将变量、表达式或一个常数值与一个字符串并置即 可,如System.out. println(“”+x);System.out. println(“:” +123+“大于”+122)等。上机调试下列程序,注意观察结果,特别注意System.out. print()和System.out. println()的区 别。 public class OutputData { public static void main ( string args [ ] ) { int x=234, y=432 ; System.out. println (“:” +x+“<”+2*x); System.out. print (“我输出结果后不回车“); System.out. println (“我输出结果后自动回车到下一行”); } }
Java程序设计基础课后习题参考答案 第2章 1、关于Java Application得入口方法main()得检验: main()方法得参数名就是否可以改变? main()方法得参数个数就是否可以改变? 该方法名就是否可以改变? 参考答案:(1)main()方法得参数名可以改变.(2)main()方法得参数个数不可以改变。(3)该方法名不可以改变。 2、当一个程序没有main()方法时,能编译吗?如果能编译,能运行吗? 参考答案:当一个程序没有main()方法就是,就是可以编译通过得,但就是不能给运行,因为找不到一个主函数入口。 3、下列语句能否编译通过? bytei =127; bytej = 128; longl1 = 999999; long l2= 9999999999; 参考答案:byte i 与long l1可以编译通过。而byte j 与longl2 超出自身数据类型范围,所以编译失败。 4、下列语句能否编译通过? float f1 =3、5; float f2 = 3.5f; 参考答案:java中浮点型得数据在不声明得情况下都就是double型得,如果要表示一个数据就是float型得,必须在数据后面加上“F”或“f”;因此,floatf1 无法编译通过。 5、验证int 与char,int与double等类型就是否可以相互转换。 参考答案:(1)char类型可以转换为int 类型得,但就是int类型无法转换为char类型得;(2)int 可以转换为double类型得,但就是double类型无法转换为int 类型得。 6、计算下列表达式,注意观察运算符优先级规则。若有表达式就是非法表达式,则指出不合法之处且进行解释。 (1)4+5 == 6*2 ?(2) (4=5)/6?? (3)9%2*7/3>17(4)(4+5)<=6/3 ? (5) 4+5%3!=7-2????(6)4+5/6〉=10%2 参考答案:表达式(2)为不合法表达式,只能将值赋值给一个变量,因此其中(4=5)将5赋值给4就是不合法得. 7、下列()就是合法得Java标识符。 (1)Counter1 ??(2)$index, (3) name-7 ??(4)_byte
可选试题 判断题 ×1.Java是低级语言 √2.Java是面向对象的程序设计语言 ×3.Java是编译型的计算机语言 √5.Java源程序文件的后缀是.java ×10.一个Java源程序文件中可以有多个public类 √11.一个Java源程序中可以有多个类 ×12.一个Java Applet源程序的主类可以有多个父类 √13.Java应用程序的入口方法是main √14.Java应用程序(Application)的主类中一定要有主方法(main) √16.Java小程序(Applet)的主类的父类必须是类Applet ×17.Java语言中的逻辑变量可以和整型变量相互强制转换 ×18.在程序中可对用final修饰的变量的值进行更改 ×27.双精度数强制转换成单精度数后,其数值精度提高 ×11.方法可以有多个返回值 ×5.重载的方法可以通过它们的返回值类型的不同来区分 √16.定义在方法体中的变量能与定义在方法体外的变量同名 √6.一个对象一定要属于某个类 ×7.构造函数的方法名可由编程人员任意命名 √8.类的构造函数名必须和类名相同 √10.构造函数可以重载 ×11.如果一个类定义中没有定义构造函数,该类就没有构造函数 √12.如果一个类定义中已经定义了构造函数,java不会再给它提供默认的构造函数 ×11.静态属性和静态方法属于类的一个具体对象 √12.static 变量能是private 变量 ×14.static方法能处理非static成员 √15.非static方法能处理static成员 ×16.static方法中能有this引用 ×18.类的私有属性和私有方法能被其子类直接访问 √12.子类的成员变量能与其父类的成员变量同名 ×14.子类可以重新定义从父类继承来的同名方法,并且允许它们有不同类型的返回值 √15.接口支持多继承(extends) √15.一个接口能够继承(extends)多个接口 ×7.抽象类只能做为父类 ×8.可以定义抽象类的对象 √9.抽象方法能被继承 √10.抽象方法只能存在于抽象类或接口中
参考答案 第1章 3、计算机系统由哪两部分组成的?计算机硬件结构由哪几部分组成?它们各自有什么作用? 一台计算机由硬件和软件组成。一台典型的计算机由五大部分组成。这五大部分是:运算器,控制器,存储器,输入设备和输出设备。 运算器是执行算术运算和逻辑运算的部件。 控制器是向计算机其他部分发送命令的部件。 存储器是计算机用来存储数据、信息的部件。 输入设备就是外界向计算机输入信息设备。 输出设备恰好与输入设备的作用相反,它将处理过后的信息输出呈现给用户。 9、将以下十进制数转换为对应的二进制数 (1)32 (2)97 (3)256 (4)500 (1)100000 (2)1100001 (3)100000000 (4)111110100 第2章 1.Java语言有哪些主要特点。 平台独立性 安全性 多线程 网络化 面向对象 3.Java Application的开发步骤有哪些。 Java Application的开发步骤: (1)下载JDK软件并安装; (2)配置相应的环境变量(path和classpath); (3)编写Java源程序(文本编辑器或集成开发环境IDE); (4)编译Java源程序,得到字节码文件(javac *.java); (5)执行字节码文件(java 字节码文件名)。
4.什么是环境变量,设置环境变量的主要目的是什么。 环境变量的配置主要是为了进行“寻径”,也即让程序能找到它需要的文件,所以设置的内容就是一些路径。 第3章 1.Java语言对于合法标识符的规定是什么?指出以下哪些为合法标识符。 a a2 3a *a _a $a int a% 在Java语言中,标识符必须以字母、美元符号或者下划线打头,后接字母、数字、下划线或美元符号串。另外,Java语言对标识符的有效字符个数不做限定。 合法的标识符: a a2 _a $a 5.数据类型强制转换的原则是什么?如何转换? 对于变窄转换,如long到short、double到float,或者不兼容转换:float到short、char 到short等,则需要进行强制转换。 float f = 11.5; short b ; b = (short)f; (强制转换) 第4章 5.用穷举法求出3位数中百、十、个位数的立方和就是该数的数。 public class Test { public static void main(String[] args) { int a,b,c,x=100; while(x<1000){ a=x%10; b=(x%100-a)/10; c=(x-x%100)/100; if(a*a*a+b*b*b+c*c*c==x) System.out.println(x); x+=1;
Java 2实用教程(第三版) 清华大学出版社 (编著耿祥义张跃平) 例子源代码 建议使用文档结构图 (选择Word菜单→视图→文档结构图)
第一章Java 语言入门例子1 public class Hello { public static void main (String args[ ]) { System.out.println("你好,很高兴学习Java"); } } 例子2 public class People { int height; String ear; void speak(String s) { System.out.println(s); } } class A { public static void main(String args[]) { People zhubajie; zhubajie=new People(); zhubajie.height=170; zhubajie.ear="两只大耳朵"; System.out.println("身高:"+zhubajie.height); System.out.println(zhubajie.ear); zhubajie.speak("师傅,咱们别去西天了,改去月宫吧"); } } 例子3 import java.applet.*; import java.awt.*; public class Boy extends Applet { public void paint(Graphics g) { g.setColor(Color.red); g.drawString("我一边喝着咖啡,一边学Java呢",5,30); g.setColor(Color.blue);
Java程序设计第三次作业 第7章习题 4.1程序代码 import java.util.*; public class SUMANDAVERAGE { public static void main(String[] args) { Scanner reader=new Scanner(System.in); double sum=0; int m=0; while(reader.hasNextDouble()){ double x=reader.nextDouble(); assert x>=0&&x<=100:"该数是非法的成绩数据!"; m=m+1; sum=sum+x; } System.out.printf("%d个数的和为%f\n", m,sum); System.out.printf("%d个数的平均值为%f\n",m,sum/m); } } 4.2运行结果 第8章习题 4.1程序代码 package kehou; import java.util.Calendar; import java.util.InputMismatchException; import java.util.Scanner; public class BC8_4 { public static void main(String[] args) { System.out.print("请选择你要完成的功能:\n1,转换字母大小写及连接两个字符串。\n2,得到字符串第一个和最后一个字符。\n3,计算两个时间之间的间隔天数。\n" + "4,使用简单的Math类用法。\n5,剔除字符串中的非数字字符。\n6,解析字符串。\n."); System.out.print("输入数字i(i=1...6;输入0结束!):"); Scanner reader=new Scanner(System.in);
《JA V A程序设计》练习题 一、单选择题 1、编译Java Application 源程序文件将产生相应的字节码文件,这些字节码文件的扩展名为( B )。 A. java B. .class C. html D. .exe 2、设x = 1 , y = 2 , z = 3,则表达式y+=z--/++x 的值是( A)。 A. 3 B. 3. 5 C. 4 D. 5 3、不允许作为类及类成员的访问控制符的是( C )。 A. public B. private C. static D. protected 4、为AB类的一个无形式参数无返回值的方法method书写方法头,使得使用类名AB作为前缀就可以调用它,该方法头的形式为( A)。 A. static void method( ) B. public void method( ) C. final void method( ) D. abstract void method( ) 5、关于选择结构下列哪个说法正确?( B ) A.if语句和else语句必须成对出现 B.if语句可以没有else语句对应 C.switch结构中每个case语句中必须用break语句 D.switch结构中必须有default语句 6、while循环和do…while循环的区别是:( D) A.没有区别,这两个结构任何情况下效果一样 B.while循环比do…while循环执行效率高 C.while循环是先循环后判断,所以循环体至少被执行一次 D.do…while循环是先循环后判断,所以循环体至少被执行一次 7、关于for循环和while循环的说法哪个正确?( B) A.while循环先判断后执行,for循环先执行后判断。 B.while循环判断条件一般是程序结果,for循环的判断条件一般是非程序结果C.两种循环任何时候都不可以替换 D.两种循环结构中都必须有循环体,循环体不能为空
第4章类、对象和接口 1. 类中的实例变量在什么时候会被分配内存空间? 答: 当该类创建对象之后,实例变量才会被分配相应的内存空间。 2. 什么叫方法的重载?构造方法可以重载吗? 答:①一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同,即或者是参数的个数不同,或者是参数的类型不同(方法的重载体现了多态性,即功能多态性)。 ②构造方法可以重载。 3. 类中的实例方法可以操作类变量(static变量)吗?类方法(static方法)可 以操作实例变量吗? 答:①类中的实例方法可以操作类变量。 ②类方法不可以操作实例变量 4. 类中的实例方法可以用类名直接调用吗? 答: 类中的实例方法不可以用类名直接调用。 5. 举例说明protected方法和友好方法的区别。 答: 当子类与父类不在同一个包中时,子类可以继承父类的protected方法;而友好方法此时则不能被子类继承。 6. 举例说明类变量和实例变量的区别。 答:⑴书写: 定义成员变量时,类变量有static修饰;实例变量没有static修饰。例: class A { int x; //实例变量 static int y; //类变量 } ⑵内存: 不创建对象,类的实例变量不会被分配内存空间;类变量被分配相应的内存空间。 不同对象的实例变量被分配不同的内存空间;不同对象的类变量被分配相同的内存空间。 任何一个对象改变类变量,其他对象的相应类变量也发生相应变化。 一个对象的实例变量发生改变,不影响其他对象的相应实例变量。 例: 执行语句: A1.x=10; A1.y=20; 这时A2.x的值也是10;而A2.y的值保持原来的初值。 ⑶使用: 类变量可以被类方法操作;而实例变量不能被类方法操作。 例: class A { int x; static int y; static void func() {
【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少 //这是一个菲波拉契数列问题 public class lianxi01 { public static void main(String[] args) { System.out.println("第1个月的兔子对数: 1"); System.out.println("第2个月的兔子对数: 1"); int f1 = 1, f2 = 1, f, M=24; for(int i=3; i<=M; i++) { f = f2; f2 = f1 + f2; f1 = f; System.out.println("第" + i +"个月的兔子对数: "+f2); } } } 【程序2】 题目:判断101-200之间有多少个素数,并输出所有素数。 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。 public class lianxi02 { public static void main(String[] args) { int count = 0; for(int i=101; i<200; i+=2) { boolean b = false; for(int j=2; j<=Math.sqrt(i); j++) { if(i % j == 0) { b = false; break; } else { b = true; } } if(b == true) {count ++;System.out.println(i );} } System.out.println( "素数个数是: " + count); } } 【程序3】 题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。 public class lianxi03 { public static void main(String[] args) { int b1, b2, b3; for(int m=101; m<1000; m++) {