c語言范文

時(shí)間:2023-04-07 14:38:03

導(dǎo)語:如何才能寫好一篇c語言,這就需要搜集整理更多的資料和文獻(xiàn),歡迎閱讀由公務(wù)員之家整理的十篇范文,供你借鑒。

c語言

篇1

c語言是計(jì)算機(jī)的高級語言。

高級語言主要是相對于匯編語言而言的,基本脫離了機(jī)器的硬件系統(tǒng),用人們更易理解的方式編寫程序。C語言是僅產(chǎn)生少量的機(jī)器語言以及不需要任何運(yùn)行環(huán)境支持便能運(yùn)行的高效率程序設(shè)計(jì)語言,能以簡易的方式編譯、處理低級存儲器。

C語言提供了許多低級處理的功能,但仍然保持著跨平臺的特性,以一個(gè)標(biāo)準(zhǔn)規(guī)格寫出的C語言程序可在包括一些類似嵌入式處理器以及超級計(jì)算機(jī)等作業(yè)平臺的許多計(jì)算機(jī)平臺上進(jìn)行編譯。

(來源:文章屋網(wǎng) )

篇2

關(guān)鍵詞:C語言;教學(xué)方法;思維轉(zhuǎn)化;啟發(fā)式教學(xué);軟件工程

一、前言

C語言是一種通用性計(jì)算機(jī)程序設(shè)計(jì)語言。它兼有匯編語言和高級語言的雙重優(yōu)點(diǎn),運(yùn)用它既能編寫操作系統(tǒng)軟件,又能開發(fā)各個(gè)領(lǐng)域的應(yīng)用軟件。C語言的實(shí)用性使之成為編程的首選語言。學(xué)好了C語言,再進(jìn)一步深造C++/VC++,JAVA等言語,就有了堅(jiān)實(shí)的基礎(chǔ)。但目前很多學(xué)生在學(xué)習(xí)《C語言程序設(shè)計(jì)》后,感覺讀程序還湊合,編程則“難于上青天”部分學(xué)生甚至毫無編程想法,僅僅是為應(yīng)付考試而死記硬背,完全背離了高職教育的初衷。因此,如何在C語言教學(xué)中啟發(fā)并訓(xùn)練學(xué)生的編程思維,是每個(gè)教師應(yīng)深思的問理。以下是筆者在C語言教學(xué)中的一些看法,愿和同行探討。

二、上好第一堂課

如何上好第一堂《C語言程序設(shè)計(jì)》課是至關(guān)重要的。因?yàn)閷W(xué)生都是初次接觸C語言,C語言對他們來說是神秘的,“興趣永遠(yuǎn)是最好的老師”,有了興趣他們才會積極主動地去學(xué)習(xí),所以第一堂課的成功與否直接關(guān)系到學(xué)生能否對這門課產(chǎn)生興趣,所以我覺得第一堂課應(yīng)為“趣味C語言導(dǎo)學(xué)課”。

(一)程序結(jié)果展示,激發(fā)興趣

要激發(fā)學(xué)生的興趣。首先要讓大家知道C語言的強(qiáng)大功能,利用它我們能編寫各種軟件,通過幻燈片向?qū)W生展示各種結(jié)果畫面,例如從50年代玩的搖桿游戲到如今的電腦游戲。相信這時(shí)有些學(xué)生已經(jīng)有些“蠢蠢欲動”了。恨不得立刻學(xué)好C語言。

(二)強(qiáng)調(diào)C語言的重要性

C語言是學(xué)生今后學(xué)好后繼課程的基礎(chǔ),比如數(shù)據(jù)結(jié)構(gòu)。C++,JAVA等。雖然程序設(shè)計(jì)語言更新很快,但如果真正掌握精了程序設(shè)計(jì)思想,具備了真正解決實(shí)際問題的能力。語言再更新可程序設(shè)計(jì)的本質(zhì)不會變。

(三)傳授C語言的學(xué)習(xí)方法

C語言是一門實(shí)踐性課程,要理論結(jié)合實(shí)踐,加強(qiáng)學(xué)生的動手能力,解決問題的能力,在學(xué)習(xí)方法上給以學(xué)生指導(dǎo),告訴學(xué)生如何自學(xué),如何聽課,如何動手實(shí)踐,明確一點(diǎn):“C語言不是看會的,也不是聽會的,而是親自動手實(shí)踐練會的”,強(qiáng)調(diào)實(shí)踐的重要性。

(四)認(rèn)識C語言的編譯環(huán)境。

在visual studio2005環(huán)境下,舉出幾個(gè)簡單的小程序演示給他們看,并逐一講解,引導(dǎo)學(xué)生自己去發(fā)現(xiàn)程序中存在的缺陷以及改進(jìn)的方式。熟悉C語言源程序到可執(zhí)行文件的整個(gè)操作流程。讓他們仿照所列舉的幾個(gè)程序模仿著編一個(gè)小程序。

二、C語言教學(xué)方法

(一)抽象思維到形象思維的轉(zhuǎn)化

讓學(xué)習(xí)過程變得輕松有趣是激發(fā)學(xué)生興趣的關(guān)鍵所在,C語言本身是一門極其抽象難懂的學(xué)科,把抽象的問題形象化,使本來枯燥無味的C語言變得魅力無限,符合學(xué)生的認(rèn)知規(guī)律,可以收到良好的效果。

(二)采用問題啟發(fā)式授課,激發(fā)自主學(xué)習(xí)

針對C語言概念多,語法繁的現(xiàn)狀,采用問題啟發(fā)式教學(xué)可以將難理解、難記憶的概念和規(guī)則變成一系列時(shí)而醒目、時(shí)而深奧的問題呈現(xiàn)在課堂教學(xué)中,這樣就能把學(xué)生的注意力集中起來,學(xué)習(xí)積極性調(diào)動起來,達(dá)到師生互動的效果,教師自問自答為主,有問有答,互問互答,改變單調(diào)死板、照本宣科的牧師講法。這種啟發(fā)式、討論式、交流式的教法,不僅改變原來的灌輸式,而且增強(qiáng)了學(xué)生自主學(xué)習(xí)的能力。

(三)“引申法”“框架法”和“求異法”相結(jié)合

所謂“引申法”是指是結(jié)合已經(jīng)解決的問題,因勢利導(dǎo),引導(dǎo)學(xué)生在此基礎(chǔ)上解決相關(guān)聯(lián)的問題?!耙攴ā笨梢耘囵B(yǎng)學(xué)生在程序設(shè)計(jì)方面的發(fā)散思維。提高程序設(shè)計(jì)中的應(yīng)變能力。問題是活的,但程序是有章可循的。最終使學(xué)生明白,語法是有限的,可解決的問題是無限的。只有在分析實(shí)際向題的基礎(chǔ)上,以清晰的思路去設(shè)計(jì)算法,才能舉一反三,以不變應(yīng)萬變。

“框架法”可培養(yǎng)學(xué)生的全局思維和算法的整體設(shè)計(jì)能力。具體體現(xiàn)在兩方面:一是在學(xué)生有了一點(diǎn)編程基礎(chǔ)后要利用偽代碼或流程圖,從算法設(shè)計(jì)的角度講解編程思路,而不應(yīng)拘泥于語法細(xì)節(jié),不分主次、逐條語句的講解代碼。通過此框架,可使初學(xué)者對函數(shù)設(shè)計(jì)的關(guān)鍵問題有清晰的認(rèn)識,利于從統(tǒng)籌全局的角度去考慮問題,體現(xiàn)了程序設(shè)計(jì)逐步求精的思路。這樣可以層次分明,突出算法設(shè)計(jì)的關(guān)鍵,利于培養(yǎng)學(xué)生的編程思路。二是在學(xué)習(xí)重點(diǎn)章函數(shù)時(shí),由于新的算法已很少,主要是學(xué)習(xí)用函數(shù)調(diào)用的方法來重新編制以前所熟悉的程序,那么我們可以把著眼點(diǎn)放在函數(shù)的設(shè)計(jì)框架上,體現(xiàn)參數(shù)設(shè)計(jì)、返回值設(shè)計(jì)等關(guān)鍵問題,而無需細(xì)講函數(shù)體的實(shí)現(xiàn)細(xì)節(jié)。

“求異法”:一個(gè)固定的問題。解決的方法可能不唯一,如果能啟發(fā)學(xué)生多角度、多側(cè)面去尋求解決問題的辦法,則可激發(fā)學(xué)生思考的積極性,提高其學(xué)習(xí)興致。在C語言中一題多解的情況有很多,有意識地引導(dǎo)新思路,鼓勵新方法,以培養(yǎng)學(xué)生在編程中的求異思維,而不是死記硬背,墨守成規(guī)。

(四)理論教學(xué)與學(xué)生實(shí)踐相結(jié)合,提高程序調(diào)試能力

對程序設(shè)計(jì)課來說,理論學(xué)習(xí)和上機(jī)要兩手抓,兩手都要抓硬。實(shí)驗(yàn)課不能流于形式,讓學(xué)生照抄照搬,甚至身在曹營心在漢。必須給學(xué)生思考、創(chuàng)新的啟迪,訓(xùn)練其實(shí)踐能力,實(shí)驗(yàn)課要生動活潑,使學(xué)生既掌握書中的重點(diǎn)算法,又有充分的思考空間,讓學(xué)生充分體會到頓悟和創(chuàng)造的樂趣。在進(jìn)行每一部分的學(xué)習(xí)的時(shí)候,都應(yīng)該配有相應(yīng)的學(xué)生上機(jī)實(shí)踐的機(jī)會。這樣學(xué)生既鍛煉了動手能力,又鞏固了所學(xué)的知識。還應(yīng)該讓學(xué)生養(yǎng)成上機(jī)前分析題目,決定算法與數(shù)據(jù)結(jié)構(gòu),并編出程序源代碼的好習(xí)慣,這樣在上機(jī)時(shí),學(xué)生就有的放矢,主要精力放在調(diào)式程序上需。對于普遍存在的問題,進(jìn)行集中提示、講解、演示以增加學(xué)生的印象。井及時(shí)檢查總結(jié)學(xué)生上機(jī)實(shí)驗(yàn)的完成情況。

(五)在整個(gè)教學(xué)環(huán)節(jié)中,巧妙地引人軟件工程的基本思想

