北京总部

0起点学IT,中软卓越十大IT课程全揭秘丨精彩即将来袭

0起点学IT,中软卓越十大IT课程全揭秘丨精彩即将来袭

2017-06-14

从0开始学IT,真的可以吗? 答案在这里!   备受小伙伴们期待和瞩目的 “0起点学IT,中软国际卓越培训中心十大IT课程全揭秘·官方首发” 精彩即将来袭!          没抢上沙发的同学,赶紧搬个小板凳!         看!第一波预热互动已经开始了:   小卓详解:        学习的时候最担心的是有问题找不着人问,中软卓越给你开小灶!我们的技术老师全天候一对一辅导,有问题可以随时问,能最快获得进步;还有大量的在线视频,课前可以提前预习,带着问题来听课,课后可以及时查缺补漏,扎实高效!   小卓详解:        在中软卓越,日常天天练,阶段集中练,结业冲刺练!   1、日常天天练:边讲边练,每个知识点都有实践练习。 2、阶段集中练:每个阶段结束后,都将有1-2周的项目实践。 3、结业冲刺练:结业前模拟实际项目,进行3-4周项目开发。     小卓详解:        经过在中软卓越4个月的学习,相当于积累了1年的工作经验,找工作的时候,你就不再是刚出校门的白纸一张了。同时,中软卓越有专业的就业服务团队,为你进行丰富的就业指导。然后,通过中软卓越举办的专场招聘会推荐给各大企业,还有什么好担心的?   首期IT课程预告: 0起点学Java,攀登编程语言常青树  12月15日中软卓越官方微信首发(ID:zrzyit2015) 敬 请 期 待 !

更多>
2017年潮流字体排版趋势,让你的作品更时尚!

2017年潮流字体排版趋势,让你的作品更时尚!

2017-06-12

技术和设计趋势一样,随着时间的推移总在不停地变化。对于网页设计师和前端而言,字体和排版所涉及到的技术和设计尤其是如此。不过纵观这几年,网页字体和排版在大方向上并没有明显变化,结合当前主流产品和设计,并不难确定2017年内,我们需要关注的这些字体和排版趋势。 定制:品牌化的字体 Bookerly, San Francisco, Product Sans 这些带着明显品牌烙印的英文字体,想必设计师们并不陌生,而新晋中文字体苹方,和最近火爆无比的思源系列新字体,思源宋体,无一例外,都在向我们传递一个明确的信息:品牌化字体的大时代来临了。 Bookerly 字体是亚马逊官方联合 Dalton Magg 为Kindle 系列产品所专门定制的字体。设计巨头苹果就更不必说,San Francisco 为苹果产品专用英文字体,覆盖了macOS、iOS、watchOS 和 tvOS 四个核心平台,官方还未中文用户专门定制了苹方字体,从文字层面上彻底完成了品牌化。当然,定制化的字体不仅仅是大企业的专利,在前不久美国总统竞选中落选的希拉里克林顿,还有专门的字体用来对抗大选期间流行的川普专用手写字体…… 通过 Prototypo 和 FontArk 这样的工具,自定义英文字体绝对是一件便捷又快速的事情。自定义字体和创意字体本质上是一致的:它们都旨在强化品牌的识别度。 响应:完美适配所有设备 如今每天都有新的产品,新的数字设备诞生,我们对于可以适应各种屏幕显示的字体,依然有着极大的需求。在桌面端上显示的超大字体能够带来视觉冲击力和戏剧性的效果,但是直接沿用到移动端,可能效果并不理想,会让信息的流动性变差,无法流畅地浏览。而这也是响应式设计所要解决的主要问题,字体应该能够根据各种不同的设备的使用场景进行适配。在响应式排版当中,字体尺寸、间距和整个布局都会遵循一整套排版规则,进行自适应。 虽然目前设计师们依然在不断遭遇新的问题,但是响应式排版的整体方案已经比较成熟。 对比:超大和超小尺寸的字体 正如同之前所说的,超大和超小的字体本身就能带来戏剧化的体验,通过尺寸上的对比,来营造独特的视觉奇观,影响访客的主观体验。超大字体毫无疑问是引人瞩目的,它能够将信息视觉化的呈现出来。 另一方面,超小的字体在多用在极简主义的网页上,它常常同首图搭配在一起,和超大字体不同的是,超小的文本内容常常是用来凸显图片内容的,它通过对比将视觉焦点转移到图片上,所发挥的作用和负空间有异曲同工之妙。 超大和超小的字体,本身能发挥作用主要是因为它们所带来的视觉落差,尺寸适中的文本相反没有这样的效果。当然,具体如何使用取决于你的品牌定位,以及你所要用的页面和场合。 性格:增加个性化的色彩 最深刻的艺术,要么是传达思想,要么发人深省。在字体和排版当中,最艺术化的,应该是使用独特而创新的字体来进行品牌设计与传达。实际上,今年我们已经看到越来越多的个性化字体设计用来强化品牌的设计案例了。而最值得关注也是最流行的,大概是水彩和渐变的色彩为字体注入性格的设计手法了。 手写字体也是一个明显的趋势,它们给品牌所赋予的个性更为明显和突出。不过,值得注意的是,有的字体确实是手写或者手绘的,而有的字体只是模拟这种笔触。 复古字体则是另外一个流行趋势,正如同我们常说的,复古一直在流行。复古的字体常常能够给人以精致和品质感。 可变:排版的未来 微软、谷歌、苹果和Adobe 在2016年9月联合发布了 OpenType 可变字体项目,这一项目让字体能够更好地适配响应式排版布局,让单个字体文件能够容纳更多不同样式的字体和布局,OpenType 字体文件规范让设计师能够将不同高度、不同字重、不同间距的不同类型的字体,有机的整合到一个字体文件中,并且灵活地运用到排版中去。 几何:令人着迷的图形 我们的生活中充满了各式各样的几何图形,几何图形本身也是字体设计的灵感来源之一。纤细的线条,棱角分明的形状,或者是圆润的边角,充满几何元素质感的设计让字体显得优雅而流畅,充满现代感。 在过去的一年当中,越来越多的字体设计中开始出现几何元素,不少企业和机构将几何字体和元素引入自家品牌,用以强化品牌所传达的信任感。 叠加:图片和文本的结合 图片和文本是网页设计中最常见的两个元素,两者常常相互配合,呈现信息。图文混排的设计由来已久,但是近几年来,设计师们尤其喜欢图片和文本相互叠加的设计,为了确保文本而和图片的呈现效果,两者要保持较好的对比度,文本不能影响图片的焦点,而图片也最好不要影响文本的识别。图片和文本两者的结合让内容拥有了层次,两者的结合应该是信息的强化,实际效果不应该混淆用户的视听。 混搭:不同字体的组合 一般而言,衬线体和衬线体的组合能够让排版看起来更加一致,但是衬线体、非衬线体甚至手写字体的有机组合,有的时候同样能创造一定的协调感。这种视觉设计的趋势非常的明显,字体的组合搭配结合具有现代风格的纹理/图案,常常能让整个设计更加摩登和丰满。 结语 网页设计中,图片的使用总是不可避免,但是字体和排版用好了常常能够化腐朽为神奇。这些设计趋势已经悄然出现在设计圈的各个角落,但是发觉和了解终究还是有差别的,了解它们,运用它们,才能让趋势掌握在自己手中。 来源:聊设计(ID:liaosheji2010);作者:liaosheji2010,小卓在此感谢原作者!

