漫谈c游戏引擎开发

2022-08-01

第一篇:漫谈c游戏引擎开发

基于Cocos2dx引擎的环保益智手机游戏设计与开发

摘要:《游走雾霾》是一款基于Cocos2dx游戏引擎、主要搭载于Android端的环保类益智手机游戏。对该游戏各模块的设计及实现进行了阐述。分析了游戏需求及市场现状,在游戏设计过程中,结合软件工程中常用的设计理念,整体架构采用单例设计模式,使用编程语言为C++。游戏已完成终端调试,程序运行流畅,功能实现完全。

关键词:Cocos2dx引擎;手机游戏开发;雾霾;C++

DOIDOI:10.11907/rjdk.161680

中图分类号:TP319

文献标识码:A文章编号:16727800(2016)010008804

0引言

手机游戏产业的高速发展和空气质量问题的日益突出,这两个看似不相关的现象背后实则蕴藏了巨大的市场,如果能将其有效结合,不仅具有较高的商业价值,并且能够将环保话题延伸到规模庞大、影响力广的游戏产业中,具有很强的公益性。

顺此思路,本文基于Cocos2dx游戏引擎,利用Visual Studio、Tiled、Particle Designer等软件开发了一款手机游戏。游戏以城市为背景,设有雾霾回收口,用户通过放置道具栏中的障碍物,改变雾霾的初始路径使其进入回收口,以达到游戏成功的目的。游戏进行了多次Android真机调试,实现了全部设计目标。

1背景分析

1.1市场现状

随着智能手机的普及与互联网行业的飞速发展,移动游戏行业取得了长足的进步,截至2015年,市场规模已达到492.7亿人民币[1]。与此同时,手机游戏用户数量也呈现出井喷的态势,超越了2亿[2]。一款优秀的客户端游戏不仅能够带来较高的销售收入,还具有较强的社会性话题,故而受到手机厂商的青睐,占据了游戏市场较大份额。从手机游戏的类型分布来看,休闲益智游戏数量超过了60%,最受玩家喜爱,市场竞争也最为激烈。

Android凭借其开源性和终端多样性在全球普及率较高,它能够兼容低端智能机的特性,降低了智能手机的硬件门槛,占据全球84.7%的市场份额,从游戏推广角度无疑是最好的载体。

空气质量问题被社会广泛关注,基于此,我们收集了潜在用户对环保类手机游戏的看法,结果显示仅有20%的人玩过与环保主题相类似的游戏,有16%的人竟没有听说过,可见公众对环保类游戏的了解程度较低。同时,以治理空气污染为主题的游戏还是空白,但潜在用户量较大,有较大的发掘潜力。

1.2设计思路

结合上述分析,开发者将游戏定位为一款基于Android手机操作系统的环保益智型手机游戏。当下游戏市场如跑酷、消除、棋牌类产品数量较多,没有创新型思路和主题的游戏很难具有较高的用户粘性。开发者以雾霾为背景,推出以消除雾霾为核心的新概念游戏,将“共同治霾,人人可为”的理念贯穿其中,使玩家能够将游戏与现实生活进行一定程度的结合,让玩家感受到在为环境保护贡献力量,在实现基本商业价值的同时,实现了游戏设计者所赋予的公益价值。

2Cocos2dx引擎简介

Cocos2d引擎最早由阿根廷人Ricardo使用Python语言进行开发,之后又使用Objective-c将它移植到IOS与Mac平台上[3]。Cocos2d出现过许多分支,其中发展最好、最具生命力的当属兼具开源性和跨平台性的Cocos2dx。它由C++写成,在脚本的绑定方面采用了跨平台的Lua与Javascript,能够在IOS、Mac、Android、Linux、Windows、Blackberry等绝大多数操作系统上运行,为开发者提供完整的游戏开发工具链,目前使用Cocos2dx开发的游戏已经超过了1亿的下载量,其中,Android平台占据最大份额。

在Cocos2dx引擎中,导演类(Director)控制所有的场景(Scene),整个游戏的所有切换均在场景上实现,各模块分别是一个独立的场景,每个场景中包含了若干个层(Layer),分别实现不同功能,每个层中有若干的精灵(Sprite)对象以丰富场景内容,达到游戏设计效果[4]。导演、场景、层、精灵4个概念是游戏的基本组成元素,其关系如图1所示。

3游戏设计

3.1流程设计

游戏的基本元素为:雾霾主体、回收口、障碍物。玩家通过记忆游戏中预设的雾霾移动轨迹,结合回收口在图中的具体位置,放置障碍物改变雾霾路径。在经典模式中,雾霾若进入地图中的回收口处则判定游戏胜利,解锁下一个关卡;在自由模式中,地图会由总体微缩至局部,玩家需要在连续的关卡中将雾霾一步步引导至回收口。图2为经典模式流程。

3.2模块设计

游戏分为5个模块,如图3所示。

(1)帮助模块。帮助模块采用了预设动画方式,进入帮助界面后玩家可以通过点击播放按钮多次观看动画,动画真实还原了游戏中的场景和道具,能够帮助玩家快速掌握游戏玩法。

(2)设置模块与商店模块。设置模块主要进行游戏音效设置,玩家可以在帮助界面中选择,从而改变全局变量值,实现游戏整体音效统一。商店模块提供游戏中必要的道具,玩家可以结合游戏情况自主选择,达到降低游戏难度、提高游戏趣味性效果。

(3)自由与经典地图模块。地图模块是整个游戏的主体部分,游戏提供自由和经典两种模块供玩家选择。

4游戏实现

4.1场景介绍

4.1.1开始场景

开始场景(HelloWorldScene)作为玩家对游戏的最初印象,设计时充分考虑了视觉效果,采用扁平化与拟物化的设计原则,界面如图4所示。

在功能方面,除了其自身的初始化函数,开始场景(HelloWorld)中还有可以进行场景切换、跳转至游戏各大模块的回调函数和与其相关的场景生命周期函数。以进入帮助界面回调函数为例:

4.1.2关卡选择场景

该场景帮助玩家在经典模式中进行关卡选择。

关卡选择场景(SelectScene)提供了进入各关卡按钮及相应的回调函数,玩家通过点击按钮,触发回调函数从而进入游戏主场景,它是整个游戏的中枢环节。以进入第一关的按钮及其回调函数举例:

4.1.3游戏主场景

(1)场景背景。经典模式场景背景以夜空中的城市为主题,设计了一系列城市街道图,雾霾在城市的主干道上进行移动,见图5。自由模式的场景背景则以星空为主题,见图6。

(2)界面控件。所有界面下方有障碍物道具栏,道具栏的右侧设置了开始按钮,玩家摆放障碍物完毕后点击开始按钮,可使雾霾进行二次移动。

界面左上角设置了暂停按钮,玩家在游戏过程中可以随时退出游戏。

(3)场景功能。经典模式和自由模式只存在背景图片和流程上的差别,场景中实现功能是一致的。首先通过瓦片地图导入,识别出地图中的路径起始点与回收口坐标;然后通过精灵和粒子系统动作使雾霾进行初次移动,玩家放置障碍物后地图进行坐标识别;最后雾霾根据障碍物位置实现二次移动,系统判断游戏是否成功。