計(jì)算機(jī)科學(xué)屬工程技術(shù)科學(xué),為使學(xué)生有良好的編程思維,應(yīng)注重軟件工程思想的滲透。對軟件生存周期的幾個(gè)階段,即問題定義、可行性研究、需求分析、概要設(shè)計(jì)、詳細(xì)設(shè)計(jì)、編碼、調(diào)試、運(yùn)行與維護(hù),可以通過常規(guī)的C程序設(shè)計(jì)實(shí)例來體現(xiàn),以培養(yǎng)學(xué)生編程中的工程思維。這樣并沒有費(fèi)很大力氣講抽象的概念,卻可培養(yǎng)學(xué)生在程序設(shè)計(jì)中從軟件工程角度去系統(tǒng)分析問題的良好習(xí)慣。雖然問題小了些,但“窺一斑而知全局”,經(jīng)反復(fù)強(qiáng)化問題求解中所蘊(yùn)含的基本思想,將有效地訓(xùn)練學(xué)生程序設(shè)計(jì)中統(tǒng)籌全局的工程思維能力。

篇3

實(shí)驗(yàn)一 上機(jī)操作初步和簡單的C程序設(shè)計(jì)

一、 實(shí)驗(yàn)?zāi)康?/p>

1、熟悉C語言運(yùn)行環(huán)境Turbo C++3.0

2、會簡單的程序調(diào)試

3、熟悉C語言各種類型數(shù)據(jù)的輸入輸出函數(shù)的使用方法

4、掌握順序結(jié)構(gòu)程序設(shè)計(jì)

二、 實(shí)驗(yàn)內(nèi)容

1、 上機(jī)運(yùn)行本章3個(gè)例題,熟悉所用系統(tǒng)的上機(jī)方法與步驟。(習(xí)題1.7)

2、 編寫一個(gè)C程序,輸入a、b、c 3個(gè)值,輸出其中最大者。(習(xí)題1.6)

3、 設(shè)圓半徑r=1.5,圓柱高h(yuǎn)=3,求圓周長、圓面積、圓球表面積、圓球體積、圓柱體積。用scanf輸入數(shù)據(jù),輸出計(jì)算結(jié)果,輸出時(shí)要求有文字說明,取小數(shù)點(diǎn)后2位數(shù)字。注意:在Trubo C++ 3.0中不能輸入漢字,只能輸入英文或拼音。(習(xí)題4.8)

4、 運(yùn)行如下程序,寫出運(yùn)行結(jié)果。kt250.com整理該文章,版權(quán)歸原作者、原出處所有...

#include

void main()

{

int a=1,b=2;

a=a+b; b=a-b; a=a-b;

printf("%d,%dn",a,b);

}

篇4

關(guān)鍵詞:Java

面向?qū)ο?/p>

c++

編程語言

中國分類號:TP312

文獻(xiàn)標(biāo)識碼:A

文章編號:1002-2422(2010)03-0088-03

1 Java語言的特點(diǎn)

(1)簡單性

Java繼承了C/C++的語法,丟棄了其中不常用又容易引起混淆的功能,特別是非面向?qū)ο蟮膬?nèi)容,取消了c語言的結(jié)構(gòu)、指針、#define語句、多重繼承、全局變量和函數(shù)、GOTO語句、操作符重載和自動類型轉(zhuǎn)換等等。

(2)面向?qū)ο?/p>

Java是一種純面向?qū)ο蟮恼Z言,具有封裝、繼承和多態(tài)的特性,無全局變量或函數(shù),可以被用于面向?qū)ο筮@種現(xiàn)代軟件工程。

(3)分布式

Java包括一個(gè)支持HTTP和FTP等基于TCP/IP協(xié)議的子庫。因此,Java應(yīng)用程序可憑借URL打開并訪問網(wǎng)絡(luò)上的對象,象本地一樣。

(4)解釋型

Java寫成的源代碼需要被編譯成高階的字節(jié)碼,其與機(jī)器架構(gòu)無關(guān)。然后,這種字節(jié)碼在任何Java的運(yùn)行環(huán)境中由Java虛擬機(jī)解釋執(zhí)行。保證了Java與平臺無關(guān)性和可移植性。解釋執(zhí)行與及時(shí)編譯技術(shù)的完美結(jié)合,提供了相當(dāng)高的運(yùn)算性能。

(5)多態(tài)的支持

Java是一種非常注重對象形態(tài)轉(zhuǎn)換的語言,所以在編譯時(shí)期就會做形態(tài)轉(zhuǎn)換檢查,在執(zhí)行時(shí)期,Java也會做一些形態(tài)上的檢查。

(6)垃圾收集和異常處理

由于Java垃圾收集器會做自動的垃圾收集,這里的垃圾指一些不會被再使用的對象,所以程序設(shè)計(jì)者不需費(fèi)心。內(nèi)存會被自動地管理,Java本身提供了許多面向?qū)ο蟮漠惓?Exception)處理,所以程序在執(zhí)行時(shí)期所發(fā)生的錯誤,都可以由程序自己來處理。

(7)安全性

Java設(shè)計(jì)時(shí)對系統(tǒng)的安全,特別是網(wǎng)絡(luò)安全做了周密的考慮。通過字節(jié)碼驗(yàn)證、內(nèi)存調(diào)用方式、資源使用權(quán)限等進(jìn)行多層次的安全管理。Java被認(rèn)為是在任何系統(tǒng)上最安全的應(yīng)用程序之一。

2 Java的技術(shù)平臺

Java不僅僅是一種語言,更重要是一種區(qū)別于傳統(tǒng)系統(tǒng),遵循“網(wǎng)絡(luò)就是計(jì)算機(jī)”信條的平臺技術(shù)。Java平臺將面向?qū)ο笙到y(tǒng)擴(kuò)展成包括程序和數(shù)據(jù)的網(wǎng)絡(luò)計(jì)算機(jī),而這個(gè)平臺的核心就是Java虛擬機(jī)。Java虛擬機(jī)的概念和實(shí)現(xiàn)使Java平臺成為萬能開發(fā)平臺,實(shí)現(xiàn)了Java程序“編寫一次,到處運(yùn)行”。Java虛擬機(jī)是一種抽象化的計(jì)算機(jī),可以在其上面執(zhí)行Java的字節(jié)碼。其本身的設(shè)計(jì)原則是“小而簡單”,目的是為了盡可能在所有機(jī)器上都能安裝。這樣的精簡原則,使得其能夠在現(xiàn)有的各種平臺上都可以順利執(zhí)行,適合各種網(wǎng)絡(luò)的環(huán)境。Java的技術(shù)平臺的工作原理:第一步Java用一個(gè)編譯器將源程序代碼(.java)轉(zhuǎn)換成可執(zhí)行程序(.class),Java編譯器生成的是獨(dú)立于處理器結(jié)構(gòu)的字節(jié)代碼。第二步字節(jié)代碼用一個(gè)Java虛擬機(jī)來執(zhí)行,JVM是理想化的Java處理芯片,通常是在軟件上實(shí)現(xiàn)而不是在硬件上實(shí)現(xiàn)。

3 Java語言和c++語言的比較

c++和Java都屬于雜合語言,允許采用多種編程風(fēng)格。C++是一種雜合語言,支持與c語言的向后兼容能力。由于C++是c的一個(gè)超集,所以包含的許多特性都是c語言不具備的,這些特性使C++在某些地方顯得過于復(fù)雜。但在Java中,設(shè)計(jì)者覺得這種雜合并不象在C++里那么重要。JavB保留了C++的語法,但忽略了資源引用、指針?biāo)惴ā⒉僮鞣剌d等潛在危險(xiǎn),是C/C++的簡化版本。所以Java雖然是從C++衍生出來,Java和C++之間仍存在一些顯著的差異,這些差異代表著技術(shù)的極大進(jìn)步,證明了Java是一種比c++更優(yōu)秀的程序設(shè)計(jì)語言。從面向?qū)ο?00)程序設(shè)計(jì)的角度,論述一下Java和C++的重要差異:

(1)單根結(jié)構(gòu)

在c++中,可在任何地方啟動一個(gè)新的繼承樹,所以最后往往看到包含了大量樹的“一片森林”。在Java中,采用了一種單根式的分級結(jié)構(gòu),因此所有對象都是從根類統(tǒng)一繼承。盡管這表面上看似乎造成了限制,但由于每個(gè)對象肯定至少有一個(gè)object接口,所以往往能獲得更強(qiáng)大的能力,Java的強(qiáng)制單根結(jié)構(gòu)更好地符合了面向?qū)ο?00)語言的標(biāo)準(zhǔn)。

(2)取消指針

Java和C++用new創(chuàng)建一個(gè)對象的時(shí)候,例如:Strings=new String(“object”):都會獲得一個(gè)對象引用。然而,C++對象引用在創(chuàng)建時(shí)必須進(jìn)行初始化,而且不可重定義到一個(gè)不同的位置。但Java對象引用并不一定局限于創(chuàng)建時(shí)的位置??筛鶕?jù)情況任意定義,這便消除了對指針的部分需求。指針通常被看作在基本變量數(shù)組中四處移動的一種有效手段。在c++里,必須用大量采用指針指向任意一個(gè)內(nèi)存位置,這同時(shí)會使其變得不安全,也是Java不提供這一支持的原因。在Java里,沒有象C++那樣的指針,Java允許其以更安全的形式達(dá)到相同的目標(biāo)。Java沒有全局函數(shù),只有類,因而可以用傳遞的方式實(shí)現(xiàn)對象的引用。

(3)自動垃圾收集機(jī)制

Java中沒有C++“破壞器”,變量不存在“作用域”的問題。Java有個(gè)finalize()方法是每一個(gè)類的成員,在某種程度上類似于c++的“破壞器”。但finalize()是由垃圾收集器調(diào)用的,而且只負(fù)責(zé)釋放“資源”,如打開的文件、套接字、端口、URL等。如需在一個(gè)特定的地點(diǎn)做某件事情,必須創(chuàng)建一個(gè)特殊的方法,并調(diào)用它,不能依賴finalize()方法。由Java不支持破壞器的概念,針對類內(nèi)的基礎(chǔ)類以及成員對象,Java采用垃圾收集器自動清除,所有對象都會被當(dāng)作“垃圾”收集掉。自動垃圾收集意味著在Java中出現(xiàn)內(nèi)存漏洞的情況會少得多,但也并非完全不可能。若調(diào)用一個(gè)用于分配存儲空間的固有方法,垃圾收集器就不能對其進(jìn)行跟蹤監(jiān)視。而在另一方面,C++中的所有對象必須用finalize()方法破壞,然而,內(nèi)存漏洞和資源漏洞多是由于編寫不當(dāng)?shù)膄inalize()造成的,或是由于在已分配的一個(gè)塊尾釋放一種資源造成的。Java垃圾收集器是在C++基礎(chǔ)上的一種極大進(jìn)步,使許多編程問題得以解決。