更多>
软件开发入门:如何在网页中解决设计师留给你的字体问题?

软件开发入门:如何在网页中解决设计师留给你的字体问题?

2017-03-28

       在一些推广活动项目的页面中,设计师可能会需要用到许多好看的字体,例如:方正综艺.ttf、方正兰亭、 方正喵呜.ttf等(此处省略N个字体)。        当设计师使用这些特殊字体的时候,前端攻城狮同学们往往因为这些字体“太有个性”而烦恼。今天小卓为大家分享一些经验,实用又经典,希望能对童鞋们的工作有所帮助! 方法一:切图法 方法二:Font-spider介绍及使用 Font-spider自动化构建工具gulp介绍及使用 步入正题: 应对设计师的"字体”难题,有两种解决方式可供同学们挑选,方式一是我们熟知常用的切图法,方法二是今日文章重点介绍的Font-spider。 方法一:切图法 大多数的活动页面采用的方式是将字体储存为单个的小图片,这种方式简单粗暴。 有关切图方式的优缺点,想必大家都与小卓有相同的感受。切图方式简单易用,效果与设计图完全一致。然而,它也有很多缺点,例如:如果只有几张图片的话,切图方式简单而且效率较高,但如果有几十张几百张的图片拿来运用的话...不论是切图或者后期的修改都是噩梦。 方法二:Font-spider 什么是Font-spider: 字蛛通过分析本地 CSS 与 HTML 文件获取 WebFont 中没有使用的字符,并将这些字符数据从字体中删除以实现压缩,同时生成跨浏览器使用的格式。 中文字体动辄10M+的大小,使我们无法直接引用字体文件。通俗地讲,font-spider,就是将HTML里使用到的文字,单独打包成一个新的字体文件。那么,究竟该如何具体操作呢?且看以下讲解。 如何使用Font-spider 第一步:安装font-spider 使用Node.js安装font-spider: npm install font-spider -g (注:Node.js下载地址:https://nodejs.org/en/) 第二步:在项目中使用webfond 项目目录: 在HTML里引入font.css 声明一个新的字体,我们把它命名为”FZ”。 第三部:运行运行 font-spider 命令: font-spider demo.html 我们可以发现页面依赖的字体将会自动压缩好,将1986KB的字体文件压缩成几KB的新字体,而且会根据不同浏览器的兼容性打包成不同类型的文件。 原字体会也会备份,我们看一下生成后的目录结构: 压缩后出现4个字体文件,我们在CSS中已经引入。而我们的原文件会备份到.font-spider这个目录下。 执行后的效果: 如何使用自动化构建工具gulp实时自动编译? 在真实的开发中,我们肯定不想每次保存代码后都去命令行输入font-spider命令去编译,这个时候就需要依靠自动化构建工具去做实时编译。 这里我们推荐使用gulp(因为上手很简单)。   第一步:安装gulp 没有安装过gulp的同学,使用NPM在全局下安装Gulp。 npm install --global gulp   在项目根目录下,将gulp、gulp-font-spider、gulp-watch作为项目开发依赖(devDependencies)安装: npm install gulp gulp-font-spider --save-dev (注①:gulp-font-spider是font-spider基于gulp的插件) (注②:gulp-watch可以监听文件的保存)   第二步:配置gulp 在项目根目录下创建gulpfile.js文件。 1.引入gulp、gulp-font-spider、gulp-watch这三个项目开发依赖。 2.配置gulp-font-spider、和gulp-watch监听demo.html从而自动执行font-spider。 此时的项目目录结构: 第三步:执行gulp命令 此时我们将H1标签的内容改为“我在正在使用Gulp!”并保存。 返回命令行工具,我们会发现gulp已经帮我们自动执行了font-spider。 看一下效果: 更多精彩内容请进入技术知识库!

