”學(xué)習(xí)C語言用一個學(xué)期,而且感覺是用代碼做一些簡單的數(shù)學(xué)題,沒什么用途”,這說明你的感覺是對的,老師的教學(xué)方法錯了,必須徹底改變學(xué)習(xí)方法,以提高學(xué)習(xí)效率。
象這種底層的高級C語言,一般學(xué)會并熟練使用,時間不超過兩周。
學(xué)習(xí)編程語言,絕不能象高數(shù)一樣,一節(jié)一節(jié)地學(xué)扎實,推理有據(jù)。編程語言類有它的學(xué)習(xí)方法。
我九十年代初,在工作中學(xué)C語言,兩周時間,不僅學(xué)會了,而且做了一個集編輯、圖形描畫、零件程序解釋的APP,之前一點基礎(chǔ)都沒有,就一本介紹庫函數(shù)及C基礎(chǔ)的英文書。
學(xué)習(xí)第一步:下載并安裝IDE,通過做界面程序,驗證所學(xué)的結(jié)構(gòu)、變量、指針、邏輯關(guān)系、文件讀寫、內(nèi)存分配、圖形界面編寫等,不僅學(xué)明白了,而且用于實際開發(fā)中。
很多初學(xué)者,老是喜歡鉆牛角尖。如變量,unsigned char,char,signed char,BYTE,WORD,int,unsigned int,long int,LONG,LP,void *,int *,p=&i,p=(struct tr*)&p等等變量,表達(dá)式搞的暈暈乎乎,以致于覺得云遮霧罩,高深莫測。
很多人驚呼:老師水平咋這么高!
初學(xué)者建議使用VS編繹器,它對C,C++有極好的兼容性,在VS上做好RC,用子程序?qū)崿F(xiàn)C的編程學(xué)習(xí)。
這時我們就陷入了一個學(xué)習(xí)誤區(qū)。
學(xué)習(xí)第二步,把以上的指針、變量寫成程序,編繹系統(tǒng)自然會告訴你那錯了。有助于快速理解C語言的各種概念。
如下圖,關(guān)于指針、結(jié)構(gòu):
上圖所示代碼,指針錯了,系統(tǒng)提示error2102錯誤。指針改正后,如下圖:
第三步,把編程語言與數(shù)學(xué)算法分開。C是語言,高數(shù)、線代、微分?jǐn)?shù)值解等是算法。語言學(xué)明白了,實際應(yīng)用時,把算法寫成函數(shù)庫,供以后使用
很多人認(rèn)為,既然AI要用到算法,那么,學(xué)語言時,就要先學(xué)算法。
大錯而特錯!算法屬于應(yīng)用,屬于數(shù)學(xué)建模,它是固定的,工作中隨時可找到函數(shù)庫,直接調(diào)用。如下,做庫函數(shù):
總結(jié):把語言與數(shù)學(xué)要分開學(xué)。學(xué)習(xí)語言,要邊做程序邊學(xué)習(xí)。單純C語言,學(xué)習(xí)時間應(yīng)不超過兩周時間。
編程語言最核心的東西就是算法,也就是你說的數(shù)學(xué)題。算法牛不牛,決定了產(chǎn)品牛不牛。百度背后的搜索算法,今日頭條的推薦算法,成就了他們今天。
難道你想做復(fù)雜的數(shù)學(xué)題?如果你數(shù)學(xué)好可以做一些復(fù)雜的數(shù)學(xué)模型。比如人工智能領(lǐng)域ocr識別模板匹配算法(算法公式如圖),你也可以搞下計算機中比較牛的幾個算法:定向搜索算法、二分查找、分支界定算法、Buchberger算法、Diffie-Hellman密鑰交換算法、數(shù)據(jù)壓縮算法、Dijkstra算法、離散微分算法、動態(tài)規(guī)劃算法、期望-最大算法、梯度下降算法、哈希算法、堆排序、決策樹、 隨機森林、分層聚類算法、線性分類器···
一個學(xué)期,能干嘛,雖然我不編程,不過十年前無聊自己玩過易語言,然后有款游戲叫 程序員升職記,這個游戲我玩了一下,到10關(guān)以后基本看著攻略都不會,即使看著攻略過關(guān)了也不知道為什么,但玩了這款游戲讓我一個30的人突然就明白了什么叫邏輯思維能力,真就是邏輯思維,不知道怎么描述,不過我想玩程序的人應(yīng)該邏輯思維能力很強,至少你現(xiàn)在所做的就是鍛煉這個能力??梢匀ピ囋囘@個游戲,如果能通關(guān)再說你學(xué)的東西有沒有用吧
以我一個外行人的感覺就是,各種命令什么的誰都會,但好的程序猿可以用最佳的組合做出來,代碼最少,機器運行流暢,邏輯思維不行的人也能做出一樣的程序,但代碼復(fù)雜,運行起來各種卡頓,感覺你可以練習(xí)一下,同樣的結(jié)果怎么用更加優(yōu)化的方式來實現(xiàn)這個方向
在現(xiàn)有的計算機體系中C語言可謂是編程的鼻祖,使得人們從晦澀難懂的機器匯編語言過渡到更接近平常正常人思維的高級語言。C語言的出現(xiàn)也直接促使了編程之樹的蓬勃發(fā)展,使得更為復(fù)雜的程序成為可能,也大大提高了程序跨平臺的兼容性。
學(xué)C語言剛?cè)腴T的時候都會覺得它只適合用來解數(shù)學(xué)題毫無用處的這種感覺。對于之前沒有編程經(jīng)驗的人來說,學(xué)了一個學(xué)期C語言,還不能算得上入門了,僅僅只是對C語言有一個概念性的理解,很多專有名詞都還有可能理解不透徹,更別提它要如何去使用。
實際上任何一門變成語言,當(dāng)你會用它來做一些簡單的數(shù)學(xué)題,就已經(jīng)打開了編程的這扇大門,后面還有更多的概念和應(yīng)用等著去挖掘、實踐,這絕對不是一朝一夕就能完成的,需要一個長期學(xué)習(xí)、運用從量變到質(zhì)變的過程。
編程離不開數(shù)學(xué)、算法、數(shù)據(jù)結(jié)構(gòu),這是循序漸進的一個過程。這就好比小學(xué)要花5~6年去學(xué)習(xí)加減乘除、小數(shù)、分?jǐn)?shù)等等一些基礎(chǔ)的數(shù)學(xué)概念和算法,到了初中才會去學(xué)習(xí)如何通過數(shù)學(xué)去解決實際生活中遇到的一些問題,到了高中已經(jīng)能夠建立數(shù)學(xué)的模型去解決更為復(fù)雜的問題,有了這些鋪墊上大學(xué)才能對于晦澀難懂的數(shù)學(xué)理論進行學(xué)習(xí)和應(yīng)用。
大道至簡同樣適用于編程,程序的UI界面只是表皮,真正支撐程序的是算法和結(jié)構(gòu)邏輯。再復(fù)雜的程序最終都會變成機器才能懂的一串0和1。
但同樣是樂高積木,卻有人能用50萬塊樂高積木搭建搭建惟妙惟肖、鬼斧神工、令人嘆為觀止的“故宮三大殿”模型,這里面包含了決心、創(chuàng)意、堅持。過去的人還在羨慕鳥兒能自由在空中翱翔的時候,如今的人卻能坐上精密的飛機在空中穿梭,甚至借助載人火箭飛船翱翔宇宙,學(xué)習(xí)并沒有止境,編程這條路同樣沒有。
學(xué)習(xí)編程需要更多的是自學(xué)和敲代碼實際應(yīng)用
很多人對于C語言的第一印象就是譚式C語言,更貼切來講是程序設(shè)計基礎(chǔ),書本上并沒有很高深的程序,教授的老師也并沒有指望你學(xué)完程序設(shè)計基礎(chǔ)去做一些多么厲害的東西,只是希望你學(xué)會什么是C語言,程序設(shè)計是什么樣的。這也進一步地印證了“師傅領(lǐng)進門,修行在個人”這句話。
不管現(xiàn)在的何種編程語言都遵循發(fā)展C語言的古法常量、變量、類、結(jié)構(gòu)體、函數(shù)、循環(huán)、判斷分支等等。一門編程語言足夠吸引人的地方在于它擁有一個龐大的生態(tài)系統(tǒng),讓開發(fā)者開發(fā)時引用到很多優(yōu)質(zhì)的庫,這樣就會大大的縮短開發(fā)的時間,比如Python、JavaScript、GO、Java等等就擁有這樣的特性。編程語言的更新和迭代往往會帶來更好的應(yīng)用,會推出更多的應(yīng)用庫同時修正以往不好的設(shè)計。
學(xué)習(xí)編程是需要付出代價
衡量一門編程語言好不好也取決于對于初學(xué)者的友好程度,容易上手也不需要花費幾年的時間去掌握它??墒蔷幊陶Z言僅僅只是給你一個平臺,至于你是搭建一個茅草屋還是搭建一個座高樓大廈完全取決于你自己,而這個過程是要付出代價。
以上個人淺見,歡迎批評指正。
認(rèn)同我的看法,請點個贊再走,感謝!
喜歡我的,請關(guān)注我,再次感謝!
前言:想法正常,但是認(rèn)知有誤。
1、學(xué)習(xí)編程的目的
編程的目的是為了解決問題,即便是因為興趣愛好也是算是解決問題的范疇。因而學(xué)習(xí)C語言,做數(shù)學(xué)題也是鍛煉能力的一個過程。因為現(xiàn)實過程中的問題,一般是多因素的。就比如種樹,實際上解決的時候,就得考慮拿什么挖坑、拿什么澆樹,甚至是不是在種下之前進行堆肥。而抽象為數(shù)學(xué)題的時候,可能就是給了面積和間距,就求數(shù)量了。
數(shù)學(xué)是什么,到底怎樣的一門學(xué)科。很多時候,我們在學(xué)校學(xué)習(xí)的時候,僅僅把這門學(xué)科當(dāng)作是記得少,算得多的一門學(xué)科。到了實際的應(yīng)用中,沒有數(shù)學(xué)很多問題還真不好解決。
這里就說地鐵的停車和開車,類似的火車也是一樣的,這是一類很普通的大眾交通工具。我們經(jīng)常乘坐,但是很少去考慮它的實際運行性能。
但是,不去關(guān)注不代表沒有,這里就會有一個PID的控制方式。簡單拆分為數(shù)學(xué)的 積分、微分、比例。因為實際的運行不是憑司機感覺去加速、減速,這么大動量的物體就會按照這相關(guān)的算法去控制。這里的算法就可以粗略理解為程序。
數(shù)學(xué)本身就是有用的,編程解決數(shù)學(xué)題,更加有用。數(shù)學(xué)本身似乎沒有太大的實際用途,并不像體育能教會我們怎樣去鍛煉身體,因為數(shù)學(xué)的本身就是將實際物理形態(tài)的東西抽象了,這樣做的目的是為了概括一類問題,解決一類問題。比如—公式。
2、C語言的一些應(yīng)用場景
我是一個嵌入式工程師,有個時候設(shè)計一些簡單的硬件,有個時候會編寫一些程序。我使用的平臺叫做單片機。相關(guān)的應(yīng)用也不少,比如電磁爐、電飯煲,里面的控制核心就是各種各樣的單片機,而單片機的靈魂就是C語言。當(dāng)然單片機在這里,他們會有一個高檔的名字叫微控制器。一般而言,有這樣字眼的家電,價格上就會不一樣。
這里是單片機的具體應(yīng)用,也是C語言的具體應(yīng)用,因為在找工作的時候,崗位JD里面會明確規(guī)定:1、會用單片機;2、會使用C語言編程。比如電飯煲什么時候斷電,傳統(tǒng)的做法都是水干了,溫度達(dá)到100 溫控器就跳閘。實際上,利用C語言編程判斷溫度是不是達(dá)到100,達(dá)到100 就斷電,也是可以實現(xiàn)的。只是在實際應(yīng)用的時候,就不僅僅是比較溫度了,還有有溫度的測量原理以及準(zhǔn)確測量溫度的方式。
總結(jié):想來想去也沒找到好從好句,借用名言——任何語言的編程到最后都是算法。
趕緊輟學(xué)吧,你那老師不行,眼看著就把你往溝里帶的節(jié)奏。你老師到底做過什么項目沒有?我們學(xué)車C語言都是半路出家,一個星期就出師了,然后找項目做設(shè)計,大規(guī)范學(xué)一下,然后各種技巧、指針、算法原則都是用到再查,不用在課堂上記住,Internet就是圖書館,要什么查不到?
就好像學(xué)中文不需要背會字典一樣,那些要考試才問的東西不用學(xué),這個道理明白不?
程序員有很多種層次。第一個:科研型,這種就跟科學(xué)家一樣,大部分會選擇底層語言,能創(chuàng)造出什么不好說,屬于探索性質(zhì)的,但是一旦探索到,可能可以引領(lǐng)世界往前走一步。第二個:架構(gòu)型,是科研型的實踐衍生,通過各種研究成果,架構(gòu)軟件體系,供行業(yè)應(yīng)用,大部分被稱為架構(gòu)師。第三種,應(yīng)用型,應(yīng)用工程師也具備一定的架構(gòu)能力,但更偏重應(yīng)用整合,表現(xiàn)為能熟練應(yīng)用各種開發(fā)框架。第四種,入門型,一入侯門深似海,望君慎重,這類人才剛接觸開發(fā)不多久。第五類,摸魚型,跟其他行業(yè)摸魚的一樣,只是把他當(dāng)作一份普通的工作而已,學(xué)習(xí)?不可能的,開發(fā)也不可能的,半桶水晃的叮當(dāng)響,這種人后來開始鼓吹中年危機,轉(zhuǎn)管理去了。
c語言 偏低層,底層主要是系統(tǒng)編程,直接操作寄存器等等,偏重數(shù)據(jù)結(jié)構(gòu),所以初學(xué)者基本就是練習(xí) 計算器的功能
上大學(xué)學(xué)了FORTRON77,除了算幾個正弦函數(shù)和排列,幾顆小星星以外,感覺不出來能做什么事?后來自學(xué)了C語言C加加數(shù)據(jù)庫等等等等又學(xué)了BorLand c++感覺創(chuàng)造一個窗口界面太累了,直到后來用了VC 6.0才感覺到了創(chuàng)造界面的方便。如果只是學(xué)了C語言,給我的感覺,除了做實驗什么也做不了。大學(xué)畢業(yè)十年后,我才真正的編了一個實際工程中使用的程序,給我開發(fā)的單機,提供上位機支持。我91年工作的那個時候會編程序的人,基本上是零?,F(xiàn)在滿世界都是科班出身的人了。說明一下,除了FORTRON77,其他的我都是自學(xué)的
課堂上學(xué)到的c語言本身就是很簡單的,在國內(nèi)大學(xué)的c語言課堂上你很難學(xué)到真正做項目的能力,所以他們提出可以上手學(xué)習(xí)做一些c語言工程,我認(rèn)為學(xué)習(xí)做項目的能力很重要,但是有些回答給的是做游戲,做窗體的項目,我倒不是很贊同。
國內(nèi)大學(xué)普遍把c語言作為程序設(shè)計的入門課程,甚至我大一的時候那門課程的名字就不叫c語言,而是叫《程序設(shè)計基礎(chǔ)》,其實意義很明白了:老師根本沒指望你學(xué)完能用c語言做多么厲害的東西,他是希望你學(xué)會程序設(shè)計,而不只是c語言。至于做工程,其實c++,java都比c語言要好,除了底層計算機系統(tǒng)、嵌入式、物聯(lián)網(wǎng)這些偏硬件的方向其他方向需要你用c語言做工程的方向其實少之又少,哪怕是嵌入式、物聯(lián)網(wǎng)等方向?qū)戇M單片機的程序其實也普遍比較簡單,更需要補的是硬件知識和掌握各種API,而寫底層系統(tǒng)你還要學(xué)的東西就實在是太多太多了。所以我依舊認(rèn)為你把課堂上老師教你的內(nèi)容學(xué)會了,入了編程的門就夠了,更多高大上的復(fù)雜的東西你以后會發(fā)現(xiàn)普遍不是用c語言寫的,你現(xiàn)在去學(xué)用c語言寫窗體,寫小游戲你以后會發(fā)現(xiàn)其實人家都在用Qt,c#,java這些,寫的比你快還比你好,你學(xué)了也用處有限。
確實有余力可以選一門應(yīng)用更廣泛的語言繼續(xù)學(xué)習(xí),與c語言相互印證,或者想學(xué)習(xí)做項目的話,學(xué)一學(xué)單片機,自己做個呼吸燈,電子鐘,溫度顯示器,指紋鎖,收音機之類的,淘寶上買個可編程機器人與其他傳感器組合實現(xiàn)一些自動尋跡,目標(biāo)識別啥的功能,都很有意思,這才是目前c語言在工業(yè)界比較普遍的應(yīng)用,寫游戲?qū)懣蛻舳藢懞笈_啥的早就是其他語言的主戰(zhàn)場了,沒必要空耗太多功夫。
先上結(jié)論,因為c語言只是最最基礎(chǔ)的工具。c語言與編程的關(guān)系就像學(xué)會寫漢字與寫小說的關(guān)系,其實我覺得如果你以后的目標(biāo)是自己開發(fā)出像微信、QQ、淘寶、抖音等等那種面向普通用戶的大型程序的話,說c語言是拼音都不為過。
開始時候也覺得c語言天天就只是做一些沒什么用的數(shù)學(xué)題很沒意思,后來學(xué)習(xí)了其他語言和計算機相關(guān)知識后我發(fā)現(xiàn)其實學(xué)校教我們c語言的主要目的可能根本就不是叫我們用c語言開發(fā)出多么厲害的程序,而是以下這些目的:
①帶你接觸一種很多主流計算機語言都遵循的語法。
很多主流計算機語言(像c++,c#,java)都遵循了c語言的分號換行,大括號標(biāo)記代碼段,循環(huán)條件和if判斷條件用小括號括起來,數(shù)組索引用中括號括起來等基礎(chǔ)語法,以及特殊一些的js,Go,python也部分遵循了這些語法。這些習(xí)慣以后會伴隨你敲的每一行代碼,有的甚至老程序員了都會漏掉分號或者半邊大括號,所以早點帶你習(xí)慣這種語法是很重要的。
②帶你接觸編程常用概念。
c語言中的常量,變量,類,結(jié)構(gòu)體,函數(shù),循環(huán),分枝判斷等等都是大多數(shù)語言依舊在使用的概念,這些概念在程序中無處不在,在任何一門語言的學(xué)習(xí)中你都要先學(xué)習(xí)這些概念。
③帶你熟悉程序員的思維方式。
舉個最簡單的例子,你在現(xiàn)實中如果要按照高挨個站隊你會怎么做?這就是一個排序問題,程序員是怎么解決這個問題的?反正我學(xué)習(xí)了排序之后才意識到自己站隊一般是用選擇排序和插入排序的方法,而冒泡排序,歸并排序,快速排序,堆排序等等算法其實應(yīng)該是數(shù)學(xué)家或者程序員特有的考慮問題的方法,一般人很少接觸到,還有遞歸和迭代,是最典型的數(shù)學(xué)家或者程序員的思維方式:把一個問題簡化成我解決過的問題,不斷簡化下去得到最終的解。這種思維方式將會伴隨你一生,哪怕你不做程序員了也會用得到。
④帶你初步認(rèn)識計算機的工作原理。
c語言是最貼近計算機底層的高級語言,特別是c語言中最令初學(xué)者困惑的指針和內(nèi)存分配直接揭示了程序在計算機中的運行過程,其實你以后學(xué)到c++和計算機組成原理、匯編語言的時候就會更進一步理解為什么c語言里是那么設(shè)計的,熟練的c語言程序員看到一行代碼就能知道執(zhí)行完這行代碼在內(nèi)存里發(fā)生了什么,這在以后任何語言的debug中都是很重要的,你要知道你的每一行代碼在做什么。
⑤帶你學(xué)習(xí)寫代碼、編譯、調(diào)試、運行的過程
這個想必我也不用多說,你以后學(xué)習(xí)任何一種計算機語言都離不開這幾個步驟,只是有的可能把編譯的過程隱藏起來了不給你看見。
最后,上面這些也只是我的一點總結(jié),并不代表老師們的真實意圖,我也還只是接觸了計算機知識中的冰山一角,大概說的很不全面,也歡迎補充、指正。以及題主如果確實想急于做一些有意思看起來比較高大上的項目的話,可以去圖書館找找一些名叫“c語言項目實戰(zhàn)”、“XXX項目實戰(zhàn)(基于c語言)”、“c語言游戲編程”等等這樣的書(不一定就是這些名字,我也沒看過這些書),或者直接去學(xué)習(xí)python吧,剛學(xué)完c語言學(xué)習(xí)python應(yīng)該會很快,在學(xué)習(xí)的過程中還能和c語言互相印證,然后你就可以借助python語言中的一些開源庫做很多高大上的工作了,但我還是建議你學(xué)好c語言基礎(chǔ),因為那是你以后學(xué)習(xí)其他語言的一把鑰匙。