(4)異常控制機(jī)制

Java的異常規(guī)范比c++的出色得多。Java中的所有異常都是從基礎(chǔ)類Throwable里繼承而來的,所以可確保得到的是一個(gè)通用接口。丟棄一個(gè)錯誤的異常后,不是象C++那樣在運(yùn)行期間調(diào)用一個(gè)函數(shù),Java異常規(guī)范是在編譯期間檢查并執(zhí)行的。被取代的方法必須遵守那一方法的基礎(chǔ)類 的異常規(guī)范,可丟棄指定的異?;蛘邚哪切┊惓Q苌鰜淼钠渌惓?。這樣一來,最終得到的是更為“健壯”的異??刂拼a。

(5)單一繼承

Java中的繼承具有與c++相同的效果,但采用的語法不同。Java用extends關(guān)鍵字標(biāo)志從一個(gè)基礎(chǔ)類的繼承,并用super關(guān)鍵字指出準(zhǔn)備在基礎(chǔ)類中調(diào)用的方法,與當(dāng)前所在的方法具有相同的名字。然而,Java中的super關(guān)鍵字只允許訪問父類的方法,亦即分級結(jié)構(gòu)的上一級。通過在c++中設(shè)定基礎(chǔ)類的作用域,可訪問位于分級結(jié)構(gòu)較深處的方法,亦可用super關(guān)鍵字調(diào)用基礎(chǔ)類構(gòu)建器,所有類最終都會從Object里自動繼承。和C++不同,Java不存在明確的構(gòu)建器初始化列表,但Java編譯器會強(qiáng)迫在構(gòu)建器主體的開頭進(jìn)行全部的基礎(chǔ)類初始化,而且不允許在主體的后面部分進(jìn)行這一工作。其語法如下:

public class A extends B{public A(String msg){super(msg);∥調(diào)用基礎(chǔ)類構(gòu)建器}pubic C(int i){ super.C(i);∥調(diào)用基本方法}}

Java提供了一個(gè)interface關(guān)鍵字,其作用是創(chuàng)建抽象基礎(chǔ)類的一個(gè)等價(jià)物。在其中填充抽象方法,且沒有數(shù)據(jù)成員。這樣一來,對于僅僅設(shè)計(jì)成一個(gè)接口的東西,以及對于用extends關(guān)鍵字在現(xiàn)有功能基礎(chǔ)上的擴(kuò)展,兩者之間便產(chǎn)生了一個(gè)明顯的差異。不值得用abstract關(guān)鍵字產(chǎn)生一種類似的效果,因?yàn)椴荒軇?chuàng)建屬于那個(gè)類的一個(gè)對象。一個(gè)抽象類可包含抽象方法,并不要求在其里面包含什么東西,但其也能包含用于具體實(shí)現(xiàn)的代碼。因此,其被限制成一個(gè)單一的繼承。通過與接口聯(lián)合使用,這一方案避免了對類似于c++虛擬基礎(chǔ)類那樣的一些機(jī)制的需要。為創(chuàng)建一個(gè)實(shí)例的一個(gè)interface(接口),需使implements關(guān)鍵字。其語法類似于繼承的語法,如下:

public interface Face

public void Output():}

public class C extends B implements Face{public void Output()fSystem,out,println(“an object”),}}

篇5

關(guān)鍵詞:C語言;指針;程序設(shè)計(jì)

中圖分類號:TP311.1 文獻(xiàn)標(biāo)識碼:A文章編號:1007-9599 (2010) 05-0000-01

C Language Pointer

Li Peng

(Tianjin Polytechnic University,Tianjin300160,China)

Abstract:C-language is a programming language,teaching in the program design plays an important role.In the C language,difficult to understand is the pointer.This article intends to discuss the indicators of definitions,classifications,operations and 3 special purpose,so that we can more clearly understand the nature pointer.Can be expected that only a thorough grasp of the pointer can truly grasp of the C language. Applications through in-depth pointers,C language will be used more widely in the field.

Keywords:C language;Pointer;Programming

一、引言

C語言是目前教學(xué)中使用最廣的程序設(shè)計(jì)語言。雖然近年來產(chǎn)生了許多功能豐富的計(jì)算機(jī)程序設(shè)計(jì)語言,但鮮有能代替C語言的。其主要原因就是它不僅是一門高級語言更重要的是它能直接對物理地址進(jìn)行訪問,具有雙重功能,是嵌入式設(shè)計(jì)中必不可少的一門語言。C語言功能強(qiáng)大的主要原因就是具有指針結(jié)構(gòu)。指針是一種特殊的數(shù)據(jù)類型,直接指向目標(biāo)的存儲地址,實(shí)現(xiàn)直接訪問對象存儲空間的功能,具有重要的作用。

二、C語言中的指針簡介

在C語言中,任何一個(gè)變量總結(jié)起來包括變量的數(shù)據(jù)類型、存儲空間。在數(shù)據(jù)類型中定義的變量的基本范圍和操作類型。存儲空間就是變量在計(jì)算機(jī)中的存儲地址,如何有效的存儲變量并能有效的訪問到它這是一個(gè)必須解決的問題。指針就是表示地址的一種變量,所以指針的范圍嚴(yán)格來說只能是自然數(shù)的,并且不能在兩個(gè)指針間進(jìn)行加、乘、除這樣的運(yùn)算。由于在C語言中每個(gè)數(shù)據(jù)類型都必有存儲空間,所以指針可以應(yīng)用于幾乎所有的數(shù)據(jù)類型中。所以,從這個(gè)角度出發(fā)可以將指針分為:指向變量的指針、數(shù)組指針、字符指針、指向指針的指針、函數(shù)指針、結(jié)構(gòu)變量的指針以及文件指針等等。其中,指向變量的指針就是存儲變量的地址的。如 int * s這就是一個(gè)指向整型的指針,可以用于指向一個(gè)整型變量。如int a; 當(dāng)p=&a時(shí),就是將p存儲整型變量a的地址。這是指針最簡單的一種類型。所謂數(shù)組指針,就是指數(shù)組的名稱實(shí)際上是指向整個(gè)數(shù)組空間的首指針。如 int a[10];其中a本質(zhì)上是一個(gè)指針,指向該數(shù)組的第一個(gè)位置,a[2]表示距離a指向空間向后2個(gè)位置所在空間中的存放的值。所以,a[2]=*(a+2)。字符指針本質(zhì)上是數(shù)組指針的一種特殊情況,就是存放字符串的數(shù)組所對應(yīng)的數(shù)組名。指向指針的指針這是一類很特殊的指針,用于存放指針的一類指針,在本質(zhì)上與指向變量的指針十分相似。例如 char *ss[N]={“java”,”sss”,’’rrr”}。指向函數(shù)的指針就是指向函數(shù)入口地址的指針。結(jié)構(gòu)變量的指針這類指針和指向變量的指針很類似,主要的區(qū)別在于結(jié)構(gòu)變量可能有多個(gè)類型不同的變量,所以一般空間較大。文件指針就是對文件進(jìn)行操作的指針。從上述的分類可以看出無論什么類型的指針其功能都是一樣的就是用于指向?qū)ο蟮牡刂房臻g罷了。

上面簡要的介紹了指針的定義和分類,現(xiàn)在簡要的論述一下指針涉及到的運(yùn)算操作。首先由于指針是存放的變量地址的,所以第一個(gè)操作就是對指針進(jìn)行地址賦值。如int a,*p;

P=&a,這就是對指針p進(jìn)行進(jìn)行賦變量a的地址,p指向變量a。當(dāng)然也可以通過指針獲取指針指向地址空間所存儲的值。如int b=2,*p;p=&a,這是*p就表示p指向空間所存儲的值,在本例中就是a的值2。為了能在數(shù)組指針中通過指針能訪問到整個(gè)數(shù)組的值,所以??梢詫χ羔樳M(jìn)行加減整數(shù)值,表示地址的前移或后移。如int a[10],*p,*s; p=a;s=p+2;其中s 的值表示數(shù)組中首地址向前移動2的位置,表示 a[2]對應(yīng)的地址。 為了表示兩個(gè)地址間存在的距離,可以通過指針間的減法實(shí)現(xiàn)。當(dāng)然指針涉及到的還有其他運(yùn)算,現(xiàn)不詳述了。

三、C語言中的指針應(yīng)用

在C語言中指針的十分應(yīng)用廣泛,除具有一般的功能外,具體特殊功能的應(yīng)用總結(jié)起來有三個(gè)方面:一是用于在函數(shù)中可以返回多個(gè)值;還有就是可以實(shí)現(xiàn)動態(tài)調(diào)用函數(shù);最后就是實(shí)現(xiàn)數(shù)組的動態(tài)定義。其中,由于由函數(shù)的特點(diǎn),一個(gè)函數(shù)只能有一個(gè)返回值,但在有些場合需要返回多個(gè)值,就可以定義指針參量來實(shí)現(xiàn),其定義的基本框架如下:

Sss( int a,int *p )

{int s;

…….

………

Return s;

}

在這中情況下,函數(shù)不僅可以得到返回值(通過Return s來實(shí)現(xiàn)的),還可以通過指針p來返回相應(yīng)的值。所謂指針能實(shí)現(xiàn)動態(tài)調(diào)用函數(shù),這里用到的指針就是上文中提到的函數(shù)指針。函數(shù)指針就是指向函數(shù)入口地址的指針,我們還知道其實(shí)函數(shù)名就是一個(gè)函數(shù)指針。我們就是通過函數(shù)名實(shí)現(xiàn)動態(tài)調(diào)用函數(shù)的。在主調(diào)函數(shù)的參數(shù)中采用函數(shù)名充當(dāng)實(shí)參就能實(shí)現(xiàn)函數(shù)的動態(tài)調(diào)用。該方法以簡短的代碼實(shí)現(xiàn)了復(fù)雜的功能。最后講到指針能實(shí)現(xiàn)數(shù)組的動態(tài)定義。從C語言的學(xué)習(xí)中,我們知道在定義數(shù)組時(shí)一定要指定數(shù)組的大小,否則,不能完整數(shù)組的定義。那么如何實(shí)現(xiàn)數(shù)組的動態(tài)定義?數(shù)組從本質(zhì)上來講就是連續(xù)的空間集合罷了。那么,我們可以通過申請一個(gè)空間并賦值給一個(gè)指針變量,以此指針變量為首空間,就能獲取連續(xù)的空間,這與數(shù)組相同。當(dāng)然數(shù)組還有許多應(yīng)用,只有認(rèn)真分析就能得到更多更好的應(yīng)用實(shí)例。