更多>
CSS开发:5分钟快速上手Compass

CSS开发:5分钟快速上手Compass

2017-03-14

 Sass是一种"CSS预处理器",可以让CSS的开发变得简单和可维护。但是,只有搭配Compass,它才能显出真正的威力,学会了Compass,你的CSS开发效率会上一个台阶。 Compass与CSS的关系类似于JQuery与Java,封装了一系列有用的模块和模板,补充Sass的功能。 01 安装 Compass是用Ruby语言开发的,所以安装它之前,必须安装Ruby。  Ruby安装地址:http://www.ruby-lang.org/en/downloads/ 命令行模式(windows去掉sodu)  sudo gem install compass  Compass是基于Sass的,所以Ruby会自动帮我们安装好Sass。 如果gem安装失败,可以手动下载。  下载地址:https://rubygems.org/gems/compass 命令行模式(windows去掉sodu)  Sudo gem install --local compass.gem 02 项目初始化&编译 创建compass项目(命令行模式)  compass create myproject  cd myproject Compass编译命令  compass compile Compass自动编译命令  compass watch 03 Compass模块 Compass内置五个模块,分别为reset、 css3、 layout、 typography、 utilities。 reset模块 重置浏览器默认样式  @import "compass/reset"; css3模块 提供19种CSS3命令,为css3属性添加不同浏览器兼容性前缀  以transition属性为例transition: all .5s; @import "compass/css3"; @include transition(all,.5s); 编译结果为: -moz-transition: all, 0.5s; -o-transition: all, 0.5s; -webkit-transition: all, 0.5s; transition: all, 0.5s; layout模块 提供布局功能  以sticky-footer()为例,指定的元素始终会出现在浏览器最低端 @import "compass/layout"; @include sticky-footer(54px); Typography 模块 提供版式功能 以链接为例,使用link-colors()为不同状态下设置不同的color @import "compass/typography"; @include link-colors(#00c, #0cc, #c0c, #ccc, #cc0); utilities模块 该模块提供某些不属于其他模块的功能。 例如做一个清除浮动的class  import "compass/utilities/"; .clearfix { @include clearfix; } 除了这5个模块,Compass还提供了一系列好用的函数。 例如如image-width()和image-height()返回图片的宽和高。 $pic_path: "../images/pic.jpg"; #pic{ background: url($pic_path); width: image-width($pic_path); height: image-height($pic_path); } 返回结果如下: #pic { background: url("../images/pic.jpg"); width: 590px; height: 100px; } 这么做,以后就省去引入图片时,还要查看图片大小的问题了。 赶快试试Compass,去感受它真正的威力吧! 这是最好的时代,这是最坏的时代 It was the best of times, it was the worst of times 每一个时代,都会成全一部分人 你的选择决定你的时代 抓住互联网的巨大机遇,成就自我别再犹豫! 中软卓越以人才供应链为导向,提供基于岗位的项目实战训练,投重金研发了专门针对大学生的准员工“5R(5Real)”实训课程体系(5R即:真实的工作环境、真实的项目经理、真实的项目案例、真实的工作压力、真实的工作机会),致力于培养符合社会实际需求的软件人才,多年来已累计为自身及全行业培养合格准员工超过10万人。  想学IT找小卓 留言微信:您的姓名、联系方式、所在地区、想了解的课程 登录中软卓越官方网站客服咨询:http://etc.chinasofti.com 或 http://www.zretc.com 拨打电话:400-666-3775 与小卓成为QQ好友:3177669389

更多>
Objective-C知识点——property属性

Objective-C知识点——property属性

2017-03-08