4.1.4信息提示场景

信息提示场景由游戏成功、游戏失败、是否继续3个提示构成。在游戏成功和游戏失败界面中增加了关于雾霾的知识,以通过游戏普及环保知识。

4.2瓦片地图

如果一个游戏有较丰富的背景元素,直接使用背景图切换方式就需要为每个不同场景准备一张较大的背景图,这样不仅造成资源浪费,还会延长预加载时间,降低玩家的游戏体验。可以采用瓦片地图,将一张大的世界地图或背景图用瓦片表示,开发者使用许多较小的纹理来创建瓦片,在提高绘图性能的同时也方便了引擎的管理,只要将瓦片进行拼接即可得到整体的背景图[5]。

瓦片地图.tmx文件还可以存放地图中一些重要点的坐标集供开发时使用,补充代码如下:

map=TMXTiledMap::create("map/map3.tmx")

4.3精灵移动

精灵移动通过MoveTo函数实现,它主要进行两点之间的移动,背景图中所有点的坐标均可通过瓦片地图来获得,runAction函数可以形成组合动作实现精灵的连续移动。

4.4粒子系统

在绘制一些复杂系统时,一些动态效果很难用传统方式呈现,这时可以借助粒子系统。但是在具体操作中,如果将粒子的诸多性质一一用代码列举不但达不到最终效果,还会降低开发效率。实际操作中可以利用粒子编辑器,在可视化界面下自定义粒子系统,最终导出plist文件。下面是plist文件的某些内容,可见它主要是对粒子系统的各参数进行描述,只需将plist文件添加至工程中即可实现效果。

5结语

本文详细介绍了一款环保类手机游戏《游走雾霾》的设计思路以及技术细节。游戏使用C++语言,利用开源的游戏引擎Cocos2dx进行开发,界面友好,设计思路简单明晰,具有良好的用户交互性。游戏经过测试,功能完全实现。

参考文献参考文献:

[1]北京腾云天下科技有限公司.TalkingData 2015年移动游戏行业报告[R].北京,2015.

[2]CNNIC .2014-2015年中国手机游戏用户调研报告[R].北京: 中国互联网络信息中心,2015.

[3]Cocos2d.维基百科[EB/OL].https://en.wikipedia.org/wiki/Cocos2d,2008.

[4]关东升.Cocos2dx实战:C++卷[M].北京:清华大学出版社,2014.

[5]NXSHOW.深入理解Cocos2dx 3.x:内置数据结构(2)Map [EB/OL].http:///doc/tutorial/show?id=2637.

责任编辑(责任编辑:杜能钢)

第二篇:LUNA_游戏引擎介绍

LUNA

游戏引擎介绍

学院:计算机科学与技术班级: 学号: 姓名:

《LUNA 游戏引擎介绍》

LUNA游戏引擎系LUNA团队精心研发的拳头产品,该引擎秉承了国内外许多著名游戏引擎的优点,并开创式的融入了多个游戏引擎制作的新模式、新观点,较好的吸引了其他知名游戏引擎的精华,是中国国内游戏引擎中非常优秀的作品,虽然该引擎的商业版迟迟未能推出,但丝毫不能阻挡业界开发者想揭开她神秘面纱的想法,现在特对该引擎作一些技术揭秘:

LUNA 游戏引擎经过多个版本的更新和衍生,从最初单纯的游戏基本库到如今拥有完整且多元化的游戏制作解决方案,经历了五个年头。在这五个年头里,LUNA引擎的主要开发者Villa Lee先后数次大刀阔斧的整改引擎的结构和框架,由其是最近一个版本的更新,耗费了半年时间之间,实时的给引擎注入代表当今世界最领先图形技术和游戏制作技术。

为了具备与操作系统无关性的特点,LUNA引擎单独划出了两个底层管理模块。

第一个是操作系统转置层,该层中主要封装了Linux、Win32等不同操作系统的API,同时包含了底层错误反应系统、事件驱动系统、CPU监测管理系统、Thread Manager、和两个高精度计时器;

另一个是操作系统管理层,类似于MSDOS的Io.sys。该层中主要集成了Memory监测管理系统、管道处理系统、管道映射表分析器、管道搜索器、FPU/3D Now!™/SSE 优化指令集。

同大多数著名的引擎一下,LUNA有极为丰富的高效的渲染指令。并且这些指令是以类工厂形式提供给引擎使用者使用的。各个指令的分类以及各个其他非渲染类子系统相关的功能如下表:

♦ 角色动画、模型系统

支持Lod Mesh,根据视点距离自动减面及调整细节等级。 支持顶点位移、旋转、缩放动画 支持蒙皮(Skin)

支持骨架和骨架动画。3ds max 中的Biped、Bones 或Dummy 等均可作为骨架输出。 支持材质动画 支持路径动画 支持材质坐标系动画 支持贴花纸(Decal)动画 支持贴花纸坐标系动画

支持融合和形变动画,例如从人变成龙或其他动物 支持面部表情动画

支持可见度动画,如模型或模型部分淡入淡出。 支持通用和任意缩放动画,或模型的部分任意缩放动画

支持动画合成,同一模型同时可以播放多个动画,不同动画会自动叠加合成,不同动 画可以按照不同的速度播放。 支持自定义动画长度和播放速度,在模型输出时可以调整动画的播放速度。 支持动画播放运行时加速、减速。

支持动画中某帧触发相对应的事件,例如播放到动画中某一帧的时候进行扣血等。 支持对模型的部分进行操作。

支持环境贴图、反射贴图、细节贴图等,可以做反光效果等。 ♦ 碰撞检测系统

快速准确的碰撞检测算法。 支持边界框碰撞。 支持AABB 碰撞。 支持射线碰撞。 支持任意形状的碰撞。

支持按照不同类别的物件进行分类碰撞。例如可以设定玩家与地面、静态物件等发生 碰撞,怪物与地面发生碰撞却不与静态物件发生碰撞等。 ♦ 效果系统

效果系统包含对各种光效组合的支持,全面提升游戏画面的可视性: 支持材质自动融合。 支持实时动态阴影。

支持动态光效,支持非线性光效动画,可自定义RGB 三色关键帧动画。 支持爆炸效果。 支持熔岩效果。 支持太阳眩光。 支持闪电特效。

支持镜头颤动效果,可自定义颤动的物理频率和振幅。 支持刀光剑影。

支持雨雪效果,雨雪材质可以从指定的材质列表中随机选择,雨雪量大小、风力大 小、雨量速度等等参数可以自定义,支持暴风雨效果(特定算法)。 支持水花和波纹、气泡效果。 支持物件被击破产生碎片。 支持运动模糊效果。

支持自定义特效,可以在显卡上对硬件显示模块进行直接编程,高速执行,算法类似 Uneal3。所有自定义特效可以通过特效管理器进行管理,并可分别运用在不同模型 上。 ♦ 粒子系统

>>> 自定义粒子触发方向、发散参数、发散位移参数、生存周期、间隔周 期、内外延角、风力参数、推进力参数、重力、推进力变化参数、速度参数等等参 数。