四、結(jié)論

C語言是到目前為止學(xué)習(xí)最多的程序設(shè)計(jì)語言之一,也是計(jì)算機(jī)教育中的必修課。在整個(gè)C語言教學(xué)中,指針是一個(gè)十分重要的部分,也是最難掌握的部分之一。論文通過對指針的概念、分類、運(yùn)算類型和應(yīng)用等方面,系統(tǒng)的論述了指針,目的就是讓大家能清晰的了解指針、掌握指針,從而實(shí)現(xiàn)高效的應(yīng)用指針。只有掌握好了指針,才能發(fā)揮C語言的優(yōu)勢,可見指針具有重要的作用。

參考文獻(xiàn):

篇6

【關(guān)鍵詞】指針;情景創(chuàng)設(shè);主動探索;協(xié)作學(xué)習(xí);游戲案例導(dǎo)入

一、引言

指針是C語言中廣泛使用的一種數(shù)據(jù)類型,運(yùn)用指針編程是C語言最主要的風(fēng)格之一。正確而靈活地運(yùn)用它,可以有效地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu);能動態(tài)分配內(nèi)存;能方便地使用字符串;有效而方便地使用數(shù)組;在調(diào)用函數(shù)時(shí)能得到多于1個(gè)的值;并能像匯編語言一樣處理內(nèi)存地址,從而變出精練而高效的程序等,這對設(shè)計(jì)系統(tǒng)軟件是很必要的。掌握指針的應(yīng)用,可以使程序簡潔、緊湊、高效。指針極大地豐富了C語言的功能。每一個(gè)學(xué)習(xí)和使用C語言的人,都應(yīng)當(dāng)深入地學(xué)習(xí)和掌握指針??梢哉f,不掌握指針就是沒有掌握C語言的精華。

二、教學(xué)現(xiàn)狀

高職學(xué)生的基礎(chǔ)普遍較差,數(shù)學(xué)與英語基礎(chǔ)較為薄弱,在碰到程序邏輯思維分析,程序代碼編寫及調(diào)試的過程中,往往會感到困難,這是高職C語言課程教學(xué)中的共性問題。學(xué)習(xí)指針是學(xué)習(xí)C語言中最重要的一環(huán),能否正確理解和使用指針是學(xué)生是否掌握C語言的一個(gè)標(biāo)志。同時(shí),指針也是C語言中最為困難的一部分,學(xué)生很難正確理解基本概念,就指針的教學(xué)談?wù)勛约旱南敕ā?/p>

三、教學(xué)方法

1、情景創(chuàng)設(shè)教學(xué)法。課堂教學(xué)是獲取知識和技能的主要陣地,應(yīng)當(dāng)成為培養(yǎng)學(xué)生獨(dú)立思考的搖籃。情景創(chuàng)設(shè)教學(xué)方法把學(xué)習(xí)設(shè)置到簡單的、有意義的問題情境中,學(xué)生通過互相合作來解決這些問題,發(fā)現(xiàn)隱含于問題背后的科學(xué)知識,形成讓學(xué)生掌握解決問題的技能和提高自主學(xué)習(xí)的能力。例如,講解指針的基本概念,計(jì)算機(jī)中的所有數(shù)據(jù)都是順序存放在存儲器中的。一般把存儲器中的一個(gè)字節(jié)稱為一個(gè)內(nèi)存單元,不同數(shù)據(jù)類型的值所占用的內(nèi)存單元數(shù)亦不同。為了正確地訪問這些內(nèi)存單元。內(nèi)存單元的編號也叫地址,通常也把這個(gè)地址稱為指針。內(nèi)存單元的指針和內(nèi)存單元的內(nèi)容是兩個(gè)不同的概念。為讓學(xué)生掌握并理解內(nèi)存單元的指針和內(nèi)存單元的內(nèi)容,我采用了情景創(chuàng)設(shè)的教學(xué)方法。我們到銀行去存、取款時(shí),銀行工作人員將根據(jù)我們的賬號去查找存款單,找到之后在存單上寫入存款、取款的金額。在這里,賬號就是存單的指針,存款數(shù)就是存單的內(nèi)容。這樣就能讓學(xué)生明白內(nèi)存單元的指針和內(nèi)存單元的內(nèi)容之間的關(guān)系了。

2、主動探索、協(xié)作學(xué)習(xí)教學(xué)法。根據(jù)已有信息,從不同角度、不同方向思考問題,從多方面尋求多樣性答案的一種思維形式,是主動探索的教學(xué)方法。為走出傳統(tǒng)教學(xué)中的泥灘,教師應(yīng)轉(zhuǎn)變教學(xué)觀念,砸碎應(yīng)試教育的模式和框架,克服單純傳授知識的傾向,注重順向思維、逆向思維、多向思維的訓(xùn)練,培養(yǎng)學(xué)生思維的深刻性、批判性和創(chuàng)新性。具體來講,就是要通過挖掘教材中能一題多解、一法多用、一題多變的教學(xué)內(nèi)容,來引導(dǎo)學(xué)生主動探索,使他們的思考朝多種方向擴(kuò)散,提出各種設(shè)想、多種解答。在指針教學(xué)中還可以進(jìn)行協(xié)作學(xué)習(xí)中培養(yǎng)學(xué)生們的思維。協(xié)作學(xué)習(xí)是在解題中,盡可能利用自己已有的知識和經(jīng)驗(yàn)與同學(xué)一起討論,將不同的方法進(jìn)行比較,從中確定出最佳方案。在教學(xué)中,引導(dǎo)學(xué)生從不同方向利用其他學(xué)科的理論,開闊思路,找出解決問題的多種方法。然后在眾多的解法中,經(jīng)過歸納、判斷和比較,最終得出一個(gè)最優(yōu)化的結(jié)論。比如在教學(xué)生如何通過指針引用數(shù)組元素,先請學(xué)生協(xié)作學(xué)習(xí)開闊思路用不同方法編寫“輸出數(shù)組中的全部元素”程序。

方法一:下標(biāo)法

方法二:通過數(shù)組名計(jì)算數(shù)組元素地址,找出元素的值

方法三:用指針變量指向數(shù)組元素

通過該教學(xué)方法,這個(gè)知識點(diǎn)學(xué)生掌握得很好,找出解決問題的多種方法,能深刻地、高水平地掌握知識,并能把這些知識廣泛應(yīng)用到學(xué)習(xí)新知識的過程中,舉一反三,提高了對知識的理解能力,使學(xué)習(xí)活動順利進(jìn)行。

3、游戲案例導(dǎo)入教學(xué)法

在指針教學(xué)中通過游戲案例導(dǎo)入教學(xué)法可以營造學(xué)生獨(dú)立思考的心理氛圍。在分析指向多維數(shù)組的指針和指針變量中的“多維數(shù)組的地址”知識點(diǎn),我先請同學(xué)做游戲,一個(gè)當(dāng)“排長”,三個(gè)當(dāng)“班長”,十二個(gè)當(dāng)“戰(zhàn)士”,游戲是:有一個(gè)排,下設(shè)3個(gè)班,每個(gè)班有4名戰(zhàn)士。規(guī)定排長只管理到班,班長管理戰(zhàn)士。在排長眼里只有第0、1、2班。排長從第0班的起始位置走到第1班的起始位置,看來只走了一步,但實(shí)際上他跳過了4名戰(zhàn)士。為了找到某一班內(nèi)某一個(gè)戰(zhàn)士,必須給兩個(gè)參數(shù),即第i班第j個(gè)戰(zhàn)士,先找到第i班,然后由該班班長在本班范圍內(nèi)找第j個(gè)戰(zhàn)士。這個(gè)戰(zhàn)士的位置就是a[i]+i.。開始時(shí)班長面對第0個(gè)戰(zhàn)士。注意,排長和班長的初始位置是相同的。但他們的“指向”是不同的。排長“指向”班,他走一步就跳過1個(gè)班,而班長“指向”戰(zhàn)士,走一步只是指向下一個(gè)戰(zhàn)士??梢钥吹脚砰L是“宏觀管理”,只管班,班長則是“微觀管理”,管理到戰(zhàn)士。如果要找第1班第2個(gè)戰(zhàn)士,則先由排長找到第1班的班長,然后,由班長在本班范圍內(nèi)找到第2個(gè)戰(zhàn)士。二維數(shù)組a相當(dāng)于排長,每一行(即一維數(shù)組a[0]、a[1]、a[2])相當(dāng)于班長,每一行中的元素(如a[1][2])相當(dāng)于戰(zhàn)士。

請同學(xué)們打開書,仔細(xì)看插圖,邊看邊想:誰是排長?班長在哪兒?管多少個(gè)戰(zhàn)士?

這段游戲?qū)氚沿灤┤牡木€索用三個(gè)問題串起來,讓學(xué)生從靜態(tài)的圖中找答案,思考、討論結(jié)果。這一過程學(xué)生的思維也是最活躍的,對問題的思考是深入而全方位的,這些問題激發(fā)了學(xué)生們的心理驅(qū)動力,在討論爭議中,讓學(xué)生迸發(fā)出創(chuàng)新思維的火花。

篇7

關(guān)鍵詞: C語言 變量 變量的存儲類別

C語言是一種應(yīng)用廣泛的、結(jié)構(gòu)化的程序設(shè)計(jì)語言。程序設(shè)計(jì)的一項(xiàng)主要任務(wù)就是對數(shù)據(jù)進(jìn)行處理,編寫程序時(shí)需要用到各種變量來存放數(shù)據(jù)。因此,變量在C語言中是一個(gè)很重要的概念。由于C語言的數(shù)據(jù)結(jié)構(gòu)豐富,變量的內(nèi)容也很多,包括變量的概念、定義、數(shù)據(jù)類型、作用域、存儲類別和存儲方式等。靈活掌握C語言中的各種變量,對程序設(shè)計(jì)將起到至關(guān)重要的作用。

一、變量的概念

變量是內(nèi)存或寄存器中用一個(gè)標(biāo)識符命名的存儲單元,可以用來存儲一個(gè)特定類型的數(shù)據(jù),并且數(shù)據(jù)的值在程序運(yùn)行過程中可以進(jìn)行修改??梢?變量首先是一個(gè)標(biāo)識符或者名稱,就像一個(gè)客房的編號一樣,有了這個(gè)編號,我們就可以找到房間的客人。為了方便,我們在給變量命名時(shí),最好能符合大多數(shù)人的習(xí)慣,應(yīng)見名知義,便于交流和維護(hù)。