Objective-C中的@property关键字及其用法 1)        定义: property是用来捕获对象的状态。它们反射出对象的内在属性以及和其他对象的关系。它提供了一个安全的、便捷的方法,以便我们访问对象的属性,而不需要写出各种访问方法(getter、setter)。 使用@property关键字有以下几点好处: 自动的实现getter和seeter方法:当你声明了property时,会自动的实现getter和setter方法而不用自己写出来。 使用该关键字使得目的非常明确,就是用来进行数据封装并提供访问接口的。 property关键字可以通过一系列附加信息,来方便的约束属性的行为。比如提供了各种附加声明如assign、copy、weak、strong、atomic、nonatomic等。 2)        @property附加声明的作用,见下述说明: @property与@synthesize是成对出现的,可以自动生成某个类成员变量的存取方法。在Xcode4.5以及以后的版本,@synthesize可以省略。 附加属性的约束: ①atomic与nonatomic atomic:默认是有该属性的,这个属性是为了保证程序在多线程情况,编译器会自动生成一些互斥加锁代码,避免该变量的读写不同步问题。 nonatomic:如果该对象无需考虑多线程的情况,请加入这个属性,这样会让编译器少生成一些互斥加锁代码,可以提高效率。 ②readwrite与readonly readwrite:这个属性是默认的情况,会自动为你生成存取器。 readonly:只生成getter不会有setter方法。 readwrite、readonly这两个属性的真正价值,不是提供成员变量访问接口,而是控制成员变量的访问权限。 ③strong与weak strong:强引用,也是我们通常说的引用,其存亡直接决定了所指向对象的存亡。如果不存在指向一个对象的引用,并且此对象不再显示在列表中,则此对象会被从内存中释放。 weak:弱引用,不决定对象的存亡。即使一个对象被持有无数个弱引用,只要没有强引用指向它,那么还是会被清除。 strong与retain功能相似;weak与assign相似,只是当对象消失后weak会自动把指针变为nil; ④assign、copy、retain assign:默认类型,setter方法直接赋值,不进行任何retain操作,不改变引用计数。一般用来处理基本数据类型。 retain:释放旧的对象(release),将旧对象的值赋给新对象,再令新对象引用计数为1。我理解为指针的拷贝,拷贝一份原来的指针,释放原来指针指向的对象的内容,再令指针指向新的对象内容。 copy:与retain处理流程一样,先对旧值release,再copy出新的对象,retainCount为1.为了减少对上下文的依赖而引入的机 制。我理解为内容的拷贝,向内存申请一块空间,把原来的对象内容赋给它,令其引用计数为1。对copy属性要特别注意:被定义有copy属性的对象必须要 符合NSCopying协议,必须实现-(id)copyWithZone:(NSZone *)zone方法。 也可以直接使用: 使用assign: 对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double,char, 等等) 使用copy: 对NSString 使用retain: 对其他NSObject和其子类 成就年薪百万程序员就到中软国际教育!

更多>
IOS开发系列--Objective-C之协议、代码块、分类

IOS开发系列--Objective-C之协议、代码块、分类

2017-03-07

