決編程謎題游戲是提高開發邏輯和解決問題能力的一種有趣手段。此外,當你嘗試熟悉一門新的編程語言時,解決這類編程語言的謎題游戲可以幫助你加快學習過程。
無論你是一個編程新手,還是想要增強你現有的技能,或渴望掌握最熱門的編碼語言,以下文章中介紹的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年教育部、勞動總局《關于改革中等教育結構改革的報告》明確“職業(技術)學校、職業中學、農業中學的畢業生,可以報考高等院校。報考對口專業的考生,考試成績在同一分數段內,優先錄取”?,F在很多省份中職生參加的高考都叫對口高考,或錄取中體現專業對口的原則。當時這個考試只面向職高,不面向中專、技校。從此文件得出,1980年把除了普通高中外的高中階段學校劃分為若干類型?!奥殬I(技術)學校”是獨立于職業中學(可能包括工業中學)、農業中學(含農/林/牧/漁業中學)、中等專業學校、技工學校之外的,這可能是一些網友中職和中專不同論的“理論初始來源”。(但是五十年代政務院把中等專業學校和技工學校同樣劃為中等技術學校的范圍內,有人認為職業教育和技術教育不同,但王明達“我看沒什么區別”)。現在一般表述為“中職(含/不含技校)”,狹義的中職即教育系統中職。
1985年《中共中央關于教育體制改革的決定》明確:高等職業技術學校(不含高專的??拼髮W前身)優先招收中職畢業生和一線產業工人。此文將“普通大學”和“高等職業技術學校”并列。(“普通高?!痹诤暧^領域是與高職高專(含/不含包括部分一本的應用型本科)并立的概念,在平時是包括本科高校和高職高專院校,區別于職工大學、開放大學等成人高校)。但是1986年國務院轉發《國家教委等部門關于全國職業技術教育會議情況報告》指出“青年工人脫離本職工作需要,盲目追求高文憑”“應當為工人開辟一條進修提高的道路,完善工人技術等級制度,增設技師職務”“引導青年工人向中級、高級技工以致技師方向發展”,后來產生了技師學院,技師學院逐步由職業培訓機構轉化為職業學校。由于技工院校初中起點五、六年學制班無法取得大學文憑,勞動和社會保障部發文:技師學院要與高等學校聯合辦學。之后部分地區提出高級工班、(預備)技師班畢業生可以考編考公。人社部發2014(96)號明確將技師學院納入高等學校序列。新的《職業教育法》規定:“根據高等職業學校設置制度規定,將符合條件的技師學院納入高等職業學校序列”。(納入后其功能、特色、管理體制應該不變)
1986年會議的決定(雖針對在職工人,同時也對中職生產生一定影響)使1985高職優先招收中職畢業生的政策受挫。1987國家教委印發了《普通高等學校招收少數中等職業學校畢業生應屆畢業生的暫行規定》(職教師資班)明確高校招收職高畢業生采用“推薦+考試”方式;高校招收中專畢業生“推薦+復審”方式;技校畢業生升讀勞動人事部所屬天津職業技術師范學院(現在還有天職師大單招)。招生計劃嚴格限制在應屆畢業生總數的1%。1991年《關于高考改革有關問題的通知》明確職高推薦5%學生參加高考,中專、技校需畢業滿兩年(按照87《規定》中專技校應屆畢業生報考職教師資班應該不用畢業滿兩年)。
1993年《中國教育改革與發展綱要》指出“中等與高等職業和普通教育共同發展,相互銜接”,體現鼓勵中職畢業生升讀大學的精神。1994年《關于中國教育改革和發展綱要的實施意見》更是明確“建立職業教育與其他教育相互溝通與銜接的立交橋”。
2002年《國務院關于大力推進職業教育改革與發展的決定》明確“擴大中等職業學校畢業生進入高等學校尤其是高等職業學校繼續學習的比例”。當時很多地區中職畢業生報名高考人數猛增。
但是2006年國家限制高校對口招收中職畢業生數量不超過中職應屆畢業生的5%,中職畢業生升學比例顯著下滑。
為了提高中職教育吸引力,2010《國家中長期教育發展規劃》明確要提高中職畢業生直接升學比例,高校對口招收中職生的比例不超過應屆畢業生5%的規定取消。
國發2014(35)號將“中職學校畢業生報考高職”放在“普通高中畢業生報考高職”之前,回歸1985年中央文件“高職應優先招中職畢業生”的精神。此文件將“高職院?!焙汀捌胀ǜ咝!辈⒘?,而非像之前將“普通本科高?!焙汀案叩嚷殬I學校”并列,可能暗含向應用型轉型的本科高校(包括部分重點本科)也應該招收中職畢業生的意思(另有國家文件指出“推動普通本科高校向應用型轉型,重點舉辦職業本科教育”,不過沒實現也不太可能會實現,后在應用型本科外另設職業本科)。
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年之前在春季高考招收中職畢業生(職教師資班是本科層次,另有??朴媱潱?/span>
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年中辦、國辦印發《關于推動現代職業教育高質量發展的意見》明確:“鼓勵應用型本科學校開展職業本科教育。按照專業大致對口的原則,指導應用型本科學校、職業本科學校吸引更多中高職畢業生報考”。
(二)、中職畢業生升讀全日制大學現狀探析
現在一些內陸省份連普通高中畢業生都是大多直接就業而非升讀大學,這樣省份的中職、技校以直接就業為導向可能會合理些。
但是除了這些地區外,中職學生大多都非??释肴罩拼髮W,家長也過半希望子女升讀全日制大學。即使在父母月收入不到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后高職和高專的文憑一模一樣,之前不一樣)后招生?,F在還有高中后一年制中專,這類學生和普高轉學生經常搶占初中起點中職畢業生升學機會(有的地方規定對口升本科只能是初中起點應屆中職畢業生報名)。
1986年國務院轉發《國家教委等部門關于全國職業技術教育會議情況報告》指出應當為(在職)工人開辟一條進修提高的道路,完善工人技術等級制度,增設技師職務、引導青年工人向中級、高級技工以致技師方向發展。后來產生了技師學院,技師學院逐步由職業培訓機構轉化為職業學校。由于技工院校初中起點五、六年學制班無法取得大學文憑,勞動和社會保障部發文:技師學院要與高等學校聯合辦學。人社部發2014(96)號明確將技師學院納入高等學校序列。新的《職業教育法》規定:“根據高等職業學校設置制度規定,將符合條件的技師學院納入高等職業學校序列”。
(二)各類中職職教高考參與度
筆者看了幾百個后綴為“職業技術學校”“職業高級中學”“中?!薄奥毥讨行摹薄澳硺I學?!薄皫煼秾W?!薄啊薄凹脊W?!薄凹紟煂W院”的微信公眾號里的招生簡章(無法一一標注),得出以下結論:職業高中和中專普遍都重視職教高考,在其公眾號搜索“高考”(結合不同省份不同情況用不同關鍵詞搜索(“對口”“單招”“三校生”“高職”“3+證書”等))過去中專升學率比職高低、現在基本沒什么區別。
“雙掛牌機構”則不如單純的職高、中專重視升學(也有一些特別重視)。沒有高級工招生任務的技工學校也大多重視高考,但高考參與度低于職高、中專。
技師學院職教高考參與度與所在省份有很強的關系。如河南很多技師學院內設職高部(對口高考部),湖北很多技師學院內設技能高考班,廣西大多技師學院招生簡章都有提“本科對口中職”,陜西、安徽、云南江蘇部分技師學院有高考班、山西、內蒙古、黑龍江很多技師學院內設高考班,山東大多數技師學院設春季高考班……
而在廣東、福建、湖南、浙江、四川等地區大多數技師學院為了初中起點長學制班招生不參加職教高考,但會和成人高校、繼續教育學院聯合辦學,組織學生參加成考、自考或讓學生報名電大,少數技師學院取消和成人高校(繼續教育學院)聯合辦學的計劃(對比近幾年招生簡章),原因可能是學生認為這樣還不如在第三年“跑路”參加職教高考升讀全日制大學,不利于高級工班招生。在一些網絡平臺上有些網友呼吁“要去職高、別去技校”,解決這一問題的治本之策就是把技師學院列入高校序列,使技師學院擁有普通高等教育文憑頒發資格(李立文《論“技師學院”高等化》),現在已經把“將符合條件的技師學院納入高等職業學校序列”寫入法律。也有少部分技師學院有組織學生參加天津職業技術師范大學單考單招或本省份職教高考,有的技師學院雖然不組織學生參加全日制高考,但會和高校聯辦“三二分段”“五年一貫”(具體名稱因省有異)。
綜上,各類中職職教高考參與度:
綜合高中大于職業高中、中專大于雙掛牌機構大于民辦技校、沒有高級工招生任務的技校大于技師學院。
三、附注
本人對這塊感興趣始于看到一些宣傳“中考錄取率比高考錄取率低,考高中比考大學難”的偷換概念的文章,高考作為第一大考,其社會關注程度、影響力肯定高于中考。這一類文章把包括高職的大學率和不包括中職的高中率做比較,屬于典型的直接的偷換概念,應該拿普通本科高校錄取率和普通高中錄取率、高考總錄取率和高中階段學??備浫÷首霰容^。中等職業學校也是高級中等教育學校的重要組成部分,即中職也是高中。如果說部分中職名稱中不含有“高級中學”而不是高中階段學校,那按照50年代政務院將高等學校劃分為大學、專門學院、專科學校的規定,職業技術學院(前身高等職業技術學校)、??茖W校不是大學?顯然不是。此外,這類文章還宣傳“考不上(普通)高中無緣大學”,其實是亂說。中職畢業生也可以通過對口職教高考升讀全日制大學。筆者寫這篇文章目的是:1讓更多人知道中職畢業生可以通過對口職教高考升讀全日制大學2一開始是想讓別人知道職高、中專、技校尤其是技師學院的區別(上文已述),不過新的《中華人民共和國職業教育法》規定“根據高等職業學校設置制度規定,將符合條件的技師學院納入高等職業學校序列”,以后技師學院會在保持特色的基礎上擁有高等教育文憑授予權,若干年后也就不會有這一目的了。本人在參考專家的文章時也發現專家李紅衛文章存在的個別瑕疵,這是本人的小小成果。如李紅衛在河北師范大學學報《教育科學版》(J)2012,9發表的《我國職業學校學生升學制度變遷研究》就認為1985中央的決定明確高職優先招收中職畢業生,體現鼓勵中職生深造的精神,但是1987《國家教委關于普通高等學校招收少量中等職業學校畢業生的暫行規定》卻規定招生總數不能超過應屆畢業生的1%,作者認為這“可能是考慮到該項政策還處于試點階段”。但其實原因不是該項政策處于試點階段,而是1986《國務院轉發{國家教委等部門關于全國職業技術教育工作會議情況報告}的通知》認為“青年工人脫離本職工作需要盲目追求高文憑、應為工人開辟一條進修提高的道路,引導青年工人向中級、高級技工以致技師方向發展”而把1985《中共中央關于教育體制改革的決定》中“高職優先招中職畢業生和一線職工”結論推翻,這也可以解釋專家提出“為什么85年就推出高職優先招中職畢業生的政策,直到97年才出臺具體規定”。86的政策造成技師學院無文憑的后遺癥,不過現在已經將“把符合條件的技師學院納入高等職業學校序列”寫入國家法律。
此外,由于條件限制、無法獲取部分相關資料(如網上搜不到02~05部分省份中職生對口高考計劃、90年代職教師資班對口招生計劃)……造成掌握的信息不夠豐富。
寫完了,謝謝觀看。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。