




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
跟我學(xué)馬頭琴-基礎(chǔ)教程擊弓這種演奏法是演奏者利用弓子的彈性,用弓毛敲擊琴弦彈起后再敲擊來演奏的。這種演奏法所獲得的音質(zhì)是輕巧而富有彈性。在馬頭琴演奏中,常用左半弓或偏左中弓來演奏。演奏時,手腕不能過緊、過僵,也不能過松。主要用下臂和手腕的密切配合來演奏。擊弓的符號是“”。為了記譜方便,有時不在每個音上都作出標(biāo)記,而是用“下同”的標(biāo)記法來標(biāo)出需用去弓演奏的樂段跳弓跳弓可分為二種,一種是自然跳弓,另一種是人工跳弓。a.演奏自然跳弓時,人為的力度要小一些,主要是利用弓子自己的彈性。演奏時,右手的各個部位不得緊張,手腕及手指放松到能握住弓子即可。食指和中指松弛地放在弓桿上,無名指和小指勾住弓毛,拇指稍壓緊弓柄。運(yùn)弓要平行。最適合拉自然跳弓的部位是中弓和偏左中引這種弓法演奏比較均勻的快速曲子很適宜。演奏時,弓毛最好不要寓弦。b.演奏人工跳弓時,人為的力度較大些,小臂和手腕及手指稍加控制弓子。與自然跳寫的不同之處是弓毛離開琴弦。這種弓法演奏慢一點(diǎn)的樂曲很適宜。還可以演奏漸慢和漸快的樂曲。最適合做人工跳弓演奏的弓子部位是中弓或偏右中弓處。跳弓的符號是“?”長樂段的跳弓也可用“……下同……”標(biāo)記法表示。對以上兩種弓法,可以根據(jù)樂曲的速度靈活地交替運(yùn)用。演奏者還可以根據(jù)自已弓子的彈性、樂曲的速度及里外弦的具體情況靈活地運(yùn)用弓子的不同部位。自然跳弓的練習(xí)方法,首先要從運(yùn)用中弓開始。盡可能用快和短的分弓,把弓子的重心點(diǎn)牢牢均壓在弦上,不叫弓子跳動。做第二步練習(xí)時,用同一個方法,但不加壓力,使弓子自然跳起。這時要注意右手各部位不得緊張僵硬。跳弓時,弓毛不能跳得太高,要求弓毛碰弘時間短促,音質(zhì)干凈、清楚。索格斯日赫弓這種弓法是快而短促的分弓;是馬頭琴演奏長調(diào)歌曲時經(jīng)常應(yīng)用的一種弓法。奏法是在一個長時值音的中間或后半部分用弓尖或左半弓迅速地來口拉奏一下,奏出兩三個同青反復(fù)的裝飾音。它的符號是“”。這一弓法實(shí)際上就是當(dāng)一弓拉不完一個長時值音時的補(bǔ)充手段。使用這種弓法時,腕部要放松。同時還要根據(jù)樂曲的情緒靈活運(yùn)用。雙弓這種弓法實(shí)際上是每個音符奏兩弓(一推一拉)的意思,一般出現(xiàn)在快速演奏中,其符號為音符右下方的“`”或樂曲的開頭注上“雙弓”。指法指法常識馬頭琴的指法不同于其它各種弓弦樂器。它不但有獨(dú)特的按弦法,而且有獨(dú)特的指法,從而形成了自己獨(dú)特的民族鳳格。如果這種特殊指法掌握不好,那么民族風(fēng)格也就無法體現(xiàn)了現(xiàn)在將指法技巧介紹如下:(1)手指按弦法一般拉弦樂器,演奏時都是從正面壓弦,馬頭琴則不同,它是用食指和中指的指甲根從左向右頂弦,無名指和小指是用指尖從左向右頂弦,小指夠不著里弦時,它從外弦底下伸過去頂里弦(奏外弦時直接頂弦)。一般初學(xué)者可以把指甲留得稍長,以避免手指從弦上滑落。(2)手指起落手指頂弦奏出不同的樂音后,不要抬得過高,否則會影響演奏速度和人為地造成手指的緊張和僵硬。另外,因?yàn)轳R頭琴的音位間隔比較寬,(特別是一、二把位的音位),所以手部要放松,手指自然張開,不要擠在一起,否則容易造成手指不按在音位上,演奏出來的音也就不準(zhǔn)了。手指頂弦力量過大,音質(zhì)會發(fā)問,還會造成樂音偏高,而且影響手指的靈活性。頂弦力量過小,則音質(zhì)不結(jié)實(shí)、蒼白,產(chǎn)生飄音和雜音。所以要在練習(xí)中,仔細(xì)尋找項弦所需要的最適當(dāng)?shù)牧Χ取#?)音準(zhǔn)問題音準(zhǔn)與不準(zhǔn),關(guān)鍵在于手指是否按在準(zhǔn)確的音位上。因?yàn)檠葑鄷r有快慢不同,有時可能按得偏低或偏高,同時馬頭琴是從側(cè)面頂弦,有時可能頂過勁而使音偏高不準(zhǔn),這一點(diǎn)主要*演奏者的聽覺來辨別,這就需要演奏者在平時加強(qiáng)聽覺訓(xùn)練,熟悉各種調(diào)性、調(diào)式的音階,提高識別音的能力。另外,要養(yǎng)成按規(guī)定指法來演奏的習(xí)慣,熟悉琴的把位和音位,逐漸達(dá)到“觸弦即準(zhǔn)”的程度。這里,還需要特別提到的是,馬頭琴是四度定弦樂器,換把是極其頻繁的,往往在倒換把位時容易出現(xiàn)音不準(zhǔn)的現(xiàn)象,這就需要演奏者在平時努力掌握各把的音位以及音位與音位之間的距離等問題。要做到“觸弦即準(zhǔn)”,就必須在“練”字上下功夫,逐漸使自己的臂、手、指對移動距離和位置形成直感,并將這種感覺與聽覺統(tǒng)一起來,達(dá)到發(fā)音準(zhǔn)確的目的。2.指法技巧(1)換把a(bǔ).滑指換把。它不但是一種換把方式,也是演奏蒙古族樂曲表現(xiàn)民族風(fēng)格的一種手段。換把的速度分快慢兩種,由樂曲的內(nèi)容和情緒的需要而定。慢滑指換把一般用在速度較慢的樂曲中,快滑指換把一般用在歡快的樂曲上。b.跳指換把。在蒙古族樂曲中,八度和八度以上的大跳是很多的。遇到這種情況時,要用到跳指換把。在跳指換把時,一種是直接跳到所需要的音位上,另一種是當(dāng)需要奏出二、三、四指等音位上的樂音時。仍然將一指跳到一指的音位,再用二、三、四指立即接到所需要的音位上。這時的一指只是個“經(jīng)過音”。這個“經(jīng)過音”在練習(xí)跳指換把時是很重要的,它可以幫助演奏者較為準(zhǔn)確地奏出換把后的音來,待熟練后,再把“經(jīng)過音”去掉,但是一指一定要在“經(jīng)過音”的位置。在跳指換把過程中,要手指離弦。不帶出任何聲響(而滑指換把則是手不離弦),一定要減輕手指觸弦的力度,否則由于弓子相應(yīng)增加力度,會發(fā)出由弱到強(qiáng)又從強(qiáng)到弱的()滑音。無論使用哪一種換把,演奏時都要注意左腕的帶動(提)動作,即無論上跳或下跳的換把都要手腕先行,手指在手腕的帶動下進(jìn)行。待從此把位滑(或跳)至另一把位后,再將。左手腕與左手各部位的姿勢還原。否則,手腕如果與手指同時行動,就會造成手腕緊張、僵硬,影響正常換把。在換把過程中,要注意將左手虎口放松,切忌緊夾琴桿,否則,會影響換把速度和靈活性、準(zhǔn)確性,給演奏帶來不良后果。練習(xí)經(jīng)過音時,請參看下面的例子:(2)同音打弦裝飾音(符號是“tr”或“三”、“四”)同音打弦裝飾音是是馬頭琴演奏的特殊技巧之一,同時也是表現(xiàn)蒙古族音樂風(fēng)格的具體手段之一。這種指法技巧的運(yùn)用有兩種方式,一種是在節(jié)拍的后面出現(xiàn),另一種是在節(jié)拍前面出現(xiàn)。它們的特點(diǎn)是在用二度和三度音位時,用二、三、四指打弦。如一指奏著旋律音,那么就用二、三、四指在不同音位上打弦奏出;若二指奏旋律音,則用四指打弦奏出;若三指奏旋律音,也用四指打弦奏出。從音位上講,雖然是6—6i或6—6i,奏著(或)不同音位的打弦,但奏出的效果是的音響效果。上面雖然是在不同音位打弦,但是所奏出的效果不是所打音位的實(shí)音,而是所奏音的同音裝飾音。手指打幾下弦則是幾個同音裝飾音。例如打三下,則是66的效果。在演奏四、五連音時,節(jié)奏要稍快一點(diǎn),二、三連音稍慢一點(diǎn)。在馬頭琴演奏中,一般是一指按弦時三指打弦;二、三指按弦時,四指打弦。但是在三輪按弦四指打弦時,是在高把位應(yīng)用,因?yàn)楦甙盐灰粑痪嚯x短,所以可以打出大小三度音位的打弦。(3)顫指(符號“tr”)顫指的指法技巧,是從西洋小提琴等弦樂器的演奏技巧上移植過來的。一般演奏現(xiàn)代樂曲和其它民族樂曲時應(yīng)用,在民間和傳統(tǒng)演奏中很少應(yīng)用。它與同音裝飾音所不同的是奏出打音的實(shí)音,從而同旋律音反復(fù)奏出打弦音。演奏時,手指要放松,用手指的彈性來打弦。例如:1=D顫指在練習(xí)中,容易出現(xiàn)的毛病有:①拇指過于緊張;②手腕僵硬;③按在弦上的手指過分用力頂弦;④手指抬得過高而影響速度;⑤手指拾得不夠高,沒有彈力或節(jié)奏不穩(wěn),忽快忽慢等。糾正方法:手臂、腕部和手指既要放松,同時又要有控制地演奏。(4)同音打弦這種演奏法不同于同音裝飾音的地方,只是所打的音不是裝飾音,而是旋律中的基本音。在演奏時所用的方法與同音裝飾音一樣。它也是蒙古族音樂風(fēng)格的表現(xiàn)手法之一,這種奏法,有著深沉、飽滿而又強(qiáng)烈激動的特點(diǎn)。它沒有過多換弓造成的斷續(xù)感覺。同音打弦一般用連弓演奏。例如。在這一例子中,第一小節(jié)中的“335”的第二、三個“8”音就是用打弦的方法獲得的。同樣第二小節(jié)的兩個“5”音也是用打弦指法獲得的。用第幾指打弦可以用數(shù)字和括號來表示。如前例中的(三)一樣。從這一例中,我們可以看到記譜是:“3”音都是三指在“5”音的音位上打孩出來的。第二小節(jié)的第一、二個a6”音是第三指在“7”音的音位上打弦奏出的,這的第—指都不抬起。同音打弦法關(guān)鍵在于打弦不改變旋律音的性質(zhì),只給旋律音一個“間斷”的感覺。手指不是壓在弦上,而是打在弦上,需要手指富有彈性,如果是手指壓在弦上,就會使原旋律音變成所壓音位的實(shí)音。(5)滑音馬頭琴在演奏蒙古族樂曲時,經(jīng)常運(yùn)用滑音來表現(xiàn)樂曲的情感。這也是一種特殊的表現(xiàn)手法。一般常用的滑音有三種。①上滑音(符號是“,”)上滑音是從所奏的旋律音滑向上面的旋律音。一般是向它上方三度以上的旋律音跳進(jìn)時運(yùn)用上滑音。例如:實(shí)際演奏法是:355滑音是用前面演奏的同一手指滑向另一個旋律音的。②下滑音(符號“、”)下滑音是從所演奏的旋律音向下滑到另一個旋律音。實(shí)際演奏法是:……。實(shí)際演奏法是:③回滑音(符號是“八”)回滑音也是在演奏蒙古族樂曲時常常運(yùn)用的一種演奏方法。一般以大二度音程關(guān)系、小三度音程關(guān)系和大已度音程關(guān)系的方式出現(xiàn),同時以快速回滑二、三、四次的方式演奏。演奏時不換把位,常用三指或四指演奏。實(shí)際演奏法上:這種回滑音一般用在節(jié)拍的最后一拍的前半拍之前,往往是一弓奏出的。在長音處,有時也根據(jù)樂曲的情緒在回滑音之前用索格斯日赫弓法。用這種弓法的演奏效果是:這種處理是自由的色彩性處理,往往是由演奏者和歌者的臨時情緒的高漲而油然產(chǎn)生的。(6)和音馬頭琴常常較多地采用雙和音來演奏。一般在按一根弦的同時,同另一根空弦形成二三、四、五六、七、八度和音。另一種較為普遍地是用拇指從里弦右側(cè)第二把位上觸弦形成純四度或八度的泛音和音。目前除了采用這些和音方式演奏以外,還吸收了中外弦樂器演奏方法。用雙指(一指和二指)同時觸弦奏出雙弦上的雙實(shí)音和音,從而可以奏出二三、四、五、六、七、八度的實(shí)音和音。(7)揉弦揉弦演奏法是表現(xiàn)樂曲各種感情變化的極有力手法,馬頭琴的揉弦又有它自己的特殊性。揉弦是用手指上下滾動頂指得到的勇音效果。揉弦的力量主要來自左上臂,再通過下管來帶動手腕和手指,是由各部分的有機(jī)配合來完成揉弦任務(wù)的。探弦時,左手手指頂弦力度要適當(dāng),左上管、下臂、腕子和手指要適當(dāng)放松,不能但硬,要有韌性。這種奏法適合中板或較慢的樂曲,可以表現(xiàn)比較細(xì)膩的、深思的及悲傷的樂曲。揉弦時,要根據(jù)樂曲的內(nèi)容和感情的變化來改變?nèi)嘞业姆取K俣嚷臉非?,揉弦的幅度要大一些;速度較快的樂曲,揉弦的幅度要小一些。另外,各種情感、情緒的樂曲同用弓的力度有極密切的關(guān)系.因此探弦是同一定的音質(zhì)、音量都互相關(guān)聯(lián)著。一般地講,在低把位時揉弦幅度要大一些,在高把位時要小一些。揉弦容易出現(xiàn)的問題有以下幾種:①頂弦指的力度過小,是因?yàn)樯媳?、下臂以及手腕過分緊張,各部位沒有放松。因而力量集中在上臂沒有傳到手指上。也可能是由于上管、下管及腕部過分放松,沒有真正地頂住弦,從而造成了蒼白和空飄的音質(zhì)。糾正的辦法是:對于前一種情況,在練習(xí)時,上、下管和腕部要適當(dāng)放松,手指要有韌勁,頂住琴弦,慢慢地練習(xí)。對于后一種情況,練習(xí)時要適當(dāng)加強(qiáng)上、下臂和腕部的力度,手指頂好弦后再練。②揉弦時,由于手指和腕部過于僵硬,上、下臂擺動過大,因而造成揉弦的幅度很大,發(fā)出來的聲音不均勻,不準(zhǔn)確,音波忽大忽小、忽高忽低,聽起來很不舒服。糾正方法:手腕要放松,縮小下臂的擺動幅度,使手腕和手指更多地參加揉弦動作,讓手指的滾動幅度和快慢均勻。(8)保留指保留指的演奏法是在低于正在演奏著的音位上,把其它沒有參加演奏的手指,按指法頂在弦上的一種預(yù)備指法動作。它的特點(diǎn)在于:把不參加演奏的手指,按音位輕輕地頂在弦上,這樣既保證了發(fā)音的準(zhǔn)確,也不影響速度和換把,同時減少了指法的混亂,因而保證了樂曲進(jìn)行的速度。當(dāng)一指賣完二指按弦時,一指不用抬起,繼續(xù)輕輕頂住弦。當(dāng)一指滑到上一把位的音位后,也象前一把那樣頂弦。特別是速度快起來時,就更沒有拾指的機(jī)會,如果抬指就會影響速度和樂曲的進(jìn)行。(9)彈弦(符號是“+”)彈弦是用左手的一指或二指從弦的里面往外彈弦(右手的琴弓同時拉弦)?;蛘呤窃趶椣业耐瑫r用弓擊弦,奏出擊鼓節(jié)奏。彈弦時,手指要有力度。這是第一種邊拉迪彈的形式。這是先彈后擊的彈撥擊弓奏法。(10)撥弦(符號是“piZZ”)這種技巧是馬頭琴演奏者為了表現(xiàn)樂曲的需要,從其它樂器上移植過來的。演奏方法是:左手繼續(xù)頂弦,右手二、三、四指繼續(xù)握住弓,用右手第一指撥弦。這種演奏法一般用在歡快的樂曲之中。(11)泛音演奏技巧這種演奏法和演奏技巧是從民間江音演奏法中繼承過來的。它同單音頂指演奏結(jié)合起來運(yùn)用。演奏法是同前面介紹的江音演奏法(五度定弦演奏法和反四度定弦演奏法)是一樣的,主要用一、三、四指指尖,從弦左側(cè)向右頂弦演奏。運(yùn)弓要有力度,頂弦時要輕輕觸弦,這樣就能獲得江音音響。同時用拇指觸弦,同一指結(jié)合形成純四度泛音,同三指結(jié)合形成純八度和音,這兩個雙和音是比較常用的泛音。在需要演奏高把位的音時,一般不到高把位,而是在原把位或中把位上用江音奏出。從上面的譜例我們可以看到到的“5”音,不是往上把位走,而是回到外弦上的泛音位置,“3”音和“5”音也一樣不往上走,而是在外弦的泛音上演奏。從而不換把位,用泛音代替實(shí)音,對某些沒有江音的實(shí)音則奏出實(shí)音。因此,所謂泛音技巧,就是泛音同實(shí)音交替使用的演奏法(12)“潮爾”演奏技巧這種演奏法,可以在反四度定弦的外弦上演奏。(13)滑音顫指這是一種華彩性的技巧。常常用來模仿馬的嘶鳴。一般用在華彩性樂段中。主要是在下行大滑音中運(yùn)用。演奏法是一個手指觸弦滑音,另一個手指顫指滑下。計算機(jī)學(xué)院《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計報告課題名稱:馬踏棋盤 課題負(fù)責(zé)人(學(xué)號/姓名):同組成員名單(姓名):指導(dǎo)教師: 評閱成績:評閱意見: 提交報告時間:Time\@"yyyy年M月d日"2021年10月8日項目成員序號學(xué)號姓名職責(zé)任務(wù)說明1110520131劉偉小組成員需求分析用戶使用說明測試結(jié)果2110520121黎貴濤組長概要設(shè)計2.詳細(xì)設(shè)計3110520104林建彪小組成員1概要設(shè)計2.調(diào)試分析一、【問題描述】設(shè)計一個國際象棋的馬踏棋盤的演示過程。基本要求:將馬隨機(jī)放在國際象棋的8*8棋盤Board[8][8]的某個方格中,馬按走棋規(guī)則進(jìn)行移動,要求每個方格只進(jìn)行一次,走遍整個棋盤的全部64個方格。編制非遞歸程序,求出馬的行走路線,并按求出的行走路線,將數(shù)字1,2,…,64依次填入一個8*8的方陣,輸出之。測試數(shù)據(jù):可自行制定一個馬的初始位置(i,j),0<=I,j<=7。二、【實(shí)驗(yàn)?zāi)康摹?、對數(shù)據(jù)結(jié)構(gòu)基本理論和存儲結(jié)構(gòu)及算法設(shè)計有更深入的理解;2、了解棧的特性,以便在實(shí)際問題背景下靈活運(yùn)用他們;3、提高在世紀(jì)設(shè)計操作中系統(tǒng)分析、結(jié)構(gòu)確定、算法選擇、數(shù)學(xué)建模和信息加工的能力?!驹O(shè)計過程】81726354第1步:實(shí)現(xiàn)提示一般來說,當(dāng)馬位于位置(i,j)時,可以走到下列8個位置之一:(i-2,j+1),(i-1,j+2)(i+1,j+2),(i+2,j+1)(i+2,j-1),(i+1,j-2)(i-1,j-2),(i-2,j-1)(圖-1)但是,如果(i,j)靠近棋盤的邊緣,上述有些位置可能要超出棋盤位置,成為不允許的位置。8個可能位置可以用一位數(shù)組HTry1[0…7]和HTry2[0…7]來表示:01234567-2-11221-1-21221-1-2-2-1(表-2)位于(i,j)的馬可以走到新位置是在棋盤范圍內(nèi)的(i+HTry1[h],j+HTry2[h]),其中h=0…7。第2步:需求分析輸入的形式和輸入值的范圍:輸入馬的初始行坐標(biāo)X和列坐標(biāo)Y,X和Y的范圍都是[1,8]。輸出形式:以數(shù)組下表的形式輸入,i為行標(biāo),j為列標(biāo),用空格符號隔開。以棋盤形式輸出,每一格打印馬走的步數(shù),這種方式比較直觀程序所能達(dá)到的功能:讓馬從任意起點(diǎn)出發(fā)都能夠遍歷整個8*8的棋盤。測試數(shù)據(jù),包括正確輸入及輸出結(jié)果和含有錯誤的輸入及其輸出結(jié)果。數(shù)據(jù)可以任定,只要1<=x,y<=8就可以了。正確的輸出結(jié)果為一個二維數(shù)組,每個元素的值表示馬行走的第幾步,若輸入有錯,則程序會顯示:“輸入有誤!請重新輸入……”并且要求用戶重新輸入數(shù)據(jù),直至輸入正確為止。第3步,算法設(shè)計思想:1、輸入馬所在初始位置的坐標(biāo)值,考慮到用戶的輸入習(xí)慣,此處1<=x,y<=8;2、將輸入的初始值進(jìn)棧;3、設(shè)置一個while循環(huán),循環(huán)條件為count<64;4、取出棧頂元素;5、定義flag標(biāo)志變量的值;6、按照setpossible函數(shù)順時針順序優(yōu)先原則,找棧頂元素周圍未被占用的新位置。7、若存在該位置,則令order的值等于該新位置的坐標(biāo),并入棧;8、否則彈出棧頂元素;9、再次回到第③步while循環(huán)進(jìn)行判斷;10、輸出一個8*8的方陣,所示數(shù)字即為相應(yīng)步驟。第4步,算法框圖:開始開始輸入初始坐標(biāo)X,Y判斷X,Y是否合法?Initstack建立新棧并且將初始位置入棧count<64GetTop取棧頂元素;找出所有可走位置根據(jù)for循環(huán)及優(yōu)先原則查找是否存在下一個坐標(biāo)?調(diào)用push函數(shù)將其壓縮進(jìn)棧調(diào)用DleteTop函數(shù)將棧頂元素彈出輸出否是否是否是第5步,存儲結(jié)構(gòu)設(shè)計:(1)、位置的存儲表示方式typedefstruct{intx;inty;intfrom;}Point;(2)、棧的存儲方式#defineSTACKSIZE70#defineSTACKINCREASE10typedefstructStack{Point*top;Point*base;intstacksize;};第6步,設(shè)計功能分析與實(shí)現(xiàn)(1)、設(shè)定棧的抽象數(shù)據(jù)類型定義:ADTStack{數(shù)據(jù)對象:D={ai|ai∈ElemSet,i=1,2,…,n,n≥0}數(shù)據(jù)關(guān)系:R1={<ai-1,ai>|ai-1,ai∈D,i=2,…,n}約定an端為棧頂,ai端為棧頂?;静僮鳎篒nitStack(&s)操作結(jié)果:構(gòu)造一個空棧s,DestroyStack(&s)初始條件:棧s已存在。操作結(jié)果:棧s被銷毀。ClearStack(&s)初始條件:棧s已存在。操作結(jié)果:棧s清為空棧。StackEmpty(&s)初始條件:棧s已存在。操作結(jié)果:若棧s為空棧,則返回OK,否則返回ERROR。StackLength(s);初始條件:棧s存在。操作結(jié)果:返回s的元素個數(shù),即棧的長度。GetTop(s,&e);初始條件:棧s已存在且非空。操作結(jié)果:用e返回s的棧頂元素。Push(&s,e)初始條件:棧s已存在。操作結(jié)果:插入元素e為新的棧頂元素。DeleteTop(&s,&e)初始條件:棧s存在且非空。操作結(jié)果:刪除棧頂元素,并用e返回。GetDeep(s)初始條件:棧s存在。操作結(jié)果:返回一個int型的整數(shù)表示棧深。stackTraverse(s,visit())初始條件:棧s存在且非空。操作結(jié)果:從棧底到棧頂依次對s的每個元素調(diào)用visit()。一旦visit()失敗,則操作失敗。}ADTStack(2)、選取對該程序有用的函數(shù)。1、InitStack(&s)用于構(gòu)建空棧實(shí)現(xiàn)相應(yīng)的操作;2、StackEmpty(&s)用于判斷空棧情況,已確保循環(huán)體能夠準(zhǔn)確實(shí)現(xiàn);3、GetTop(s,&e)用于取放入棧的棧頂元素,實(shí)現(xiàn)把放入的橫縱坐標(biāo)按要求取出;4、Push(&s,e)用于將用戶輸入的橫縱坐標(biāo)放入棧;5、DeleteTop(&s,&e)用于實(shí)現(xiàn)將要求取出的元素取出;6、GetDeep()用于獲取棧的深度;7、DestroyStack()用于銷毀棧。(3)、主要函數(shù)及算法說明。1、函數(shù):voidsetpossible(Pointcur)參數(shù):Pointcur功能:找出當(dāng)前位置下一步的八個位置,將其賦給g_round[8];算法:接受參數(shù)傳來的值,按順時針次序加上g_round[i].x={-2,-1,1,2,2,1,-1,-2};g_round[i].y={1,2,2,1,-1,-2,-2,-1};再根據(jù)getpossible函數(shù)來判斷是否合法;若合法則返回OK,否則返回ERROR.2、函數(shù):Statusgetpossible(inti,Point&pt)參數(shù):inti,Point&pt功能:將所在位置周圍八個位置坐標(biāo)賦予指針變量,并判斷其合理性;算法:用以下賦值語句pt.x=g_round[i-1].x;pt.y=g_round[i-1].y;將現(xiàn)在周圍8個指定位置賦予指針變量pt,并用if(pt.x<0||pt.y<0||pt.x>7||pt.y>7)條件語句判斷其合理性,若合理則返回OK,否則返回ERROR.3、語句:for(inti=cur.from+1;i<=8;i++){if(getpossible(i,next)&&order[next.x][next.y]==0){語句……}}功能:按照順時針優(yōu)先規(guī)則,選出下一個可用的位置,通過if判斷語句來判斷所選的下一步是否可用,若可用,則使其進(jìn)棧,否則運(yùn)行下面一個語句。4、語句:if(flag==NULL){語句…..while(j<p&&GetDeep(herseVisit)>1){語句…..}}功能:如果當(dāng)前位置不存在任何新路徑,則根據(jù)while循環(huán)進(jìn)行退棧,直至退到存在有最佳位置的坐標(biāo)。但必須保證棧不為空。所以此出棧中設(shè)定了intGetDeep的基本操作,就是防止空棧還繼續(xù)彈東西出來的情況發(fā)生。四、【調(diào)試程序】(1)、問題:語法錯誤原因:首次運(yùn)行語法錯誤比較多,一般都是由于粗心大意輸入有誤造成的,還有一些錯誤屬于變量忘記定義之類的,經(jīng)過認(rèn)真一個一個調(diào)試后這類錯誤得以解決。下圖為第一次運(yùn)行時的錯誤(2)、問題:運(yùn)行后突然停止程序原因:可能是輸出不恰當(dāng)解決:此問題出現(xiàn)后,剛開始不知道為啥,看了很多遍程序就是找不出原由,于是后來請教同學(xué),一起研究后無意中改了輸出格式,將printf("%s,%2d",'|',order[i][j]);改成了printf("%d,%f",order[i][j],'|');竟然成功輸出了。懷疑是%s使用得不恰當(dāng)。下圖為修改前的運(yùn)行結(jié)果:(3)、問題:將上述問題解決后雖然不會出現(xiàn)程序突然終止的情況,但運(yùn)行結(jié)果如下圖,輸出結(jié)果很亂;原因:輸出格式不符解決:將printf("%d,%f",order[i][j],'|');改成printf("|%2d",order[i][j]);(4)、問題:上述問題都搞定后,輸入初始坐標(biāo)后按下Enter鍵后不會出現(xiàn)棋盤原因:main()函數(shù)里flag寫成intflage;解決:將intflage改成flag(5)、問題:上述問題都搞定后,輸入初始坐標(biāo)后按下Enter鍵后會出現(xiàn)棋盤,但是在棋盤上會出現(xiàn)0000的情況,與需要的結(jié)果不符。原因:regular.h文件里面獲得合理位置的邊界位置判定,橫坐標(biāo)和縱坐標(biāo)的范圍少寫了ps.x>7||ps.y<0。解決:在regular.h文件里面添加橫坐標(biāo)和縱坐標(biāo)的范圍ps.x>7||ps.y<0(6)、問題:上述問題都搞定后,輸入初始坐標(biāo)后按下Enter鍵后立即退出了原因:main()函數(shù)里有scanf(),當(dāng)用戶輸入初始坐標(biāo)后,將這兩個坐標(biāo)賦予給&begin.x,&begin.y,結(jié)果當(dāng)用戶想用Enter鍵進(jìn)行確認(rèn)操作后,Enter本身是一個字符,而這個字符不符合循環(huán)要求,所以直接退出解決:多加一個getchar()把Enter鍵給吸收掉,結(jié)果如下圖:五、【用戶手冊】運(yùn)行程序,程序開始界面,如圖所示:輸入初始值x,y,如輸入(3,7),如圖所示:因?yàn)椋?,7)在(1~8)的范圍內(nèi),所以程序輸出結(jié)果如下:按(y/Y)后,程序?qū)⑻捷斎氤跏贾滴恢?,如圖所示:按其他任意鍵后(如按(n/N)鍵),將退出程序,如圖所示:若輸入的初始值沒在(1~8)的范圍內(nèi),如輸入(7,9),則將提示錯誤,并要求重新輸入,如圖所示:按任意鍵后,程序?qū)⑻剌斎氤跏贾档奈恢?,如圖所示:六、【實(shí)驗(yàn)總結(jié)與體會】總結(jié):馬踏棋盤,作為一種經(jīng)典的棧的應(yīng)用例子,從大方面將,剛看到這名字就知道用棧來實(shí)現(xiàn),但是,當(dāng)你面對這個題目,打開編譯器之后想寫的時候,發(fā)現(xiàn)又不是那么容易,很多細(xì)節(jié)需要認(rèn)真的分析,比如結(jié)構(gòu)體的定義,棋子因?yàn)槭嵌S的,所以對于用來存儲棋盤的橫縱坐標(biāo),需要用到兩個變量,定義兩整型變量x,y。剛開始只定義了這兩個變量,后來發(fā)現(xiàn)如果找到下一個位置,而下一個位置有很多個都是符合的,如何選取最優(yōu)的呢?最有的有可能是最先找到的,可找到后還得繼續(xù)找下去,萬一沒有比他更優(yōu)的,則要退回來,如果沒有變量from來記錄前一位置最優(yōu)位置,就無法找到之前的點(diǎn),所以要多加一個變量;其外就是程序的調(diào)試,調(diào)試確實(shí)需要很大的耐心,有時候只是你的大意而輸錯了字符或輸入輸出格式不符合就會出現(xiàn)很多看起來不可思議很難發(fā)現(xiàn)的錯誤,這也說明了編程的時候一定要認(rèn)真有耐心。體會:剛學(xué)習(xí)棧的時候,覺得并不太難,反正就是先進(jìn)后出,可是到了實(shí)際運(yùn)用的時候,才發(fā)現(xiàn)學(xué)到的理論知識要用到實(shí)際去還真是個問題,通過這次課程設(shè)計的實(shí)踐,讓我對棧有了更深入的理解,也發(fā)現(xiàn)一種理論再簡單的知識,如果不實(shí)際運(yùn)用一下,對于你的掌握肯定是不夠的,因?yàn)閷?shí)際運(yùn)用中你要適當(dāng)選取哪些是有用的,哪些不必用到的,而且當(dāng)你很興奮的寫完代碼后,會發(fā)現(xiàn)很多錯誤,當(dāng)然一般是語法錯誤,如果你的邏輯沒錯的話,也有可能是你思想沒錯,但你的表達(dá)不妥當(dāng),這也會讓你對程序的修改顯得很無助;再次,世上沒有完美的程序,如今社會上出現(xiàn)的各個軟件每到一定的時候就會有升級版也正是這個原因,我承認(rèn)自己這個程序存在很多漏洞和不足,但一個程序的優(yōu)化可不是一朝一夕的事,只要求自己能完成基本任務(wù)就行了。七、【參考文獻(xiàn)】《數(shù)據(jù)結(jié)構(gòu)(C語言版)》--------嚴(yán)蔚敏、吳偉民編著《C語言設(shè)計(第三版)》--------譚浩強(qiáng)著《C語言課程設(shè)計(第2版)》-------梁旭、谷曉琳、黃明編著《C語言通用范例金典》-------柳盛,王國全,沈永林編著【程序清單】1.文件horse.h#ifndef__HORSE_H__#define__HORSE_H__#include<stdio.h>#include<malloc.h>#defineOK1#defineERROR0#defineSTACKSIZE70#defineSTACKINCREASE10typedefintStatus;//位置的儲存typedefstruct{ intx; inty; intfrom;}Point;//棧的儲存typedefstruct{ Point*top; Point*base; intstacksize;}Stack;//建棧StatusInitstack(Stack&s){ s.base=(Point*)malloc(STACKSIZE*sizeof(Point)); if(s.base==NULL)returnERROR; s.top=s.base; s.stacksize=STACKSIZE; returnOK;}//向棧中插入元素eStatusPush(Stack&s,Pointe){ if(s.top-s.base>=s.stacksize) { s.base=(Point*)realloc(s.base, (s.stacksize+STACKINCREASE)*sizeof(Point)); if(s.base==NULL)returnERROR; s.top=s.base+s.stacksize; s.stacksize+=STACKINCREASE; } (*s.top).x=e.x; (*s.top).y=e.y; (*s.top).from=e.from; s.top++; returnOK;}//棧不為空,則刪除棧頂元素StatusDeleteTop(Stack&s,Point&e){ if(s.top==s.base)returnERROR; s.top--; e.x=(*s.top).x; e.y=(*s.top).y; e.from=(*s.top).from; returnOK;}//銷毀棧StatusDestroyStack(Stack&s){ free(s.base);//free(s); returnOK;}//判斷棧是否為空StatusStackEmpty(Stacks){ if(s.base==s.top)returnOK; elsereturnERROR;}//獲得棧頂元素StatusGetTop(Stacks,Point&e){ if(s.base==s.top)returnERROR; e.x=(*(s.top-1)).x; e.y=(*(s.top-1)).y; e.from=(*(s.top-1)).from; returnOK;}//獲得棧的深度intGetDeep(Stacks){ returns.top-s.base;}#endif文件regular.h#ifndef__REGULAR_H__#define__REGULAR_H__#include"horse.h"Pointh_possible[8]={0,0,0};//查找所有可能的位置,并存入h_possible[8]中voidsetPossible(Pointcon){ Pointround[]= { {con.x-2,con.y+1,0}, {con.x-1,con.y+2,0}, {con.x+1,con.y+2,0}, {con.x+2,con.y+1,0}, {con.x+2,con.y-1,0}, {con.x+1,con.y-2,0}, {con.x-1,con.y-2,0}, {con.x-2,con.y-1,0} }; for(inti=0;i<8;i++) { h_possible[i].x=round[i].x; h_possible[i].y=round[i].y; h_possible[i].from=round[i].from; }}//取得合理的可能位置StatusgetPossible(inti,Point&ps){ ps.x=h_possible[i-1].x; ps.y=h_possible[i-1].y; if(ps.x<0||ps.y>7||ps.x>7||ps.y<0)returnERROR; elsereturnOK;}#endif主函數(shù)main.c#include<stdio.h>#include<stdlib.h>#include"horse.h"#include"regular.h"voidmain(){ inti,j,p; ints=1; charyn; StackhorseVisit; Pointcur,next;H1:while(s){ intorder[8][8]={0};//是一個中間變量,用來記錄當(dāng)前位置 intcount=0; Pointbegin; system("color31"); printf("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<馬踏棋盤程序演示>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"); printf("請輸入馬在棋盤上的任意初始位置x,y,根據(jù)用戶習(xí)慣,其中x,y為(~8),例如(7):"); scanf("%d%d",&begin.x,&begin.y); printf("\n================================================================================\n"); begin.from=0; while(begin.x>8||begin.y>8||begin.x<1||begin.y<1) { system("cls"); printf("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<輸入格式不對,請重新輸入...>>>>>>>>>>>>>>>>>>>\n"); getchar(); getchar(); system("cls"); gotoH1; } getchar(); begin.x--;//注意用戶輸入的坐標(biāo)(~8),而儲存是(~7),這里要自減 begin.y--; Initstack(horseVisit);//創(chuàng)建空棧 Push(horseVisit,begin);//入棧,將用戶輸入的坐標(biāo)存入棧中 count++;//計數(shù)器加 order[begin.x][begin.y]=count; while(count<64) { GetTop(horseVisit,cur);//取棧頂元素存入cur中 setPossible(cur);//找出位置附近可能的八個位置 intflag=false;//標(biāo)志 for(inti=cur.from+1;i<=8;i++) { //按照順時針的順序,選出下一個可走的新位置
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中藥材種苗質(zhì)量合同標(biāo)準(zhǔn)及發(fā)展趨勢
- 16.1《阿房宮賦》課件 2024-2025學(xué)年統(tǒng)編版高一語文必修下冊
- 七年級語文上冊 第二單元 體驗(yàn)親情 6 散步教學(xué)設(shè)計 新人教版
- Brand KPIs for pet supply online shop PetShop.co.uk in the United Kingdom-外文版培訓(xùn)課件(2025.2)
- 第三章陸地和海洋第一節(jié)大洲和大洋教學(xué)設(shè)計-2024-2025學(xué)年人教版地理七年級上冊
- 2025年度全國中小學(xué)語文教師基本功技能大賽模擬試題及答案
- 癲癇患者的護(hù)理
- 發(fā)熱患者的護(hù)理
- 個人勞動防護(hù)用品的使用和維護(hù)安全培訓(xùn)
- 版?zhèn)€人房屋退租合同協(xié)議書范本
- 電力安全工作規(guī)程(完整版)
- 2024-2030年中國臨近空間飛行器發(fā)展規(guī)劃及未來前景展望研究報告
- 《廣東省智慧高速公路建設(shè)指南(試行)》
- 工廠自動化規(guī)劃報告
- 《分布式生活垃圾中轉(zhuǎn)站臭氣處理技術(shù)規(guī)程》
- 一般企業(yè)財務(wù)報表附注(模板)
- 波斯帝國課件
- ICD-10和ICD-9-CM-3編碼質(zhì)控解析-循環(huán)系統(tǒng)
- 河南省勞動關(guān)系協(xié)調(diào)員職業(yè)技能大賽技術(shù)工作文件
- 藝術(shù)涂料施工協(xié)議
- 廢鐵拆除安全合同范例
評論
0/150
提交評論