概述 ObjC的语法主要基于smalltalk进行设计的,除了提供常规的面向对象特性外,还增加了很多其他特性,这一节将重点介绍ObjC中一些常用的语法特性。当然这些内容虽然和其他高级语言命名不一样,但是我们都可以在其中找到他们的影子,在文章中我也会对比其他语言进行介绍,这一节的重点内容如下: 协议protocol 代码块block 分类category 协议protocol 在ObjC中使用@protocol定义一组方法规范,实现此协议的类必须实现对应的方法。熟悉面向对象的童鞋都知道接口本身是对象行为描述的协议规范。也就是说在ObjC中@protocol和其他语言的接口定义是类似的,只是在ObjC中interface关键字已经用于定义类了,因此它不会再像C#、Java中使用interface定义接口了。 假设我们定义了一个动物的协议AnimalDelegate,人员Person这个类需要实现这个协议,请看下面的代码: AnimalDelegate.h // //  AnimalDelegate.h //  Protocol&Block&Category // //  Created by Kenshin Cui on 14-2-2. //  Copyright (c) 2014年 Kenshin Cui. All rights reserved. //     //定义一个协议 @protocol AnimalDelegate   @required //必须实现的方法 -(void)eat;   @optional //可选实现的方法 -(void)run; -(void)say; -(void)sleep;   @end   Person.h // //  Person.h //  Protocol&Block&Category // //  Created by Kenshin Cui on 14-2-2. //  Copyright (c) 2014年 Kenshin Cui. All rights reserved. //   #import #import "AnimalDelegate.h"   @interface Person : NSObject   -(void)eat;   @end Person.m // //  Person.m //  Protocol&Block&Category // //  Created by Kenshin Cui on 14-2-2. //  Copyright (c) 2014年 Kenshin Cui. All rights reserved. //   #import "Person.h"   @implementation Person   -(void)eat{     NSLog(@"eating..."); }   @end 这里需要说明几点: 一个协议可以扩展自另一个协议,例如上面AnimalDelegate就扩展自NSObject,如果需要扩展多个协议中间使用逗号分隔; 和其他高级语言中接口不同的是协议中定义的方法不一定是必须实现的,我们可以通过关键字进行@required和@optional进行设置,如果不设置则默认是@required(注意ObjC是弱语法,即使不实现必选方法编译运行也不会报错); 协议通过<>进行实现,一个类可以同时实现多个协议,中间通过逗号分隔; 协议的实现只能在类的声明上,不能放到类的实现上(也就是说必须写成@interface Person:NSObject而不能写成@implementation Person); 协议中不能定义属性、成员变量等,只能定义方法; 事实上在ObjC中协议的更多作用是用于约束一个类必须实现某些方法,而从面向对象的角度而言这个类跟接口并不一定存在某种自然关系,可能是两个完全不同意义上的事物,这种模式我们称之为代理模式(Delegation)。在Cocoa框架中大量采用这种模式实现数据和UI的分离,而且基本上所有的协议都是以Delegate结尾。 现在假设需要设计一个按钮,我们知道按钮都是需要点击的,在其他语言中通常会引入事件机制,只要使用者订阅了点击事件,那么点击的时候就会触发执行这个事件(这是对象之间解耦的一种方式:代码注入)。但是在ObjC中没有事件的定义,而是使用代理来处理这个问题。首先在按钮中定义按钮的代理,同时使用协议约束这个代理(事件的触发者)必须实现协议中的某些方法,当按钮处理过程中查看代理是否实现了这个方法,如果实现了则调用这个方法。 KCButton.h // //  KCButton.h //  Protocol&Block&Category // //  Created by Kenshin Cui on 14-2-2. //  Copyright (c) 2014年 Kenshin Cui. All rights reserved. //   #import @class KCButton;   //一个协议可以扩展另一个协议,例如KCButtonDelegate扩展了NSObject协议 @protocol KCButtonDelegate   @required //@required修饰的方法必须实现 -(void)onClick:(KCButton *)button;   @optional //@optional修饰的方法是可选实现的 -(void)onMouseover:(KCButton *)button; -(void)onMouseout:(KCButton *)button;   @end   @interface KCButton : NSObject   #pragma mark - 属性 #pragma mark 代理属性,同时约定作为代理的对象必须实现KCButtonDelegate协议 @property (nonatomic,retain) iddelegate;   #pragma mark - 公共方法 #pragma mark 点击方法 -(void)click;   @end KCButton.m // //  KCButton.m //  Protocol&Block&Category // //  Created by Kenshin Cui on 14-2-2. //  Copyright (c) 2014年 Kenshin Cui. All rights reserved. //   #import "KCButton.h"   @implementation KCButton   -(void)click{     NSLog(@"Invoke KCButton's click method.");     //判断_delegate实例是否实现了onClick:方法(注意方法名是"onClick:",后面有个:)     //避免未实现ButtonDelegate的类也作为KCButton的监听     if([_delegate respondsToSelector:@selector(onClick:)]){         [_delegate onClick:self];     } }   @end MyListener.h // //  MyListener.h //  Protocol&Block&Category // //  Created by Kenshin Cui on 14-2-2. //  Copyright (c) 2014年 Kenshin Cui. All rights reserved. //   #import @class KCButton; @protocol KCButtonDelegate;   @interface MyListener : NSObject -(void)onClick:(KCButton *)button; @end MyListener.m // //  MyListener.m //  Protocol&Block&Category // //  Created by Kenshin Cui on 14-2-2. //  Copyright (c) 2014年 Kenshin Cui. All rights reserved. //   #import "MyListener.h" #import "KCButton.h"   @implementation MyListener -(void)onClick:(KCButton *)button{     NSLog(@"Invoke MyListener's onClick method.The button is:%@.",button); } @end main.m // //  main.m //  Protocol&Block&Category // //  Created by Kenshin Cui on 14-2-2. //  Copyright (c) 2014年 Kenshin Cui. All rights reserved. //   #import #import "KCButton.h" #import "MyListener.h"   int main(int argc, const char * argv[]) {     @autoreleasepool {                 KCButton *button=[[KCButton alloc]init];         MyListener *listener=[[MyListener alloc]init];         button.delegate=listener;         [button click];         /* 结果:          Invoke KCButton's click method.          Invoke MyListener's onClick method.The button is:.          */     }     return 0; } 我们通过例子模拟了一个按钮的点击过程,有点类似于Java中事件的实现机制。通过这个例子我们需要注意以下几点内容: id可以表示任何一个ObjC对象类型,类型后面的”<协议名>“用于约束作为这个属性的对象必须实现该协议(注意:使用id定义的对象类型不需要加“*”); MyListener作为事件触发者,它实现了KCButtonDelegate代理(在ObjC中没有命名空间和包的概念,通常通过前缀进行类的划分,“KC”是我们自定义的前缀) 在.h文件中如果使用了另一个文件的类或协议我们可以通过@class或者@protocol进行声明,而不必导入这个文件,这样可以提高编译效率(注意有些情况必须使用@class或@protocol,例如上面KCButton.h中上面声明的KCButtonDelegate协议中用到了KCButton类,而此文件下方的KCButton类声明中又使用了KCButtonDelegate,从而形成在一个文件中互相引用关系,此时必须使用@class或者@protocol声明,否则编译阶段会报错),但是在.m文件中则必须导入对应的类声明文件或协议文件(如果不导入虽然语法检查可以通过但是编译链接会报错); 使用respondsToSelector方法可以判断一个对象是否实现了某个方法(需要注意方法名不是”onClick”而是“onClick:”,冒号也是方法名的一部分);    学习更多IOS开发知识就到中软国际!

更多>
数据结构中二叉树的基本操作

数据结构中二叉树的基本操作

2017-03-06

