徐曉
[摘 要]二本院校計(jì)算機(jī)專業(yè)學(xué)生普遍感覺C語言難學(xué),學(xué)習(xí)效果差,不能為后續(xù)語言學(xué)習(xí)奠定基礎(chǔ)。本文從數(shù)據(jù)類型角度分析這種狀況產(chǎn)生的原因,提出C語言的數(shù)據(jù)類型存在的缺陷,其中字符串部分尤其突出,并提出相關(guān)解決方案,旨在為相關(guān)研究提供借鑒。
[關(guān)鍵詞]C語言;字符串缺陷;二本院校
doi:10.3969/j.issn.1673 - 0194.2019.10.088
[中圖分類號]TP312 [文獻(xiàn)標(biāo)識碼]A [文章編號]1673-0194(2019)10-0-02
1 二本院校計(jì)算機(jī)專業(yè)選擇C語言作為入門語言的原因
大學(xué)計(jì)算機(jī)專業(yè)編程教學(xué)的入門語言多年來一直以C語言為主,不過近年來一些學(xué)校開始選擇Java或Python作為入門語言。但是對于二本院校計(jì)算機(jī)專業(yè)來說,大多數(shù)還是選擇C語言作為入門語言,原因如下。第一,如果選擇Python作為入門語言,雖然入門容易,也很容易學(xué)會,但是二本計(jì)算機(jī)專業(yè)學(xué)生畢業(yè)后很多還是從事前端、后端、客戶端等方面的開發(fā)工作,其主要語言是Java、C#、Javascript、php等,其基礎(chǔ)語法都是基于C語言的語法,而Python的語法則與這些語言完全不同。同時(shí),二本學(xué)生的學(xué)習(xí)能力和應(yīng)用能力不如一本學(xué)生,學(xué)習(xí)Python后轉(zhuǎn)到Java、C#等語言的難度大。第二,如果選擇Java語言作為入門語言,雖然可以一步到位,但是零編程基礎(chǔ)的二本學(xué)生一開始就要接觸大量編程知識,學(xué)習(xí)難度很大。
2 C語言數(shù)據(jù)類型的缺陷
2.1 數(shù)據(jù)類型應(yīng)具備最低要求
在軟件編程過程中,最長的數(shù)據(jù)類型有兩大類:①數(shù)值類型,包括整數(shù)與浮點(diǎn)數(shù),用于表示多少或大小,如工資、價(jià)格、產(chǎn)量等;②字符串類型,用于表示是什么內(nèi)容,如姓名、品牌、部門、地點(diǎn)等。其中,字符串在數(shù)據(jù)庫中出現(xiàn)的頻率甚至超過了數(shù)值類型。雖然在C#、Java等語言中沒有把字符串作為最基本的類型,但是都提供了string類,讓開發(fā)者把字符串作為基本類型。對于一個(gè)有經(jīng)驗(yàn)的程序員來說,在編程時(shí)認(rèn)為以下兩個(gè)語句都很基礎(chǔ),通常并不區(qū)分其中哪個(gè)更加基礎(chǔ)。
int num=10;
string name="phone";
由此可見,一門語言至少要提供數(shù)值類型和字符串類型,才能構(gòu)建完整的數(shù)據(jù)類型。但是C語言只提供數(shù)值類型,沒有提供字符串類型。
2.2 C語言的數(shù)據(jù)類型缺陷及影響
仔細(xì)研究C語言中的各種數(shù)據(jù)類型可以發(fā)現(xiàn),C語言在數(shù)據(jù)類型方面存在很多問題,幾乎所有的數(shù)據(jù)類型都是數(shù)值類型。例如:char與int可以通用;沒有邏輯類型,邏輯值用0和1表示;沒有字符串類型,存放字符串需要用數(shù)組,而數(shù)組名本質(zhì)上是指針,而指針就是地址,實(shí)際也是一個(gè)長整型數(shù)。教師可以在教學(xué)中給學(xué)生強(qiáng)調(diào)char和int的不同,但是從標(biāo)準(zhǔn)C提供的庫函數(shù)編譯系統(tǒng)并沒有嚴(yán)格區(qū)分char和int。例如下面的庫函數(shù)無論是形參還是返回值均應(yīng)該是char類型,但在標(biāo)準(zhǔn)C中都聲明為int類型。
int toupper(int ch)
這樣會導(dǎo)致學(xué)生在編寫函數(shù)時(shí)很難正確理解和使用數(shù)據(jù)類型,也給教師講解函數(shù)編寫帶來困難。例如編寫一個(gè)返回字符的函數(shù)和返回整數(shù)的函數(shù)時(shí),學(xué)生用如下形式都是行得通的。
int fun(....){......}
另外,變量在賦值時(shí)應(yīng)該賦同一類型的值,這是基本編程訓(xùn)練中被反復(fù)強(qiáng)調(diào)的知識點(diǎn),但是在標(biāo)準(zhǔn)C中,明顯不一致的語句卻能暢通無阻運(yùn)行,導(dǎo)致學(xué)生對知識點(diǎn)產(chǎn)生困惑。C語言這種數(shù)據(jù)類型的設(shè)計(jì)最初是為了讓C語言具備最大的靈活性,充分發(fā)揮C語言作為中級語言的特長。但是這種數(shù)據(jù)類型的單一性和靈活性對二本學(xué)生學(xué)習(xí)編程帶來了很大的問題。
(1)無法培養(yǎng)學(xué)生數(shù)據(jù)類型的意識。作為編程人員,看到一個(gè)變量會很自然地去想其屬于什么類型。C語言這種類型的單一性使學(xué)生很難培養(yǎng)對類型的敏感性,尤其是在編寫函數(shù)以及后續(xù)語言中的類時(shí),對數(shù)據(jù)類型的感覺顯得尤其重要。
(2)編程教學(xué)及練習(xí)題目單一,題型大多局限于數(shù)論或數(shù)值分析問題,如素?cái)?shù)問題、位數(shù)問題、圓周率問題等,類似一門數(shù)值分析的課程,而目前的應(yīng)用軟件大多數(shù)是數(shù)據(jù)處理功能,在這種情況下,學(xué)習(xí)C語言很難為學(xué)生開發(fā)后續(xù)軟件奠定良好的基礎(chǔ)。
3 C語言中字符串存在的問題
數(shù)據(jù)類型應(yīng)該包括數(shù)值和字符串兩大類,但C語言幾乎所有類型都?xì)w結(jié)為數(shù)值類型。C語言沒有專門的字符串類型,字符串是通過數(shù)組來存放,這樣的處理方式對二本學(xué)生來說存在諸多問題。
3.1 C語言與后續(xù)語言關(guān)于字符串的差異性
以目前常用的Java和C#為例,與C語言進(jìn)行關(guān)于字符串的用法對比,結(jié)果如表1所示。
從上述比較可以看出,Java、C#等語言關(guān)于字符串的用法與C語言完全不同。換句話說,學(xué)習(xí)了C語言中的字符串方面的知識在后續(xù)語言中幾乎用不上。二本院校的學(xué)生學(xué)習(xí)能力稍弱,沒有必要花大力氣去學(xué)習(xí)后面幾乎用不上的字符串的
知識。
3.2 學(xué)習(xí)C語言字符串難度大
二本學(xué)生普遍感覺C語言中的字符串難學(xué)。因?yàn)镃語言沒有字符串類型,而是使用數(shù)組存放字符串,在編程時(shí)需要考慮存儲問題。例如,下面兩個(gè)語句前面的是正確的,后面的是錯(cuò)誤的。
char x[5]="ok"; //正確
char y[5]="hello" //錯(cuò)誤,數(shù)組存放不下字符串
此外,學(xué)生常常搞不清楚將上述語句中的x理解為數(shù)組還是理解為字符串,在概念上的困惑會直接影響編程。
3.3 學(xué)習(xí)指針的難度大
二本學(xué)生普遍感覺指針難學(xué)。由于C語言用數(shù)組存放字符串,而數(shù)組名其實(shí)是指針,當(dāng)字符串作為函數(shù)參數(shù)時(shí)通常要寫成指針形式。這樣一來,學(xué)生為了學(xué)習(xí)C語言的字符串,需要先搞明白數(shù)組和指針,這樣就抬高了學(xué)生使用字符串的門檻。尤其是難學(xué)的指針攔在字符串的前面,導(dǎo)致二本學(xué)生覺得指針難學(xué),不能完全掌握并應(yīng)用自如。
4 學(xué)習(xí)C語言字符串?dāng)?shù)的簡單描述
(1)C語言數(shù)據(jù)類型單一,各種類型幾乎都?xì)w結(jié)為數(shù)值類型,急需一種完全不同的類型(如字符串類型)來培養(yǎng)學(xué)生對數(shù)據(jù)類型的感覺。
(2)C語言提供的字符串處理是通過數(shù)組、指針來實(shí)現(xiàn),對學(xué)生難度大,而且指針本身也是數(shù)值,不僅沒有起到豐富數(shù)據(jù)類型的作用,而且還十分難學(xué)。
雖然學(xué)生學(xué)習(xí)C語言比較困難、學(xué)習(xí)效果差,但是目前尚未看到二本院校從上述角度去解決問題,更多只是針對學(xué)生情況修改教學(xué)方案,但實(shí)際上,基于標(biāo)準(zhǔn)C的語法框架限制,這種修改沒有多少可以變動的空間,往往是降低難度的同時(shí)降低了對學(xué)生的要求。對于一本學(xué)生而言,較強(qiáng)的自學(xué)能力和學(xué)習(xí)自主性能夠彌補(bǔ)C語言的缺陷;但是對于二本院校學(xué)生,這些缺陷卻能讓學(xué)生在學(xué)習(xí)過程中不知不覺地把主要精力陷入C語言語法知識中,疲于概念理解,不能掌握基本編程能力。一般而言,二本學(xué)生的及格率并不是很低,但這不表示學(xué)生已經(jīng)奠定了編程基礎(chǔ),只是教師降低了課程要求。換句話說,教師對此現(xiàn)狀沒有制定相應(yīng)對策,導(dǎo)致教師教得痛苦、學(xué)生學(xué)得痛苦,難以培養(yǎng)學(xué)生對專業(yè)的興趣。
5 結(jié) 語
對于二本學(xué)生來說,C語言在數(shù)據(jù)類型尤其是字符串上存在缺陷,導(dǎo)致二本學(xué)生學(xué)習(xí)C語言的效果不佳。因此,學(xué)校應(yīng)彌補(bǔ)這個(gè)缺陷,讓學(xué)生理解C語言,為后續(xù)課程的學(xué)習(xí)奠定扎實(shí)的基礎(chǔ)。
主要參考文獻(xiàn)
[1]王宇哲.C語言與Java對比下的優(yōu)點(diǎn)[J].電子世界,2018(2).
[2]馬乾頡.程序設(shè)計(jì)語言C與Java之探討[J].信息技術(shù),2010(10).
[3]車萬翔,蘇小紅,袁永峰,等.計(jì)算機(jī)專業(yè)高級語言程序設(shè)計(jì)課程改革探索[J].計(jì)算機(jī)教育,2014(13).
[4]胡國柱.基礎(chǔ)課程C語言與Java語言的優(yōu)劣漫談[J].福建電腦,2011(11).
[5]蔣曉明,徐啟振.用C語言字符串實(shí)現(xiàn)多位整數(shù)的高精度計(jì)算[J].福建電腦,2004(6).
[6]申定保.C語言考試中的語法結(jié)構(gòu)和算法分析[J].電腦知識與技術(shù),2004(2).
[7]周建儒.C語言與C++語言幾點(diǎn)差異的應(yīng)用實(shí)例分析[J].河北軟件職業(yè)技術(shù)學(xué)院學(xué)報(bào),2016(1).
[8]白春霞,張維寶.基于C語言中字符串長度計(jì)算問題的探討[J].電腦知識與技術(shù),2010(29).
[9]倪瑞曉.C語言編程技術(shù)的分析研究[J].計(jì)算機(jī)技術(shù)與發(fā)展,2009(12).
[10]張盼盼.C語言之如何判斷回文串[J].現(xiàn)代計(jì)算機(jī),2016(31).
[11]雷金,彭秋生.淺談C語言字符串格式化[J].湖南生態(tài)科學(xué)學(xué)報(bào),2012(1).