支持动态贴图,可以调整材质变换速度。 支持粒子不同阶段使用不同颜色。 粒子发散器可以控制粒子喷射数量。 粒子可以绑定在模型上特定节点。

专门有为粒子编写的粒子脚本编辑器方便策划人员编写漂亮的粒子。 ♦ 室内场景系统

支持BSP/PORTAL/PVS 算法。 支持光图。

支持室内动态光效,支持顶点光。

支持室内全场景警报状态,全场景产生某种特定光效。 支持多层细节层,自动减面。 支持材质替换。

支持路径编辑。可用于过场动画或游戏。 支持室内触发器。 支持镜像物件,如镜子等。 支持自定义节点。 支持力场。 ♦ 室外场景系统

支持无边际连续室外地形,地形可以动画变化。 支持海底场景和天界等无重力场景。 室外地形支持连续自动减面。

室外地形支持多种材质,支持同一区域上多材质,支持材质自动融合。 支持流水和动态波纹,支持天空倒影,水流波浪等参数均可调整。 支持昼夜变化。 支持质量雾。 支持场景中可见度。

支持太阳光和太阳光效,太阳光支持颜色和亮度的关键帧非线性变化,太阳高度角可 以变化。 支持天空中多层动态云层。

场景中支持风,支持风速变化,支持暴风。 ♦ 场景管理系统

细节层管理器,可对场景中所有物件进行同一细节层管理。 光效管理器,可对场景中众多光效进行同一管理。 场景分区域管理,无缝衔接。 高速搜索算法,管理需要渲染的对象。 ♦ 格式容合系统

格式容合系统主要是为了高效的重复利用开发者已拥有的游戏资源,可以不经任何其他转换直接应用到游戏中而设计。支持兼容文件格式包含如下清单:

完全支持QUAKE引擎的.MDL/.MD2/.MD3/.BSP/.WAD文件格式,并提供直接高效渲染方法 完全支持COLLADA DTE格式以及微软的.X的MESH、SKINMESH模型文件格式,并提供直接高效渲染方法

完全支持MS3D文件模式,并提供直接高效渲染

支持.3DS文件顶点动画和模型文件模式,并提供直接高效渲染方法

支持.PNG/.DDS/.TGA/.BMP/.IMG/.PCX/.GIF/.WMF等等诸多常用的图片文件格式 支持目前应用较大的.WAV/.MP3/.MID/.SND/.WMV/.AVI/.MPEG等等声音媒体文件格式

♦用户界面系统

全真模拟Windows 的结构化控件的管理系统 各控件可以按照不同的方式随父控件缩放、移动 良好的扩展性,容易增加新控件 ♦3D音频系统

支持多种音频格式:WAV、MP

3、MIDI、WMA、CD 音轨等。 多通道音效。

支持真实3D 音效,支持多普勒声波衰弱算法、3D 音频摇动。 支持软件和硬件加速混音,支持DirectSound™、EAX

2、EAX 3。 支持高级音效处理(类似Winamp 的DSP 系统)。 ♦人工智能系统

新一代交互系统

长期以来,游戏玩家主要是通过键盘、鼠标或游戏手柄来完成游戏操作,LUNA引擎在对这些基本游戏交互设备的支持情况下,特意融合了国际较为知名的低分辨率动态图像识别算法和语音识别算法,使玩家在较低成本投入情况下,用肢体或行为语音来完成对LUNA游戏引擎开发的游戏的操作。增添了对游戏的参与性及亲身体验感。

其中动态图像识别系统包含:动作跟踪、动作运动轨迹计算、动作深度判定、色相位自调节、正切线二次插补等子模块。识别速度快、精度较高。

网络引擎系统

LUNA游戏引擎本着最低的游戏开发成本为宗指,在强大的图形渲染平台上加入了高效的网络引擎系统,该系统采用IOCP完成端口模型+P2P超接点网络技术,支持TCP/IP、UDP、HTTP等多种网络传输协议,使开发者在较短的开发周期内制作出高质量的网络程序。 物理引擎系统

游戏中的玩家运动均按照真实的动力学计算,整个场景中包含重力、重力场。场景中存在 风,烟可以随风飘动;水中存在更大的阻力和浮力,有些物体可以随水流走。 支持钢体精确碰撞。

支持针对汽车、飞行器材、船支等交通工具类的不同动力学算法。

支持自由落体或施加力、力场的物体运动,例如子弹等,可以留下漂亮的弹道。 配合自制的骨骼系统轻松完成物体碎裂、变形、散落等现实世界描述

LUNA引擎从开发伊始,就十分重视游戏工具、编缉器的开发。目前已经成功开发了方便实用的工具套间,其中包括:

场景编辑器、脚本编辑器、模型编辑转换器、模型和动画VIEWER、音频编辑器,其中场景编辑器包括地形编辑模块、运行时调试工具、属性编辑模块、任务编辑模块等等。

第三篇:创新农村党建新模式开发农民致富新引擎

大团镇党委

近年来,大团镇党委积极探索实践农民专业合作社党建新模式,以帮助农民创业、增收、致富作为农村党建的主要目标,切实加强了对农民专业合作社的组织、引导和服务,实现了农村党建、合作社发展和农民致富的共赢。

一、顺应形势,积极探索农民专业合作社党建新模式

大团镇是浦东新区的农业重镇,现有基本农田3.4万余亩,农村户籍3.2万余人,约占新区农村户籍人口的1/10。近几年,农民专业合作社如雨后春笋般成长起来,并逐步成为农村经济经营新模式。大团镇党委清醒地意识到,农民专业合作社集约了各类农业资源,提高了农业生产力,是今后农村经济的一种主要形式,但这种以自主经营为主的农民专业合作社存在着总体经营规模较小、带头人引领作用不明显、合作社内部管理不规范等问题。为此,大团镇党委积极思考,从党组织更好促进农村经济发展、更好带领农民增收致富出发,提出了“支部+合作社+农户”的思路。

从2007年开始,大团镇党委在条件比较成熟的上海申凤桃业专业合作社进行试点。村党总支以申凤合作社基地附近的3个村民小组的6名党员社员为主体,成立了一个以原村支部书记王凤娟为书记的合作社党支部,社员党员受合作社党支部和村党总支的双重领导和管理。合作社党支部的成立,迅速扩大了社员对合作社的信任度,合作社社员由最初的9户,发展到35户,并与周边800多户桃农签订了购销协议。合作社也在支部的领导下步入发展正轨,完成了“大团蜜露桃高产优质栽培技术开发”等科研项目,注册了“申凤”牌蜜露桃商标,并通过了上海市安全卫

生优质农产品认证。申凤牌蜜露桃还被评为“沪郊百宝”、全国农业品牌产品。目前,合作社已与300多个客户建立了长期的、稳定的供销关系,年销售收入达500多万元。实践证明了合作社党建模式的有效性,镇党委顺势而为,在全镇范围内进行了推广。

二、培育发展,不断增强农民专业合作社党建新模式的有效性 为深入推进这种党建模式,发挥合作社党建作用,大团镇党委三管齐下,着力推进。