二叉树的基本操作,可能包括: 创建,遍历,转化,复制,删除等。 遍历:前中后三种顺序的遍历,已经是各数据结构与算法教程的最基础内容,在此不重复。 创建:大多数据结构教程当中的二叉树创建程序,都是采用的递归方式,递归方式创建的二叉树与遍历的过程相似,所创建的二叉树,也是采用左右子节点方式,后续进行遍历操作十分方便。 转化:直觉上,最简单的二叉树存储方式其实是如下图的数组: *此图出自某高校数据结构ppt,但实在难以查证是哪个学校,无法直接感谢,请谅解。 首先,提供个满二叉树大小的数组,然后其中数值按完全二叉树存储。 显然,此种顺序存储方法:第i号(这里编号指对应的完全二叉树的位序)结点的左右孩子一定保存在第2i及2i+1号单元中。 故此,为兼顾存储的直观与遍历等操作的方便,从顺序数组向左右子节点存储方式的转化也就十分重要。 1-转化方法 分为几个步骤: (1)准备原始数组 (2)分析数组中的有效值,对应二叉树节点非空; (3)创建二叉树节点; (4)计算除最后一层子节点外,构造节点间父子关系时的循环次数; (5)构造二叉树节点间的父子关系; (6)确实二叉树根节点; 主要代码: (1)准备原始数组 1. //原始数组  2.     int intBiTreeInit[ARR_COUNT];  3.   4.      5.     //初始化原始数组至无效值  6.     for(int i=0;i<=ARR_COUNT-1;i++)  7.         intBiTreeInit[i]=NVALUE;  8.   9.     //本if条件确保ARR_COUNT是否是的乘方-1  10.     if(0==(ARR_COUNT & (ARR_COUNT+1)))  11.     {  12.         for(int i=0;i<=ARR_COUNT-1;i++)  13.             intBiTreeInit[i]=2*(i+1);  14.     }  15.     else  16.         return RET_ERR;  17.   18.     //使最后两数为无效值  19.     intBiTreeInit[ARR_COUNT-1]=NVALUE;  20.     intBiTreeInit[ARR_COUNT-2]=NVALUE;  (2)分析数组中的有效值 1. //开始获得数组中有效值位置  2.    int intRel=0;  3.    int intArr=0;  4.    for(intArr=0;intArr<=intCount-1;intArr++)  5.    {  6.        if(elemArr[intArr]!=elemNValue)  7.        {  8.            intRel++;  9.            vecIntEffPos.push_back(intArr);  10.        }  11.        }  (3)创建二叉树节点  1. //数组中有效值对应创建节点  2. //同时初始化父子节点为NULL  3. for(intArr=0;intArr<=intRel-1;intArr++)  4. {  5.     pBiTreeTemp=(PBiTreeNode)malloc(sizeof(BiTreeNode));;  6.       7.     if(NULL==pBiTreeTemp)                                //判断是否有足够的内存空间  8.     {  9.         cout<<"Memory alloc failure"<

更多>
中软国际-.NET入门知识问答

中软国际-.NET入门知识问答

2017-02-27

