决编程谜题游戏是提高开发逻辑和解决问题能力的一种有趣手段。此外,当你尝试熟悉一门新的编程语言时,解决这类编程语言的谜题游戏可以帮助你加快学习过程。
无论你是一个编程新手,还是想要增强你现有的技能,或渴望掌握最热门的编码语言,以下文章中介绍的10 款最流行的编程谜题益智网站,都将帮助你测试自己的思维,以及改善你的编程、解决问题与逻辑思维的能力。
如果你正在寻找一个有趣的方式来提高你的编程能力,Programming Praxis将是一个很好的选择。它是一个汇聚了一些有趣编程问题的博客,而解决方案则可用于一些不同的编程语言,里面有好玩的游戏——大约需要一个小时来完成的设计,来丰富你的空闲时间。它非常简单,没有排行榜、得分或奖品,并会帮助你在一路上学习一些新东西。
网站地址:http://programmingpraxis.com/
CodeKata 是由 Dave Thomas 编写的编程类谜题博客,Dave Thomas是因《程序员修炼之道》这本具有开创意义的经典书籍而闻名于世。CodeKata中的谜题涉及到与现实编程项目直接相关的许多问题,因此这也是一个用来磨练你编程技能的好地方。
网站地址:http://codekata.pragprog.com/2007/01/code_kata_backg.html#more
TopCoder网站是为Coder(编程者)而生的一个用于挑战自我的网站。该网站每个月都有两到三次在线比赛,根据比赛的结果对参赛者进行新的排名。
参赛者可根据自己的爱好选用Java, C++, C#, VB或python进行编程。参赛者须在1小时15分钟的时间内完成三道不同难度的题目,每道题完成的时间决定该题在编程部分所得的分数。
比赛可分为三部分:Coding Phase, Challenge Phase和System Test Phase,比ACM/ICPC多了Challenge Phase。如今该网站已经把中国纳入其赛区,大家可以登录网站与来自全世界的程序员进行更直接的交流。
此外,TopCoder还是个获取软件开发兼职的网站。以编程工作为例,他的流程如下:提供工作列表->用户接工作->一周后提交->评分。在评分中得第一名者,获500美金(组件类一般为800美金);第二名获250美金(组件类一般为400美金,其他名次不获得奖金。TopCoder还可以提供其他更多乐趣,赶紧登录体验吧。
网站地址:http://www.topcoder.com/
Project Euler是一个数学计算机编程解答网,引用自网站的首页:“Project Euler项目提供了一个有挑战性的‘数学/计算机编程’问题集合。数学方面的知识可以帮助你获得优雅而高效的解决方案,与此同时,计算机应用和编程技巧也不可或缺。” ProjectEuler网站拥有大量的数学逻辑程序,可以使用任何你喜欢的语言解答。
ProjectEuler提供的问题有不同的难度,可以进行连续的启发式的学习。也就是说,通过解决一个问题,提供给解题者一个新的概念,使解题者可以接触之前无法涉及的问题。
ProjectEuler网站适合于那些可能的解题者包括那些不满足于教学内容的学生,对数学问题感兴趣的数学家,以及希望能够锻炼自己的解决问题能力和数学能力的专业人士。
目前Project Euler中共有340道题目,大概每周发布一道新题。你可以按照ID(发布时间)、difficulty(solved人数)对题目进行升降序排列,方便查看。
网站地址:http://projecteuler.net/
Facebook 收集了非常具有挑战性的编程类谜题,如果您能够设法解答这些问题,可能会帮助你在Facebook公司收获一份工作机会!解答谜题时你可以使用多种语言,包括 Erlang、PHP、Perl、Python以及Ruby等等。
网站地址:http://www.facebook.com/careers/puzzles.php
The Python Challenge是一个过关式的解谜站点,使用的是经典在线解谜站点Not Pr0n的模式:根据提示找出下一关的网页地址。在 Python 挑战网上,你需要编写一系列 Python 小程序来解答相应的谜题。而随着你解答问题数量的增多,难度也会不断的增加。
虽然这个解谜站点的名字叫做Python Challenge,但事实上你可以使用任意一种程序语言(除了少数一两关可能会用到点Python的知识)。对于热衷于解决问题的程序员或开发者,这个网站还是很不错的。
网站地址:http://www.pythonchallenge.com/
Al Zimmermann是目前比较经典的计算机编程问题网站,其编程大赛是专为痴迷于计算机编程者打造的竞技舞台。通过参加竞赛,你不仅可以收获荣耀还能获得一些很好的奖品,此外还可以参与编程社区。比赛每六个月举行一次,想参加的记得把握机会哦!
网站地址:http://www.azspcs.net/
Ruby Quiz 是 Ruby 编程挑战合集,虽然是为Ruby而设,但用户也可以使用任何语言来解决其中的程序挑战问题,但是如果你想查看这些问题的评价,他们会默认的使用Ruby来解决。相对应的还会有一本书——《 最好的Ruby问答题》,讨论所选择问题可能的解决方案。
网站地址:http://rubyquiz.com/
C Puzzles 是专注于 C 语言编程谜题的网站。在这个页面上的谜题都是关于C语言常见的陷阱和常犯错误等。C语言的专家型人才可能会在很短的时间内漂亮的完成这些问题,但如果你不知道C语言的本质,这些问题可能会有点挑战。
不过也不用担心,由于许多语言都是C语言风格或直接从其中导出的,所以即使你的编程母语不是 C语言,你也很有可能可以理解和解决这些难题。
网站地址:http://www.gowrikumar.com/c/index.html
99 Prolog Problems 适合于 Prolog 编程语言,但人们已经在 Python、Ruby、Haskell、Scala 等语言中提出了相应的解决方案。通过这种方式来解决这些问题,是快速学习一门新编程语言的好方式。
网站地址:https://prof.ti.bfh.ch/hew1/informatik3/prolog/p-99/
Mind Cipher并未包含在前10名中,因为该网站不需要你进行任何编程操作。但是,它又确实包含着“世界上最伟大的脑力考验、逻辑谜题以及精神挑战”,所以如果你只是为了快速的锻炼自身的精神思维,我想这是你应该去的地方!
你还知道其他任何好的编程谜题网站,或是特殊的挑战吗?欢迎留言与我们一起分享。
本文翻译自:sixrevisions.com/resources/10-puzzle-websites-to-sharpen-your-programming-skills/,如若转载,请注明来源于嘶吼: www.4hou.com/info/news/4479.html
者:前端Q
转发链接:https://mp.weixin.qq.com/s/ewFfXptccFs5KvjUINLGbQ
小试牛刀,实现了六款简单常见HTML5 Canvas特效滤镜,并且封装成一个纯JavaScript可调用的API文件gloomyfishfilter.js。支持的特效滤镜分别为:
1.反色
2.灰色调
3.模糊
4.浮雕
5.雕刻
6.合理
2.灰色调:获取一个预期点RGB值r,g,b则新的RGB值
newr=(r * 0.272)+(g * 0.534)+(b * 0.131);
newg=(r * 0.349)+(g * 0.686)+(b * 0.168);
newb=(r * 0.393)+(g * 0.769)+(b * 0.189);
3.模糊:基于一个5 * 5的卷积核
4.浮雕与雕刻:
根据当前预期的前一个预期RGB值与它的后一个重新的RGB值之差再加上128
5.总体:模拟了物体在镜子中与之对应的效果。
var canvas=document.getElementById("target");
canvas.width=source.clientWidth;
canvas.height=source.clientHeight;
**if**(!canvas.getContext) {
console.log("Canvas not supported. Please install a HTML5compatible browser.");
**return**;
}
// get 2D context of canvas and draw image
tempContext=canvas.getContext("2d");
var source=document.getElementById("source");
tempContext.drawImage(source, 0, 0, canvas.width,canvas.height);
var canvas=document.getElementById("target");
var len=canvas.width * canvas.height * 4;
var canvasData=tempContext.getImageData(0, 0, canvas.width, canvas.height);
var binaryData=canvasData.data;
function bindButtonEvent(element, type, handler)
{
if(element.addEventListener){
element.addEventListener(type, handler,**false**);
}else{
element.attachEvent('on'+type, handler);// for IE6,7,8
}
}
<scriptsrc=*"gloomyfishfilter.js"*></script> //导入API文件
gfilter.colorInvertProcess(binaryData, len); //调用 API
<meta http-equiv="X-UA-Compatible"*content=*"chrome=IE8">
效果演示:
CSS部分:
#svgContainer {
width:800px;
height:600px;
background-color:#EEEEEE;
}
#sourceDiv { float: left; border: 2px solid blue}
#targetDiv { float: right;border: 2px solid red}
filter1.html中HTML源代码:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="chrome=IE8">
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
<title>Canvas Filter Demo</title>
<link href="default.css" rel="stylesheet" />
<script src="gloomyfishfilter.js"></scrip>
</head>
<body>
<h1>HTML Canvas Image Process - By Gloomy Fish</h1>
<div id="svgContainer">
<div id="sourceDiv">
<img id="source" src="../test.png" />
</div>
<div id="targetDiv">
<canvas id="target"></canvas>
</div>
</div>
<div id="btn-group">
<button type="button" id="invert-button">反色</button>
<button type="button" id="adjust-button">灰色调</button>
<button type="button" id="blur-button">模糊</button>
<button type="button" id="relief-button">浮雕</button>
<button type="button" id="diaoke-button">雕刻</button>
<button type="button" id="mirror-button">镜像</button>
</div>
</body>
</html>
filter1.html中JavaScript源代码:
var tempContext=null; // global variable 2d context
window.onload=function() {
var source=document.getElementById("source");
var canvas=document.getElementById("target");
canvas.width=source.clientWidth;
canvas.height=source.clientHeight;
if (!canvas.getContext) {
console.log("Canvas not supported. Please install a HTML5 compatible browser.");
return;
}
// get 2D context of canvas and draw image
tempContext=canvas.getContext("2d");
tempContext.drawImage(source, 0, 0, canvas.width, canvas.height);
// initialization actions
var inButton=document.getElementById("invert-button");
var adButton=document.getElementById("adjust-button");
var blurButton=document.getElementById("blur-button");
var reButton=document.getElementById("relief-button");
var dkButton=document.getElementById("diaoke-button");
var mirrorButton=document.getElementById("mirror-button");
// bind mouse click event
bindButtonEvent(inButton, "click", invertColor);
bindButtonEvent(adButton, "click", adjustColor);
bindButtonEvent(blurButton, "click", blurImage);
bindButtonEvent(reButton, "click", fudiaoImage);
bindButtonEvent(dkButton, "click", kediaoImage);
bindButtonEvent(mirrorButton, "click", mirrorImage);
}
function bindButtonEvent(element, type, handler)
{
if(element.addEventListener) {
element.addEventListener(type, handler, false);
} else {
element.attachEvent('on'+type, handler); // for IE6,7,8
}
}
function invertColor() {
var canvas=document.getElementById("target");
var len=canvas.width * canvas.height * 4;
var canvasData=tempContext.getImageData(0, 0, canvas.width, canvas.height);
var binaryData=canvasData.data;
// Processing all the pixels
gfilter.colorInvertProcess(binaryData, len);
// Copying back canvas data to canvas
tempContext.putImageData(canvasData, 0, 0);
}
function adjustColor() {
var canvas=document.getElementById("target");
var len=canvas.width * canvas.height * 4;
var canvasData=tempContext.getImageData(0, 0, canvas.width, canvas.height);
var binaryData=canvasData.data;
// Processing all the pixels
gfilter.colorAdjustProcess(binaryData, len);
// Copying back canvas data to canvas
tempContext.putImageData(canvasData, 0, 0);
}
function blurImage()
{
var canvas=document.getElementById("target");
var len=canvas.width * canvas.height * 4;
var canvasData=tempContext.getImageData(0, 0, canvas.width, canvas.height);
// Processing all the pixels
gfilter.blurProcess(tempContext, canvasData);
// Copying back canvas data to canvas
tempContext.putImageData(canvasData, 0, 0);
}
function fudiaoImage()
{
var canvas=document.getElementById("target");
var len=canvas.width * canvas.height * 4;
var canvasData=tempContext.getImageData(0, 0, canvas.width, canvas.height);
// Processing all the pixels
gfilter.reliefProcess(tempContext, canvasData);
// Copying back canvas data to canvas
tempContext.putImageData(canvasData, 0, 0);
}
function kediaoImage()
{
var canvas=document.getElementById("target");
var len=canvas.width * canvas.height * 4;
var canvasData=tempContext.getImageData(0, 0, canvas.width, canvas.height);
// Processing all the pixels
gfilter.diaokeProcess(tempContext, canvasData);
// Copying back canvas data to canvas
tempContext.putImageData(canvasData, 0, 0);
}
function mirrorImage()
{
var canvas=document.getElementById("target");
var len=canvas.width * canvas.height * 4;
var canvasData=tempContext.getImageData(0, 0, canvas.width, canvas.height);
// Processing all the pixels
gfilter.mirrorProcess(tempContext, canvasData);
// Copying back canvas data to canvas
tempContext.putImageData(canvasData, 0, 0);
}
滤镜源代码(gloomyfishfilter.js):
var gfilter={
type: "canvas",
name: "filters",
author: "zhigang",
getInfo: function () {
return this.author + ' ' + this.type + ' ' + this.name;
},
/**
* invert color value of pixel, new pixel=RGB(255-r, 255-g, 255 - b)
*
* @param binaryData - canvas's imagedata.data
* @param l - length of data (width * height of image data)
*/
colorInvertProcess: function(binaryData, l) {
for (var i=0; i < l; i +=4) {
var r=binaryData[i];
var g=binaryData[i + 1];
var b=binaryData[i + 2];
binaryData[i]=255-r;
binaryData[i + 1]=255-g;
binaryData[i + 2]=255-b;
}
},
/**
* adjust color values and make it more darker and gray...
*
* @param binaryData
* @param l
*/
colorAdjustProcess: function(binaryData, l) {
for (var i=0; i < l; i +=4) {
var r=binaryData[i];
var g=binaryData[i + 1];
var b=binaryData[i + 2];
binaryData[i]=(r * 0.272) + (g * 0.534) + (b * 0.131);
binaryData[i + 1]=(r * 0.349) + (g * 0.686) + (b * 0.168);
binaryData[i + 2]=(r * 0.393) + (g * 0.769) + (b * 0.189);
}
},
/**
* deep clone image data of canvas
*
* @param context
* @param src
* @returns
*/
copyImageData: function(context, src)
{
var dst=context.createImageData(src.width, src.height);
dst.data.set(src.data);
return dst;
},
/**
* convolution - keneral size 5*5 - blur effect filter(模糊效果)
*
* @param context
* @param canvasData
*/
blurProcess: function(context, canvasData) {
console.log("Canvas Filter - blur process");
var tempCanvasData=this.copyImageData(context, canvasData);
var sumred=0.0, sumgreen=0.0, sumblue=0.0;
for ( var x=0; x < tempCanvasData.width; x++) {
for ( var y=0; y < tempCanvasData.height; y++) {
// Index of the pixel in the array
var idx=(x + y * tempCanvasData.width) * 4;
for(var subCol=-2; subCol<=2; subCol++) {
var colOff=subCol + x;
if(colOff <0 || colOff >=tempCanvasData.width) {
colOff=0;
}
for(var subRow=-2; subRow<=2; subRow++) {
var rowOff=subRow + y;
if(rowOff < 0 || rowOff >=tempCanvasData.height) {
rowOff=0;
}
var idx2=(colOff + rowOff * tempCanvasData.width) * 4;
var r=tempCanvasData.data[idx2 + 0];
var g=tempCanvasData.data[idx2 + 1];
var b=tempCanvasData.data[idx2 + 2];
sumred +=r;
sumgreen +=g;
sumblue +=b;
}
}
// calculate new RGB value
var nr=(sumred / 25.0);
var ng=(sumgreen / 25.0);
var nb=(sumblue / 25.0);
// clear previous for next pixel point
sumred=0.0;
sumgreen=0.0;
sumblue=0.0;
// assign new pixel value
canvasData.data[idx + 0]=nr; // Red channel
canvasData.data[idx + 1]=ng; // Green channel
canvasData.data[idx + 2]=nb; // Blue channel
canvasData.data[idx + 3]=255; // Alpha channel
}
}
},
/**
* after pixel value - before pixel value + 128
* 浮雕效果
*/
reliefProcess: function(context, canvasData) {
console.log("Canvas Filter - relief process");
var tempCanvasData=this.copyImageData(context, canvasData);
for ( var x=1; x < tempCanvasData.width-1; x++)
{
for ( var y=1; y < tempCanvasData.height-1; y++)
{
// Index of the pixel in the array
var idx=(x + y * tempCanvasData.width) * 4;
var bidx=((x-1) + y * tempCanvasData.width) * 4;
var aidx=((x+1) + y * tempCanvasData.width) * 4;
// calculate new RGB value
var nr=tempCanvasData.data[aidx + 0] - tempCanvasData.data[bidx + 0] + 128;
var ng=tempCanvasData.data[aidx + 1] - tempCanvasData.data[bidx + 1] + 128;
var nb=tempCanvasData.data[aidx + 2] - tempCanvasData.data[bidx + 2] + 128;
nr=(nr < 0) ? 0 : ((nr >255) ? 255 : nr);
ng=(ng < 0) ? 0 : ((ng >255) ? 255 : ng);
nb=(nb < 0) ? 0 : ((nb >255) ? 255 : nb);
// assign new pixel value
canvasData.data[idx + 0]=nr; // Red channel
canvasData.data[idx + 1]=ng; // Green channel
canvasData.data[idx + 2]=nb; // Blue channel
canvasData.data[idx + 3]=255; // Alpha channel
}
}
},
/**
* before pixel value - after pixel value + 128
* 雕刻效果
*
* @param canvasData
*/
diaokeProcess: function(context, canvasData) {
console.log("Canvas Filter - process");
var tempCanvasData=this.copyImageData(context, canvasData);
for ( var x=1; x < tempCanvasData.width-1; x++)
{
for ( var y=1; y < tempCanvasData.height-1; y++)
{
// Index of the pixel in the array
var idx=(x + y * tempCanvasData.width) * 4;
var bidx=((x-1) + y * tempCanvasData.width) * 4;
var aidx=((x+1) + y * tempCanvasData.width) * 4;
// calculate new RGB value
var nr=tempCanvasData.data[bidx + 0] - tempCanvasData.data[aidx + 0] + 128;
var ng=tempCanvasData.data[bidx + 1] - tempCanvasData.data[aidx + 1] + 128;
var nb=tempCanvasData.data[bidx + 2] - tempCanvasData.data[aidx + 2] + 128;
nr=(nr < 0) ? 0 : ((nr >255) ? 255 : nr);
ng=(ng < 0) ? 0 : ((ng >255) ? 255 : ng);
nb=(nb < 0) ? 0 : ((nb >255) ? 255 : nb);
// assign new pixel value
canvasData.data[idx + 0]=nr; // Red channel
canvasData.data[idx + 1]=ng; // Green channel
canvasData.data[idx + 2]=nb; // Blue channel
canvasData.data[idx + 3]=255; // Alpha channel
}
}
},
/**
* mirror reflect
*
* @param context
* @param canvasData
*/
mirrorProcess : function(context, canvasData) {
console.log("Canvas Filter - process");
var tempCanvasData=this.copyImageData(context, canvasData);
for ( var x=0; x < tempCanvasData.width; x++) // column
{
for ( var y=0; y < tempCanvasData.height; y++) // row
{
// Index of the pixel in the array
var idx=(x + y * tempCanvasData.width) * 4;
var midx=(((tempCanvasData.width -1) - x) + y * tempCanvasData.width) * 4;
// assign new pixel value
canvasData.data[midx + 0]=tempCanvasData.data[idx + 0]; // Red channel
canvasData.data[midx + 1]=tempCanvasData.data[idx + 1]; ; // Green channel
canvasData.data[midx + 2]=tempCanvasData.data[idx + 2]; ; // Blue channel
canvasData.data[midx + 3]=255; // Alpha channel
}
}
},
};
感谢阅读,如果你觉得我今天分享的内容,不错,请点一个赞,谢谢!!
些人认为“考不上(普通)高中无缘大学”,其实不对。职业高中、中专毕业生可以通过专门的高考(各省份不同,国家层面叫职教高考、高职分类考试)升读统招全日制大学。职高、中专、技校有区别,过去技工院校尤其是技师学院在学历上有劣势,新的《职业教育法》也明确把技师学院列入高校序列,以在保持技工院校特色、管理体制不变的情况下解决其毕业生学历认证问题。当然中等职业技术教育是以就业为导向同时兼顾升学的教育。此文只是想让读者知道一些东西。
一、中职生参加的职教高考——普通高考的重要组成部分(不是成人高考)
之前笔者看一些论文,是将中职生参加的职教高考与普通高考分离开。但是在各省份招生办组织普通高考报名时,是明确全日制普通高校招收中等职业学校毕业生的考试(具体名字因省而异)是属于普通高考的一部分,即职教高考是普通高考的重要组成部分,不同于成人高考、自学考试。职教高考的外延大于中职毕业生升读全日制大学考试的外延,但本文仅讨论其中的中职升学考试部分。
(一)中职生参加的职教高考的历史
除公文外主要参考资料:1《我国高职院校分类考试招生制度的演进、问题及改革路径》屈璐、尹毅等 2《中等职业学校毕业生对口升学的理想与现实》易超君
其它参考资料会在文中标出
总体上来说,从1980年开始,除了1986~1993、2006~2009年外,国家都是鼓励部分中职毕业生升读大学的。
1980年教育部、劳动总局《关于改革中等教育结构改革的报告》明确“职业(技术)学校、职业中学、农业中学的毕业生,可以报考高等院校。报考对口专业的考生,考试成绩在同一分数段内,优先录取”。现在很多省份中职生参加的高考都叫对口高考,或录取中体现专业对口的原则。当时这个考试只面向职高,不面向中专、技校。从此文件得出,1980年把除了普通高中外的高中阶段学校划分为若干类型。“职业(技术)学校”是独立于职业中学(可能包括工业中学)、农业中学(含农/林/牧/渔业中学)、中等专业学校、技工学校之外的,这可能是一些网友中职和中专不同论的“理论初始来源”。(但是五十年代政务院把中等专业学校和技工学校同样划为中等技术学校的范围内,有人认为职业教育和技术教育不同,但王明达“我看没什么区别”)。现在一般表述为“中职(含/不含技校)”,狭义的中职即教育系统中职。
1985年《中共中央关于教育体制改革的决定》明确:高等职业技术学校(不含高专的专科大学前身)优先招收中职毕业生和一线产业工人。此文将“普通大学”和“高等职业技术学校”并列。(“普通高校”在宏观领域是与高职高专(含/不含包括部分一本的应用型本科)并立的概念,在平时是包括本科高校和高职高专院校,区别于职工大学、开放大学等成人高校)。但是1986年国务院转发《国家教委等部门关于全国职业技术教育会议情况报告》指出“青年工人脱离本职工作需要,盲目追求高文凭”“应当为工人开辟一条进修提高的道路,完善工人技术等级制度,增设技师职务”“引导青年工人向中级、高级技工以致技师方向发展”,后来产生了技师学院,技师学院逐步由职业培训机构转化为职业学校。由于技工院校初中起点五、六年学制班无法取得大学文凭,劳动和社会保障部发文:技师学院要与高等学校联合办学。之后部分地区提出高级工班、(预备)技师班毕业生可以考编考公。人社部发2014(96)号明确将技师学院纳入高等学校序列。新的《职业教育法》规定:“根据高等职业学校设置制度规定,将符合条件的技师学院纳入高等职业学校序列”。(纳入后其功能、特色、管理体制应该不变)
1986年会议的决定(虽针对在职工人,同时也对中职生产生一定影响)使1985高职优先招收中职毕业生的政策受挫。1987国家教委印发了《普通高等学校招收少数中等职业学校毕业生应届毕业生的暂行规定》(职教师资班)明确高校招收职高毕业生采用“推荐+考试”方式;高校招收中专毕业生“推荐+复审”方式;技校毕业生升读劳动人事部所属天津职业技术师范学院(现在还有天职师大单招)。招生计划严格限制在应届毕业生总数的1%。1991年《关于高考改革有关问题的通知》明确职高推荐5%学生参加高考,中专、技校需毕业满两年(按照87《规定》中专技校应届毕业生报考职教师资班应该不用毕业满两年)。
1993年《中国教育改革与发展纲要》指出“中等与高等职业和普通教育共同发展,相互衔接”,体现鼓励中职毕业生升读大学的精神。1994年《关于中国教育改革和发展纲要的实施意见》更是明确“建立职业教育与其他教育相互沟通与衔接的立交桥”。
2002年《国务院关于大力推进职业教育改革与发展的决定》明确“扩大中等职业学校毕业生进入高等学校尤其是高等职业学校继续学习的比例”。当时很多地区中职毕业生报名高考人数猛增。
但是2006年国家限制高校对口招收中职毕业生数量不超过中职应届毕业生的5%,中职毕业生升学比例显著下滑。
为了提高中职教育吸引力,2010《国家中长期教育发展规划》明确要提高中职毕业生直接升学比例,高校对口招收中职生的比例不超过应届毕业生5%的规定取消。
国发2014(35)号将“中职学校毕业生报考高职”放在“普通高中毕业生报考高职”之前,回归1985年中央文件“高职应优先招中职毕业生”的精神。此文件将“高职院校”和“普通高校”并列,而非像之前将“普通本科高校”和“高等职业学校”并列,可能暗含向应用型转型的本科高校(包括部分重点本科)也应该招收中职毕业生的意思(另有国家文件指出“推动普通本科高校向应用型转型,重点举办职业本科教育”,不过没实现也不太可能会实现,后在应用型本科外另设职业本科)。
2016年3月11日,有政协委员提出:高等职业学校以招录中职毕业生为主,不少于1/2;转型高校或应用技术性较强的本科高校应不少于1/3;“211”“985”等一本院校中的应用技术型专业也应确定一定比例面向中职招生。由于相当一部分人士反对把中职办成升学教育,加之很多重点高校不愿招收中职毕业生,他的提议无法实现。但是2022年5月1日开始实施的《中华人民共和国职业教育法》的“高等职业学校和实施职业教育的普通高等学校应当在招生计划中确定相应比例或者采取单独考试办法,专门招收职业学校毕业生”也体现了他的思想。
现在招收中职毕业生的211大学(统招全日制)只剩下两所。(四川农业大学、湖南师范大学在本省对口高考中招生),但是仍有重点本科(河北师范大学)(通过对口高考)招收中职毕业生的比例约占全日制本科年度招生总计划的10%。(可在招生官网查询)
过去也有一些211、985在中职生参加的职教高考中投放计划,但现在不再招收中职毕业生了。如:A成都电子科技大学在90年代通过普通高校职教师资班对口招生考试招收中职毕业生(参考资料已标在前文)
B东南大学在2003年通过对口单招考试招收中职毕业生(参考资料:新浪新闻转载2003年8月13日的《扬子晚报》《江苏省2003年单招本一专业投档线公布》【EB/OL】https://edu.sina.cn/sa/2003-08-13/detail-ikftpnny8656084.d.html?from=wap
C西北农林科技大学职教师资班通过2010年山西省面向中等职业学校毕业生对口招生考试招收中等职业学校毕业生
依据:百度百科《山西省教育厅关于做好2010年中等职业学校毕业生对口升学考试工作的通知》
D中国矿业大学等高等学校招收普通中专、职业高中、技工学校毕业生和煤炭企业优秀青年
E厦门大学在2004年通过高等职业教育面向中等职业学校毕业生单独招生考试(现在高职院校分类考试的前身)招收计算机类、财经类、电子电气类、旅游类中职生https://m.docin.com/touch/p-933301.html?backPageNum=4福州大学也招
F天津大学17年之前在春季高考招收中职毕业生(职教师资班是本科层次,另有专科计划)
G同济大学在04年三校生高考中招生(上海青年报《三校生今年可直接考本科》)
H郑州大学本部和体育学院之前在对口高考中招收中职毕业生
I延边大学之前通过吉林省对口高考招收中职毕业生,2020年退出(eb/ol)1https://www.ybu.edu.cn/info/1054/3742.htm
2https://gaokao.eol.cn/ji_lin/dongtai/201903/t20190327_1651538.shtml
别的211招收中职毕业生的信息也看到过(如2003重庆大学采矿专业职教师资班、西南农业大学职教师资班在“三校生高职”考试中招生),但由于缺乏资料…东南大学之前通过对口单招考试招收中职生的信息是在类似贴吧的网站看到的,后找到依据,网络碎片化信息有时有用。
2019年取消专科高职招收中职毕业生比例限制。2021年中办、国办印发《关于推动现代职业教育高质量发展的意见》明确:“鼓励应用型本科学校开展职业本科教育。按照专业大致对口的原则,指导应用型本科学校、职业本科学校吸引更多中高职毕业生报考”。
(二)、中职毕业生升读全日制大学现状探析
现在一些内陆省份连普通高中毕业生都是大多直接就业而非升读大学,这样省份的中职、技校以直接就业为导向可能会合理些。
但是除了这些地区外,中职学生大多都非常渴望升入全日制大学,家长也过半希望子女升读全日制大学。即使在父母月收入不到1667(年收入低于两万)的中职生当中,升读大学意愿强烈的仍然占较高比例(包括子女升学意愿和父母升学意愿)。
中职的主体是学生,应该以生为本,为学生的自由和全面发展服务,绝不是为企业输送廉价劳动力或迎合部分强烈反对中职毕业生升学的专家意见。即便以直接就业为导向,也应把学生对实习单位和未来工作的满意度放在第一位,同时兼顾企业对廉价劳动力的需求。(有的中职教师强调对苦脏累专业学生加强所谓的“职业道德教育”,“学生过于强调个人利益,只想做技工不愿做普工”实质上就是迎合企业对廉价劳动力的需求,背离了学校教育以生为本、为学生全面发展服务的宗旨)
同时兼顾中职学生强烈的升学需求,理直气壮抓高考。参考资料1家庭文化资本对中职学生升学意愿的影响研究浙江师范大学学位论文周昊昊张棉好。2中职学生家长对子女升学的教育期望初探张文琦刘云波《高等职业教育探索(广州)》2020年第20203期51-57
3《中国职业教育发展大型问卷调查报告》教育家杂志2021年4月刊第4期
未来机械化会取代部分人力,但对于中小企业来说,机械化成本过高,仍需苦脏累险工作人员。部分人认为中职生上了大学后,就没人从事苦脏累险工作了,这是己所不欲施于人。从经济学角度来说,只要待遇足够优厚,苦脏累险类工作照样有人从事,这是符合共同富裕的国策。由于人力成本水涨船高,直接就业的中职毕业生也能从中受益。
同时,中职升学热有助于促进教育公平,江苏省教育厅干部眭平就在《扩大规模 公平竞争 体现特色 正确导向——对江苏省高校对口单招工作的思考》中指出“目前接受中职教育的绝大多数学生及其家庭大多处于经济、社会和文化的底层,是弱势群体,而教育机会均等的价值取向主要应是改变处于不利地位的社会阶层人员的教育状态,教育制度主要应帮助弱势群体改善生存状态,从而缩小因教育机会不均等带来的社会性的不公平。”“应更多地考虑增加从中职毕业生中对口招生的规模,这是高等教育体制改革的需要,是构建职业教育体系的需要,是实现高等教育机会均等和公平的需要”。
中职重视升学,有利于提高中职学校吸引力,获取优质生源;有利于促使学生认真学习,强化学校管理,使中职学校有良好的学风、校风,维护区域稳定。张雪彦《对“对口升学”考试的思考》和陈必山《中职教育教学改革实践探索—以安徽省定元化工学校为例》就说明了中职注重升学有利于招生。
如皋第一中专就是个鲜明的例子,从1992年开始办对口单招班,以极高的升学率吸引外省学子前来报读【EB/OL】https://mp.weixin.qq.com/s/HDP7xzEsRxKzF2gEXpcV2g【EB/OL】https://mp.weixin.qq.com/s/uW73MpBQC-iaNwgNZGIHpg【EB/OL】https://mp.weixin.qq.com/s/sA1V5qdETxsaT9sHL07V_A如皋中专和如皋第一中专互比本科率“对口单招本科上线人数全省第一”“对口单招本科上线率全省第一”这两个中专升学率和升学质量比一些普通高中还高,生源也比一些普通高中好。
像广东全日制公办本科招收中等职业学校毕业生数量、质量在境内24个省份中排倒数,因此中职学校很难以此吸引优质生源。但是从2018年开始,专科大学招收中职毕业生的数量大幅增加。2019粤府办文件将“中职毕业生报考高职”(表述为完善中职考试制度)放在“普通高中毕业生之前”,但是粤府文件又将普通高中报高职放在前面(参考:相关文件)
技工学校尤其是技师学院的职教高考参与度总体比职业高中、中专低很多,因为技师学院为了初中起点高级工班、预备技师班招生,这会在后文说明。
职教高考在不同的省份有较大差别,如名称、考试方式、录取方式、参与院校、报名条件等等。例如浙江的“单招”大致相当于四川的对口高考;浙江的提前招生相当于四川的单招。有的省份既有对口高考又有单招,江苏省对口单招是一回事,有的省份有单招没有对口。除了天津职业技术师范大学职教师资班面向技工院校毕业生单考单招和北京联合大学职教师资班单考单招外,境内有24个省份有全日制本科高校本科专业通过职教高考招收中职毕业生,每个省份职教高考名称不同,但都在招生录取中体现专业对口的原则。有关高校招生计划表上多把招收中职毕业生的专业科类标注为单独考试。以下列出24个省份职教高考名称及中职升本科计划。(辽宁取消中职升本,宁夏新增“应届中职毕业生报考应用本科”)
山东省春季高考,前身是高职对口考试(03年开始有本科批次)3+4中本贯通大学的质量更好。公办本科和民办本科招生计划都很多,网上一搜就有。
江苏省普通高校对口中等职业学校毕业生单独招生(中职职教高考)公办为主
安徽省应用型本科高校面向中等职业学校毕业生对口招生和分类考试招生
河北省普通高等学校对口招生(在网上搜索21河北对口本科批投档线,可以知道招生院校,再去招生院校官网搜索计划,直接查查不到)
四川省本科高校招收中职毕业生和专科高校招收中职毕业生(普通高校职教师资班和高职班对口招生考试)
湖南省普通高考职高对口类
另有初中起点六年制公费师范计划(特殊类型的中本贯通)
内蒙古自治区高等职业学校对口招收中等职业学校毕业生单独考试(有本科批次,直接在网上搜不到,可去内蒙古招生考试信息网-快捷导航-志愿填报-2021普通高考志愿填报专栏-招生计划-2021内蒙古普通高考招生计划-本科二批-计算机类等类别找,内蒙古师范大学、内蒙古农业大学、内蒙古工业大学采矿专业、内蒙古科技大学包头医学院、鄂尔多斯应用技术学院、集宁师范学院、呼伦贝尔学院、赤峰学院、河套学院)
浙江省单独考试(高等职业教育单独考试单独招生)很多一本参加
广西普通高考—本科对口中职
山西省中等职业学校对口升学考试,现在一批本科计划和2014年相比减少了不少
河南省普通高等学校对口招收中等职业学校毕业生考试
陕西省普通高等学校职业教育单独招生,具体计划百度一搜就有
福建省高职分类招生考试(中职生类)可在教育考试院下载计划
重庆市春季高考面向中职生的高职对口类
云南省高等职业技术教育本、专科招收普通中专、职业高中、技工学校毕业生考试
湖北省技能高考(前身职(成)教师资班对口招生、高职统考)湖北工业大学、湖北理工学院、湖北民族大学、湖北汽车工业学院、湖北第二师范学院、湖北经济学院等退出技能高考招生。05年之前招收中职毕业生的高职统考本科计划的数量、质量都比较好(《湖北招生考试》2005年8月号上半月P150-P152)
黑龙江省中等职业学校毕业生专业对口升学考试 吉林省高等职业教育对口升学考试
陕西省普通高等学校职业教育单独招生
甘肃省中职升学考试重庆市高职分类考试应用型本科和高职院校对口招收中等职业学校毕业生
江西省“三校生”对口升学考试
广东省普通高校招收中等职业学校毕业生统一考试(春季高考高职3+证书)
天津春季高考(中职生类)
上海市普通高校面向应届中等职业学校毕业生招生考试未标注的都是招生计划在百度上可以直接搜的到的
二、教育系统中职和技工院校区别
(一)、各类中职细化分类、历史渊源
现在基本所有人都知道普通高中和中职学校的区别,但除了业内人士外,知道教育系统中职和技工学校尤其是技师学院的区别的人很少,对于学生来说,最显著的区别就是上职高中专三年后通过职教高考升读全日制大学,在技工院校上初中起点高技工班、预备技师班五六年后也无法获得全日制大学文凭(也有部分省份很多技工院校开设高考班),但是新的《中华人民共和国职业教育法》明确“根据高等职业学校设置制度规定,将符合条件的技师学院纳入高等职业学校序列”,若干年后这些问题就不会有了。
教育系统中职
1普通中专(含中等师范学校)2职业高中(有时会把职业中专算进来)职业初中退出历史舞台3成人中专
有时上述机构的界限不明确,会以“职业技术学校”“职教中心”等笼统的名称出现(80文件将职业中学、职业技术学校并列学但现在没差别),个别职业高中名字和普通高中无异,如“深圳市盐港中学”。
过渡机构
双挂牌机构、技校技师学院内设的中专部、职业高中部(对口高考部)、中职内技工班
人社系统技工学校、技师学院
职业高中除了80年代由普通中学转设而来的之外,还有部分前身是五六十年代的农业中学(含林/牧/渔业中学)、工业中学。一开始职业中学、农业中学可能是互不相属的(1980《关于改革中等教育结构的报告》)
中专、技校建国后就有,一开始中专是高等教育的一部分,直到80年代还“不能简单的把中专划为中等教育”高中后中专在高考本科、高专、高职和电大普通班(00后高职和高专的文凭一模一样,之前不一样)后招生。现在还有高中后一年制中专,这类学生和普高转学生经常抢占初中起点中职毕业生升学机会(有的地方规定对口升本科只能是初中起点应届中职毕业生报名)。
1986年国务院转发《国家教委等部门关于全国职业技术教育会议情况报告》指出应当为(在职)工人开辟一条进修提高的道路,完善工人技术等级制度,增设技师职务、引导青年工人向中级、高级技工以致技师方向发展。后来产生了技师学院,技师学院逐步由职业培训机构转化为职业学校。由于技工院校初中起点五、六年学制班无法取得大学文凭,劳动和社会保障部发文:技师学院要与高等学校联合办学。人社部发2014(96)号明确将技师学院纳入高等学校序列。新的《职业教育法》规定:“根据高等职业学校设置制度规定,将符合条件的技师学院纳入高等职业学校序列”。
(二)各类中职职教高考参与度
笔者看了几百个后缀为“职业技术学校”“职业高级中学”“中专”“职教中心”“某业学校”“师范学校”“…”“技工学校”“技师学院”的微信公众号里的招生简章(无法一一标注),得出以下结论:职业高中和中专普遍都重视职教高考,在其公众号搜索“高考”(结合不同省份不同情况用不同关键词搜索(“对口”“单招”“三校生”“高职”“3+证书”等))过去中专升学率比职高低、现在基本没什么区别。
“双挂牌机构”则不如单纯的职高、中专重视升学(也有一些特别重视)。没有高级工招生任务的技工学校也大多重视高考,但高考参与度低于职高、中专。
技师学院职教高考参与度与所在省份有很强的关系。如河南很多技师学院内设职高部(对口高考部),湖北很多技师学院内设技能高考班,广西大多技师学院招生简章都有提“本科对口中职”,陕西、安徽、云南江苏部分技师学院有高考班、山西、内蒙古、黑龙江很多技师学院内设高考班,山东大多数技师学院设春季高考班……
而在广东、福建、湖南、浙江、四川等地区大多数技师学院为了初中起点长学制班招生不参加职教高考,但会和成人高校、继续教育学院联合办学,组织学生参加成考、自考或让学生报名电大,少数技师学院取消和成人高校(继续教育学院)联合办学的计划(对比近几年招生简章),原因可能是学生认为这样还不如在第三年“跑路”参加职教高考升读全日制大学,不利于高级工班招生。在一些网络平台上有些网友呼吁“要去职高、别去技校”,解决这一问题的治本之策就是把技师学院列入高校序列,使技师学院拥有普通高等教育文凭颁发资格(李立文《论“技师学院”高等化》),现在已经把“将符合条件的技师学院纳入高等职业学校序列”写入法律。也有少部分技师学院有组织学生参加天津职业技术师范大学单考单招或本省份职教高考,有的技师学院虽然不组织学生参加全日制高考,但会和高校联办“三二分段”“五年一贯”(具体名称因省有异)。
综上,各类中职职教高考参与度:
综合高中大于职业高中、中专大于双挂牌机构大于民办技校、没有高级工招生任务的技校大于技师学院。
三、附注
本人对这块感兴趣始于看到一些宣传“中考录取率比高考录取率低,考高中比考大学难”的偷换概念的文章,高考作为第一大考,其社会关注程度、影响力肯定高于中考。这一类文章把包括高职的大学率和不包括中职的高中率做比较,属于典型的直接的偷换概念,应该拿普通本科高校录取率和普通高中录取率、高考总录取率和高中阶段学校总录取率做比较。中等职业学校也是高级中等教育学校的重要组成部分,即中职也是高中。如果说部分中职名称中不含有“高级中学”而不是高中阶段学校,那按照50年代政务院将高等学校划分为大学、专门学院、专科学校的规定,职业技术学院(前身高等职业技术学校)、专科学校不是大学?显然不是。此外,这类文章还宣传“考不上(普通)高中无缘大学”,其实是乱说。中职毕业生也可以通过对口职教高考升读全日制大学。笔者写这篇文章目的是:1让更多人知道中职毕业生可以通过对口职教高考升读全日制大学2一开始是想让别人知道职高、中专、技校尤其是技师学院的区别(上文已述),不过新的《中华人民共和国职业教育法》规定“根据高等职业学校设置制度规定,将符合条件的技师学院纳入高等职业学校序列”,以后技师学院会在保持特色的基础上拥有高等教育文凭授予权,若干年后也就不会有这一目的了。本人在参考专家的文章时也发现专家李红卫文章存在的个别瑕疵,这是本人的小小成果。如李红卫在河北师范大学学报《教育科学版》(J)2012,9发表的《我国职业学校学生升学制度变迁研究》就认为1985中央的决定明确高职优先招收中职毕业生,体现鼓励中职生深造的精神,但是1987《国家教委关于普通高等学校招收少量中等职业学校毕业生的暂行规定》却规定招生总数不能超过应届毕业生的1%,作者认为这“可能是考虑到该项政策还处于试点阶段”。但其实原因不是该项政策处于试点阶段,而是1986《国务院转发{国家教委等部门关于全国职业技术教育工作会议情况报告}的通知》认为“青年工人脱离本职工作需要盲目追求高文凭、应为工人开辟一条进修提高的道路,引导青年工人向中级、高级技工以致技师方向发展”而把1985《中共中央关于教育体制改革的决定》中“高职优先招中职毕业生和一线职工”结论推翻,这也可以解释专家提出“为什么85年就推出高职优先招中职毕业生的政策,直到97年才出台具体规定”。86的政策造成技师学院无文凭的后遗症,不过现在已经将“把符合条件的技师学院纳入高等职业学校序列”写入国家法律。
此外,由于条件限制、无法获取部分相关资料(如网上搜不到02~05部分省份中职生对口高考计划、90年代职教师资班对口招生计划)……造成掌握的信息不够丰富。
写完了,谢谢观看。
*请认真填写需求信息,我们会在24小时内与您取得联系。