1、积极培育。一是发展了一批。按照成熟一个组建一个的原则,参照申凤桃业合作社支部模式,在条件成熟、业主认可的合作社建立了党支部,逐步成立了梁梁果蔬、乐侬对虾、思甜家禽、多利农庄4家合作社支部。二是储备了一批。按照稳步推进的原则,对一些发展有前途、个人引领作用强、党员群众公认的合作社,镇党委及时跟踪,加强与合作社领头人的沟通联系,积极为合作社支部成立创造条件,如源陆食用菌、盛亮果蔬等一批合作社党建因素得到进一步发展。三是培育了一批。镇党委积极采取“四个优先”,促进合作社良性发展,即优先培养致富能手入党、优先发展合作社内部党员、优先扶持党员和支部引领的合作社、各类资源优先向合作社党组织倾斜,全面推广“党员带头致富,党员带领群众致富”为主要内容的“双带”工程。

2、重点扶持。对一些重点合作社,大团镇党委切实加强扶持力度,从人、财、物三个方面给予支持。一是在人力上优先支援。如思甜家禽合作社支部刚成立时,由于合作社领头人不是党员,村党组织委派村委班子成员兼任,同时抓紧对合作社领头人培养。二是在财力上优先倾斜。每年区、镇两级财政和农业项目优先向建立党支部的农民专业合作社倾斜,近两年支持5家建立党支部的专业合作社共7个农业项目,支助资金达3897万元。三是在物力上优先保障。如大团桃园,就是根据“政府

搭台、合作社唱戏、农民受益”的思路,以上海水蜜桃原产地保护区为基础,为梁梁蔬果合作社发展提供了一个广阔舞台。四是在服务上优先提供。镇职能部门实施服务承诺制,帮助合作社研究市场、考察项目、协调资金,并提供技术、信息等服务。

3、激励发展。在推广实践中,镇党委还及时研究制定了《关于扶持发展专业合作组织的实施意见》,成立了以党政主要领导任正副组长及相关单位负责人为成员的工作领导小组,提出了“建一个组织,兴一项产业,活一地经济,富一方百姓”的工作目标,建立了“党委统筹抓,部门具体抓,基层深入抓”的工作机制,把发展农民专业合作组织作为村级组织目标考核的主要内容之一。同时建立奖惩激励机制,确保合作组织规范运作和健康发展。

三、互融互促,努力实现党支部、合作社、农民共赢

1、加强了农村党的建设。一是增强了合作社党组织的凝聚力。在2011年完善二轮土地延包时,思甜家禽合作社碰到了社员要求重新签订合同、提高土地流转费等发展瓶颈。合作社8名党员社员主动帮助说服其他社员继续按以前的合同以土地入社,确保合作社平安渡过了发展难关。二是体现了合作社党员的先锋模范作用。各专业合作社党支部均建立了党员带小户、领散户、帮困户的帮带责任制度,在各类重要节点时期,合作社和先致富党员社员共同走访慰问周边的农户,不断体现党员先进性。

2、培育了一批示范合作社。各合作社党组织不仅积极指导专业合作组织制定发展规划,帮助建章立制、健全管理、完善机制,规范了合作社内部管理,还引导和支持专业合作社按照发展目标,实现了组织化生产、规模化发展、品牌化经营,从而增强了竞争力。如乐侬对虾的“银京”牌水产和“乐侬”牌对虾先后多次参展上海和大连农业博览会,多利农庄

的有机蔬菜、申凤桃业的蜜露桃、思甜家禽的“联系牌”散养鸡和鹅等的市场占有率也迅速提高。2011年,成立党支部的5家合作社共带动农户2000多户,实现销售收入约1.5亿,并都成为上海市示范专业合作社。

3、解决了农民“三难”问题。各专业合作社除了以专业技术优势较好地解决了农民“种养难”外,在党支部的倡导下,鼓励一部分生产经营社员骨干从生产中脱离出来,直接从事农产品营销。如申凤桃业的党员骨干开辟了网上交易新模式,积极开拓海外销售渠道,并成功地销往新加坡、日本等地区;多利农庄的党员干部积极推行“绿色委员”直销模式,实行有机蔬菜生产、会员配送为一体的运营模式,切实解决了农民“销售难”问题;还为社内有发展潜力的党员优先争取上级的政策支持、科技项目立项以及各级多项优惠政策。据统计,各专业合作社中的农户与其他农户相比,每年户均增收3000—5000元,较好地解决了农民“增收难”问题。

经过几年的实践,大团镇合作社党建新模式取得了一定的成效,但是也存在合作社规模小、党员不多、影响不大等问题,离党建工作的目标和要求尚有不小的差距。大团镇党委将认真学习借鉴兄弟单位的成功经验,紧紧围绕农民创业、增收、致富的目标,乘势而上、探索创新,使合作社党建真正成为推动发展、服务农民、凝聚人心、促进和谐的有效力量。

第四篇:软件开发工程师C、C(2人)

软件开发工程师C、C++(2人)

岗位要求:

1.精通使用C/C++,熟悉MFC/ATL/STL/boost/openssl/ace/ice/log4c/qt等程序库。

2.精通使用lua程序扩展应用程序。

3.能够独立根据用户需求完成项目的全部设计,并领导团队最终实 现用户需求。

4.熟悉自动化单元测试的方法,并有实践经验。

5.熟悉不同平台间交叉编译的方法,并有实践经验。

6.了解Windows驱动编程方法,会调试驱动程序。

薪资福利

1.社保:北京户口,五险一金;非京籍户口,四险一金。

2.每年组织员工外出旅游1—2次,享有各种法定假日,工作满一年享有年假。

3.公司可以帮助解决员工住宿。

4.应届硕士研究生公司帮助解决北京户口,非应届硕士研究生公司可以提供人才引进机会帮助解决北京户口。

5.优秀员工年终发放优秀员工奖金,并有机会获得加薪机会。

软件开发工程师JAVA(2人)

任职要求:

学历要求:本科以上;

所学专业要求:计算机及相关专业;

工作年限:应届生;

希望到岗时间:随时。

职责描述:

JAVA高级软件工程师

1.精通Java、Javascript、xml、html等语言,精通J2EE等开发工具(Eclipse或JBuilder),熟悉Hibernate,Structs,WebWork开发框架;

2.熟悉J2EE技术体系(JSP、Servlet、EJB、JNDI、XML、SOAP、JMS等),熟悉Java的一些开源项目,熟悉主流的应用服务器和开发工具;

3.熟悉面向对象分析和设计,了解基本的设计模式及其应用,能够基于UML完成

系统的模块设计;

4.熟悉基于Web和数据库(SQL Server、MYSQL、Oracle等)的应用程序开发,具有较强的设计能力,能够独立完成应用模块的设计和开发;

5.工作责任心强,团队合作性好,善于交流,善于学习和应用新技术,心态平和;

6.具有较强的自学能力和独立思考能力,对软件开发有着浓厚的兴趣。

7.有全文检索及网络蜘蛛开发经验者优先。

第五篇:c语言系统开发设计实习报告

信息管理与系统开发设计综合模拟实习

一、实习目的