关于.NET入门知识你知道多少? 1.重载(Overload)和覆写(override)的区别 答:方法重载:当类包含两个名称相同但签名不同(方法名相同,参数列表不相同)的方法时发生方法重载。用方法重载来提供在语义上完成相同而功能不同的方法。 覆写:在类的继承中使用,通过覆写子类方法可以改变父类虚方法的实现。 2.接口与继承的区别?什么时候使用接口,什么时候使用继承? 答:(1)接口定义一个类型需要实现的方法,属性,索引和事件,包括可能的参数类型和返回值类型,而把具体的实现交由相应的类或结构来做,从而为组件提供多态能力。 (2)继承常用于在一个现有父类的基础上的功能扩展,往往是我们将几个类中相同的成员提取出来放在父类中实现,然后在各自的子类中加以继承。 (3)接口可以实现多接口继重,而继承只能实现单继承。 (4)实现继承可继承父类型的实现,由于接口中没有定义方法的实现,因此必须实现继承后该接口的所有方法。 (5)为父类型添加方法可能不影响使用继承自该类型实现的用户,而为接口添加方法导致用户必须为新方法添加实现。 (6)当派生类和基类是is-a的关系是使用"继承",典型案例"苹果is-a水果",存在can-do的关系时使用"接口" 3.ado,ado.net的区别 答:您可以通过将ADO.NET的各项功能与ActiveX数据对象(ADO)的特定功能进行比较来理解ADO.NET的功能。 数据的内存中表示形式 在ADO中,数据的内存中表示形式为记录集。在ADO.NET中,它为数据集。它们之间有重要的差异。 表的个数 记录集看起来像单个表。如果记录集将包含来自多个数据库表的数据,则它必须使用JOIN查询,将来自各个数据库表的数据组合到单个结果表中。 相反,数据集是一个或多个表的集合。数据集内的表称为数据表;明确地说,它们是DataTable对象。如果数据集包含来自多个数据库表的数据,它通常将包含多个DataTable对象。即,每个DataTable对象通常对应于单个数据库表或视图。这样,数据集可以模仿基础数据库的结构。 数据集通常还包含关系。数据集内的关系类似于数据库中的外键关系,即它使多个表中的行彼此关联。例如,如果数据集包含一个有关投资者的表和另一个有关每个投资者的股票购买情况的表,则数据集可能还包含一个关系来连接投资者表的各个行和购买表的对应行。 由于数据集可以保存多个独立的表并维护有关表之间关系的信息,因此它可以保存比记录集丰富得多的数据结构,包括自关联的表和具有多对多关系的表。 数据导航和游标 在ADO中,您使用ADOMoveNext方法顺序扫描记录集的行。在ADO.NET中,行表示为集合,因此您可以像依次通过任何集合那样依次通过表,或通过序号索引或主键索引访问特定行。DataRelation对象维护有关主记录和详细资料记录的信息,并提供方法使您可以获取与正在操作的记录相关的记录。例如,从Investor表的"NateSun"的行开始,可以定位到Purchase表中描述其购买情况的那组行。 "游标"是数据库元素,它控制记录导航、更新数据的能力和其他用户对数据库所做更改的可见性。ADO.NET不具有固有的游标对象,而是包含提供传统游标功能的数据类。例如,在ADO.NETDataReader对象中提供只进、只读游标的功能。有关游标功能的更多信息,请参见数据访问技术。 将打开连接的时间降至最低 在ADO.NET中,打开连接的时间仅足够执行数据库操作,例如"选择"(Select)或"更新"(Update)。您可以将行读入数据集中,然后在不保持与数据源的连接的情况下使用它们。在ADO中,记录集可以提供不连接的访问,但ADO主要是为连接的访问设计的。 ADO和ADO.NET中的不连接处理之间存在一个显著差异。在ADO中,通过调用OLEDB提供程序来与数据库通信。但在ADO.NET中,您通过数据适配器(OleDbDataAdapter、SqlDataAdapter、OdbcDataAdapter或OracleDataAdapter对象)与数据库通信,这将调用OLEDB提供程序或基础数据源提供的API。ADO和ADO.NET之间的主要区别在于:在ADO.NET中,数据适配器允许您控制将对数据集所做的更改传输到数据库的方式,方法是实现性能优化、执行数据验证检查或添加其他任何额外处理。 注意数据适配器、数据连接、数据命令和数据读取器是组成.NETFramework数据提供程序的组件。Microsoft和第三方供应商可能会提供其它提供程序,这些提供程序也可集成到VisualStudio中。有关不同.NET数据提供程序的信息,请参见.NET数据提供程序。 在应用程序间共享数据 在应用程序间传输ADO.NET数据集比传输ADO不连接的记录集要容易得多。若要将ADO不连接的记录集从一个组件传输到另一个组件,请使用COM封送。若要在ADO.NET中传输数据,请使用数据集,它可以传输XML流。 相对于COM封送,XML文件的传输提供以下便利之处: 更丰富的数据类型 COM封送提供一组有限的数据类型(由COM标准定义的那些类型)。由于ADO.NET中的数据集传输基于XML格式,所以对数据类型没有限制。因此,共享数据集的组件可以使用这些组件一般会使用的任何丰富的数据类型集。 性能 传输大型ADO记录集或大型ADO.NET数据集会使用网络资源;随着数据量的增长,施加于网络的压力也在增加。ADO和ADO.NET都使您可以最大限度地降低所传输的数据。但ADO.NET还提供另一个性能优势:ADO.NET不需要数据类型转换。而需要COM封送来在组件间传输记录集的ADO,则需要将ADO数据类型转换为COM数据类型。 穿透防火墙 防火墙可以影响试图传输不连接的ADO记录集的两个组件。请记住,防火墙通常配置为允许HTML文本通过,但防止系统级请求(如COM封送)通过。 因为组件使用XML交换ADO.NET数据库,所以防火墙可以允许数据集通过。 4.asp.net页面在什么时候产生?又在什么时候销毁? 答:(1)Page_Init();---初始化对象 这一过程主要是初始化包括页面本身的所有控件,每次的页面载入就会执行一次初试过程,而在这里面访问到的也是控件的初始值。还有就是可以通过OnInit()来重载初试化事件。 (2)LoadViewState---导入Viewstate数据 在初试化事件后,在loadvireState事件中所有控件将获得他们的第一个属性ViewState属性,这个属性最终将被返回给服务器以判断这个页面是已经被用户访问完毕还是仍然在被用户所访问。也可重载loadvireState事件对相应的控件进行值设定。 (3)LoadPostbackdata;---用LoadPostData处理Postback数据 Postback数据也可以理解成就是服务器页面提交的表单数据,每一次表单数据的提交都会触发执行IPostBackDataHandler接口操作的控件。 (4)Page_Load();---导入对象 这个过程就比较熟悉了,也是在页面的每次载入时一定会执行,但是注意和PageInit()之间的区别,所有的对象第一次被布置在DOM页面(在Asp.net中称控件树)里了并且可以通过代码或是相关的位置被引用。这样,对象就可以很容易的从客户端获得诸如宽度、高度、值、可见性等在Html中的属性值。经常会用到的Page.IsPostBack()指示该页是否正为响应客户端回发而加载,或者它是否正被首次加载和访问. (5)Handlecontrolevents;---具体的控件事件 这个过程执行的是相应具体控件事件,比如按钮事件..等。 (6)Page_PreRender();---预先呈递对象 预先呈递对象可以改变对象并将改变保存的最后时刻.可以对控件的属性、控件树的结构等做出最后的修改,同时还不用考虑Asp.net对其作出任何改变,因为此时已经脱离了数据库调用以及viewstate更新了,也可以通过OnPreRender来重载。 (7)Page_Render();---呈递对象呈递页面 所有对页面控件的修改完成后viewstate就被保存了。运用Html创建给浏览器输出的页面的时候Render事件就发生了。在Render事件过程中,页面调用其中的对象将它们呈递给Html。然后,页面就可以以Html的形式被用户的浏览器访问了。当Render事件被重载时,开发者可以编写自定义的Html代码使得原先生成的Html都无效而按照新的Html来组织页面。Render方法将一个HtmlTextWriter对象作为参数并用它将Html在浏览器上以网页的形式显示。这时仍然可以做一些修改动作,不过它们只是客户端的一些变化而已了。亦可以重载Render事件。 (8)Unloadevent;---卸载对象 当想服务器请求一个对象的时候,就会在内存里生成一个继承页面对象,也就是页面的类,它继承自System.Web.UI.Page. 当页面对象从内存中卸载时发生,将触发该事件. (9)Disposemethodcalled 在呈递给Html完成后,所有的对象都应被销毁。在Dispose事件中,你应该销毁所有在建立这个页面时创建的对象。这时,所有的处理已经完毕,所以销毁任何剩下的对象都是不会产生错误的,包括页面对象。你可以重载Dispose事件。 5.Session,ViewState,Application,cookie的区别? 答:Session:Session用于保持状态的基于Web服务器的方法。Session允许通过将对象存储在Web服务器的内存中在整个用户会话过程中保持任何对象。主要用于保持代码隐藏类中对象的状态。为每个用创建的,用于存储单个用户,因为他是相对每个用户的.所以可能来取得在线人数等。 ViewState:主要用于保持Web页上控件的状态。当Web页上的控件被绑定到代码隐藏类中的对象。 Application用于存储所有用户都可视的信息.所以它存储的是要让所有用户共享的一些信息.如总访问数等; Cache:页面缓存。 cookie:通常我们都把它放在客户端,也可以存储在服务器端。主要用它存储用户的个性设制,和登陆信息。 6.面向对象的思想主要包括什么? 答:开发人员应该熟悉面向对象软件开发(OOP)基本概念,熟悉面向对象软件开发中的类、继承、封装、多态等概念,具备良好的面向对象软件开发思想和设计原则。 7.什么是ASP.net中的用户控件? 答:用户控件。用户控件是能够在其中放置标记和Web服务器控件的容器。然后,可以将用户控件作为一个单元对待,为其定义属性和方法。 8.什么叫应用程序域?什么是受管制的代码?什么是强类型和强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释? 答:(1)应用程序域为隔离正在运行的应用程序提供了一种灵活而安全的方法。 (2)受管制的代码:在.NET环境中运行的任何代码都称为受管制的代码(unmanagedcode),.NET外部的其他代码也运行在Windows上,这些代码称为未受管制的代码(unmanagedcode)。 (3)强类型和弱类型的区别在与,在编码过程中是否要指定数据类型,作为强类型必须指定数据类型,编译器为其分配相应的存储空间(如c,pascal)否则编译出错。而弱类型不一定需要指定数据类型,编译器会用相同的空间去分配各种类型,除非你指定了(如basic)。作为强类型语言,在编译阶段的安全性要高于弱语言型。 强类型系统:RTTI:类型识别系统。 (4)装箱就是隐式的将一个值型转换为引用型对象。比如: inti=0; Syste.Objectobj=i; 这个过程就是装箱!就是将i装箱! 拆箱就是将一个引用型对象转换成任意值型!比如: inti=0; System.Objectobj=i; intj=(int)obj; 这个过程前2句是将i装箱,后一句是将obj拆箱! 再写个代码,看看进行了几次装拆箱! inti=0; System.Objectobj=i; Console.WriteLine(i+","+(int)obj); 其中共发生了3次装箱和一次拆箱!^_^,看出来了吧?! 第一次是将i装箱,第2次是输出的时候将i转换成string类型,而string类型为引用类型,即又是装箱,第三次装箱就是(int)obj的转换成string类型,装箱! 拆箱就是(int)obj,将obj拆箱!! (5)重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。 (6)CLR的全称是公共语言运行库(CommonLanguageRuntime),读者可以把CLR理解为一个包含运行.NET程序的引擎和一堆符合公共语言基础结构的类库的集合。CLR是一个规范的实现,我们开发的几乎所有的.NET程序都基于CLR的类库来实现,并且运行在CLR提供的运行引擎之上。所谓.NET框架,指的就是公共语言运行库。 公共语言基础(CLI)是微软公司向ECMA提交的一份语言和数据格式规范,CLR是目前为止唯一一个公共语言基础的实现版本。 CTS的全称是通用类型系统(CommonTypeSystem)。前文已经介绍了公共语言基础(CLI)的概念,微软公司提交的CLI规范,包括了公共类型系统(CTS)、公共中间语言(CIL)、底部文件格式以及元数据格式等。公共类型系统定义了一个能够在CLR上运行的语言规范。尽管有很多语言本身不符合CTS规范,但是通过加强编译器,改变语言附加规范等手段,使得许多语言能够编写出能在CLR上运行的程序。 一种语言编写的程序编译能够在CLR上运行,并不代表这种语言本身完全符合CTS的规范。例如C++语言,仍然保持了其不符合CTS规范的部分,并且在编译时把这部分不符合CTS的代码编译成原始代码而非中间代码。 最后来看一下CLS的概念。公共语言规范(CLS)是CTS的一个子集,它定义了希望编写在.NET平台上运行的程序的语言所需符合的最小规范。正因为.NET允许由不同语言编写的程序一起执行,所以才制定出CLS规范,用以避免不同语言特性产生的错误。 9.列举一下你所了解的XML技术及其应用 答:xml可以用来做网页(xslt)xml可以当作数据库xml可以用来保存对象的系列化 10.值类型和引用类型的区别?写出C#的样例代码。 答:值类型包括简单类型、结构体类型和枚举类型,引用类型包括自定义类、数组、接口、委托等 关于.NET入门知识问答,了解更多热门.NET问题就到中软国际!

更多>

推荐阅读

更多

友情链接:

中软卓越java培训地址:北京市海淀区科学院南路2号融科资讯中心C座北楼12层 联系电话:400-666-3775 邮箱账号:etc-marketing@chinasofti.com

©2008-2016 北京中软国际教育科技股份有限公司 京ICP备14058756号-2