二、變量的定義和初始化

在C語言中要使用變量必須先定義,再使用。一個(gè)變量定義的完整格式是(里的部分表示可以省略的部分):

[存儲類型]數(shù)據(jù)類型 變量名1[=表達(dá)式1],變量名2[=表達(dá)式2],……,變量名n[=表達(dá)式n]。

定義一個(gè)變量的過程就是向內(nèi)存申請一個(gè)符合該數(shù)據(jù)類型的內(nèi)存空間,以后對該變量的操作就是對對應(yīng)內(nèi)存空間的存取操作。

在這個(gè)定義中,存儲類型決定了變量存放在何處,數(shù)據(jù)類型決定了這個(gè)變量所占的字節(jié)數(shù),變量名決定了這個(gè)變量在本程序中的名字,表達(dá)式則決定了這個(gè)變量的初始值,使用變量之前應(yīng)該給一個(gè)值,編譯程序?qū)椭覀儼l(fā)現(xiàn)那些還沒有被給定一個(gè)值就被使用的變量。不過,變量不一定需要初始化。在函數(shù)外部定義的變量或者在函數(shù)內(nèi)部用static關(guān)鍵字定義的變量在沒有明確地被初始化之前都已被系統(tǒng)初始化為0了。在函數(shù)內(nèi)部或程序塊內(nèi)部定義的不帶Static關(guān)鍵字的變量都是自動變量,如果沒有明確地對這些變量進(jìn)行初始化,它們就是會具有未定義值。如果沒有對一個(gè)自動變量進(jìn)行初始化,在使用它之前就必須保證先給它賦值。

三、變量的數(shù)據(jù)類型

程序設(shè)計(jì)最基本的問題是解決對所要處理數(shù)據(jù)的描述。任何一個(gè)數(shù)據(jù),都有一個(gè)確定的表示形式。一個(gè)確定的值和確定的能參與的各種運(yùn)算,就是數(shù)據(jù)類型。程序中變量的本質(zhì)表現(xiàn)在存在時(shí)間和占用空間這兩個(gè)方面。變量的數(shù)據(jù)類型決定了變量占用的存儲空間。它受類型說明語句的制約。任一變量都必須具有確定的數(shù)據(jù)類型。不管變量怎樣變化,其值都必須符合該類數(shù)據(jù)類型的規(guī)定。

四、變量的存儲類型

C語言中變量不僅僅有數(shù)據(jù)類型,還有存儲類型。數(shù)據(jù)類型用來說明變量所占的存儲空間的大小和可以進(jìn)行的操作,存儲類型用來表示變量的生命期和作用域,即變量起作用的范圍。在C語言中,按照變量的作用域把變量分為兩種:局部變量和全局變量。

1.局部變量

在一個(gè)函數(shù)內(nèi)部定義的變量,只在本函數(shù)內(nèi)部有效,這種變量稱為“局部變量”。例如:主函數(shù)與被調(diào)用函數(shù)中可以有相同的變量名,但這些變量只作用在它自己的范圍內(nèi),即兩個(gè)函數(shù)中的同名變量,在內(nèi)存中占有不同的存儲單元,是兩個(gè)不同的變量。局部變量存在于以下幾種形式中:

(1)在一個(gè)函數(shù)內(nèi)部定義的變量是局部變量,只能在函數(shù)內(nèi)部使用。

(2)在主函數(shù)內(nèi)部定義的變量也是局部變量,其它函數(shù)也不能使用主函數(shù)中的變量。

(3)形式參數(shù)是局部變量。

(4)在復(fù)合語句中定義的變量是局部于復(fù)合語句的變量,只能在復(fù)合語句中使用。

(5)局部變量在函數(shù)被調(diào)用的過程中占有存儲單元。

(6)不同函數(shù)中可以使用同名變量。在不同的作用域內(nèi),可以對變量重新進(jìn)行定義。

2.全局變量

在函數(shù)外部定義的變量是全局變量,其作用域是變量定義位置至整個(gè)程序文件結(jié)束。使用全局變量,可增加函數(shù)間數(shù)據(jù)聯(lián)系的渠道。全局變量可以將數(shù)據(jù)帶入到作用域范圍內(nèi)的函數(shù),也可以將數(shù)據(jù)帶回到作用域范圍內(nèi)的其它函數(shù)。提前引用外部變量,需對外部變量進(jìn)行說明,或稱聲明。局部變量如與外部變量同名,則在局部變量的作用域內(nèi),外部變量存在,但不可見,外部變量的作用被屏蔽。全局變量在程序運(yùn)行過程中均占用存儲單元。在編程時(shí),原則上盡量少用全局變量,能用局部變量,不用全局變量,要避免局部變量全局化。

在C語言中,按照變量在內(nèi)存中存在的時(shí)間(生存期)角度來分,可分為動態(tài)存儲方式和靜態(tài)存儲方式。

(1)靜態(tài)存儲變量

凡是用關(guān)鍵字Static定義的變量全部被稱為靜態(tài)變量。所有的靜態(tài)變量全部存儲在靜態(tài)存儲區(qū),在程序的運(yùn)行期間一直存在。

(2)動態(tài)存儲變量

動態(tài)存儲變量是存儲在動態(tài)存儲區(qū)的,這種變量只在定義它們的時(shí)候才創(chuàng)建,在定義它們的函數(shù)返回時(shí)系統(tǒng)回收變量所占內(nèi)存。對這些變量的創(chuàng)建和回收是由系統(tǒng)自動完成的,所以也叫自動變量(用關(guān)鍵字Auto定義)。最典型的例子就是函數(shù)中定義的局部變量。

變量的特性除了數(shù)據(jù)類型之外,還有存儲類別。C語言中變量的存儲類別有四種:自動型(Auto)、靜態(tài)型(Static)、外部型(Extern)、寄存器型(Register)。

①自動型(Auto)

Auto表示自動變量,通常關(guān)鍵字Auto可以省略,自動變量必須定義在函數(shù)內(nèi)部,我們以前所說的變量基本上都是這種類型,函數(shù)的形式參數(shù)也是這種類型。自動型變量是局部變量,所以作用域是本函數(shù)。若是在復(fù)合語句中說明的自動變量,其作用域是本復(fù)合語句。

②靜態(tài)型(Static)

在函數(shù)內(nèi)部以Static進(jìn)行說明的變量。它是局部變量,作用域與自動變量相同。它的存儲方式是靜態(tài)的,當(dāng)它被說明后就占有存儲單元,直到本程序執(zhí)行結(jié)束,所以它的生命期是從被說明開始到程序執(zhí)行結(jié)束。當(dāng)一個(gè)變量被定義為靜態(tài)型時(shí),如果它沒有賦值,系統(tǒng)自動賦0值,而自動變量不賦值,它的值是不確定的。

③外部型(Extern)

在函數(shù)外部說明的變量,它是全局變量,所以作用域是從說明開始到程序結(jié)束。它的存儲方式是靜態(tài)型,所以它的生存期是從說明開始到整個(gè)程序執(zhí)行結(jié)束。外部變量有定義性說明和引用性說明兩種形式,定義性說明作用是定義一個(gè)外部變量,不需要使用Extern。若外部變量在程序的后面說明,當(dāng)前不能直接使用,若要使用就必需使用Extern進(jìn)行引用性說明。

④寄存器型(Register)

Register關(guān)鍵字用于聲明寄存器變量,頻繁使用的變量聲明為Register型可以提高程序效率,也可以交給編譯器自行優(yōu)化(編譯器一般把循環(huán)控制變量存儲類型定為Register),Register類型的變量受處理器寄存器長度的限制,不符合要求的Register變量將會被處理成Auto型內(nèi)存變量。Register變量在作用時(shí)駐留于處理器的寄存器,故其作用域也只限于相應(yīng)的函數(shù)和復(fù)合語句,和Auto類似。

總之,C語言中的變量類型豐富,運(yùn)用靈活。只有多想、多練、多編寫程序,我們才能真正掌握其中的含義。

參考文獻(xiàn):

篇8

關(guān)鍵詞: C程序設(shè)計(jì) 運(yùn)算符 預(yù)算順序 算法 結(jié)構(gòu)

一、引言

現(xiàn)在許多院校的計(jì)算機(jī)專業(yè)開設(shè)了C語言課程,將其作為學(xué)生學(xué)習(xí)程序設(shè)計(jì)技術(shù)的入門課程,這與C語言的特點(diǎn)是分不開的。C語言不但可以編寫系統(tǒng)軟件,而且可以根據(jù)用戶的需要編寫出滿足用戶要求的應(yīng)用軟件,尤其是C語言具有很好的對計(jì)算機(jī)的硬件編程能力。同時(shí),C語言具有邏輯性強(qiáng)、處理問題周密、嚴(yán)謹(jǐn)?shù)奶攸c(diǎn),是集知識和技能于一體,實(shí)踐性很強(qiáng)的課程。學(xué)生通過學(xué)習(xí)C語言可掌握程序設(shè)計(jì)的一些基本方法和技巧。然而C語言的數(shù)據(jù)類型較多、表達(dá)式豐富、語法結(jié)構(gòu)較復(fù)雜,是一門教師難教、學(xué)生難學(xué)的課程。

《C程序設(shè)計(jì)》的內(nèi)容很豐富,按照我們現(xiàn)在的教學(xué)大綱,教學(xué)的主要內(nèi)容是基礎(chǔ)知識、四種結(jié)構(gòu)的程序設(shè)計(jì)、函數(shù)與數(shù)組的應(yīng)用和一些簡單的算法。在學(xué)習(xí)時(shí),同學(xué)們應(yīng)該把主要精力放在這些部分,多進(jìn)行練習(xí)和上機(jī)調(diào)試。當(dāng)然,在初學(xué)C語言時(shí),可能會遇到有些問題理解不透,或者表達(dá)方式與以往數(shù)學(xué)學(xué)習(xí)中不同(如運(yùn)算符等),這就要求不要?dú)怵H,不明白的地方多問多想,鼓足勇氣進(jìn)行學(xué)習(xí),待學(xué)完后面的章節(jié)知識,前面的問題也就迎刃而解了。學(xué)習(xí)C語言始終要記住“曙光在前頭”和“千金難買回頭看”。學(xué)習(xí)后面的知識,不要忘了回頭弄清遺留下的問題和加深理解前面的知識。這是我們學(xué)生最不易做到的,然而卻又是最重要的。學(xué)習(xí)C語言就是要經(jīng)過幾個(gè)反復(fù),才能前后貫穿,積累應(yīng)該掌握的C語言知識。那么,我們到底該如何學(xué)好《C程序設(shè)計(jì)》呢?