通过模拟实习,主要要达到两个目的,一是检验和巩固专业知识、二是提高综合素质和能力。信管07级学生的模拟实习主要是复杂程序和简单软件的实现。通过该模拟实习,可以将学生课堂上掌握的理论知识与处理数据的业务相结合,以检验我们同学们掌握知识的宽度、深度及对知识的综合运用能力。

二、实习环境

计算机硬件配置:cpu 内存 硬盘操作系统:windows xp 开发环境:visual c++ 6.0

三、实习内容

内容一:运动会分数统计

任务:参加运动会有n个学校,学校编号为1„„n。比赛分成m个男子项目,和w个女子项目。项目编号为男子1„„m,女子m+1„„m+w。不同的项目取前五名或前三名积分;取前五名的积分分别为:

7、

5、

3、

2、1,前三名的积分分别为:

5、

3、2;哪些取前五名或前三名由学生自己设定。(m<=20,n<=20)

功能要求:

(1)可以输入各个项目的前三名或前五名的成绩; (2)能统计各学校总分;

(3)可以按学校编号、学校总分、男女团体总分排序输出;

(4)可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。

规定:输入数据形式和范围:20以内的整数(如果做得更好可以输入学校的名称,运动项目的名称)

输出形式:有中文提示,各学校分数为整形

1 界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。

存储结构:学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。(数据文件的数据读写方法等相关内容在c语言程序设计的书上,请自学解决)请在最后的上交资料中指明你用到的存储结构; 测试数据:要求使用

1、全部合法数据;

2、整体非法数据;

3、局部非法数据。进行程序测试,以保证程序的稳定。测试数据及测试结果请在上交的资料中写明;

内容二:纸牌游戏

任务:编号为1-52张牌,正面向上,从第2张开始,以2为基数,是2的倍数的牌翻一次,直到最后一张牌;然后,从第3张开始,以3为基数,是3的倍数的牌翻一次,直到最后一张牌;然后„从第4张开始,以4为基数,是4的倍数的牌翻一次, 直到最后一张牌;...再依次5的倍数的牌翻一次,6的,7的 直到 以52为基数的 翻过,输出:这时正面向上的牌有哪些?

内容三:设计学生成绩管理系统。该系统中存储学生的学号、姓名、性别、年龄、课程成绩等信息。

要求:(1)浏览学生信息

(2)添加学生信息 (3)删除学生信息 (4)查找学生信息 (5)修改学生信息 (6)对成绩的处理

①求出每个学生各门课程的总成绩、平均成绩、最高分和最低分。 ②求出某一门课程所有学生总成绩、平均成绩、最高分和最低分。 (7)按照学生某门课程的成绩对学生排序

四、算法分析、设计与描述

1.算法分析和设计 内容一:

运动会分数统计是对运动会信息的基本管理与统计,它包括:运动会信息的输入、运动会总体成绩的查询、指定学校成绩的查询、以及各种要求的排列。

使用模块化编程的方法每项功能有一个函数来完成,对应如下: 按学校编号排序void bianhao( )

按学校总分排序void zongfen( ) 按学校男总分排序void malezf( )

按学校女总分排序void femalezf( ) 查询某个学校成绩void cxsch( )

查询某个项目成绩void cxxm( ) 为了把数据封装起来更方便使用,创建了表示项目结构体的struct item和表示学校的结构体struct school。

struct item { char name[15]; int snum[5]; int s; }p[21];

struct school { int num; char name[15]; int score; int mscore; int wscore; }sch[21];

内容二:

此题算法比较简单,按题目要求相当于从第一张牌算起,若这张牌是二的倍数,则翻面,是三的倍数则再翻一次,是四的倍数则再翻一次,循环直到52为止,则此张牌结算完成。翻完第一张牌后,再继续算第二张牌,直到52张牌都结算完成。

3 内容三:

学生信息管理系统是对学生信息的基本管理,它包括:浏览学生信息、添加学生信息、删除学生信息、查找学生信息、修改学生信息、对成绩的处理、按照学生某门课程的成绩对学生排序

使用模块化编程的方法每项功能有一个函数来完成,对应如下:

(1)浏览学生信息以及读取数据 void print(ID *head) (2)添加学生信息以及对成绩的处理ID *insert(ID *head) (3)删除学生信息 ID *delet(ID *head) (4)查找学生信息ID *search(ID *head) (5)修改信息 ID *amend(ID *head) (6)按照学生某门课程的成绩对学生排序ID *sort(ID *head) (7)存储数据以及退出系统ID *breaksys(ID *head) 为了把数据封装起来更方便使用,创建了表示学生信息的结构体struct id struct id { char name[20]; int num; int a; int b; int c; double ave; ID *next; };

2.算法描述 内容一:

开始输入数据选择操作按学校编号排序按学校总分排序按学校男总分排序按学校女总分排序查询某学校成绩查询某个项目成绩退出结束 图4.1 计分系统总体模块流程图

开始N输入学校的个数nYn>=1&&n<=20输入学校的名称输入男子项目数m和女子项目数wYN输入项目的名称m<=20&&m>=1&&w<=20&&w>=1输入项目选取的名次sN输入项目的前s名的学校编号x>=1&&x<=nY储存数据结束

图4.2 数据输入保存流程图

开始i=0isNsch[j];sch[j]=tch[j].numi++i=1i<=nY输出成绩i++N结束图4.3按编号排列流程图

开始i=1Ni<=52Yj=2j<=52Yi%j=0YNNa=-aj++a==1YN输出ii++结束图4.4 流程图

内容二:

内容三:

开始输入zZ=2Z=1Z=3Z=4Z=5Z=6Z=7Z=8浏览学生信息添加学生信息删除学生信息查找学生信息修改学生信息对成绩的处理按照学生某门课程的成绩对学生排序退出结束 图4.5总体模块流程图

开始输入删除的学号p1=headnum!=p1->num && p1!=NULLNYp2=p1p1=p1->nextYhead==NULLN输出没有记录结束num==p1->numYp1==headNhead=p1->nextYp2->next=p1->nextpc--结束

图4.6 删除数据流程图

五、程序设计

1.程序设计的基本思路 内容一:

(1)主函数的程序设计

首先输入运动会成绩,进入菜单,然后选择操作(运用swith语句),调用各子函数,同时保存文件。最后选择退出程序。

(2)各子函数的程序设计 保存信息:

fp=fopen("运动会分数统计.txt","wb"); fprintf(fp,"编号 学校名称 总分 男子总分 女子总分 "); for(i=1;i<=n;i++) {

fprintf(fp," %d%10s%7d%7d%7d ",sch[i].num,sch[i].name,sch[i].score, sch[i].mscore,sch[i].wscore); } fclose(fp);

按学校编号排序