二、奠定基礎(chǔ)――了解、學(xué)好運(yùn)算符和運(yùn)算順序

C語言的運(yùn)算非常靈活,功能十分豐富,運(yùn)算種類遠(yuǎn)多于其他程序設(shè)計(jì)語言。在表達(dá)式方面較其它程序語言更為簡潔,如自加、自減、逗號運(yùn)算和三目運(yùn)算使表達(dá)式更為簡單。但初學(xué)者往往會覺得這種表達(dá)式難讀,關(guān)鍵原因就是對運(yùn)算符和運(yùn)算順序理解不透不全。當(dāng)多種不同運(yùn)算組成一個(gè)運(yùn)算表達(dá)式,即一個(gè)運(yùn)算式中出現(xiàn)多種運(yùn)算符時(shí),運(yùn)算的優(yōu)先順序和結(jié)合規(guī)則顯得十分重要。在學(xué)習(xí)中,只要我們對此合理進(jìn)行分類,找出它們與我們在數(shù)學(xué)中所學(xué)到運(yùn)算之間的不同點(diǎn)之后,記住這些運(yùn)算也就不困難了,有些運(yùn)算符在理解后更會牢記心中,將來用起來會得心應(yīng)手,而有些可暫時(shí)放棄不理,等用到時(shí)再記不遲。對于運(yùn)算符的優(yōu)先級也是必須明確的?!禖程序設(shè)計(jì)》運(yùn)算符可分為15種優(yōu)先級,從高到低,優(yōu)先級為1―15,且除第2、3級和第14級為從右至左結(jié)合外,其他都是從左至右結(jié)合,它決定著同級運(yùn)算符的運(yùn)算順序。這里就給大家介紹一個(gè)優(yōu)先級口訣:

括號成員第一

全體單目第二

乘除余三、加減四

移位五、關(guān)系六

等于(與)不等排第七

位與異位和位或

“三分天下”八九十

邏輯或跟與

十二和十一

條件高于賦值

逗號運(yùn)算級最低。[1]

下面我們來舉個(gè)例子:

a=3;b=5;c=++a*b;d=a++*b;

對于c=++a*b來說,按表中所列順序,++先執(zhí)行,*后執(zhí)行,所以++a執(zhí)行后,a的值為4,由于++為前置運(yùn)算,所以a的值4參與運(yùn)算,C的值計(jì)算式為4*5=20而不是3*5=15了。而對于d=a++*b來說,由于a++為后置運(yùn)算,所以a值為4參與運(yùn)算,使得d的值仍為20,而a參與運(yùn)算后其值加1,值為5。這個(gè)例子執(zhí)行后,a的值為5,b的值為5,c的值為20,d的值也是20。

三、砌磚壘墻――了解、學(xué)好四種程序結(jié)構(gòu)

(1)順序結(jié)構(gòu)

順序結(jié)構(gòu)的程序設(shè)計(jì)是最簡單的,只要按照解決問題的順序?qū)懗鱿鄳?yīng)的語句就行,它的執(zhí)行順序是自上而下,依次執(zhí)行。例如:a=3,b=5,現(xiàn)交換a,b的值。這個(gè)問題就好像交換兩個(gè)杯子的水,這當(dāng)然要用到第三個(gè)杯子,假如第三個(gè)杯子是c,那么正確的程序?yàn)椋篶=a;a=b;b=c;執(zhí)行結(jié)果是a=5,b=c=3。

(2)分支結(jié)構(gòu)

順序結(jié)構(gòu)的程序雖然能解決計(jì)算、輸出等問題,但不能做判斷再選擇。對于要先做判斷再選擇的問題就要使用分支結(jié)構(gòu)。分支結(jié)構(gòu)的執(zhí)行是依據(jù)一定的條件選擇執(zhí)行路徑,而不是嚴(yán)格按照語句出現(xiàn)的物理順序。分支結(jié)構(gòu)的程序設(shè)計(jì)方法的關(guān)鍵在于構(gòu)造合適的分支條件和分析程序流程,根據(jù)不同的程序流程選擇適當(dāng)?shù)姆种дZ句。分支結(jié)構(gòu)適合于帶有邏輯或關(guān)系比較等條件判斷的計(jì)算,設(shè)計(jì)這類程序時(shí)往往都要先繪制其程序流程圖,然后根據(jù)程序流程寫出源程序,這樣做把程序設(shè)計(jì)分析與語言分開,使得問題簡單化,易于理解。程序流程圖是根據(jù)解題分析所繪制的程序執(zhí)行流程圖。學(xué)習(xí)分支結(jié)構(gòu)不要被分支嵌套所迷惑,只要正確繪制出流程圖,弄清各分支所要執(zhí)行的功能,嵌套結(jié)構(gòu)也就不難了。嵌套只不過是分支中又包括分支語句而已,不是新知識,只要對雙分支的理解清楚,分支嵌套是不難的。那么就先來簡單介紹一下二分支選擇結(jié)構(gòu)。C語言的if語句有兩種基本形式,即獨(dú)立的if結(jié)構(gòu)和if-else結(jié)構(gòu)。[2]其語法形式如下:

1)獨(dú)立的if結(jié)構(gòu)

if(表達(dá)式)

語句

2)if-else結(jié)構(gòu)

if(表達(dá)式)

語句1

else

語句2

再來看一下分支嵌套的語法形式

if(表達(dá)式1)

if(表達(dá)式2)語句1

else語句2

else語句3

(3)循環(huán)結(jié)構(gòu)

循環(huán)結(jié)構(gòu)可以減少源程序重復(fù)書寫的工作量,用來描述重復(fù)執(zhí)行某段算法的問題,這是程序設(shè)計(jì)中最能發(fā)揮計(jì)算機(jī)特長的程序結(jié)構(gòu)。C語言中提供四種循環(huán),即goto循環(huán)、while循環(huán)、do-while循環(huán)和for循環(huán)。[3]四種循環(huán)可以用來處理同一問題,一般情況下它們可以互相代替換,但一般不提倡用goto循環(huán),因?yàn)閺?qiáng)制改變程序的順序經(jīng)常會給程序的運(yùn)行帶來不可預(yù)料的錯誤,在學(xué)習(xí)中我們主要學(xué)習(xí)while、do...while、for三種循環(huán)。常用的三種循環(huán)結(jié)構(gòu)學(xué)習(xí)的重點(diǎn)在于弄清它們相同與不同之處,以便在不同場合下使用,這就要清楚三種循環(huán)的格式和執(zhí)行順序,將每種循環(huán)的流程圖理解透徹后就會明白如何替換使用,如把while循環(huán)的例題,用for語句重新編寫一個(gè)程序,這樣能更好地理解它們的作用。特別要注意在循環(huán)體內(nèi)應(yīng)包含趨于結(jié)束的語句(即循環(huán)變量值的改變),否則就可能成了一個(gè)死循環(huán),這是初學(xué)者的一個(gè)常見錯誤。對于它們的異同點(diǎn),我們也應(yīng)該了解,明確:用while和do...while循環(huán)時(shí),循環(huán)變量的初始化的操作應(yīng)在循環(huán)體之前,而for循環(huán)一般在語句1中進(jìn)行的;while循環(huán)和for循環(huán)都是先判斷表達(dá)式,后執(zhí)行循環(huán)體,而do...while循環(huán)是先執(zhí)行循環(huán)體后判斷表達(dá)式,也就是說do...while的循環(huán)體最少被執(zhí)行一次,而while循環(huán)和for就可能一次都不執(zhí)行。另外還要注意的是這三種循環(huán)都可以用break語句跳出循環(huán),用continue語句結(jié)束本次循環(huán),而goto語句與if構(gòu)成的循環(huán),是不能用break和continue語句進(jìn)行控制的。[4]在這里介紹一下三種常見循環(huán)的一般格式:

1)while循環(huán):

while(表達(dá)式)

循環(huán)體

2)do-while循環(huán):

do

循環(huán)體

while(表達(dá)式)

3)for循環(huán):

for(表達(dá)式1;表達(dá)式2;表達(dá)式3)

循環(huán)體語句(組)

(4)模塊化程序結(jié)構(gòu)

C語言的模塊化程序結(jié)構(gòu)用函數(shù)來實(shí)現(xiàn),即將復(fù)雜的C程序分為若干模塊,每個(gè)模塊都編寫成一個(gè)C函數(shù),然后通過主函數(shù)調(diào)用函數(shù)及函數(shù)調(diào)用函數(shù)來實(shí)現(xiàn)一大型問題的C程序編寫。因此常說:C程序=主函數(shù)+子函數(shù)。因此,對函數(shù)的定義、調(diào)用、值的返回等中要尤其注重理解和應(yīng)用,并通過上機(jī)調(diào)試加以鞏固。[5]

其實(shí),順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)并不是彼此孤立的,在循環(huán)中可以有分支、順序結(jié)構(gòu),分支中也可以有循環(huán)、順序結(jié)構(gòu),但是不管哪種結(jié)構(gòu),我們均可廣義地把它們看成一個(gè)語句。在實(shí)際編程過程中常將這三種結(jié)構(gòu)相互結(jié)合以實(shí)現(xiàn)各種算法,設(shè)計(jì)出相應(yīng)程序,但是要編程的問題較大,編寫出的程序就往往很長、結(jié)構(gòu)重復(fù)多,造成可讀性差,難以理解,解決這個(gè)問題的方法是將C程序設(shè)計(jì)成模塊化結(jié)構(gòu)。[6]

四、修飾――掌握一些簡單的算法

所謂算法,就是解決某類問題的方法。確切地說,就是對某一類特定的問題,給出解決該問題的一系列(有窮的)操作,而每一操作都有其確切的意義,并在有限時(shí)間內(nèi)可以計(jì)算出結(jié)果。一個(gè)算法有多少個(gè)輸入量,它是問題給出的初始數(shù)據(jù),經(jīng)過算法的實(shí)現(xiàn),它有一個(gè)或多個(gè)輸出量,這就是算法對輸入運(yùn)算的結(jié)果,即問題的解答?!禖程序設(shè)計(jì)》教學(xué)大綱,只要求我們掌握一些簡單的算法,在掌握這些基本算法后,要完成對問題的分析就容易了。[7]如兩個(gè)數(shù)的交換、三個(gè)數(shù)的比較、選擇法排序和冒泡法排序,這就要求我們要清楚這些算法的內(nèi)在含義,其中選擇法排序和冒泡法排序稍難,但只要明白排序的具體過程,對代碼的理解就不難了。如要將兩個(gè)變量X、Y的值交換。