for(i=0;i

} for(j=i;j

if(sch[i].num>sch[j].num) { } t=sch[i];sch[i]=sch[j];sch[j]=t; 按学校总分排序

for(i=1;i

for(j=i;j<=n;j++)

if(sch[i].score

} t=sch[i]; sch[i]=sch[j]; sch[j]=t; 8 }

按学校男总分排序

school t; for(i=1;i

} for(j=i;j<=n;j++)

{ if(sch[i].mscore

for(i=1;i

} for(j=i;j<=n;j++)

if(sch[i].wscore

for(i=1;i<=n;i++) {

} if(sch[i].num==s) {

} printf(" %d%10s%7d%7d%7d ",sch[i].num,sch[i].name, sch[i].score,sch[i].mscore,sch[i].wscore); break; 查询某个项目成绩

for(i=1;i<=5;i++) printf(" %d%6d%10s ",i,p[s].snum[i],sch[ p[s].snum[i] ].name); printf(" ");

9 内容二:

主要算法是两次for循环

for(i=1;i<=52;i++) {

} a=1; for(j=2;j<=52;j++) {

} if(a==1) printf("%d ",i); if(i%j==0) a=-a;

内容三:

(1)主函数的程序设计

首先,进入菜单,然后选择操作(运用swith语句),调用各子函数,调用完后自动返回主菜单。在退出程序时自动保存文件。

(2)各子函数的程序设计 显示信息:

fp=fopen("学生成绩管理.txt","a+"); printf("显示结果是: "); printf("学号 姓名 性别 年龄 语文 数学 英语 总成绩 平均成绩 最高分 最低分 "); while(p!=NULL) { &p->min); } fclose(fp); if(head!=NULL) {

fscanf(fp,"%3d%5s%5s%5d%5d%5d%5d%5d%5d%5d%5d ",&p->num, &p->name,&p->sex, &p->age,&p->a,&p->b,&p->c,&p->sum,&p->ave,&p->max, p++; do {

}

10 printf("%3d%5s%5s%5d%5d%5d%5d%6d%9.2f%7d%7d ",p->num, p=p->next; p->name,p->sex, p->age,p->a,p->b,p->c,p->sum,p->ave,p->max,p->min); } while(p!=NULL); printf("总体成绩: "); printf("语文的总成绩是%4d 平均成绩是%5.2f 最高分是%3d 最低分是%3d ",asum,aave,amax,amin); printf("数学的总成绩是%4d 平均成绩是%5.2f 最高分是%3d 最低分是%3d ",bsum,bave,bmax,bmin); printf("英语的总成绩是%4d 平均成绩是%5.2f 最高分是%3d 最低分是%3d ",csum,cave,cmax,cmin);

添加记录

printf("插入操作开始!!! "); temp=(ID *)malloc(sizeof(ID)); printf("请输入学生的学号: ");scanf("%d",&temp->num); printf("请输入学生的姓名: ");scanf("%s",&temp->name); printf("请输入学生的性别: ");scanf("%s",&temp->sex); printf("请输入学生的年龄: ");scanf("%d",&temp->age); printf("请输入学生的语文成绩: ");scanf("%d",&temp->a); printf("请输入学生的数学成绩: ");scanf("%d",&temp->b); printf("请输入学生的英语成绩: ");scanf("%d",&temp->c);

查找记录

查找记录中需要看记录中是否有与输入数据匹配的数据。有则输出数据,没有则提示没有找到数据。

while(str!=p1->num && p1!=NULL) {

} p2=p1; p1=p1->next; 保存记录

fp=fopen("学生成绩管理.txt","a+"); fprintf(fp,"学号 姓名 性别 年龄 语文 数学 英语 总成绩 平均成绩 最高分 最低分 "); while(p->next!=NULL) {

} fclose(fp);

11 fprintf(fp,"%3d%5s%5s%5d%5d%5d%5d%5d%5d%5d%5d ", p++; p->num,p->name,p->sex, p->age,p->a,p->b,p->c,p->sum,p->ave,p->max, p->min);

2.程序代码 内容一:

#include #include int n,m,w; FILE *fp; struct item { char name[15]; int snum[5]; int s; }p[21]; struct school { int num; char name[15]; int score; int mscore; int wscore; }sch[21]; int integral1[5]={7,5,3,2,1};//前五名得分 int integral2[3]={5,3,2};//前三名得分 void input() { int i,j=0,y,x; printf("请输入学校个数:"); while(1) {

} for(i=1;i<=n;i++) {

scanf("%d",&n); if(n>=1&&n<=20)y=1; if(y)break; else printf("输入错误,请重新输入: "); printf("请输入第%d个学校的名称:",i); scanf("%s",&sch[i].name); sch[i].score=0; sch[i].wscore=0; sch[i].mscore=0; sch[i].num=i;

12 } printf("请输入男子项目数和女子项目数: "); y=0; while(1) {

} for(i=1;i<=m+w;i++) {

scanf("%d%d",&m,&w); if(m<=20&&m>=1&&w<=20&&w>=1)y=1; if(y)break; else printf("输入错误,请重新输入: "); printf("请输入第%d个项目的名称:",i); scanf("%s",& p[i].name); while(1) {

} printf("请输入第%d个项目的前%d名的学校编号: ",i,p[i].s); if(p[i].s==5) {

} else { for(j=1;j<=5&&j<=n;j++)

13 printf("请输入第%d个项目选取的名次:",i); scanf("%d",& p[i].s); if(p[i].s==3||p[i].s==5)break; else printf("输入错误,请重新输入: "); for(j=1;j<=5&&j<=n;j++) {

} y=0; while(1) {

} p[i].snum[j]=x; sch[x].score+=integral1[j-1]; if(i<=m)sch[x].mscore+=integral1[j-1]; else sch[x].wscore+=integral1[j-1];

scanf("%d",&x); if(x>=1&&x<=n)y=1; if(y)break;

else printf("输入错误,请重新输入: ");

}

} {

} y=0; while(1) {

} p[i].snum[j]=x; sch[x].score+=integral2[j-1]; if(i<=m)sch[x].mscore+=integral2[j-1]; else sch[x].wscore+=integral2[j-1];

scanf("%d",&x); if(x>=1&&x<=n)y=1; if(y)break;

else printf("输入错误,请重新输入: "); fp=fopen("运动会分数统计.txt","wb"); fprintf(fp,"编号 学校名称 总分 男子总分 女子总分 "); for(i=1;i<=n;i++) {

fprintf(fp," %d%10s%7d%7d%7d ",sch[i].num,sch[i].name,sch[i].score, sch[i].mscore,sch[i].wscore); } fclose(fp); } void bianhao() //按编号排序 { int i,j; school t; for(i=0;i

} printf(" 按编号排列: "); printf("编号 学校名称 总分 男子总分 女子总分 "); for(i=1;i<=n;i++)

printf(" %d%10s%7d%7d%7d ",sch[i].num,sch[i].name,sch[i].score, sch[i].mscore,sch[i].wscore);

14 for(j=i;j

if(sch[i].num>sch[j].num) { } t=sch[i];sch[i]=sch[j];sch[j]=t; } void zongfen() //按学校总分排序 { int i,j; school t; for(i=1;i

} printf(" 按学校总分排列: "); printf("编号 学校名称 总分 男子总分 女子总分 "); for(i=1;i<=n;i++)

printf(" %d%10s%7d%7d%7d ",sch[i].num,sch[i].name,sch[i].score, sch[i].mscore,sch[i].wscore); }

void malezf() //按学校男总分排序 { int i,j; school t; for(i=1;i

} printf(" 按学校男子总分排列: "); printf("编号 学校名称 总分 男子总分 女子总分 "); for(i=1;i<=n;i++)