用自然語言描述如下:

步驟1,將X值存入中間變量Z中:XZ。

步驟2,將Y值存入變量X中:YX。

步驟3,將中間變量Z值存入Y中:ZY。

用偽代碼可表示如下:

BEGIN

xz

yx

zy

END

當(dāng)然還可以用流程圖表示,這里就不列舉了。

五、結(jié)語

在大學(xué)里,許多學(xué)C語言的人,都有著不同的目的。有的人是認(rèn)真對待每一門所學(xué)的課程,包括C語言,有的人是對程序設(shè)計(jì)有著濃厚的興趣,還有的人只是為了獲得學(xué)分而學(xué)習(xí)C語言。這樣,一部分人會覺得C語言容易學(xué),一部分人又會覺得C語言難學(xué),還有一部分人會覺得C語言容易學(xué),但是不會編寫程序。這樣就導(dǎo)致了學(xué)習(xí)C語言效果的差異。其實(shí),學(xué)習(xí)C語言并不是進(jìn)行一種職業(yè)培訓(xùn),而是一種綜合思維的訓(xùn)練。我們應(yīng)當(dāng)正確認(rèn)識什么是程序,并學(xué)會一種思考問題的方法,初步掌握用C語言來進(jìn)行程序設(shè)計(jì)。

參考文獻(xiàn):

[1]田祥宏,榮政.C語言程序設(shè)計(jì).西安電子科技大學(xué)出版社,2007.

[2]李麗娟.C程序設(shè)計(jì)基礎(chǔ)教程.

[3]Stephen Prata著.云巔工作室譯.C Primer Plus.

[4]Kenneth A.Reek著.徐波譯.C和指針POINTERS ON C.

篇9

關(guān)鍵字:“C語言”;C;AI-CODE;游戲教學(xué);程序設(shè)計(jì)

前言

傳統(tǒng)的計(jì)算機(jī)程序設(shè)計(jì)教學(xué)方式大部分都是以教師講授為主,而學(xué)生被動地接受知識。這種教育模式往往存在著枯燥乏味、無趣,而且很大程度上存著單向性(也就是常說的填鴨式教學(xué)),教授者和被教授者之間缺乏互動性,使學(xué)生普遍產(chǎn)生學(xué)習(xí)只為了應(yīng)付考試等厭學(xué)的情緒,不能積極地發(fā)展和挖掘?qū)W生的智力,甚至?xí)髿W(xué)生的求真求新的天性,他們的創(chuàng)造力逐漸在枯燥無味的程序設(shè)計(jì)教學(xué)中消磨殆盡。

如何能讓學(xué)生能體會到學(xué)生程序設(shè)計(jì)的樂趣,并逐漸地像迷上“網(wǎng)絡(luò)游戲”那樣“迷上”程序設(shè)計(jì)的學(xué)習(xí)呢?

“游戲教學(xué)”是旨在用一種寓教于樂的高效學(xué)習(xí)方法,利用人們“愛玩”的天性,讓學(xué)習(xí)者在“玩”中學(xué)習(xí),從而充分調(diào)動學(xué)習(xí)者的學(xué)習(xí)興趣,使學(xué)習(xí)的效率和主動性得到極大的提高。正如蘇格拉底的名言:教育不是灌輸,而是點(diǎn)燃火焰!

一、AI-CODE游戲系統(tǒng)簡介

AI-CODE游戲教育平臺是一套全新的教育平臺,以寓教于樂的游戲教育方式,打破了傳統(tǒng)的教育模式??么蠹以詵茄蠱鵲木杭賈脅恢瘓醯靨岣咦約旱募撲慊絳蟶杓撲膠拖喙氐氖?、五d懟⑼紜⑷斯ぶ悄艿妊Э浦兜撓τ盟?。AI-CODE為程序和算法設(shè)計(jì)的學(xué)習(xí)和實(shí)踐提供了全方位的環(huán)境,由于其游戲主題的有趣性、直觀性,使學(xué)生在學(xué)習(xí)的同時(shí)感到了快樂和成就感,而在娛樂的同時(shí)發(fā)現(xiàn)自己以前的知識不夠用,所以為了得到更多的快樂和成就感,便又投入于學(xué)習(xí)中,讓學(xué)生在玩,學(xué)習(xí),玩,學(xué)習(xí)的循環(huán)的過程中不斷提高自己的程序設(shè)計(jì)和策略算法設(shè)計(jì)的水平,整個(gè)過程是一個(gè)自主的學(xué)習(xí)過程,是一種逐漸“迷上”的過程,而非被強(qiáng)迫的。AI-CODE學(xué)習(xí)三者的關(guān)系如下圖:

AI-RCJ是AI-CODE中一套虛擬足球機(jī)器人的制作和競技仿真的教育平臺,并實(shí)現(xiàn)了C、C++、Java、C#等多種編程語言同臺競技。為了讓自己的足球在競技中具有良好的攻防性和機(jī)動性,必須給虛擬足球機(jī)器人賦予一定的智能,智能化程度的高低取決于使用者數(shù)學(xué)、物理、計(jì)算機(jī)等相關(guān)學(xué)科知識的靈活運(yùn)用程度。AI-RCJ界面如下圖:

二、快樂的學(xué)習(xí)之旅

下面在“AI-RCJ”教育平臺上,以幾個(gè)簡單的例子展示C語言的快樂學(xué)習(xí)之旅,在這些快樂的有“成就感”的競技中逐漸掌握C程序設(shè)計(jì)語言一些關(guān)鍵語法,體會到“游戲教學(xué)”的樂趣。

(一)我的第一個(gè)會動的機(jī)器人

在AI-RCJ教育平臺中我們只須書寫幾句簡單的代碼,就立刻可以看到一個(gè)會動的“足球機(jī)器人”,會讓我們馬上感到有些小小的“成就感”,并吸引我們繼續(xù)的深入。

#includeairobot/c/SimpleRobot.h

/**

*機(jī)器人執(zhí)行函數(shù)

*/

voidrun()

{

/*在這里添加控制機(jī)器人的代碼*/

doMoveTo(30,30);/*移動到坐標(biāo)點(diǎn)(30,30)*/

}

這段代碼代表了一個(gè)“函數(shù)”,這個(gè)函數(shù)的名字叫做run。函數(shù)是c語言程序的一個(gè)主要組成部分,每個(gè)函數(shù)都有自己的名字,并且可以完成相應(yīng)的功能。run函數(shù)只由單個(gè)語句組成,doMoveTo(30,30)完成控制機(jī)器人移動到(30,30)這個(gè)坐標(biāo)點(diǎn)。

(二)讓機(jī)器人會撞球

要讓機(jī)器人撞擊足球就要知道足球的坐標(biāo)。在程序中調(diào)用getBallX和getBallY可以獲取足球的坐標(biāo)。

voidrun(void)

{

doubleballX,ballY;/*定義兩個(gè)變量*/

ballX=getBallX();/*獲得足球的x坐標(biāo)*/

ballY=getBallY();/*獲得足球的y坐標(biāo)*/

doMoveTo(ballX,ballY);/*向足球撞擊*/

}

在run函數(shù)里面,第一條語句定義了兩個(gè)“變量”,變量是c語言中的一個(gè)基本元素,可以用它們來存放不同的數(shù)值,程序設(shè)計(jì)中變量的作用和代數(shù)中的未知數(shù)的作用類似。在使用一個(gè)變量之前,必須先定義它,“doubleballX,ballY;”這條語句完成了變量的定義。這兩個(gè)變量的名字是ballX和ballY,以后可以通過這兩個(gè)名字來使用變量,就像使用函數(shù)的名字來調(diào)用一個(gè)函數(shù)一樣。變量是有“類型”的,變量的類型規(guī)定了變量可以存放什么樣的數(shù)據(jù),ballX和ballY這兩個(gè)變量的類型是double,表示他們可以存放浮點(diǎn)數(shù),也就是我們通常所說的小數(shù)。轉(zhuǎn)載于范文中國網(wǎng)。

語句ballX=getBallX()使用了變量ballX,這是一個(gè)“賦值語句”,等號“=”將賦值

語句分成了左右兩部分,等號的左邊一般是一個(gè)變量,等號表示賦值操作,就是把右邊的數(shù)值存放到左邊的變量當(dāng)中,在這里等號并不是要表示兩邊的內(nèi)容相等。在這條賦值語句中,等號右邊的部分是一個(gè)函數(shù)調(diào)用,被調(diào)用的函數(shù)叫g(shù)etBallX,這個(gè)函數(shù)是一個(gè)有“返回值”的函數(shù),這表示調(diào)用這個(gè)函數(shù)后,我們可以得到一個(gè)數(shù)值,這個(gè)數(shù)值代表了函數(shù)執(zhí)行的結(jié)果。getBallX函數(shù)的返回值是足球的ballX坐標(biāo)。賦值語句“ballX=getBallX();”把getBallX函數(shù)的返回值保存到了變量ballX里,執(zhí)行這個(gè)語句的時(shí)候,實(shí)際上發(fā)生了兩件事,首先是調(diào)用getBallX函數(shù),并取得函數(shù)的返回值,然后就是將這個(gè)返回值保存到變量ballX里。語句ballY=getBallY()是類似的,這條語句把對手的ballY坐標(biāo)保存到的變量y里。

現(xiàn)在知道了足球當(dāng)前的坐標(biāo),語句“doMoveTo(ballX,ballY);”完成了向足球所在位置撞擊的工作。在這里我們將變量ballX,ballY作為參數(shù)傳遞給doMoveTo函數(shù),因?yàn)樽兞縝allX,ballY里存放了足球所在位置的坐標(biāo),通過用這兩個(gè)變量作為參數(shù)調(diào)用doMoveTo函數(shù),也就是將足球所在位置作為撞擊的目標(biāo)點(diǎn),實(shí)現(xiàn)向足球所在位置撞擊。

但我們看到機(jī)器人在剛開始時(shí)撞擊了一下足球,之后便停止不動。

如何能讓機(jī)器人能不斷地撞球呢?我們用一種新的語句:循環(huán)語句,實(shí)現(xiàn)一個(gè)不斷撞擊足球的機(jī)器人。

voidrun(void)