printf(" %d%10s%7d%7d%7d ",sch[i].num,sch[i].name,sch[i].score, sch[i].mscore,sch[i].wscore); } void femalezf() //按学校女总分排序 {

15 for(j=i;j<=n;j++)

if(sch[i].score

} t=sch[i]; sch[i]=sch[j]; sch[j]=t; for(j=i;j<=n;j++)

if(sch[i].mscore

} printf(" 按学校女子总分排列: "); printf("编号 学校名称 总分 男子总分 女子总分 "); for(i=1;i<=n;i++)

printf(" %d%10s%7d%7d%7d ",sch[i].num,sch[i].name,sch[i].score, sch[i].mscore,sch[i].wscore); printf(" "); } void cxsch() //查询某个学校成绩 { int i,y,s; printf("输入需要查询的学校编号:"); y=0; while(1) {

} printf("该学校相关信息: "); printf("编号 学校名称 总分 男子总分 女子总分 "); for(i=1;i<=n;i++) {

} printf(" "); }

16 for(j=i;j<=n;j++)

if(sch[i].wscore=1&&s<=n)y=1; if(y)break; else printf("输入数据有误,请重新输入:"); if(sch[i].num==s) {

} printf(" %d%10s%7d%7d%7d ",sch[i].num,sch[i].name, sch[i].score,sch[i].mscore,sch[i].wscore); break;

void cxxm() //查询某个项目成绩 { int i,y,s; printf("输入需要查询的项目编号:"); y=0; while(1) {

} printf("%s前5名学校编号及名称为 ",p[s].name); printf("名次 编号 学校名称 "); for(i=1;i<=5;i++)

}

void main() { input(); int z; while(1) {

scanf("%d",&s); if(s>=1&&s<=n)y=1; if(y)break; else printf("输入数据有误,请重新输入:"); printf(" %d%6d%10s ",i,p[s].snum[i],sch[ p[s].snum[i] ].name); printf(" "); printf(" 请选择: "); printf("1.按学校编号排序 "); printf("2.按学校总分排序 "); printf("3.按学校男总分排序 "); printf("4.按学校女总分排序 "); printf("5.查询某个学校成绩 "); printf("6.查询某个项目成绩 "); printf("7.退出 "); scanf("%d",&z); switch(z) { case 1: bianhao(); break; case 2:zongfen(); break; case 3:malezf(); break; case 4:femalezf(); break; case 5:cxsch(); break; case 6:cxxm(); break;

case 7: exit(0); break; default :printf("输入错误,请重新输入! ");

} } }

内容二:

#include void main() { int i,j,a; printf("正面向上的牌有: "); for(i=1;i<=52;i++) {

a=1;

for(j=2;j<=52;j++)

{

if(i%j==0)

a=-a;

}

if(a==1)

{

printf("%d ",i);

} } }

内容三:

#include #include #include #include #define ID struct id struct id { char name[20]; int num; char sex[2]; int age; int a; int b; int c; int sum;

18 double ave; int min; int max; ID *next; }stu[100]; int pc=1; FILE *fp; int asum=0,bsum=0,csum=0; int amax=0,bmax=0,cmax=0; int amin=100,bmin=100,cmin=100; float aave,bave,cave;

void print(ID *head)//显示记录 { ID *p; p=head; int temp; printf("显示结果是: "); printf("学号 姓名 性别 年龄 语文 数学 英语 总成绩 平均成绩 最高分 最低分 "); if(head!=NULL) {

} printf("总体成绩: "); printf("语文的总成绩是%4d 平均成绩是%5.2f 最高分是%3d 最低分是%3d ",asum,aave,amax,amin); printf("数学的总成绩是%4d 平均成绩是%5.2f 最高分是%3d 最低分是%3d ",bsum,bave,bmax,bmin); printf("英语的总成绩是%4d 平均成绩是%5.2f 最高分是%3d 最低分是%3d ",csum,cave,cmax,cmin); }

ID *insert(ID *head) //添加记录 { ID *sort(ID *head); ID *temp,*p1,*p2,*p;

19 do {

} while(p!=NULL); printf("%3d%5s%5s%5d%5d%5d%5d%6d%9.2f%7d%7d ",p->num, p=p->next; p->name,p->sex, p->age,p->a,p->b,p->c,p->sum,p->ave,p->max,p->min); int t; p=head; printf("插入操作开始!!! "); temp=(ID *)malloc(sizeof(ID)); printf("请输入学生的学号: ");scanf("%d",&temp->num); printf("请输入学生的姓名: ");scanf("%s",&temp->name); printf("请输入学生的性别: ");scanf("%s",&temp->sex); printf("请输入学生的年龄: ");scanf("%d",&temp->age); printf("请输入学生的语文成绩: ");scanf("%d",&temp->a); printf("请输入学生的数学成绩: ");scanf("%d",&temp->b); printf("请输入学生的英语成绩: ");scanf("%d",&temp->c); temp->sum=temp->a+temp->b+temp->c; temp->ave=(temp->sum)/3.0; temp->min=((temp->ab)?temp->a:temp->b)c?((temp->ab)?temp->a:temp->b):temp->c; temp->max=((temp->a>temp->b)?temp->a:temp->b)>temp->c?((temp->a>temp->b)?temp->a:temp->b):temp->c;

if (head==NULL) {

} else {

head=temp; temp->next=NULL; p1=head; p2=p1; p1=p1->next; p2->next=temp; temp->next=p1; p=head; do {

asum=asum+p->a; bsum=bsum+p->b; csum=csum+p->c; if(amin > p->a) {

} if(amax < p->a) {

20 t=amin; amin=p->a;

}

} t=amax; amax=p->a; if(bmin > p->b) {

} if(bmax < p->b) {

} if(cmin > p->c) {

} if(cmax < p->c) {

} p=p->next; t=cmax; cmax=p->c; t=cmin; cmin=p->c; t=bmax; bmax=p->b; t=bmin; bmin=p->b; while(p!=NULL); aave=float(asum/pc); bave=float(bsum/pc); cave=float(csum/pc); } printf("添加成功!!"); pc++; return (head); }

ID *search(ID *head) //查找记录 { ID *p1,*p2; int str; printf("请输入要查找的学生的学号:"); scanf("%d",&str); p1=head; while(str!=p1->num && p1!=NULL)

21 {

} if(str==p1->num) {

} else

}

ID *sort(ID *head)//排序 { int temp; char str[100]; double dbl; ID *p1,*p2; for(p1=head;p1!=NULL;p1=p1->next) {

p2=p1; p1=p1->next; printf("学生的学号:%d ",p1->num); printf("学生的姓名:%s ",p1->name); printf("学生的性别:%s ",p1->sex); printf("学生的年龄:%d ",p1->age); printf("学生的语文成绩:%d ",p1->a); printf("学生的数学成绩:%d ",p1->b); printf("学生的外语成绩:%d ",p1->c); printf("学生的总成绩:%d ",p1->sum); printf("学生的平均成绩:%.2lf ",p1->ave); printf("学生的最高分:%d ",p1->max); printf("学生的最低分:%d ",p1->min); printf("没有找到记录"); return head; for(p2=p1->next;p2!=NULL;p2=p2->next) {

if(p1->aveave) {

temp=p1->num; p1->num=p2->num; p2->num=temp; strcpy(str,p1->name); strcpy(p1->name,p2->name); strcpy(p2->name,str); temp=p1->a; p1->a=p2->a;

22

}

}

} p2->a=temp; temp=p1->b; p1->b=p2->b; p2->b=temp; temp=p1->c; p1->c=p2->c; p2->c=temp; dbl=p1->ave; p1->ave=p2->ave; p2->ave=dbl; printf("排序成功!!! "); return (head); }