{

doubleballX,ballY;/*定義兩個(gè)變量*/

while(1){

ballX=getBallX();/*獲得足球的x坐標(biāo)*/

ballY=getBallY();/*獲得足球的x坐標(biāo)*/

doMoveTo(ballX,ballY);

}

}

就這樣讓我們體會到循環(huán)語句的“威力”?。ㄈ┳寵C(jī)器人聰明起來——避免“烏龍”球

好了,我們的機(jī)器人已經(jīng)能動起來啦,但如何讓我們的機(jī)器人變“聰明”起來呢?能實(shí)現(xiàn)一個(gè)可以根據(jù)自己的進(jìn)攻方向和足球的運(yùn)動方向來盡量避免踢“烏龍”球的機(jī)器人。

我們會不知不覺地想辦法去不斷學(xué)習(xí),讓我們機(jī)器人越來起“聰明”!

voidrun(void)

{

intshoot;/*定義控制變量*/

doubleballHeading;/*定義變量,存儲球的運(yùn)動方向*/

doubleheading;/*定義變量,存儲機(jī)器人的進(jìn)攻方向*/

doubleballX,ballY;/*定義變量,存儲球的ballX,ballY坐標(biāo)*/

doublegoalMin,goalMax;

doublecourtWidth,courtHeight;

doublegoalSize;/*定義變量,存儲球門的大?。▽挾龋?/

/*定義變量,存儲球的運(yùn)動直線方程ballY=k*ballX+b中的b和k*/

doubleb,k;

heading=getAttack();/*得到機(jī)器人的進(jìn)攻方向*/

courtWidth=getCourtWidth();/*得到場地的寬度*/

courtHeight=getCourtHeight();/*得到場地的高度*/

goalSize=getGoalSize();/*得到球門的大小*/

goalMin=courtHeight/2-goalSize/2;

goalMax=courtHeight/2+goalSize/2;

while(1){

/*求出足球的運(yùn)動直線*/

ballX=getBallX();

ballY=getBallY();

ballHeading=getBallHeading();

k=tan(ballHeading);

b=ballY-k*ballX;

/*如果機(jī)器人是由左向右進(jìn)攻,而且當(dāng)前球的運(yùn)動方向是由右向左運(yùn)動*/

if(heading0ballHeadingPI/2ballHeadingPI*3/2){

if(goalMin50*k+bgoalMax50*k+b){

shoot=0;

}else{

shoot=1;

}

}

/*如果機(jī)器人是由右向左進(jìn)攻,而且當(dāng)前球的運(yùn)動方向是由左向右運(yùn)動*/

elseif(heading=0

(ballHeading=0ballHeadingPI/2

||ballHeading2*PIballHeading3*PI/2))

{

if(goalMink*courtWidth+b

k*courtWidth+bgoalMax){

shoot=0;

}else{

shoot=1;

}

}

/*其他情況*/

elseshoot=1;

if(shoot==1){

doMoveTo(ballX,ballY

}else{

doTurnTo(PI*3/2);

doMoveBack(300);

}

}

}

通過循環(huán)語句(while)和選擇語句(if)等知識的綜合應(yīng)用,讓我們的機(jī)器人變得越來越“聰明”啦。接著下來,我們又會想讓我們的機(jī)器人變成有策略的進(jìn)攻和防守,團(tuán)隊(duì)協(xié)作。。。。。。,最后讓整個(gè)“足球”比賽變得越來越有意思,學(xué)習(xí)變得越來越有趣。

四、結(jié)語

AI-CODE中的AI-RCJ讓學(xué)生在這“虛擬足球競技”的教育平臺上,讓自己的機(jī)器人動起來,不斷地撞球,聰明起來,有策略的進(jìn)攻和防守。。。。。。等一系列有“成就感”的快樂游戲中,逐漸“迷上”程序和算法設(shè)計(jì)。為了更好地“玩”,不斷地學(xué)習(xí),不斷地提高自己的計(jì)算機(jī)程序設(shè)計(jì)水平和策略算法設(shè)計(jì)水平,真正體會到寓教于樂的樂趣!

參考文獻(xiàn)

[1]龔睿.AI-CODESYSTEMS在智能機(jī)器人教學(xué)中的應(yīng)用[J].2004.

[2]沙有威.程序設(shè)計(jì)教學(xué)的新載體——智能機(jī)器[J].2002.

篇10

關(guān)鍵詞:C語言 圖形函數(shù) 應(yīng)用

引言

C語言是國際上廣泛流行的很有發(fā)展前途的計(jì)算機(jī)高級語言。它既具有一般計(jì)算機(jī)高級語言的可讀性、可移植性的特點(diǎn),又具有低級語言能夠?qū)τ?jì)算機(jī)硬件進(jìn)行操作的特性,因此,它適合用于操作系統(tǒng)的描述語言,用C語言開發(fā)系統(tǒng)軟件和應(yīng)用軟件。但在87ANSIC中并沒有規(guī)定C語言的圖形功能,許多C語言教材沒有介紹C語言的圖形功能,這給許多需要用C語言設(shè)計(jì)完美、漂亮的用戶界面的初學(xué)者帶來了困難[1-2]。本文旨在通過介紹Turbo C 2.0的主要圖形函數(shù)及一個(gè)具體的實(shí)例簡介這些函數(shù)的用法。

1 與圖形繪制有關(guān)的系統(tǒng)硬件[2-3]

要使計(jì)算機(jī)能夠繪制圖形,必須有一定的硬件基礎(chǔ)作為保障。圖形繪制的硬件基礎(chǔ)主要是顯示器和顯示卡。顯示器的工作方式一般有文本方式和圖形方式。要在屏幕上顯示圖形,必須將其設(shè)置成圖形方式。衡量顯示器的主要性能指標(biāo)是點(diǎn)距和分辨率。目前顯示器常用的點(diǎn)距有0.39mm、0.31mm和0.28mm三種。高檔微機(jī)配置的彩色顯示器目前流行的是VGA檔次,它最低的分辨率為640×480,中檔的是800×600,高檔的是1024×768。顯示器必須與顯示卡配套使用才能發(fā)揮其圖形功能。顯示卡所能支持的不同分辨率的顯卡類型稱為顯示模式。下表給出Turbo C中常用的幾種顯示卡的圖形模式:

2 Turbo C 2.0中與繪圖有關(guān)的常用圖形函數(shù)

2.1 設(shè)置圖形工作方式的函數(shù):initgraph()。

Turbo C繪圖,首先必須設(shè)置顯示器為圖形方式。該函數(shù)通過選定參數(shù)可確定顯卡的類型及圖形模式。

如:

int driver,mode;

driver=IBM8514;

mode=IBM8514HI;

initgraph(&driver,& mode,“c:\temp”);

將圖形方式設(shè)置為IBM8514類型,IBM8514HI圖形模式,1024×768的分辨率,搜索路徑temp為C盤一級子目錄。

2.2 顏色控制函數(shù)setbkcolor(int color)及setcolor(int color)。

其中setbkcolor( )設(shè)置背景顏色,setcolor( )設(shè)置劃線顏色。

2.3 基本繪圖函數(shù)

A. line(int x1,int y1,int x2,int y2)

功能:從點(diǎn)(x1,y1)到點(diǎn)(x2,y2)畫一直線。

B. arc(int x,int y,int stange,int endangle,int r)

功能:以(x,y)為圓弧的中心,以stange為起始角度,以endangle為終止角度,以r為半徑作一圓弧。

C. setfillstyle(int pattern,int color)

功能:用參數(shù)pattern所確定的填充模式,用參數(shù)color確定的顏色進(jìn)行填充。

D. floodfill(int x,int y,int color)

功能:填充一個(gè)含有點(diǎn)(x,y)在內(nèi)的有界封閉區(qū)域,這個(gè)有界封閉區(qū)域的邊界由參數(shù)color確定,填充模式與填充顏色由函數(shù)setfillstyle設(shè)定。

2.4 字符輸出函數(shù)

A. settextstyle(int font,int direction,int size)

功能:在圖形方式下設(shè)置字符的字體,式樣和放大因子。

B. outtextxy(int x,int y,char &str)

功能:在窗口(x,y)的位置輸出字符或字符串。

C. getch( )

功能:從控制臺取得一字符且不輸出,用來使程序暫停,按任意鍵后使程序繼續(xù)運(yùn)行。

3. 繪制一個(gè)圓餅型統(tǒng)計(jì)圖的程序如下

#include

main( )

{ int driver,mode;

driver=VGA;

mode=VGAHI;

initgraph(&driver,&mode,“ ”);

setbkcolor(0);

setcolor(15);

arc(320,240,0,360,180);

line(320,240,500,240);

line(320,240,443,112);

line(320,240,266,70);

line(320,240,200,374);

setfillstyle(4,2);

floodfill(340,230,15);

setfillstyle(5,9);

floodfill(340,180,15);

setfillstyle(7,4);

floodfill(300,240,15);

setfillstyle(8,3);

floodfill(340,280,15);

setcolor(14);

settextstyle(1,0,4);

outtextxy(410,180,“14%”);

settextstyle(1,0,4);

outtextxy(330,110,“16%”);

settextstyle(1,0,4);

outtextxy(200,200,“34%”);

settextstyle(1,0,4);

outtextxy(340,310,“36%”);}

上述程序在Turbo C 2.0中上機(jī)通過編譯、連接、運(yùn)行,可得到精美的圓餅型圖。讀者通過閱讀并上機(jī)調(diào)試運(yùn)行該程序可以對C語言的圖形設(shè)置、繪制;顏色的控制、填充等函數(shù)的應(yīng)用有一個(gè)感性的認(rèn)識,對復(fù)雜枯燥的C函數(shù)提高學(xué)習(xí)興趣。

結(jié)語

目前許多C語言教材很少介紹C語言的圖形功能,而許多C語言學(xué)習(xí)者對C語言的圖形功能很感興趣,為幫助初學(xué)者學(xué)習(xí)C語言繪圖函數(shù)并提高學(xué)習(xí)興趣,本文簡單介紹了C語言一些常用的繪圖函數(shù)及其應(yīng)用,權(quán)當(dāng)拋磚引玉!還有一些圖形函數(shù)沒有列出,讀者若有興趣可參閱《C語言函數(shù)大全》。

參考文獻(xiàn):

[1]徐士良.PC機(jī)C圖形編程手冊.北京:清華大學(xué)出版社,1994.2.

[2]譚浩強(qiáng).C程序設(shè)計(jì)(第二版)[M].北京:清華大學(xué)出版社,1999.