ID *delet(ID *head) //删除记录 { ID *p1,*p2; int num; printf("请输入要删除的学生的学号:"); scanf("%d",&num); p1=head; if (head==NULL) {

} while(num!=p1->num && p1!=NULL) {

} if(num==p1->num) {

}

23 printf("没有记录 "); goto end; p2=p1; p1=p1->next; if (p1==head) head=p1->next; p2->next=p1->next; else printf("删除成功!!! "); pc--; else

}

ID *amend(ID *head)//修改信息 { ID *p; p=head; int findmess; if(!head) {

} printf("请你输入要修改的学生学号:"); scanf("%d",&findmess); while(findmess!=p->num) {

} if(p) {

printf("请你输入新学号(原来是%d):",p->num); scanf("%d",&p->num); printf("请你输入新姓名(原来是%s):",p->name); scanf("%s",&p->name); getchar(); printf("请你输入新性别(原来是%s):",p->sex); scanf("%s",&p->sex); printf("请你输入新年龄(原来是%d):",p->age); scanf("%d",&p->age); printf("请你输入新的语文成绩(原来是%d分):",p->a); scanf("%d",&p->a); getchar(); printf("请你输入新的数学成绩(原来是%d分):",p->b); scanf("%d",&p->b); getchar(); printf("请你输入新的英语成绩(原来是%d分):",p->c); scanf("%d",&p->c); p->sum=(p->a+p->b+p->c); p->ave=p->sum/3.0; p++; printf(" =====>提示:没有资料可以修改! "); exit(0); printf("没有这个记录"); end:return head; p->min=((p->ab)?p->a:p->b)c?((p->ab)?p->a:p->b):p->c;

24 p->max=((p->a>p->b)?p->a:p->b)>p->c?((p->a>p->b)?p->a:p->b):p->c;

} else {

} }

ID *breaksys(ID *head) { ID *p; p=head; fp=fopen("学生成绩管理.txt","a+"); fprintf(fp,"学号 姓名 性别 年龄 语文 数学 英语 总成绩 平均成绩 最高分 最低分 "); while(p->next!=NULL) {

} fclose(fp); return(head); } void main() { ID *head=NULL; int choise; printf(" * * * * * 信息管理与系统开发设计综合模拟实习 * * * * * "); printf(" "); while(1) {

printf(" 提示:资料修改成功! "); return (head); printf("没有这个学号!"); fprintf(fp,"%3d%5s%5s%5d%5d%5d%5d%5d%5d%5d%5d ",p->num, p++; p->name,p->sex, p->age,p->a,p->b,p->c,p->sum,p->ave,p->max,p->min); printf(" 学生信息管理系统 "); printf(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "); printf(" 1 . 浏 览 学 生 信 息 "); printf(" 2 . 添 加 学 生 信 息 "); printf(" 3 . 删 除 学 生 信 息 "); printf(" 4 . 查 找 学 生 信 息 "); printf(" 5 . 修 改 学 生 信 息 "); printf(" 6 . 学 生 成 绩 排 序 "); printf(" 0 . 退 出 系 统 ");

25

} } printf(" "); printf(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "); printf("请选择(0-6):"); scanf("%d",&choise); switch(choise) { case 1: print(head); break; case 2: head=insert(head); break; case 3: head=delet(head); break; case 4: head=search(head); break; case 5: head=amend(head);break; case 6: head=sort(head); break; case 0: breaksys(head);exit(0); break; default :printf("输入错误,请重新输入! "); }

六、程序运行、调试和结果分析

1.程序运行中出现的问题及调试手段

在调试过程中出现了比较多的错误,也耗费了大量的时间和精力修改。 在运行程序一是出现了图6.1问题。经过检查发现问题出现在代码printf("%d%s%d%d%d",sch[i].num,sch[i].name,sch[i].score,sch[i].male,sch[i]. female)上,并且是sch[i].name出现了问题。由此发现了在结构体中name定义为string name,改为char name[15]后,程序可以正常运行。

26

图6.1 应用程序错误

在运行程序三时,储存的文件中出现乱码,经过检查发现储存的数据的格式不对导致出现乱码。修改以后,这个问题就解决了。

2.程序运行结果分析 内容一 (1)输入数据

27

图6.2输入数据

(2)选择操作

28

图6.3主界面

图6.4 按编号排列

29

图6.5 按学校总分排列

图6.6按学校男子总分排列

30

图6.6按学校查询

图6.7按项目查询

31

储存文件中的数据如下

图6.8 存储的数据

内容二

图6.9 运行结果

内容三

(1)程序主界面

图6.10 程序主界面

32

(2)选择操作

图6.11 添加学生信息

图6.12 浏览学生信息

图6.13 删除学生信息

图6.14 删除3号信息后的结果

33

图6.15 查找学生信息

图6.16 删除学生信息

图6.17 学生排序

图6.18排序后的学生信息

图6.19退出系统

34

七、实习总结

通过这次模拟实习,我的C语言编程的能力有了很大的提高,特别是在指针、数组、函数和结构体方面,还学习了课本没有讲到的知识,学会了使用模块化编程的简单方法,另外在对话框的编程要求美观、方面也有了体会。

指针是C语言的灵魂,它在本次实习也起到了非常大的作用,本次实习在使用指针过程中对指针进行了简化也是一个“亮点”,它使程序变得通俗易懂,也降低了程序的难度。以后要对这种方法进行深刻的体会。

数组在程序中有着很重要的作用,对数据的贮存、输入、读取起着很重要的作用,本程序几乎所有数据都以数组进行输入、贮存、读取方便了对数据的处理和输入,数组的的使用在本程序中有很大的好处。

函数是实现模块化编程的基础,它使程序变得方面易懂,对修改起了很大作用,也降低了编程的难度,一个函数就是一个功能,它使各个功能之间有了一定的独立性,一个函数的错误,不会导致整个程序的失败(主函数除外),对函数的良好应用时在本程序中又以深刻的体会。也有了很大提高。

结构体的使用,为本次实习提供了很大方便,同时提高了本程序的可读性,结构数组方便了对数据的管理。

文件的读取与存贮使数据可以保存下来,这也是在以前的学习过程中没有掌握的内容,在开始时遇到了不小的困难。

另外,感觉到自己能编写的程序都非常的简短,系统性也不强。我还需要在编程方面进一步提高。

从这次编程序的过程中,我学到了编程所必须具备的专业技能,更领会编译程序所需要的细心和耐心。同时也提高了自己对编程的兴趣,使自己对编程有了更深的理解,体会到编程的乐趣。

35

上一篇:社区经济工作总结下一篇:庆七一诗歌精选

本站热搜